From: Mathieu Baudier Date: Sun, 13 Feb 2011 20:48:30 +0000 (+0000) Subject: SLC Repo X-Git-Tag: argeo-slc-2.1.7~1037 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=6a0f4cf1c0a1b49004b8c3dbc075f7202f7536f1;p=gpl%2Fargeo-slc.git SLC Repo git-svn-id: https://svn.argeo.org/slc/trunk@4136 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/demo/slc_demo_rap.properties b/demo/slc_demo_rap.properties index f128e259e..e736cdbe7 100644 --- a/demo/slc_demo_rap.properties +++ b/demo/slc_demo_rap.properties @@ -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 index 000000000..fc4d90a5e --- /dev/null +++ b/demo/slc_repo.properties @@ -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 diff --git a/dep/org.argeo.slc.dep.server/pom.xml b/dep/org.argeo.slc.dep.server/pom.xml index 590784f71..fee0b63e6 100644 --- a/dep/org.argeo.slc.dep.server/pom.xml +++ b/dep/org.argeo.slc.dep.server/pom.xml @@ -50,6 +50,11 @@ org.argeo.slc.support.ws.client ${project.version} + + org.argeo.slc.runtime + org.argeo.slc.repo + ${project.version} + diff --git a/dep/pom.xml b/dep/pom.xml index 102886779..4d5f11d4f 100644 --- a/dep/pom.xml +++ b/dep/pom.xml @@ -79,9 +79,6 @@ pde-sources generate-resources - - false - generate-descriptors diff --git a/integration-tests/org.argeo.slc.it.webapp/META-INF/MANIFEST.MF b/integration-tests/org.argeo.slc.it.webapp/META-INF/MANIFEST.MF index 1564834a3..bf8093932 100644 --- a/integration-tests/org.argeo.slc.it.webapp/META-INF/MANIFEST.MF +++ b/integration-tests/org.argeo.slc.it.webapp/META-INF/MANIFEST.MF @@ -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 diff --git a/integration-tests/org.argeo.slc.it.webapp/pom.xml b/integration-tests/org.argeo.slc.it.webapp/pom.xml index b3ba0ffb3..c45f87707 100644 --- a/integration-tests/org.argeo.slc.it.webapp/pom.xml +++ b/integration-tests/org.argeo.slc.it.webapp/pom.xml @@ -43,10 +43,6 @@ org.argeo.slc.demo.ant 7080 - @@ -118,7 +114,7 @@ org.argeo.slc.dep - org.argeo.slc.dep.sdk + org.argeo.slc.dep.sdk.rcp ${project.version} diff --git a/modules/server/org.argeo.slc.server.repo/META-INF/MANIFEST.MF b/modules/server/org.argeo.slc.server.repo/META-INF/MANIFEST.MF index 8f968fe6e..27347f2b5 100644 --- a/modules/server/org.argeo.slc.server.repo/META-INF/MANIFEST.MF +++ b/modules/server/org.argeo.slc.server.repo/META-INF/MANIFEST.MF @@ -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 index 000000000..395a4edae --- /dev/null +++ b/modules/server/org.argeo.slc.server.repo/META-INF/spring/maven.xml @@ -0,0 +1,59 @@ + + + + + + + + + + org.apache.commons:com.springsource.org.apache.commons.logging + + org.osgi:org.osgi.core + org.easymock:easymock + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/server/org.argeo.slc.server.repo/META-INF/spring/repo-osgi.xml b/modules/server/org.argeo.slc.server.repo/META-INF/spring/repo-osgi.xml index b6793cd8b..b5987612c 100644 --- a/modules/server/org.argeo.slc.server.repo/META-INF/spring/repo-osgi.xml +++ b/modules/server/org.argeo.slc.server.repo/META-INF/spring/repo-osgi.xml @@ -7,6 +7,11 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd"> + - + + + \ 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 index 000000000..018e1cfd1 --- /dev/null +++ b/runtime/org.argeo.slc.repo/pom.xml @@ -0,0 +1,42 @@ + + 4.0.0 + + org.argeo.slc + runtime + 0.13.1-SNAPSHOT + .. + + org.argeo.slc.runtime + org.argeo.slc.repo + SLC Repository + + + + org.apache.felix + maven-bundle-plugin + ${version.maven-bundle-plugin} + + + + org.argeo.slc.repo.* + + + + + + + + + org.argeo.slc.runtime + org.argeo.slc.support.aether + 0.13.1-SNAPSHOT + + + + org.slf4j + com.springsource.slf4j.org.apache.commons.logging + + + + 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 index 000000000..8aff3de08 --- /dev/null +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/ImportMavenDependencies.java @@ -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 excludedArtifacts = new HashSet(); + + 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 artifactComparator = new Comparator() { + public int compare(Artifact o1, Artifact o2) { + return o1.getArtifactId().compareTo(o2.getArtifactId()); + } + }; + + Set registeredArtifacts = new TreeSet( + artifactComparator); + parsePom(aetherTemplate, registeredArtifacts, pomArtifact); + if (log.isDebugEnabled()) + log.debug("Gathered " + registeredArtifacts.size() + + " artifacts"); + + // Resolve and add non-optional dependencies + Set artifacts = new TreeSet(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 artifacts, DependencyNode node) { + for (DependencyNode child : node.getChildren()) { + if (!child.getDependency().isOptional()) { + addArtifact(artifacts, child.getDependency().getArtifact()); + addDependencies(artifacts, child); + } + } + } + + private void addArtifact(Set 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 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 excludedArtifactIds) { + this.excludedArtifacts = excludedArtifactIds; + } + + public void setRootCoordinates(String rootCoordinates) { + this.rootCoordinates = rootCoordinates; + } + +} diff --git a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/SlcException.java b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/SlcException.java index 6a10746d5..331f53b5b 100644 --- a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/SlcException.java +++ b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/SlcException.java @@ -18,7 +18,7 @@ package org.argeo.slc; /** Basis for all SLC exceptions. This is an unchecked exception. */ public class SlcException extends RuntimeException { - static final long serialVersionUID = 1l; + private static final long serialVersionUID = 6373738619304106445L; /** Constructor. */ public SlcException(String message) { @@ -26,8 +26,8 @@ public class SlcException extends RuntimeException { } /** Constructor. */ - public SlcException(String message, Throwable cause) { - super(message, cause); + public SlcException(String message, Throwable e) { + super(message, e); } } diff --git a/runtime/org.argeo.slc.support.aether/.classpath b/runtime/org.argeo.slc.support.aether/.classpath new file mode 100644 index 000000000..92f19d2ff --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/runtime/org.argeo.slc.support.aether/.project b/runtime/org.argeo.slc.support.aether/.project new file mode 100644 index 000000000..b96fdc24c --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/.project @@ -0,0 +1,28 @@ + + + org.argeo.slc.support.aether + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + 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 index 000000000..e9b307cfa --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/.settings/org.eclipse.jdt.core.prefs @@ -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 index 000000000..b90e5a5c6 --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/.settings/org.eclipse.pde.core.prefs @@ -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 index 000000000..5fc538bc8 --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/build.properties @@ -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 index 000000000..ca9969352 --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/pom.xml @@ -0,0 +1,57 @@ + + 4.0.0 + + org.argeo.slc + runtime + 0.13.1-SNAPSHOT + .. + + org.argeo.slc.runtime + org.argeo.slc.support.aether + SLC Support Aether + + + + org.apache.felix + maven-bundle-plugin + ${version.maven-bundle-plugin} + + + + org.argeo.slc.aether.* + + + + + + + + + org.argeo.slc.runtime + org.argeo.slc.core + 0.13.1-SNAPSHOT + + + + org.argeo.dep.osgi + org.argeo.dep.osgi.aether + + + + org.springframework + org.springframework.beans + + + + org.slf4j + com.springsource.slf4j.org.apache.commons.logging + + + + org.eclipse.osgi + org.eclipse.osgi + provided + + + 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 index 000000000..c7b2c4bc1 --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/AetherTemplate.java @@ -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 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 getRemoteRepositories() { + return remoteRepositories; + } + + public void setRemoteRepositories(List 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 index 000000000..c088afe1f --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/AetherUtils.java @@ -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 index 000000000..718045d33 --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/ConsoleRepositoryListener.java @@ -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 index 000000000..921e0e4fa --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/ConsoleTransferListener.java @@ -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 downloads = new ConcurrentHashMap(); + + 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 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 index 000000000..d7e9729c0 --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/SimpleArtifactDescriptorReader.java @@ -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 index 000000000..7c74447f6 --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/SimpleVersionRangeResolver.java @@ -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 index 000000000..f67973fdb --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/SimpleVersionResolver.java @@ -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 index 000000000..04869685a --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/osgi/OsgiVersion.java @@ -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 index 000000000..d945b3a56 --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/spring/RemoteRepositoryFactory.java @@ -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 index 000000000..b5bf15764 --- /dev/null +++ b/runtime/org.argeo.slc.support.maven/META-INF/spring/maven-osgi.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + \ 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 index 000000000..6c21a5e91 --- /dev/null +++ b/runtime/org.argeo.slc.support.maven/META-INF/spring/maven.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/runtime/org.argeo.slc.support.maven/pom.xml b/runtime/org.argeo.slc.support.maven/pom.xml index 35fc70682..e2d557569 100644 --- a/runtime/org.argeo.slc.support.maven/pom.xml +++ b/runtime/org.argeo.slc.support.maven/pom.xml @@ -69,6 +69,12 @@ org.argeo.slc.specs ${project.version} + + org.argeo.slc.runtime + org.argeo.slc.support.aether + ${project.version} + + 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 index e10d6decd..000000000 --- a/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/ConsoleRepositoryListener.java +++ /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 index b60da8f8a..000000000 --- a/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/ConsoleTransferListener.java +++ /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 downloads = new ConcurrentHashMap(); - - 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 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; - } - -} diff --git a/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java b/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java index 2a39452ed..d3f4f4389 100644 --- a/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java +++ b/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java @@ -22,6 +22,9 @@ import org.apache.maven.cli.MavenCli; import org.apache.maven.repository.internal.DefaultServiceLocator; import org.apache.maven.repository.internal.MavenRepositorySystemSession; import org.argeo.slc.SlcException; +import org.argeo.slc.aether.AetherUtils; +import org.argeo.slc.aether.ConsoleRepositoryListener; +import org.argeo.slc.aether.ConsoleTransferListener; import org.codehaus.plexus.PlexusContainer; import org.sonatype.aether.RepositorySystem; import org.sonatype.aether.RepositorySystemSession; @@ -36,6 +39,7 @@ import org.sonatype.aether.repository.RemoteRepository; import org.sonatype.aether.spi.connector.RepositoryConnectorFactory; import org.sonatype.aether.util.artifact.DefaultArtifact; import org.sonatype.aether.util.graph.PreorderNodeListGenerator; +import org.sonatype.aether.util.graph.selector.OptionalDependencySelector; public class MavenManager { private final static Log log = LogFactory.getLog(MavenManager.class); @@ -100,9 +104,9 @@ public class MavenManager { public void testAether() { try { - RepositorySystem repoSystem = newRepositorySystem(); + RepositorySystem repoSystem = createRepositorySystem(); - RepositorySystemSession session = newSession(repoSystem); + RepositorySystemSession session = createRepositorySystemSession(repoSystem); Dependency dependency = new Dependency(new DefaultArtifact( "org.argeo.slc.dep:org.argeo.slc.dep.sdk:0.13.1-SNAPSHOT"), @@ -129,29 +133,17 @@ public class MavenManager { log.debug(artifact); } - logDependencyNode(0, node); + AetherUtils.logDependencyNode(0, node); // System.out.println(nlg.getClassPath()); - + } catch (Exception e) { throw new SlcException("Cannot resolve", e); } } - private void logDependencyNode(int depth, DependencyNode dependencyNode) { - 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() + "]"); - for (DependencyNode child : dependencyNode.getChildren()) - logDependencyNode(depth + 1, child); - } - - private RepositorySystem newRepositorySystem() { + /** Creates a Maven {@link RepositorySystem}. */ + public static RepositorySystem createRepositorySystem() { try { // return new // DefaultPlexusContainer().lookup(RepositorySystem.class); @@ -168,7 +160,8 @@ public class MavenManager { } } - private RepositorySystemSession newSession(RepositorySystem system) { + public static RepositorySystemSession createRepositorySystemSession( + RepositorySystem system) { MavenRepositorySystemSession session = new MavenRepositorySystemSession(); LocalRepository localRepo = new LocalRepository( @@ -177,7 +170,6 @@ public class MavenManager { .newLocalRepositoryManager(localRepo)); session.setTransferListener(new ConsoleTransferListener(System.out)); session.setRepositoryListener(new ConsoleRepositoryListener()); - return session; } @@ -198,135 +190,4 @@ public class MavenManager { } } - /* - * private final Log log = LogFactory.getLog(getClass()); - * - * private String localRepositoryPath = System.getProperty("user.home") + - * File.separator + ".m2" + File.separator + "repository"; - * - * private ArtifactRepository localRepository; private - * List remoteRepositoriesInternal; private - * List remoteRepositories = new - * Vector(); - * - * private MavenEmbedder mavenEmbedder; private ClassLoader classLoader; - * private Boolean offline = false; - * - * public void init() { try { mavenEmbedder = new SlcMavenEmbedder(); - * mavenEmbedder.setOffline(offline); // - * mavenEmbedder.setAlignWithUserInstallation(true); if (classLoader != - * null) mavenEmbedder.setClassLoader(classLoader); else - * mavenEmbedder.setClassLoader(getClass().getClassLoader()); // else // - * mavenEmbedder.setClassLoader(Thread.currentThread() // - * .getContextClassLoader()); mavenEmbedder.start(); - * - * mavenEmbedder.setLocalRepositoryDirectory(new File( - * localRepositoryPath)); - * - * localRepository = mavenEmbedder.getLocalRepository(); - * - * remoteRepositoriesInternal = new Vector(); for - * (RemoteRepository remoteRepository : remoteRepositories) { - * - * ArtifactRepository repository = mavenEmbedder.createRepository( - * remoteRepository.getUrl(), remoteRepository.getId()); - * remoteRepositoriesInternal.add(repository); } - * - * MavenFile mavenFile = new MavenFile(); - * mavenFile.setGroupId("org.argeo.slc.dist"); - * mavenFile.setArtifactId("org.argeo.slc.sdk"); - * mavenFile.setVersion("0.12.2-SNAPSHOT"); mavenFile.setType("pom"); - * Artifact artifact = resolve(mavenFile); log.debug("Location of " + - * artifact + " : " + artifact.getFile()); // log.debug("Dependencies of " + - * artifact); // for (Object obj : artifact.getDependencyTrail()) { // - * log.debug(" " + obj); // } - * - * File pomFile = new File( - * "/home/mbaudier/dev/src/slc/dist/org.argeo.slc.sdk/pom.xml"); - * MavenProject project = mavenEmbedder - * .readProjectWithDependencies(pomFile); // MavenProject project = - * mavenEmbedder // .readProjectWithDependencies(artifact.getFile()); - * - * // EventMonitor eventMonitor = new EventMonitor() { // // public void - * startEvent(String eventName, String target, // long timestamp) { // - * log.debug(eventName + ", " + target + ", " + timestamp); // } // // - * public void errorEvent(String eventName, String target, // long - * timestamp, Throwable cause) { // log.debug(eventName + ", " + target + - * ", " + timestamp); // } // // public void endEvent(String eventName, - * String target, // long timestamp) { // log.debug(eventName + ", " + - * target + ", " + timestamp); // } // }; // // String[] goals = { "clean", - * "install" }; // mavenEmbedder.execute(project, Arrays.asList(goals), // - * eventMonitor, // null, null, pomFile.getParentFile()); - * - * Set transitDeps = getTransitiveProjectDependencies( project, - * remoteRepositoriesInternal, localRepository); - * log.debug(transitDeps.size() + " dependencies for " + artifact); for - * (Object obj : transitDeps) { log.debug(" " + obj); } - * - * } catch (Exception e) { throw new - * SlcException("Cannot initialize Maven manager", e); } } - * - * @SuppressWarnings("unchecked") public Set - * getTransitiveProjectDependencies(MavenProject project, - * List remoteRepos, ArtifactRepository local) { - * Embedder embedder = mavenEmbedder.getEmbedder(); try { ArtifactFactory - * artifactFactory = (ArtifactFactory) embedder - * .lookup(ArtifactFactory.ROLE); - * - * ArtifactResolver artifactResolver = (ArtifactResolver) embedder - * .lookup(ArtifactResolver.ROLE); - * - * ArtifactMetadataSource artifactMetadataSource = (ArtifactMetadataSource) - * embedder .lookup(ArtifactMetadataSource.ROLE); - * - * Set artifacts = project.createArtifacts(artifactFactory, null, - * null); - * - * ArtifactResolutionResult arr = artifactResolver - * .resolveTransitively(artifacts, project.getArtifact(), local, - * remoteRepos, artifactMetadataSource, null); - * - * return arr.getArtifacts(); } catch (Exception e) { throw new - * SlcException("Cannot resolve dependency for " + project, e); } // Order, - * just for display // Set dependencies = new TreeSet(new - * ArtifactComparator()); // dependencies.addAll(arr.getArtifacts()); // - * return dependencies; } - * - * private Artifact resolve(MavenFile mavenDistribution) { try { Artifact - * artifact; if (mavenDistribution.getClassifier() == null) { artifact = - * mavenEmbedder.createArtifact(mavenDistribution .getGroupId(), - * mavenDistribution.getArtifactId(), mavenDistribution.getVersion(), - * Artifact.SCOPE_PROVIDED, mavenDistribution.getType()); } else { artifact - * = mavenEmbedder.createArtifactWithClassifier( - * mavenDistribution.getGroupId(), mavenDistribution .getArtifactId(), - * mavenDistribution .getVersion(), mavenDistribution.getType(), - * mavenDistribution.getClassifier()); } - * - * mavenEmbedder.resolve(artifact, remoteRepositoriesInternal, - * localRepository); - * - * return artifact; } catch (Exception e) { throw new - * SlcException("Cannot resolve artifact.", e); } } - * - * public File getPackageLocation(MavenFile mavenDistribution) { return - * resolve(mavenDistribution).getFile(); } - * - * public void destroy() { try { if (mavenEmbedder != null) { - * mavenEmbedder.stop(); } } catch (MavenEmbedderException e) { - * log.error("Cannot destroy Maven manager", e); } } - * - * public void setLocalRepositoryPath(String localRepositoryPath) { - * this.localRepositoryPath = localRepositoryPath; } - * - * public List getRemoteRepositories() { return - * remoteRepositories; } - * - * public void setRemoteRepositories(List - * remoteRepositories) { this.remoteRepositories = remoteRepositories; } - * - * public void setClassLoader(ClassLoader classLoader) { this.classLoader = - * classLoader; } - * - * public void setOffline(Boolean offline) { this.offline = offline; } - */ } diff --git a/runtime/pom.xml b/runtime/pom.xml index ee07851b1..a7baf8a1d 100644 --- a/runtime/pom.xml +++ b/runtime/pom.xml @@ -21,6 +21,7 @@ org.argeo.slc.support.equinox org.argeo.slc.support.hibernate org.argeo.slc.support.ant + org.argeo.slc.support.aether org.argeo.slc.support.maven org.argeo.slc.support.jemmy org.argeo.slc.support.jcr @@ -31,6 +32,7 @@ org.argeo.slc.launcher org.argeo.slc.lib.detached org.argeo.slc.support.ws.client + org.argeo.slc.repo