]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
SLC Repo
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 13 Feb 2011 20:48:30 +0000 (20:48 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 13 Feb 2011 20:48:30 +0000 (20:48 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@4136 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

34 files changed:
demo/slc_demo_rap.properties
demo/slc_repo.properties [new file with mode: 0644]
dep/org.argeo.slc.dep.server/pom.xml
dep/pom.xml
integration-tests/org.argeo.slc.it.webapp/META-INF/MANIFEST.MF
integration-tests/org.argeo.slc.it.webapp/pom.xml
modules/server/org.argeo.slc.server.repo/META-INF/MANIFEST.MF
modules/server/org.argeo.slc.server.repo/META-INF/spring/maven.xml [new file with mode: 0644]
modules/server/org.argeo.slc.server.repo/META-INF/spring/repo-osgi.xml
runtime/org.argeo.slc.repo/pom.xml [new file with mode: 0644]
runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/ImportMavenDependencies.java [new file with mode: 0644]
runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/SlcException.java
runtime/org.argeo.slc.support.aether/.classpath [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/.project [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/.settings/org.eclipse.pde.core.prefs [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/build.properties [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/pom.xml [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/AetherTemplate.java [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/AetherUtils.java [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/ConsoleRepositoryListener.java [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/ConsoleTransferListener.java [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/SimpleArtifactDescriptorReader.java [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/SimpleVersionRangeResolver.java [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/SimpleVersionResolver.java [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/osgi/OsgiVersion.java [new file with mode: 0644]
runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/spring/RemoteRepositoryFactory.java [new file with mode: 0644]
runtime/org.argeo.slc.support.maven/META-INF/spring/maven-osgi.xml [new file with mode: 0644]
runtime/org.argeo.slc.support.maven/META-INF/spring/maven.xml [new file with mode: 0644]
runtime/org.argeo.slc.support.maven/pom.xml
runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/ConsoleRepositoryListener.java [deleted file]
runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/ConsoleTransferListener.java [deleted file]
runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java
runtime/pom.xml

index f128e259ee662dcd337284510b35fdfbb807111d..e736cdbe725c8345318c43fcb6f71e231e7900c2 100644 (file)
@@ -17,11 +17,9 @@ org.argeo.slc.server.castor,\
 org.argeo.slc.server.h2,\
 org.argeo.slc.server.hibernate,\
 org.argeo.slc.server.services,\
-
-#org.argeo.server.ads.server,\
-#org.argeo.security.manager.ldap,\
-#org.argeo.security.services,\
-#org.argeo.security.manager.ldap,\
+org.argeo.server.ads.server,\
+org.argeo.security.manager.ldap,\
+org.argeo.security.services,\
 
 #org.argeo.security.ui.initialPerspective=com.agfa.sebi.client.ui.consultEbiPerspective
 
diff --git a/demo/slc_repo.properties b/demo/slc_repo.properties
new file mode 100644 (file)
index 0000000..fc4d90a
--- /dev/null
@@ -0,0 +1,6 @@
+argeo.osgi.start=\
+org.springframework.osgi.extender,\
+org.argeo.slc.support.maven,\
+org.argeo.slc.server.repo,\
+
+log4j.configuration=file:../../log4j.properties
index 590784f712eaf6d3ed7b1b4931ade731e5a99b2d..fee0b63e6691670bd8608b4d18e56ff1e2ade33a 100644 (file)
                        <artifactId>org.argeo.slc.support.ws.client</artifactId>
                        <version>${project.version}</version>
                </dependency>
+               <dependency>
+                       <groupId>org.argeo.slc.runtime</groupId>
+                       <artifactId>org.argeo.slc.repo</artifactId>
+                       <version>${project.version}</version>
+               </dependency>
 
                <!-- Commons -->
                <dependency>
index 1028867794c58964c60bb241eb78005408f32f4d..4d5f11d4f516e147959b9ae71878408ce0c697ff 100644 (file)
@@ -79,9 +79,6 @@
                                                                <goal>pde-sources</goal>
                                                        </goals>
                                                        <phase>generate-resources</phase>
-                                                       <configuration>
-                                                               <copyArtifacts>false</copyArtifacts>
-                                                       </configuration>
                                                </execution>
                                                <execution>
                                                        <id>generate-descriptors</id>
index 1564834a38417a852047e60ca27a0b58ad019f06..bf80939326761fd126aa05270923fcab412861d8 100644 (file)
@@ -4,10 +4,10 @@ Bundle-Name: SLC Integration Tests
 Bundle-SymbolicName: org.argeo.slc.it.webapp
 Bundle-Version: 0.13.1.SNAPSHOT
 Import-Package: junit.framework;version="3.8.2",
- org.argeo.slc;version="0.13.0.SNAPSHOT-r3650",
- org.argeo.slc.msg;version="0.13.0.SNAPSHOT-r3653",
- org.argeo.slc.runtime;version="0.13.0.SNAPSHOT-r3650",
- org.argeo.slc.server;version="0.13.0.SNAPSHOT-r3650",
- org.argeo.slc.server.client;version="0.13.0.SNAPSHOT-r3641",
- org.argeo.slc.server.unit;version="0.13.0.SNAPSHOT-r3641"
+ org.argeo.slc,
+ org.argeo.slc.msg,
+ org.argeo.slc.runtime,
+ org.argeo.slc.server,
+ org.argeo.slc.server.client,
+ org.argeo.slc.server.unit
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
index b3ba0ffb34a60914a4c250bac48ee8f05298d6bf..c45f877075615c5d69a210039a539f55337ba069 100644 (file)
                                                        org.argeo.slc.demo.ant                                          
                                                </argeo.osgi.start>
                                                <argeo.server.port.http>7080</argeo.server.port.http>
-                                               <!-- <argeo.osgi.start> org.springframework.osgi.extender, org.argeo.server.ads.server, 
-                                                       org.argeo.slc.server.jackrabbit.derby, org.argeo.slc.server.jcr, org.argeo.slc.server.main, 
-                                                       org.argeo.slc.ria, org.argeo.slc.agent, org.argeo.slc.agent.jms, org.argeo.slc.demo.minimal, 
-                                                       org.argeo.slc.demo.basic, org.argeo.slc.demo.ant </argeo.osgi.start> -->
                                        </systemProperties>
                                </configuration>
                                <executions>
        <dependencies>
                <dependency>
                        <groupId>org.argeo.slc.dep</groupId>
-                       <artifactId>org.argeo.slc.dep.sdk</artifactId>
+                       <artifactId>org.argeo.slc.dep.sdk.rcp</artifactId>
                        <version>${project.version}</version>
                </dependency>
                <!-- Unit Tests -->
index 8f968fe6e53e21127fdc146ed504fc4f0c12ab7e..27347f2b526d357f8eaf706d37cb34a742628a65 100644 (file)
@@ -3,3 +3,7 @@ Bundle-ManifestVersion: 2
 Bundle-Name: Repo
 Bundle-SymbolicName: org.argeo.slc.server.repo
 Bundle-Version: 1.0.0.qualifier
+Import-Package: org.argeo.slc.aether,
+ org.argeo.slc.aether.spring,
+ org.argeo.slc.repo.maven,
+ org.sonatype.aether;version="1.9.0"
diff --git a/modules/server/org.argeo.slc.server.repo/META-INF/spring/maven.xml b/modules/server/org.argeo.slc.server.repo/META-INF/spring/maven.xml
new file mode 100644 (file)
index 0000000..395a4ed
--- /dev/null
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
+       ">
+
+
+       <bean class="org.argeo.slc.repo.maven.ImportMavenDependencies"
+               init-method="run">
+               <property name="rootCoordinates"
+                       value="org.argeo.dep:versions-all:pom:1.1.3-SNAPSHOT" />
+               <property name="aetherTemplate" ref="mavenAetherTemplate" />
+               <property name="excludedArtifacts">
+                       <set>
+                               <value>org.apache.commons:com.springsource.org.apache.commons.logging
+                               </value>
+                               <value>org.osgi:org.osgi.core</value>
+                               <value>org.easymock:easymock</value>
+                       </set>
+               </property>
+       </bean>
+
+       <bean id="mavenAetherTemplate" class="org.argeo.slc.aether.AetherTemplate">
+               <property name="repositorySystem" ref="mavenRepositorySystem" />
+               <property name="repositorySystemSession" ref="mavenRepositorySystemSession" />
+               <property name="remoteRepositories" ref="defaultMavenRepositories" />
+       </bean>
+
+       <!-- Remote repositories -->
+       <util:list id="defaultMavenRepositories">
+               <ref local="central" />
+               <ref local="com.springsource.repository.bundles.external" />
+               <ref local="com.springsource.repository.bundles.release" />
+               <ref local="argeo" />
+               <ref local="argeo-snapshots" />
+       </util:list>
+
+       <bean id="central" class="org.argeo.slc.aether.spring.RemoteRepositoryFactory">
+               <property name="url" value="http://repo1.maven.org/maven2" />
+       </bean>
+       <bean id="com.springsource.repository.bundles.release" class="org.argeo.slc.aether.spring.RemoteRepositoryFactory">
+               <property name="url"
+                       value="http://repository.springsource.com/maven/bundles/release" />
+       </bean>
+       <bean id="com.springsource.repository.bundles.external" class="org.argeo.slc.aether.spring.RemoteRepositoryFactory">
+               <property name="url"
+                       value="http://repository.springsource.com/maven/bundles/external" />
+       </bean>
+       <bean id="argeo" class="org.argeo.slc.aether.spring.RemoteRepositoryFactory">
+               <property name="url" value="http://maven.argeo.org/argeo/" />
+       </bean>
+       <bean id="argeo-snapshots" class="org.argeo.slc.aether.spring.RemoteRepositoryFactory">
+               <property name="url" value="http://dev.argeo.org/maven/argeo-snapshots/" />
+       </bean>
+
+</beans>
\ No newline at end of file
index b6793cd8bfd7439a39564767a421375dd9c712c5..b5987612c5d9114f6c681014a3dea6c4b2041341 100644 (file)
@@ -7,6 +7,11 @@
        http://www.springframework.org/schema/beans   \r
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\r
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd">\r
+       <!-- <reference id="jcrRepository" interface="javax.jcr.Repository" /> -->\r
 \r
-       <reference id="jcrRepository" interface="javax.jcr.Repository" />\r
+       <!-- Maven -->\r
+       <reference id="mavenRepositorySystem" interface="org.sonatype.aether.RepositorySystem"\r
+               filter="(aether.repositorySystemType=maven)" />\r
+       <reference id="mavenRepositorySystemSession" interface="org.sonatype.aether.RepositorySystemSession"\r
+               filter="(aether.repositorySystemType=maven)" />\r
 </beans:beans>
\ No newline at end of file
diff --git a/runtime/org.argeo.slc.repo/pom.xml b/runtime/org.argeo.slc.repo/pom.xml
new file mode 100644 (file)
index 0000000..018e1cf
--- /dev/null
@@ -0,0 +1,42 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.slc</groupId>
+               <artifactId>runtime</artifactId>
+               <version>0.13.1-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <groupId>org.argeo.slc.runtime</groupId>
+       <artifactId>org.argeo.slc.repo</artifactId>
+       <name>SLC Repository</name>
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.apache.felix</groupId>
+                               <artifactId>maven-bundle-plugin</artifactId>
+                               <version>${version.maven-bundle-plugin}</version>
+                               <configuration>
+                                       <instructions>
+                                               <Export-Package>
+                                                       org.argeo.slc.repo.*
+                                               </Export-Package>
+                                       </instructions>
+                               </configuration>
+                       </plugin>
+               </plugins>
+       </build>
+       <dependencies>
+               <dependency>
+                       <groupId>org.argeo.slc.runtime</groupId>
+                       <artifactId>org.argeo.slc.support.aether</artifactId>
+                       <version>0.13.1-SNAPSHOT</version>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.slf4j</groupId>
+                       <artifactId>com.springsource.slf4j.org.apache.commons.logging</artifactId>
+               </dependency>
+
+       </dependencies>
+</project>
diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/ImportMavenDependencies.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/ImportMavenDependencies.java
new file mode 100644 (file)
index 0000000..8aff3de
--- /dev/null
@@ -0,0 +1,200 @@
+package org.argeo.slc.repo.maven;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.aether.AetherTemplate;
+import org.argeo.slc.aether.AetherUtils;
+import org.sonatype.aether.artifact.Artifact;
+import org.sonatype.aether.graph.DependencyNode;
+import org.sonatype.aether.util.artifact.DefaultArtifact;
+import org.sonatype.aether.util.graph.PreorderNodeListGenerator;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+public class ImportMavenDependencies implements Runnable {
+       private final static Log log = LogFactory
+                       .getLog(ImportMavenDependencies.class);
+
+       private AetherTemplate aetherTemplate;
+       private String rootCoordinates;
+       private Set<String> excludedArtifacts = new HashSet<String>();
+
+       public void run() {
+               try {
+                       Artifact pomArtifact = new DefaultArtifact(rootCoordinates);
+
+                       // {
+                       // DependencyNode node = aetherTemplate
+                       // .resolveDependencies(pomArtifact);
+                       //
+                       // PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
+                       // node.accept(nlg);
+                       //
+                       // for (Artifact artifact : nlg.getArtifacts(true)) {
+                       // log.debug(artifact);
+                       // }
+                       // AetherUtils.logDependencyNode(0, node);
+                       // }
+
+                       Comparator<Artifact> artifactComparator = new Comparator<Artifact>() {
+                               public int compare(Artifact o1, Artifact o2) {
+                                       return o1.getArtifactId().compareTo(o2.getArtifactId());
+                               }
+                       };
+
+                       Set<Artifact> registeredArtifacts = new TreeSet<Artifact>(
+                                       artifactComparator);
+                       parsePom(aetherTemplate, registeredArtifacts, pomArtifact);
+                       if (log.isDebugEnabled())
+                               log.debug("Gathered " + registeredArtifacts.size()
+                                               + " artifacts");
+
+                       // Resolve and add non-optional dependencies
+                       Set<Artifact> artifacts = new TreeSet<Artifact>(artifactComparator);
+                       for (Artifact artifact : registeredArtifacts) {
+                               try {
+                                       addArtifact(artifacts, artifact);
+                                       DependencyNode node = aetherTemplate
+                                                       .resolveDependencies(artifact);
+                                       addDependencies(artifacts, node);
+                               } catch (Exception e) {
+                                       log.error("Could not resolve dependencies of " + artifact
+                                                       + ": " + e.getCause().getMessage());
+                               }
+
+                       }
+
+                       if (log.isDebugEnabled())
+                               log.debug("Resolved " + artifacts.size() + " artifacts");
+                       Properties distributionDescriptor = new Properties();
+                       for (Artifact artifact : artifacts) {
+                               log.debug(artifact.getArtifactId() + " ["
+                                               + artifact.getVersion() + "]\t(" + artifact + ")");
+                               distributionDescriptor.setProperty(artifact.getArtifactId()
+                                               + ":" + artifact.getVersion(), artifact.toString());
+                       }
+
+                       ByteArrayOutputStream out = new ByteArrayOutputStream();
+                       distributionDescriptor.store(out, "");
+                       log.debug(new String(out.toByteArray()));
+                       out.close();
+               } catch (Exception e) {
+                       throw new SlcException("Cannot resolve", e);
+               }
+       }
+
+       /** Recursively adds non optional dependencies */
+       private void addDependencies(Set<Artifact> artifacts, DependencyNode node) {
+               for (DependencyNode child : node.getChildren()) {
+                       if (!child.getDependency().isOptional()) {
+                               addArtifact(artifacts, child.getDependency().getArtifact());
+                               addDependencies(artifacts, child);
+                       }
+               }
+       }
+
+       private void addArtifact(Set<Artifact> artifacts, Artifact artifact) {
+               if (!excludedArtifacts.contains(artifact.getGroupId() + ":"
+                               + artifact.getArtifactId()))
+                       artifacts.add(artifact);
+       }
+
+       /**
+        * Directly parses Maven POM XML format in order to find all artifacts
+        * references under the dependency and dependencyManagement tags. This is
+        * meant to migrate existing pom registering a lot of artifacts, not to
+        * replace Maven resolving.
+        */
+       protected void parsePom(AetherTemplate aetherTemplate,
+                       Set<Artifact> artifacts, Artifact pomArtifact) {
+               if (log.isDebugEnabled())
+                       log.debug("Gather dependencies for " + pomArtifact);
+
+               try {
+                       File file = aetherTemplate.getResolvedFile(pomArtifact);
+                       DocumentBuilder documentBuilder = DocumentBuilderFactory
+                                       .newInstance().newDocumentBuilder();
+                       Document doc = documentBuilder.parse(file);
+
+                       // properties
+                       Properties props = new Properties();
+                       props.setProperty("project.version", pomArtifact.getBaseVersion());
+                       NodeList properties = doc.getElementsByTagName("properties");
+                       if (properties.getLength() > 0) {
+                               NodeList propertiesElems = properties.item(0).getChildNodes();
+                               for (int i = 0; i < propertiesElems.getLength(); i++) {
+                                       if (propertiesElems.item(i) instanceof Element) {
+                                               Element property = (Element) propertiesElems.item(i);
+                                               props.put(property.getNodeName(),
+                                                               property.getTextContent());
+                                       }
+                               }
+                       }
+
+                       // dependencies (direct and dependencyManagement)
+                       NodeList dependencies = doc.getElementsByTagName("dependency");
+                       for (int i = 0; i < dependencies.getLength(); i++) {
+                               Element dependency = (Element) dependencies.item(i);
+                               String groupId = dependency.getElementsByTagName("groupId")
+                                               .item(0).getTextContent().trim();
+                               String artifactId = dependency
+                                               .getElementsByTagName("artifactId").item(0)
+                                               .getTextContent().trim();
+                               String version = dependency.getElementsByTagName("version")
+                                               .item(0).getTextContent().trim();
+                               if (version.startsWith("${")) {
+                                       String versionKey = version.substring(0,
+                                                       version.length() - 1).substring(2);
+                                       if (!props.containsKey(versionKey))
+                                               throw new SlcException("Cannot interpret version "
+                                                               + version);
+                                       version = props.getProperty(versionKey);
+                               }
+                               NodeList scopes = dependency.getElementsByTagName("scope");
+                               if (scopes.getLength() > 0
+                                               && scopes.item(0).getTextContent().equals("import")) {
+                                       // recurse
+                                       parsePom(aetherTemplate, artifacts, new DefaultArtifact(
+                                                       groupId, artifactId, "pom", version));
+                               } else {
+                                       // TODO: deal with scope?
+                                       // TODO: deal with type
+                                       String type = "jar";
+                                       Artifact artifact = new DefaultArtifact(groupId,
+                                                       artifactId, type, version);
+                                       artifacts.add(artifact);
+                               }
+                       }
+               } catch (Exception e) {
+                       throw new SlcException("Cannot process " + pomArtifact, e);
+               }
+       }
+
+       public void setAetherTemplate(AetherTemplate aetherTemplate) {
+               this.aetherTemplate = aetherTemplate;
+       }
+
+       public void setExcludedArtifacts(Set<String> excludedArtifactIds) {
+               this.excludedArtifacts = excludedArtifactIds;
+       }
+
+       public void setRootCoordinates(String rootCoordinates) {
+               this.rootCoordinates = rootCoordinates;
+       }
+
+}
index 6a10746d503a903d83d22d1a6bdb4845108f025d..331f53b5bc49e89018f86cf2b5d0ae52ba008d38 100644 (file)
@@ -18,7 +18,7 @@ package org.argeo.slc;
 \r
 /** Basis for all SLC exceptions. This is an unchecked exception. */\r
 public class SlcException extends RuntimeException {\r
-       static final long serialVersionUID = 1l;\r
+       private static final long serialVersionUID = 6373738619304106445L;\r
 \r
        /** Constructor. */\r
        public SlcException(String message) {\r
@@ -26,8 +26,8 @@ public class SlcException extends RuntimeException {
        }\r
 \r
        /** Constructor. */\r
-       public SlcException(String message, Throwable cause) {\r
-               super(message, cause);\r
+       public SlcException(String message, Throwable e) {\r
+               super(message, e);\r
        }\r
 \r
 }\r
diff --git a/runtime/org.argeo.slc.support.aether/.classpath b/runtime/org.argeo.slc.support.aether/.classpath
new file mode 100644 (file)
index 0000000..92f19d2
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src/main/java"/>
+       <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/runtime/org.argeo.slc.support.aether/.project b/runtime/org.argeo.slc.support.aether/.project
new file mode 100644 (file)
index 0000000..b96fdc2
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.slc.support.aether</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/runtime/org.argeo.slc.support.aether/.settings/org.eclipse.jdt.core.prefs b/runtime/org.argeo.slc.support.aether/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..e9b307c
--- /dev/null
@@ -0,0 +1,8 @@
+#Sun Feb 13 11:00:00 CET 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/runtime/org.argeo.slc.support.aether/.settings/org.eclipse.pde.core.prefs b/runtime/org.argeo.slc.support.aether/.settings/org.eclipse.pde.core.prefs
new file mode 100644 (file)
index 0000000..b90e5a5
--- /dev/null
@@ -0,0 +1,4 @@
+#Sun Feb 13 11:00:00 CET 2011
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/runtime/org.argeo.slc.support.aether/build.properties b/runtime/org.argeo.slc.support.aether/build.properties
new file mode 100644 (file)
index 0000000..5fc538b
--- /dev/null
@@ -0,0 +1,4 @@
+source.. = src/main/java/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .
diff --git a/runtime/org.argeo.slc.support.aether/pom.xml b/runtime/org.argeo.slc.support.aether/pom.xml
new file mode 100644 (file)
index 0000000..ca99693
--- /dev/null
@@ -0,0 +1,57 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.slc</groupId>
+               <artifactId>runtime</artifactId>
+               <version>0.13.1-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <groupId>org.argeo.slc.runtime</groupId>
+       <artifactId>org.argeo.slc.support.aether</artifactId>
+       <name>SLC Support Aether</name>
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.apache.felix</groupId>
+                               <artifactId>maven-bundle-plugin</artifactId>
+                               <version>${version.maven-bundle-plugin}</version>
+                               <configuration>
+                                       <instructions>
+                                               <Export-Package>
+                                                       org.argeo.slc.aether.*
+                                               </Export-Package>
+                                       </instructions>
+                               </configuration>
+                       </plugin>
+               </plugins>
+       </build>
+       <dependencies>
+               <dependency>
+                       <groupId>org.argeo.slc.runtime</groupId>
+                       <artifactId>org.argeo.slc.core</artifactId>
+                       <version>0.13.1-SNAPSHOT</version>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.argeo.dep.osgi</groupId>
+                       <artifactId>org.argeo.dep.osgi.aether</artifactId>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.springframework</groupId>
+                       <artifactId>org.springframework.beans</artifactId>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.slf4j</groupId>
+                       <artifactId>com.springsource.slf4j.org.apache.commons.logging</artifactId>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.eclipse.osgi</groupId>
+                       <artifactId>org.eclipse.osgi</artifactId>
+                       <scope>provided</scope>
+               </dependency>
+       </dependencies>
+</project>
diff --git a/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/AetherTemplate.java b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/AetherTemplate.java
new file mode 100644 (file)
index 0000000..c7b2c4b
--- /dev/null
@@ -0,0 +1,100 @@
+package org.argeo.slc.aether;
+
+import java.io.File;
+import java.util.List;
+
+import org.argeo.slc.SlcException;
+import org.sonatype.aether.RepositorySystem;
+import org.sonatype.aether.RepositorySystemSession;
+import org.sonatype.aether.artifact.Artifact;
+import org.sonatype.aether.collection.CollectRequest;
+import org.sonatype.aether.graph.Dependency;
+import org.sonatype.aether.graph.DependencyNode;
+import org.sonatype.aether.repository.RemoteRepository;
+import org.sonatype.aether.resolution.ArtifactRequest;
+import org.sonatype.aether.resolution.ArtifactResolutionException;
+import org.sonatype.aether.resolution.ArtifactResult;
+
+/** Simplifies access to Aether. */
+public class AetherTemplate {
+       private RepositorySystem repositorySystem;
+       private RepositorySystemSession repositorySystemSession;
+       private List<RemoteRepository> remoteRepositories;
+
+       /** Resolves the artifact in order to give access to its file. */
+       public File getResolvedFile(Artifact artifact) {
+               try {
+                       ArtifactRequest artifactRequest = new ArtifactRequest(artifact,
+                                       remoteRepositories, null);
+                       ArtifactResult result = repositorySystem.resolveArtifact(
+                                       repositorySystemSession, artifactRequest);
+                       return result.getArtifact().getFile();
+               } catch (ArtifactResolutionException e) {
+                       throw new SlcException("Cannot resolve " + artifact, e);
+               }
+       }
+
+       /**
+        * Transitively resolves the dependencies of this artifact (with scope
+        * 'compile')
+        * 
+        * @param artifact
+        *            the artifact to resolve
+        */
+       public DependencyNode resolveDependencies(Artifact artifact) {
+               return resolveDependencies(artifact, "compile");
+       }
+
+       /**
+        * Transitively resolves the dependencies of this artifact.
+        * 
+        * @param artifact
+        *            the artifact to resolve
+        * @param scope
+        *            the scope
+        */
+       public DependencyNode resolveDependencies(Artifact artifact, String scope) {
+               try {
+                       Dependency dependency = new Dependency(artifact, scope);
+                       CollectRequest collectRequest = new CollectRequest();
+                       collectRequest.setRoot(dependency);
+                       for (RemoteRepository remoteRepository : remoteRepositories)
+                               collectRequest.addRepository(remoteRepository);
+                       DependencyNode node = repositorySystem.collectDependencies(
+                                       repositorySystemSession, collectRequest).getRoot();
+
+                       repositorySystem.resolveDependencies(repositorySystemSession, node,
+                                       null);
+                       return node;
+               } catch (Exception e) {
+                       throw new SlcException("Cannot resolve dependencies of " + artifact
+                                       + " (scope: " + scope + ")", e);
+               }
+       }
+
+       public RepositorySystem getRepositorySystem() {
+               return repositorySystem;
+       }
+
+       public void setRepositorySystem(RepositorySystem repositorySystem) {
+               this.repositorySystem = repositorySystem;
+       }
+
+       public RepositorySystemSession getRepositorySystemSession() {
+               return repositorySystemSession;
+       }
+
+       public void setRepositorySystemSession(
+                       RepositorySystemSession repositorySystemSession) {
+               this.repositorySystemSession = repositorySystemSession;
+       }
+
+       public List<RemoteRepository> getRemoteRepositories() {
+               return remoteRepositories;
+       }
+
+       public void setRemoteRepositories(List<RemoteRepository> remoteRepositories) {
+               this.remoteRepositories = remoteRepositories;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/AetherUtils.java b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/AetherUtils.java
new file mode 100644 (file)
index 0000000..c088afe
--- /dev/null
@@ -0,0 +1,32 @@
+package org.argeo.slc.aether;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.sonatype.aether.artifact.Artifact;
+import org.sonatype.aether.graph.DependencyNode;
+
+/** Utilities related to Aether */
+public class AetherUtils {
+       private final static Log log = LogFactory.getLog(AetherUtils.class);
+
+       /** Logs a dependency node and its transitive dependencies as a tree. */
+       public static void logDependencyNode(int depth,
+                       DependencyNode dependencyNode) {
+               if (!log.isDebugEnabled())
+                       return;
+
+               StringBuffer prefix = new StringBuffer(depth * 2 + 2);
+               // prefix.append("|-");
+               for (int i = 0; i < depth * 2; i++) {
+                       prefix.append(' ');
+               }
+               Artifact artifact = dependencyNode.getDependency().getArtifact();
+               log.debug(prefix + "|-> " + artifact.getArtifactId() + " ["
+                               + artifact.getVersion() + "]"
+                               + (dependencyNode.getDependency().isOptional() ? " ?" : ""));
+               for (DependencyNode child : dependencyNode.getChildren()) {
+                       logDependencyNode(depth + 1, child);
+               }
+       }
+
+}
diff --git a/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/ConsoleRepositoryListener.java b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/ConsoleRepositoryListener.java
new file mode 100644 (file)
index 0000000..718045d
--- /dev/null
@@ -0,0 +1,112 @@
+package org.argeo.slc.aether;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.sonatype.aether.AbstractRepositoryListener;
+import org.sonatype.aether.RepositoryEvent;
+
+public class ConsoleRepositoryListener extends AbstractRepositoryListener {
+
+       private final static Log log = LogFactory
+                       .getLog(ConsoleRepositoryListener.class);
+
+       public void artifactDeployed(RepositoryEvent event) {
+               if (log.isDebugEnabled())
+                       log.debug("Deployed " + event.getArtifact() + " to "
+                                       + event.getRepository());
+       }
+
+       public void artifactDeploying(RepositoryEvent event) {
+               if (log.isTraceEnabled())
+                       log.trace("Deploying " + event.getArtifact() + " to "
+                                       + event.getRepository());
+       }
+
+       public void artifactDescriptorInvalid(RepositoryEvent event) {
+               if (log.isDebugEnabled())
+                       log.warn("Invalid artifact descriptor for " + event.getArtifact()
+                                       + ": " + event.getException().getMessage());
+       }
+
+       public void artifactDescriptorMissing(RepositoryEvent event) {
+               if (log.isTraceEnabled())
+                       log.warn("Missing artifact descriptor for " + event.getArtifact());
+       }
+
+       public void artifactInstalled(RepositoryEvent event) {
+               if (log.isDebugEnabled())
+                       log.debug("Installed " + event.getArtifact() + " to "
+                                       + event.getFile());
+       }
+
+       public void artifactInstalling(RepositoryEvent event) {
+               if (log.isTraceEnabled())
+                       log.trace("Installing " + event.getArtifact() + " to "
+                                       + event.getFile());
+       }
+
+       public void artifactResolved(RepositoryEvent event) {
+               if (log.isTraceEnabled())
+                       log.trace("Resolved artifact " + event.getArtifact() + " from "
+                                       + event.getRepository());
+       }
+
+       public void artifactDownloading(RepositoryEvent event) {
+               if (log.isTraceEnabled())
+                       log.trace("Downloading artifact " + event.getArtifact() + " from "
+                                       + event.getRepository());
+       }
+
+       public void artifactDownloaded(RepositoryEvent event) {
+               if (log.isDebugEnabled())
+                       log.debug("Downloaded artifact " + event.getArtifact() + " from "
+                                       + event.getRepository());
+       }
+
+       public void artifactResolving(RepositoryEvent event) {
+               if (log.isTraceEnabled())
+                       log.trace("Resolving artifact " + event.getArtifact());
+       }
+
+       public void metadataDeployed(RepositoryEvent event) {
+               if (log.isDebugEnabled())
+                       log.debug("Deployed " + event.getMetadata() + " to "
+                                       + event.getRepository());
+       }
+
+       public void metadataDeploying(RepositoryEvent event) {
+               if (log.isTraceEnabled())
+                       log.trace("Deploying " + event.getMetadata() + " to "
+                                       + event.getRepository());
+       }
+
+       public void metadataInstalled(RepositoryEvent event) {
+               if (log.isDebugEnabled())
+                       log.debug("Installed " + event.getMetadata() + " to "
+                                       + event.getFile());
+       }
+
+       public void metadataInstalling(RepositoryEvent event) {
+               if (log.isTraceEnabled())
+                       log.trace("Installing " + event.getMetadata() + " to "
+                                       + event.getFile());
+       }
+
+       public void metadataInvalid(RepositoryEvent event) {
+               if (log.isDebugEnabled())
+                       log.debug("Invalid metadata " + event.getMetadata());
+       }
+
+       public void metadataResolved(RepositoryEvent event) {
+               if (log.isTraceEnabled())
+                       log.trace("Resolved metadata " + event.getMetadata() + " from "
+                                       + event.getRepository());
+       }
+
+       public void metadataResolving(RepositoryEvent event) {
+               if (log.isTraceEnabled())
+                       log.trace("Resolving metadata " + event.getMetadata() + " from "
+                                       + event.getRepository());
+       }
+
+}
diff --git a/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/ConsoleTransferListener.java b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/ConsoleTransferListener.java
new file mode 100644 (file)
index 0000000..921e0e4
--- /dev/null
@@ -0,0 +1,139 @@
+package org.argeo.slc.aether;
+
+import java.io.PrintStream;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.sonatype.aether.transfer.AbstractTransferListener;
+import org.sonatype.aether.transfer.TransferEvent;
+import org.sonatype.aether.transfer.TransferResource;
+
+public class ConsoleTransferListener extends AbstractTransferListener {
+       private final static Log log = LogFactory
+                       .getLog(ConsoleTransferListener.class);
+
+       private PrintStream out;
+
+       private Map<TransferResource, Long> downloads = new ConcurrentHashMap<TransferResource, Long>();
+
+       private int lastLength;
+
+       public ConsoleTransferListener(PrintStream out) {
+               this.out = (out != null) ? out : System.out;
+       }
+
+       @Override
+       public void transferInitiated(TransferEvent event) {
+               String message = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading"
+                               : "Downloading";
+
+               if (log.isDebugEnabled())
+                       log.debug(message + ": " + event.getResource().getRepositoryUrl()
+                                       + event.getResource().getResourceName());
+       }
+
+       @Override
+       public void transferProgressed(TransferEvent event) {
+               TransferResource resource = event.getResource();
+               downloads.put(resource, Long.valueOf(event.getTransferredBytes()));
+
+               StringBuilder buffer = new StringBuilder(64);
+
+               for (Map.Entry<TransferResource, Long> entry : downloads.entrySet()) {
+                       long total = entry.getKey().getContentLength();
+                       long complete = entry.getValue().longValue();
+
+                       buffer.append(getStatus(complete, total)).append("  ");
+               }
+
+               int pad = lastLength - buffer.length();
+               lastLength = buffer.length();
+               pad(buffer, pad);
+               buffer.append('\r');
+
+               out.print(buffer);
+       }
+
+       private String getStatus(long complete, long total) {
+               if (total >= 1024) {
+                       return toKB(complete) + "/" + toKB(total) + " KB ";
+               } else if (total >= 0) {
+                       return complete + "/" + total + " B ";
+               } else if (complete >= 1024) {
+                       return toKB(complete) + " KB ";
+               } else {
+                       return complete + " B ";
+               }
+       }
+
+       private void pad(StringBuilder buffer, int spaces) {
+               String block = "                                        ";
+               while (spaces > 0) {
+                       int n = Math.min(spaces, block.length());
+                       buffer.append(block, 0, n);
+                       spaces -= n;
+               }
+       }
+
+       @Override
+       public void transferSucceeded(TransferEvent event) {
+               transferCompleted(event);
+
+               TransferResource resource = event.getResource();
+               long contentLength = event.getTransferredBytes();
+               if (contentLength >= 0) {
+                       String type = (event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded"
+                                       : "Downloaded");
+                       String len = contentLength >= 1024 ? toKB(contentLength) + " KB"
+                                       : contentLength + " B";
+
+                       String throughput = "";
+                       long duration = System.currentTimeMillis()
+                                       - resource.getTransferStartTime();
+                       if (duration > 0) {
+                               DecimalFormat format = new DecimalFormat("0.0",
+                                               new DecimalFormatSymbols(Locale.ENGLISH));
+                               double kbPerSec = (contentLength / 1024.0)
+                                               / (duration / 1000.0);
+                               throughput = " at " + format.format(kbPerSec) + " KB/sec";
+                       }
+
+                       out.println(type + ": " + resource.getRepositoryUrl()
+                                       + resource.getResourceName() + " (" + len + throughput
+                                       + ")");
+               }
+       }
+
+       @Override
+       public void transferFailed(TransferEvent event) {
+               transferCompleted(event);
+
+               log.error(event.getException().getMessage()
+                               + (event.getException().getCause() != null ? " : "
+                                               + event.getException().getCause().getMessage() : ""));
+               // event.getException().printStackTrace( out );
+       }
+
+       private void transferCompleted(TransferEvent event) {
+               downloads.remove(event.getResource());
+
+               StringBuilder buffer = new StringBuilder(64);
+               pad(buffer, lastLength);
+               buffer.append('\r');
+               out.print(buffer);
+       }
+
+       public void transferCorrupted(TransferEvent event) {
+               event.getException().printStackTrace(out);
+       }
+
+       protected long toKB(long bytes) {
+               return (bytes + 1023) / 1024;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/SimpleArtifactDescriptorReader.java b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/SimpleArtifactDescriptorReader.java
new file mode 100644 (file)
index 0000000..d7e9729
--- /dev/null
@@ -0,0 +1,18 @@
+package org.argeo.slc.aether;
+
+import org.sonatype.aether.RepositorySystemSession;
+import org.sonatype.aether.impl.ArtifactDescriptorReader;
+import org.sonatype.aether.resolution.ArtifactDescriptorException;
+import org.sonatype.aether.resolution.ArtifactDescriptorRequest;
+import org.sonatype.aether.resolution.ArtifactDescriptorResult;
+
+public class SimpleArtifactDescriptorReader implements ArtifactDescriptorReader {
+
+       public ArtifactDescriptorResult readArtifactDescriptor(
+                       RepositorySystemSession session, ArtifactDescriptorRequest request)
+                       throws ArtifactDescriptorException {
+               ArtifactDescriptorResult result = new ArtifactDescriptorResult(request);
+               return result;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/SimpleVersionRangeResolver.java b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/SimpleVersionRangeResolver.java
new file mode 100644 (file)
index 0000000..7c74447
--- /dev/null
@@ -0,0 +1,22 @@
+package org.argeo.slc.aether;
+
+import org.argeo.slc.aether.osgi.OsgiVersion;
+import org.sonatype.aether.RepositorySystemSession;
+import org.sonatype.aether.impl.VersionRangeResolver;
+import org.sonatype.aether.resolution.VersionRangeRequest;
+import org.sonatype.aether.resolution.VersionRangeResolutionException;
+import org.sonatype.aether.resolution.VersionRangeResult;
+import org.sonatype.aether.version.Version;
+
+public class SimpleVersionRangeResolver implements VersionRangeResolver {
+
+       public VersionRangeResult resolveVersionRange(
+                       RepositorySystemSession session, VersionRangeRequest request)
+                       throws VersionRangeResolutionException {
+               VersionRangeResult versionRangeResult = new VersionRangeResult(request);
+               Version version = new OsgiVersion(request.getArtifact()
+                               .getBaseVersion());
+               versionRangeResult.addVersion(version);
+               return null;
+       }
+}
diff --git a/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/SimpleVersionResolver.java b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/SimpleVersionResolver.java
new file mode 100644 (file)
index 0000000..f67973f
--- /dev/null
@@ -0,0 +1,18 @@
+package org.argeo.slc.aether;
+
+import org.sonatype.aether.RepositorySystemSession;
+import org.sonatype.aether.impl.VersionResolver;
+import org.sonatype.aether.resolution.VersionRequest;
+import org.sonatype.aether.resolution.VersionResolutionException;
+import org.sonatype.aether.resolution.VersionResult;
+
+public class SimpleVersionResolver implements VersionResolver {
+
+       public VersionResult resolveVersion(RepositorySystemSession session,
+                       VersionRequest request) throws VersionResolutionException {
+               VersionResult versionResult = new VersionResult(request);
+               versionResult.setVersion(request.getArtifact().getBaseVersion());
+               return versionResult;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/osgi/OsgiVersion.java b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/osgi/OsgiVersion.java
new file mode 100644 (file)
index 0000000..0486968
--- /dev/null
@@ -0,0 +1,26 @@
+package org.argeo.slc.aether.osgi;
+
+import org.osgi.framework.Version;
+
+/**
+ * Wraps an OSGi {@link Version} as an Aether
+ * {@link org.sonatype.aether.version.Version}.
+ */
+public class OsgiVersion implements org.sonatype.aether.version.Version {
+       final private Version version;
+
+       public OsgiVersion(String str) {
+               version = Version.parseVersion(str);
+       }
+
+       public Version getVersion() {
+               return version;
+       }
+
+       public int compareTo(org.sonatype.aether.version.Version v) {
+               if (!(v instanceof OsgiVersion))
+                       return 0;
+               OsgiVersion ov = (OsgiVersion) v;
+               return version.compareTo(ov.version);
+       }
+}
diff --git a/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/spring/RemoteRepositoryFactory.java b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/spring/RemoteRepositoryFactory.java
new file mode 100644 (file)
index 0000000..d945b3a
--- /dev/null
@@ -0,0 +1,43 @@
+package org.argeo.slc.aether.spring;
+
+import org.sonatype.aether.repository.RemoteRepository;
+import org.springframework.beans.factory.BeanNameAware;
+import org.springframework.beans.factory.FactoryBean;
+
+/** Simplifies the definition of a remote factory using Spring */
+public class RemoteRepositoryFactory implements BeanNameAware, FactoryBean {
+       private String beanName;
+       private String id;
+       private String url;
+       private String type = "default";
+
+       public Object getObject() throws Exception {
+               return new RemoteRepository(id != null ? id : beanName, type, url);
+       }
+
+       public Class<?> getObjectType() {
+               return RemoteRepository.class;
+       }
+
+       public boolean isSingleton() {
+               return true;
+       }
+
+       public void setBeanName(String name) {
+               this.beanName = name;
+
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public void setUrl(String url) {
+               this.url = url;
+       }
+
+       public void setType(String type) {
+               this.type = type;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.support.maven/META-INF/spring/maven-osgi.xml b/runtime/org.argeo.slc.support.maven/META-INF/spring/maven-osgi.xml
new file mode 100644 (file)
index 0000000..b5bf157
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"\r
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"\r
+       xsi:schemaLocation="http://www.springframework.org/schema/osgi  \r
+       http://www.springframework.org/schema/osgi/spring-osgi-1.1.xsd\r
+       http://www.springframework.org/schema/beans   \r
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">\r
+\r
+       <service ref="mavenRepositorySystem" interface="org.sonatype.aether.RepositorySystem">\r
+               <service-properties>\r
+                       <beans:entry key="aether.repositorySystemType" value="maven" />\r
+               </service-properties>\r
+       </service>\r
+\r
+       <service ref="defaultMavenRepositorySystemSession" interface="org.sonatype.aether.RepositorySystemSession">\r
+               <service-properties>\r
+                       <beans:entry key="aether.repositorySystemType" value="maven" />\r
+               </service-properties>\r
+       </service>\r
+</beans:beans>
\ No newline at end of file
diff --git a/runtime/org.argeo.slc.support.maven/META-INF/spring/maven.xml b/runtime/org.argeo.slc.support.maven/META-INF/spring/maven.xml
new file mode 100644 (file)
index 0000000..6c21a5e
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+
+       <bean id="mavenRepositorySystem" class="org.argeo.slc.maven.MavenManager"
+               factory-method="createRepositorySystem">
+       </bean>
+
+       <bean id="defaultMavenRepositorySystemSession" class="org.argeo.slc.maven.MavenManager"
+               factory-method="createRepositorySystemSession">
+               <constructor-arg ref="mavenRepositorySystem" />
+       </bean>
+</beans>
\ No newline at end of file
index 35fc706825044bc6a1d3176cf7654a8182ee57d6..e2d5575699b88a70561c7109380cfec16c22c6bc 100644 (file)
                        <artifactId>org.argeo.slc.specs</artifactId>
                        <version>${project.version}</version>
                </dependency>
+               <dependency>
+                       <groupId>org.argeo.slc.runtime</groupId>
+                       <artifactId>org.argeo.slc.support.aether</artifactId>
+                       <version>${project.version}</version>
+               </dependency>
+               
                <!-- <dependency> <groupId>org.argeo.dep.osgi</groupId> <artifactId>org.argeo.dep.osgi.maven.embedder</artifactId> 
                        </dependency> -->
                <dependency>
diff --git a/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/ConsoleRepositoryListener.java b/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/ConsoleRepositoryListener.java
deleted file mode 100644 (file)
index e10d6de..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.argeo.slc.maven;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.sonatype.aether.AbstractRepositoryListener;
-import org.sonatype.aether.RepositoryEvent;
-
-public class ConsoleRepositoryListener extends AbstractRepositoryListener {
-
-       private final static Log log = LogFactory
-                       .getLog(ConsoleRepositoryListener.class);
-
-       public void artifactDeployed(RepositoryEvent event) {
-               if (log.isDebugEnabled())
-                       log.debug("Deployed " + event.getArtifact() + " to "
-                                       + event.getRepository());
-       }
-
-       public void artifactDeploying(RepositoryEvent event) {
-               if (log.isTraceEnabled())
-                       log.trace("Deploying " + event.getArtifact() + " to "
-                                       + event.getRepository());
-       }
-
-       public void artifactDescriptorInvalid(RepositoryEvent event) {
-               if (log.isDebugEnabled())
-                       log.warn("Invalid artifact descriptor for " + event.getArtifact()
-                                       + ": " + event.getException().getMessage());
-       }
-
-       public void artifactDescriptorMissing(RepositoryEvent event) {
-               if (log.isDebugEnabled())
-                       log.warn("Missing artifact descriptor for " + event.getArtifact());
-       }
-
-       public void artifactInstalled(RepositoryEvent event) {
-               if (log.isDebugEnabled())
-                       log.debug("Installed " + event.getArtifact() + " to "
-                                       + event.getFile());
-       }
-
-       public void artifactInstalling(RepositoryEvent event) {
-               if (log.isTraceEnabled())
-                       log.trace("Installing " + event.getArtifact() + " to "
-                                       + event.getFile());
-       }
-
-       public void artifactResolved(RepositoryEvent event) {
-               if (log.isTraceEnabled())
-                       log.trace("Resolved artifact " + event.getArtifact() + " from "
-                                       + event.getRepository());
-       }
-
-       public void artifactDownloading(RepositoryEvent event) {
-               if (log.isTraceEnabled())
-                       log.trace("Downloading artifact " + event.getArtifact() + " from "
-                                       + event.getRepository());
-       }
-
-       public void artifactDownloaded(RepositoryEvent event) {
-               if (log.isDebugEnabled())
-                       log.debug("Downloaded artifact " + event.getArtifact() + " from "
-                                       + event.getRepository());
-       }
-
-       public void artifactResolving(RepositoryEvent event) {
-               if (log.isTraceEnabled())
-                       log.trace("Resolving artifact " + event.getArtifact());
-       }
-
-       public void metadataDeployed(RepositoryEvent event) {
-               if (log.isDebugEnabled())
-                       log.debug("Deployed " + event.getMetadata() + " to "
-                                       + event.getRepository());
-       }
-
-       public void metadataDeploying(RepositoryEvent event) {
-               if (log.isTraceEnabled())
-                       log.trace("Deploying " + event.getMetadata() + " to "
-                                       + event.getRepository());
-       }
-
-       public void metadataInstalled(RepositoryEvent event) {
-               if (log.isDebugEnabled())
-                       log.debug("Installed " + event.getMetadata() + " to "
-                                       + event.getFile());
-       }
-
-       public void metadataInstalling(RepositoryEvent event) {
-               if (log.isTraceEnabled())
-                       log.trace("Installing " + event.getMetadata() + " to "
-                                       + event.getFile());
-       }
-
-       public void metadataInvalid(RepositoryEvent event) {
-               if (log.isDebugEnabled())
-                       log.debug("Invalid metadata " + event.getMetadata());
-       }
-
-       public void metadataResolved(RepositoryEvent event) {
-               if (log.isTraceEnabled())
-                       log.trace("Resolved metadata " + event.getMetadata() + " from "
-                                       + event.getRepository());
-       }
-
-       public void metadataResolving(RepositoryEvent event) {
-               if (log.isTraceEnabled())
-                       log.trace("Resolving metadata " + event.getMetadata() + " from "
-                                       + event.getRepository());
-       }
-
-}
diff --git a/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/ConsoleTransferListener.java b/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/ConsoleTransferListener.java
deleted file mode 100644 (file)
index b60da8f..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-package org.argeo.slc.maven;
-
-/*******************************************************************************
- * Copyright (c) 2010 Sonatype, Inc.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-import java.io.PrintStream;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.util.Locale;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.sonatype.aether.transfer.AbstractTransferListener;
-import org.sonatype.aether.transfer.TransferEvent;
-import org.sonatype.aether.transfer.TransferResource;
-
-public class ConsoleTransferListener
-    extends AbstractTransferListener
-{
-
-    private PrintStream out;
-
-    private Map<TransferResource, Long> downloads = new ConcurrentHashMap<TransferResource, Long>();
-
-    private int lastLength;
-
-    public ConsoleTransferListener( PrintStream out )
-    {
-        this.out = ( out != null ) ? out : System.out;
-    }
-
-    @Override
-    public void transferInitiated( TransferEvent event )
-    {
-        String message = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading";
-
-        out.println( message + ": " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName() );
-    }
-
-    @Override
-    public void transferProgressed( TransferEvent event )
-    {
-        TransferResource resource = event.getResource();
-        downloads.put( resource, Long.valueOf( event.getTransferredBytes() ) );
-
-        StringBuilder buffer = new StringBuilder( 64 );
-
-        for ( Map.Entry<TransferResource, Long> entry : downloads.entrySet() )
-        {
-            long total = entry.getKey().getContentLength();
-            long complete = entry.getValue().longValue();
-
-            buffer.append( getStatus( complete, total ) ).append( "  " );
-        }
-
-        int pad = lastLength - buffer.length();
-        lastLength = buffer.length();
-        pad( buffer, pad );
-        buffer.append( '\r' );
-
-        out.print( buffer );
-    }
-
-    private String getStatus( long complete, long total )
-    {
-        if ( total >= 1024 )
-        {
-            return toKB( complete ) + "/" + toKB( total ) + " KB ";
-        }
-        else if ( total >= 0 )
-        {
-            return complete + "/" + total + " B ";
-        }
-        else if ( complete >= 1024 )
-        {
-            return toKB( complete ) + " KB ";
-        }
-        else
-        {
-            return complete + " B ";
-        }
-    }
-
-    private void pad( StringBuilder buffer, int spaces )
-    {
-        String block = "                                        ";
-        while ( spaces > 0 )
-        {
-            int n = Math.min( spaces, block.length() );
-            buffer.append( block, 0, n );
-            spaces -= n;
-        }
-    }
-
-    @Override
-    public void transferSucceeded( TransferEvent event )
-    {
-        transferCompleted( event );
-
-        TransferResource resource = event.getResource();
-        long contentLength = event.getTransferredBytes();
-        if ( contentLength >= 0 )
-        {
-            String type = ( event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded" : "Downloaded" );
-            String len = contentLength >= 1024 ? toKB( contentLength ) + " KB" : contentLength + " B";
-
-            String throughput = "";
-            long duration = System.currentTimeMillis() - resource.getTransferStartTime();
-            if ( duration > 0 )
-            {
-                DecimalFormat format = new DecimalFormat( "0.0", new DecimalFormatSymbols( Locale.ENGLISH ) );
-                double kbPerSec = ( contentLength / 1024.0 ) / ( duration / 1000.0 );
-                throughput = " at " + format.format( kbPerSec ) + " KB/sec";
-            }
-
-            out.println( type + ": " + resource.getRepositoryUrl() + resource.getResourceName() + " (" + len
-                + throughput + ")" );
-        }
-    }
-
-    @Override
-    public void transferFailed( TransferEvent event )
-    {
-        transferCompleted( event );
-
-        event.getException().printStackTrace( out );
-    }
-
-    private void transferCompleted( TransferEvent event )
-    {
-        downloads.remove( event.getResource() );
-
-        StringBuilder buffer = new StringBuilder( 64 );
-        pad( buffer, lastLength );
-        buffer.append( '\r' );
-        out.print( buffer );
-    }
-
-    public void transferCorrupted( TransferEvent event )
-    {
-        event.getException().printStackTrace( out );
-    }
-
-    protected long toKB( long bytes )
-    {
-        return ( bytes + 1023 ) / 1024;
-    }
-
-}
index 2a39452edb4825788a0fc3ce4c43c3cd784ab98e..d3f4f4389feb7a04380f58bcd8c4f7cea4e6fabf 100644 (file)
@@ -22,6 +22,9 @@ import org.apache.maven.cli.MavenCli;
 import org.apache.maven.repository.internal.DefaultServiceLocator;\r
 import org.apache.maven.repository.internal.MavenRepositorySystemSession;\r
 import org.argeo.slc.SlcException;\r
+import org.argeo.slc.aether.AetherUtils;\r
+import org.argeo.slc.aether.ConsoleRepositoryListener;\r
+import org.argeo.slc.aether.ConsoleTransferListener;\r
 import org.codehaus.plexus.PlexusContainer;\r
 import org.sonatype.aether.RepositorySystem;\r
 import org.sonatype.aether.RepositorySystemSession;\r
@@ -36,6 +39,7 @@ import org.sonatype.aether.repository.RemoteRepository;
 import org.sonatype.aether.spi.connector.RepositoryConnectorFactory;\r
 import org.sonatype.aether.util.artifact.DefaultArtifact;\r
 import org.sonatype.aether.util.graph.PreorderNodeListGenerator;\r
+import org.sonatype.aether.util.graph.selector.OptionalDependencySelector;\r
 \r
 public class MavenManager {\r
        private final static Log log = LogFactory.getLog(MavenManager.class);\r
@@ -100,9 +104,9 @@ public class MavenManager {
 \r
        public void testAether() {\r
                try {\r
-                       RepositorySystem repoSystem = newRepositorySystem();\r
+                       RepositorySystem repoSystem = createRepositorySystem();\r
 \r
-                       RepositorySystemSession session = newSession(repoSystem);\r
+                       RepositorySystemSession session = createRepositorySystemSession(repoSystem);\r
 \r
                        Dependency dependency = new Dependency(new DefaultArtifact(\r
                                        "org.argeo.slc.dep:org.argeo.slc.dep.sdk:0.13.1-SNAPSHOT"),\r
@@ -129,29 +133,17 @@ public class MavenManager {
                                log.debug(artifact);\r
                        }\r
 \r
-                       logDependencyNode(0, node);\r
+                       AetherUtils.logDependencyNode(0, node);\r
                        // System.out.println(nlg.getClassPath());\r
-                       \r
+\r
                } catch (Exception e) {\r
                        throw new SlcException("Cannot resolve", e);\r
                }\r
 \r
        }\r
 \r
-       private void logDependencyNode(int depth, DependencyNode dependencyNode) {\r
-               StringBuffer prefix = new StringBuffer(depth * 2 + 2);\r
-               // prefix.append("|-");\r
-               for (int i = 0; i < depth * 2; i++) {\r
-                       prefix.append(' ');\r
-               }\r
-               Artifact artifact = dependencyNode.getDependency().getArtifact();\r
-               log.debug(prefix + "|-> " + artifact.getArtifactId() + " ["\r
-                               + artifact.getVersion() + "]");\r
-               for (DependencyNode child : dependencyNode.getChildren())\r
-                       logDependencyNode(depth + 1, child);\r
-       }\r
-\r
-       private RepositorySystem newRepositorySystem() {\r
+       /** Creates a Maven {@link RepositorySystem}. */\r
+       public static RepositorySystem createRepositorySystem() {\r
                try {\r
                        // return new\r
                        // DefaultPlexusContainer().lookup(RepositorySystem.class);\r
@@ -168,7 +160,8 @@ public class MavenManager {
                }\r
        }\r
 \r
-       private RepositorySystemSession newSession(RepositorySystem system) {\r
+       public static RepositorySystemSession createRepositorySystemSession(\r
+                       RepositorySystem system) {\r
                MavenRepositorySystemSession session = new MavenRepositorySystemSession();\r
 \r
                LocalRepository localRepo = new LocalRepository(\r
@@ -177,7 +170,6 @@ public class MavenManager {
                                .newLocalRepositoryManager(localRepo));\r
                session.setTransferListener(new ConsoleTransferListener(System.out));\r
                session.setRepositoryListener(new ConsoleRepositoryListener());\r
-\r
                return session;\r
        }\r
 \r
@@ -198,135 +190,4 @@ public class MavenManager {
                }\r
 \r
        }\r
-       /*\r
-        * private final Log log = LogFactory.getLog(getClass());\r
-        * \r
-        * private String localRepositoryPath = System.getProperty("user.home") +\r
-        * File.separator + ".m2" + File.separator + "repository";\r
-        * \r
-        * private ArtifactRepository localRepository; private\r
-        * List<ArtifactRepository> remoteRepositoriesInternal; private\r
-        * List<RemoteRepository> remoteRepositories = new\r
-        * Vector<RemoteRepository>();\r
-        * \r
-        * private MavenEmbedder mavenEmbedder; private ClassLoader classLoader;\r
-        * private Boolean offline = false;\r
-        * \r
-        * public void init() { try { mavenEmbedder = new SlcMavenEmbedder();\r
-        * mavenEmbedder.setOffline(offline); //\r
-        * mavenEmbedder.setAlignWithUserInstallation(true); if (classLoader !=\r
-        * null) mavenEmbedder.setClassLoader(classLoader); else\r
-        * mavenEmbedder.setClassLoader(getClass().getClassLoader()); // else //\r
-        * mavenEmbedder.setClassLoader(Thread.currentThread() //\r
-        * .getContextClassLoader()); mavenEmbedder.start();\r
-        * \r
-        * mavenEmbedder.setLocalRepositoryDirectory(new File(\r
-        * localRepositoryPath));\r
-        * \r
-        * localRepository = mavenEmbedder.getLocalRepository();\r
-        * \r
-        * remoteRepositoriesInternal = new Vector<ArtifactRepository>(); for\r
-        * (RemoteRepository remoteRepository : remoteRepositories) {\r
-        * \r
-        * ArtifactRepository repository = mavenEmbedder.createRepository(\r
-        * remoteRepository.getUrl(), remoteRepository.getId());\r
-        * remoteRepositoriesInternal.add(repository); }\r
-        * \r
-        * MavenFile mavenFile = new MavenFile();\r
-        * mavenFile.setGroupId("org.argeo.slc.dist");\r
-        * mavenFile.setArtifactId("org.argeo.slc.sdk");\r
-        * mavenFile.setVersion("0.12.2-SNAPSHOT"); mavenFile.setType("pom");\r
-        * Artifact artifact = resolve(mavenFile); log.debug("Location of " +\r
-        * artifact + " : " + artifact.getFile()); // log.debug("Dependencies of " +\r
-        * artifact); // for (Object obj : artifact.getDependencyTrail()) { //\r
-        * log.debug("  " + obj); // }\r
-        * \r
-        * File pomFile = new File(\r
-        * "/home/mbaudier/dev/src/slc/dist/org.argeo.slc.sdk/pom.xml");\r
-        * MavenProject project = mavenEmbedder\r
-        * .readProjectWithDependencies(pomFile); // MavenProject project =\r
-        * mavenEmbedder // .readProjectWithDependencies(artifact.getFile());\r
-        * \r
-        * // EventMonitor eventMonitor = new EventMonitor() { // // public void\r
-        * startEvent(String eventName, String target, // long timestamp) { //\r
-        * log.debug(eventName + ", " + target + ", " + timestamp); // } // //\r
-        * public void errorEvent(String eventName, String target, // long\r
-        * timestamp, Throwable cause) { // log.debug(eventName + ", " + target +\r
-        * ", " + timestamp); // } // // public void endEvent(String eventName,\r
-        * String target, // long timestamp) { // log.debug(eventName + ", " +\r
-        * target + ", " + timestamp); // } // }; // // String[] goals = { "clean",\r
-        * "install" }; // mavenEmbedder.execute(project, Arrays.asList(goals), //\r
-        * eventMonitor, // null, null, pomFile.getParentFile());\r
-        * \r
-        * Set<Artifact> transitDeps = getTransitiveProjectDependencies( project,\r
-        * remoteRepositoriesInternal, localRepository);\r
-        * log.debug(transitDeps.size() + " dependencies for " + artifact); for\r
-        * (Object obj : transitDeps) { log.debug("  " + obj); }\r
-        * \r
-        * } catch (Exception e) { throw new\r
-        * SlcException("Cannot initialize Maven manager", e); } }\r
-        * \r
-        * @SuppressWarnings("unchecked") public Set<Artifact>\r
-        * getTransitiveProjectDependencies(MavenProject project,\r
-        * List<ArtifactRepository> remoteRepos, ArtifactRepository local) {\r
-        * Embedder embedder = mavenEmbedder.getEmbedder(); try { ArtifactFactory\r
-        * artifactFactory = (ArtifactFactory) embedder\r
-        * .lookup(ArtifactFactory.ROLE);\r
-        * \r
-        * ArtifactResolver artifactResolver = (ArtifactResolver) embedder\r
-        * .lookup(ArtifactResolver.ROLE);\r
-        * \r
-        * ArtifactMetadataSource artifactMetadataSource = (ArtifactMetadataSource)\r
-        * embedder .lookup(ArtifactMetadataSource.ROLE);\r
-        * \r
-        * Set<Artifact> artifacts = project.createArtifacts(artifactFactory, null,\r
-        * null);\r
-        * \r
-        * ArtifactResolutionResult arr = artifactResolver\r
-        * .resolveTransitively(artifacts, project.getArtifact(), local,\r
-        * remoteRepos, artifactMetadataSource, null);\r
-        * \r
-        * return arr.getArtifacts(); } catch (Exception e) { throw new\r
-        * SlcException("Cannot resolve dependency for " + project, e); } // Order,\r
-        * just for display // Set dependencies = new TreeSet(new\r
-        * ArtifactComparator()); // dependencies.addAll(arr.getArtifacts()); //\r
-        * return dependencies; }\r
-        * \r
-        * private Artifact resolve(MavenFile mavenDistribution) { try { Artifact\r
-        * artifact; if (mavenDistribution.getClassifier() == null) { artifact =\r
-        * mavenEmbedder.createArtifact(mavenDistribution .getGroupId(),\r
-        * mavenDistribution.getArtifactId(), mavenDistribution.getVersion(),\r
-        * Artifact.SCOPE_PROVIDED, mavenDistribution.getType()); } else { artifact\r
-        * = mavenEmbedder.createArtifactWithClassifier(\r
-        * mavenDistribution.getGroupId(), mavenDistribution .getArtifactId(),\r
-        * mavenDistribution .getVersion(), mavenDistribution.getType(),\r
-        * mavenDistribution.getClassifier()); }\r
-        * \r
-        * mavenEmbedder.resolve(artifact, remoteRepositoriesInternal,\r
-        * localRepository);\r
-        * \r
-        * return artifact; } catch (Exception e) { throw new\r
-        * SlcException("Cannot resolve artifact.", e); } }\r
-        * \r
-        * public File getPackageLocation(MavenFile mavenDistribution) { return\r
-        * resolve(mavenDistribution).getFile(); }\r
-        * \r
-        * public void destroy() { try { if (mavenEmbedder != null) {\r
-        * mavenEmbedder.stop(); } } catch (MavenEmbedderException e) {\r
-        * log.error("Cannot destroy Maven manager", e); } }\r
-        * \r
-        * public void setLocalRepositoryPath(String localRepositoryPath) {\r
-        * this.localRepositoryPath = localRepositoryPath; }\r
-        * \r
-        * public List<RemoteRepository> getRemoteRepositories() { return\r
-        * remoteRepositories; }\r
-        * \r
-        * public void setRemoteRepositories(List<RemoteRepository>\r
-        * remoteRepositories) { this.remoteRepositories = remoteRepositories; }\r
-        * \r
-        * public void setClassLoader(ClassLoader classLoader) { this.classLoader =\r
-        * classLoader; }\r
-        * \r
-        * public void setOffline(Boolean offline) { this.offline = offline; }\r
-        */\r
 }\r
index ee07851b1c7e6e220e77bf0ad19f5cc3323fc4e3..a7baf8a1d79a2b108a0961c57acf230dd2a77f4a 100644 (file)
@@ -21,6 +21,7 @@
                <module>org.argeo.slc.support.equinox</module>
                <module>org.argeo.slc.support.hibernate</module>
                <module>org.argeo.slc.support.ant</module>
+               <module>org.argeo.slc.support.aether</module>
                <module>org.argeo.slc.support.maven</module>
                <module>org.argeo.slc.support.jemmy</module>
                <module>org.argeo.slc.support.jcr</module>
@@ -31,6 +32,7 @@
                <module>org.argeo.slc.launcher</module>
                <module>org.argeo.slc.lib.detached</module>
                <module>org.argeo.slc.support.ws.client</module>
+               <module>org.argeo.slc.repo</module>
        </modules>
        <build>
                <resources>