import org.argeo.slc.jcr.SlcTypes;
import org.argeo.slc.repo.NodeIndexer;
import org.argeo.slc.repo.OsgiFactory;
+import org.argeo.slc.repo.maven.MavenConventionsUtils;
+import org.sonatype.aether.artifact.Artifact;
+import org.sonatype.aether.util.artifact.DefaultArtifact;
/** Default implementation of {@link OsgiFactory}. */
-public class OsgiFactoryImpl implements OsgiFactory {
+public class OsgiFactoryImpl implements OsgiFactory, SlcNames {
private final static Log log = LogFactory.getLog(OsgiFactoryImpl.class);
private String workspace;
/** key is URI prefix, value list of base URLs */
private Map<String, List<String>> mirrors = new HashMap<String, List<String>>();
+ private List<String> mavenRepositories = new ArrayList<String>();
+ private String mavenProxyBase = "/mavenProxy";
+
public void init() {
if (workspace == null)
throw new SlcException("A workspace must be specified");
+ // default Maven repo
+ if (mavenRepositories.size() == 0) {
+ // mavenRepositories
+ // .add("http://search.maven.org/remotecontent?filepath=");
+ mavenRepositories.add("http://repo1.maven.org/maven2");
+ }
+
Session javaSession = null;
Session distSession = null;
try {
+ // TODO rather user a JavaRepoManager that will also implicitely
+ // manage the indexing of newly created nodes.
javaSession = JcrUtils.loginOrCreateWorkspace(javaRepository,
workspace);
distSession = JcrUtils.loginOrCreateWorkspace(distRepository,
}
}
+ public Node getMaven(Session distSession, String coords)
+ throws RepositoryException {
+ Artifact artifact = new DefaultArtifact(coords);
+ String path = MavenConventionsUtils.artifactPath(mavenProxyBase,
+ artifact);
+
+ // exists
+ if (distSession.itemExists(path))
+ return distSession.getNode(path);
+
+ for (String mavenRepo : mavenRepositories) {
+ String url = mavenRepo
+ + MavenConventionsUtils.artifactPath("/", artifact);
+ try {
+ Node node = loadUrlToPath(url, distSession, path);
+ if (node != null) {
+ // checksums
+ try {
+ loadUrlToPath(url + ".md5", distSession, path + ".md5");
+ } catch (FileNotFoundException e) {
+ // silent
+ }
+ try {
+ loadUrlToPath(url + ".sha1", distSession, path
+ + ".sha1");
+ } catch (FileNotFoundException e) {
+ // silent
+ }
+ return node;
+ }
+ } catch (FileNotFoundException e) {
+ if (log.isDebugEnabled())
+ log.debug("Maven " + coords
+ + " could not be downloaded from " + url);
+ }
+ }
+ throw new SlcException("Could not download Maven " + coords);
+ }
+
public Node getDist(Session distSession, String uri)
throws RepositoryException {
String distPath = '/' + JcrUtils.urlAsPath(uri);
return loadUrlToPath(url, distSession, distPath);
} catch (FileNotFoundException e) {
if (log.isDebugEnabled())
- log.debug("Cannot download" + url
+ log.debug("Cannot download " + url
+ ", trying another mirror");
}
}
throw new SlcException("Could not download " + uri);
}
+ /** Actually downloads a file to an internal location */
protected Node loadUrlToPath(String url, Session distSession, String path)
throws RepositoryException, FileNotFoundException {
if (log.isDebugEnabled())
Node fileNode = JcrUtils.copyStreamAsFile(folderNode,
JcrUtils.nodeNameFromPath(path), in);
fileNode.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
- Node origin = fileNode.addNode(SlcNames.SLC_ORIGIN,
- SlcTypes.SLC_PROXIED);
+ Node origin = fileNode.addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED);
JcrUtils.urlToAddressProperties(origin, url);
distSession.save();
return fileNode;