diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index 8c2d6379ae..43031a8cb1 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -25,22 +25,22 @@ - - + + javax.transaction jta 1.1 provided - + - + sonia.scm scm-core 1.58-SNAPSHOT - + sonia.scm scm-dao-xml @@ -64,7 +64,7 @@ scm-git-plugin 1.58-SNAPSHOT - + @@ -72,7 +72,7 @@ shiro-web ${shiro.version} - + org.apache.shiro shiro-guice @@ -116,13 +116,13 @@ provided - + com.sun.jersey.contribs jersey-multipart ${jersey.version} - + @@ -130,26 +130,26 @@ guice-multibindings ${guice.version} - + ch.qos.logback logback-classic - + org.slf4j jcl-over-slf4j ${slf4j.version} - + org.slf4j log4j-over-slf4j ${slf4j.version} - + @@ -157,46 +157,46 @@ ehcache-core ${ehcache.version} - + - + xml-apis xml-apis 1.4.01 - + - + commons-beanutils commons-beanutils - + commons-collections commons-collections - - - + commons-codec commons-codec 1.9 - + com.google.guava guava ${guava.version} - + org.quartz-scheduler quartz @@ -208,7 +208,7 @@ - + @@ -216,7 +216,7 @@ freemarker ${freemarker.version} - + com.github.spullara.mustache.java compiler @@ -226,13 +226,13 @@ - org.sonatype.aether + org.eclipse.aether aether-api ${aether.version} - org.sonatype.aether + org.eclipse.aether aether-impl ${aether.version} @@ -250,19 +250,25 @@ - org.sonatype.aether - aether-connector-asynchttpclient + org.eclipse.aether + aether-transport-http ${aether.version} - + - org.sonatype.aether - aether-connector-file + org.eclipse.aether + aether-transport-file ${aether.version} - + + + org.eclipse.aether + aether-connector-basic + ${aether.version} + + - + com.webcohesion.enunciate enunciate-core-annotations @@ -283,7 +289,7 @@ - + sonia.scm.plugins scm-git-plugin @@ -291,7 +297,7 @@ tests test - + sonia.scm.plugins scm-hg-plugin @@ -299,7 +305,7 @@ tests test - + sonia.scm.plugins scm-svn-plugin @@ -307,7 +313,7 @@ tests test - + org.seleniumhq.selenium selenium-java @@ -321,7 +327,7 @@ ${selenium.version} test - + org.seleniumhq.selenium htmlunit-driver @@ -342,23 +348,23 @@ ${jersey.version} test - + com.github.sdorra shiro-unit 1.0.0 test - + - + commons-logging commons-logging 1.1.3 provided - + log4j log4j @@ -371,7 +377,7 @@ - + com.mycila.maven-license-plugin maven-license-plugin @@ -393,7 +399,7 @@ true - + org.apache.maven.plugins @@ -412,7 +418,7 @@ - + org.apache.maven.plugins maven-antrun-plugin @@ -444,7 +450,7 @@ - + org.apache.maven.plugins maven-war-plugin @@ -513,8 +519,8 @@ ${project.build.sourceEncoding} 0 - - + + scm-webapp @@ -526,9 +532,9 @@ default 2.53.1 2.9.1 - 1.13.1 + 1.1.0 1.0 - 3.0.5 + 3.3.9 0.8.17 Tomcat e1 @@ -538,18 +544,18 @@ - + cluster - + - + sonia.scm scm-dao-orientdb 1.58-SNAPSHOT - + @@ -679,29 +685,29 @@ - + - + selenium - + - + org.apache.httpcomponents httpclient 4.3.2 test - + - + - + org.apache.maven.plugins maven-failsafe-plugin @@ -726,7 +732,7 @@ - + org.mortbay.jetty jetty-maven-plugin @@ -770,7 +776,7 @@ - + org.codehaus.mojo selenium-maven-plugin @@ -791,22 +797,22 @@ post-integration-test stop-server - + - + - + - + doc - + - + org.apache.maven.plugins maven-resources-plugin @@ -820,7 +826,7 @@ ${project.build.directory} - + src/main/doc true @@ -828,12 +834,12 @@ **/enunciate.xml - - + + - + com.webcohesion.enunciate enunciate-maven-plugin @@ -865,7 +871,7 @@ - + org.apache.maven.plugins maven-assembly-plugin @@ -884,12 +890,12 @@ - + - + diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/AbstractDependencyFilter.java b/scm-webapp/src/main/java/sonia/scm/plugin/AbstractDependencyFilter.java index d448358b64..8a17b1e50c 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/AbstractDependencyFilter.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/AbstractDependencyFilter.java @@ -36,18 +36,13 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Throwables; - +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.graph.DependencyFilter; +import org.eclipse.aether.graph.DependencyNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.sonatype.aether.artifact.Artifact; -import org.sonatype.aether.graph.DependencyFilter; -import org.sonatype.aether.graph.DependencyNode; - -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.util.List; import java.util.Set; diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/Aether.java b/scm-webapp/src/main/java/sonia/scm/plugin/Aether.java index 0ad53e62c3..0657b167b5 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/Aether.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/Aether.java @@ -35,41 +35,34 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- -import org.apache.maven.repository.internal.MavenRepositorySystemSession; - +import com.google.common.base.Throwables; +import org.apache.maven.repository.internal.MavenRepositorySystemUtils; +import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.collection.DependencyCollectionException; +import org.eclipse.aether.collection.DependencyGraphTransformer; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.graph.DependencyFilter; +import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.repository.*; +import org.eclipse.aether.resolution.DependencyRequest; +import org.eclipse.aether.resolution.DependencyResolutionException; +import org.eclipse.aether.spi.locator.ServiceLocator; +import org.eclipse.aether.util.artifact.JavaScopes; +import org.eclipse.aether.util.filter.AndDependencyFilter; +import org.eclipse.aether.util.filter.DependencyFilterUtils; +import org.eclipse.aether.util.graph.transformer.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import org.sonatype.aether.RepositorySystem; -import org.sonatype.aether.RepositorySystemSession; -import org.sonatype.aether.collection.CollectRequest; -import org.sonatype.aether.collection.DependencyCollectionException; -import org.sonatype.aether.collection.DependencyGraphTransformer; -import org.sonatype.aether.graph.Dependency; -import org.sonatype.aether.graph.DependencyFilter; -import org.sonatype.aether.graph.DependencyNode; -import org.sonatype.aether.repository.LocalRepository; -import org.sonatype.aether.repository.LocalRepositoryManager; -import org.sonatype.aether.repository.Proxy; -import org.sonatype.aether.repository.RemoteRepository; -import org.sonatype.aether.repository.RepositoryPolicy; -import org.sonatype.aether.resolution.DependencyRequest; -import org.sonatype.aether.resolution.DependencyResolutionException; -import org.sonatype.aether.util.artifact.DefaultArtifact; -import org.sonatype.aether.util.artifact.JavaScopes; -import org.sonatype.aether.util.filter.AndDependencyFilter; -import org.sonatype.aether.util.filter.DependencyFilterUtils; -import org.sonatype.aether.util.graph.transformer - .ChainedDependencyGraphTransformer; -import org.sonatype.aether.util.graph.transformer.ConflictMarker; -import org.sonatype.aether.util.graph.transformer.JavaDependencyContextRefiner; -import org.sonatype.aether.util.graph.transformer.JavaEffectiveScopeCalculator; -import org.sonatype.aether.util.graph.transformer - .NearestVersionConflictResolver; - import sonia.scm.config.ScmConfiguration; import sonia.scm.net.Proxies; +import java.net.MalformedURLException; +import java.net.URL; + /** * * @author Sebastian Sdorra @@ -77,6 +70,8 @@ import sonia.scm.net.Proxies; public final class Aether { + private static final ServiceLocator serviceLocator = new AetherServiceLocator(); + /** Field description */ private static final DependencyFilter FILTER = new AndDependencyFilter(new CoreDependencyFilter(), @@ -134,11 +129,9 @@ public final class Aether public static RemoteRepository createRemoteRepository( ScmConfiguration configuration, PluginRepository pluginRepository) { - RemoteRepository remoteRepository = - new RemoteRepository(pluginRepository.getId(), "default", - pluginRepository.getUrl()); + RemoteRepository.Builder builder = new RemoteRepository.Builder(pluginRepository.getId(), "default", pluginRepository.getUrl()); - if (Proxies.isEnabled(configuration, remoteRepository.getHost())) + if (Proxies.isEnabled(configuration, hostFromUrl(pluginRepository.getUrl()))) { Proxy proxy = DefaultProxySelector.createProxy(configuration); @@ -148,10 +141,18 @@ public final class Aether pluginRepository.getUrl()); } - remoteRepository.setProxy(proxy); + builder.setProxy(proxy); } - return remoteRepository; + return builder.build(); + } + + private static String hostFromUrl(String url) { + try { + return new URL(url).getHost(); + } catch (MalformedURLException e) { + throw Throwables.propagate(e); + } } /** @@ -162,7 +163,7 @@ public final class Aether */ public static RepositorySystem createRepositorySystem() { - return new AetherServiceLocator().getService(RepositorySystem.class); + return serviceLocator.getService(RepositorySystem.class); } /** @@ -181,8 +182,7 @@ public final class Aether ScmConfiguration configuration, AdvancedPluginConfiguration advancedPluginConfiguration) { - MavenRepositorySystemSession session = new MavenRepositorySystemSession(); - + DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); session.setChecksumPolicy(RepositoryPolicy.CHECKSUM_POLICY_WARN); if (configuration.isEnableProxy()) @@ -191,23 +191,26 @@ public final class Aether session.setProxySelector(new DefaultProxySelector(configuration)); } - LocalRepositoryManager localRepositoryManager = - system.newLocalRepositoryManager(localRepository); + LocalRepositoryManager localRepositoryManager = system.newLocalRepositoryManager(session, localRepository); session.setLocalRepositoryManager(localRepositoryManager); session.setAuthenticationSelector( new AetherAuthenticationSelector(advancedPluginConfiguration) ); - // create graph transformer to resolve dependency conflicts - //J- - DependencyGraphTransformer dgt = new ChainedDependencyGraphTransformer( - new ConflictMarker(), - new JavaEffectiveScopeCalculator(), - new NearestVersionConflictResolver(), - new JavaDependencyContextRefiner() + // create graph transformer and conflictResolver to resolve dependency conflicts + ConflictResolver conflictResolver = new ConflictResolver( + new NearestVersionSelector(), + new JavaScopeSelector(), + new SimpleOptionalitySelector(), + new JavaScopeDeriver() + ); + + DependencyGraphTransformer dgt = new ChainedDependencyGraphTransformer( + new ConflictMarker(), + conflictResolver, + new JavaDependencyContextRefiner() ); - //J+ session.setDependencyGraphTransformer(dgt); @@ -228,7 +231,7 @@ public final class Aether * @throws DependencyResolutionException */ public static DependencyNode resolveDependencies(RepositorySystem system, - RepositorySystemSession session, CollectRequest request) + RepositorySystemSession session, CollectRequest request) throws DependencyCollectionException, DependencyResolutionException { DependencyNode node = system.collectDependencies(session, diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/AetherAuthenticationSelector.java b/scm-webapp/src/main/java/sonia/scm/plugin/AetherAuthenticationSelector.java index 1f264940f8..59e8eb481e 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/AetherAuthenticationSelector.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/AetherAuthenticationSelector.java @@ -36,20 +36,18 @@ package sonia.scm.plugin; import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; - +import org.eclipse.aether.repository.Authentication; +import org.eclipse.aether.repository.AuthenticationSelector; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.util.repository.AuthenticationBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import org.sonatype.aether.repository.Authentication; -import org.sonatype.aether.repository.AuthenticationSelector; -import org.sonatype.aether.repository.RemoteRepository; - import sonia.scm.plugin.AdvancedPluginConfiguration.Server; -//~--- JDK imports ------------------------------------------------------------ - import java.util.Map; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -115,8 +113,10 @@ public class AetherAuthenticationSelector implements AuthenticationSelector { logger.info("use user {} for repository wiht id {}", server.getUsername(), repository.getId()); - authentication = new Authentication(server.getUsername(), - server.getPassword()); + authentication = new AuthenticationBuilder() + .addUsername(server.getUsername()) + .addPassword(server.getPassword()) + .build(); } return authentication; diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/AetherDependencyResolver.java b/scm-webapp/src/main/java/sonia/scm/plugin/AetherDependencyResolver.java index ee0e9b586c..f4e26b9955 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/AetherDependencyResolver.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/AetherDependencyResolver.java @@ -36,27 +36,24 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.collect.Lists; - +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.collection.DependencyCollectionException; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.repository.LocalRepository; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.resolution.DependencyResolutionException; +import org.eclipse.aether.util.graph.visitor.PreorderNodeListGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import org.sonatype.aether.RepositorySystem; -import org.sonatype.aether.RepositorySystemSession; -import org.sonatype.aether.collection.CollectRequest; -import org.sonatype.aether.collection.DependencyCollectionException; -import org.sonatype.aether.graph.Dependency; -import org.sonatype.aether.graph.DependencyNode; -import org.sonatype.aether.repository.LocalRepository; -import org.sonatype.aether.repository.RemoteRepository; -import org.sonatype.aether.resolution.DependencyResolutionException; -import org.sonatype.aether.util.graph.PreorderNodeListGenerator; - import sonia.scm.config.ScmConfiguration; -//~--- JDK imports ------------------------------------------------------------ - import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -83,9 +80,9 @@ public class AetherDependencyResolver * @param remoteRepositories */ public AetherDependencyResolver(ScmConfiguration configuration, - AdvancedPluginConfiguration advancedPluginConfiguration, - RepositorySystem system, LocalRepository localRepository, - List remoteRepositories) + AdvancedPluginConfiguration advancedPluginConfiguration, + RepositorySystem system, LocalRepository localRepository, + List remoteRepositories) { this.configuration = configuration; this.advancedPluginConfiguration = advancedPluginConfiguration; diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/AetherPluginHandler.java b/scm-webapp/src/main/java/sonia/scm/plugin/AetherPluginHandler.java index b122463a24..8668277f12 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/AetherPluginHandler.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/AetherPluginHandler.java @@ -40,10 +40,10 @@ import com.google.common.collect.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.sonatype.aether.RepositorySystem; -import org.sonatype.aether.graph.Dependency; -import org.sonatype.aether.repository.LocalRepository; -import org.sonatype.aether.repository.RemoteRepository; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.repository.LocalRepository; +import org.eclipse.aether.repository.RemoteRepository; import sonia.scm.ConfigurationException; import sonia.scm.SCMContextProvider; @@ -190,7 +190,6 @@ public class AetherPluginHandler * * * @param dependency - * @param dependencies * @param localDependencies */ private void collectDependencies(Dependency dependency, @@ -200,7 +199,7 @@ public class AetherPluginHandler { //J- AetherDependencyResolver resolver = new AetherDependencyResolver( - configuration, advancedPluginConfiguration, repositorySystem, + configuration, advancedPluginConfiguration, repositorySystem, localRepository, remoteRepositories ); //J+ diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/AetherServiceLocator.java b/scm-webapp/src/main/java/sonia/scm/plugin/AetherServiceLocator.java index 79038a4102..4220064882 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/AetherServiceLocator.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/AetherServiceLocator.java @@ -37,32 +37,30 @@ package sonia.scm.plugin; import org.apache.maven.repository.internal.DefaultArtifactDescriptorReader; import org.apache.maven.repository.internal.DefaultVersionRangeResolver; import org.apache.maven.repository.internal.DefaultVersionResolver; +import org.apache.maven.repository.internal.MavenRepositorySystemUtils; +import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; +import org.eclipse.aether.impl.ArtifactDescriptorReader; +import org.eclipse.aether.impl.DefaultServiceLocator; +import org.eclipse.aether.impl.VersionRangeResolver; +import org.eclipse.aether.impl.VersionResolver; +import org.eclipse.aether.internal.impl.slf4j.Slf4jLoggerFactory; +import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; +import org.eclipse.aether.spi.connector.transport.TransporterFactory; +import org.eclipse.aether.spi.locator.ServiceLocator; +import org.eclipse.aether.spi.log.LoggerFactory; +import org.eclipse.aether.transport.file.FileTransporterFactory; +import org.eclipse.aether.transport.http.HttpTransporterFactory; -import org.slf4j.LoggerFactory; - -import org.sonatype.aether.connector.async.AsyncRepositoryConnectorFactory; -import org.sonatype.aether.connector.file.FileRepositoryConnectorFactory; -import org.sonatype.aether.impl.ArtifactDescriptorReader; -import org.sonatype.aether.impl.VersionRangeResolver; -import org.sonatype.aether.impl.VersionResolver; -import org.sonatype.aether.impl.internal.DefaultServiceLocator; -import org.sonatype.aether.impl.internal.Slf4jLogger; -import org.sonatype.aether.spi.connector.RepositoryConnectorFactory; -import org.sonatype.aether.spi.log.Logger; +import java.util.List; /** * * @author Sebastian Sdorra */ -public class AetherServiceLocator extends DefaultServiceLocator +public class AetherServiceLocator implements ServiceLocator { - /** Field description */ - private static final String LOGGER_NAME = "org.sonatype.aether"; - - /** Field description */ - private static final Slf4jLogger logger = - new Slf4jLogger(LoggerFactory.getLogger(LOGGER_NAME)); + private DefaultServiceLocator delegate; //~--- constructors --------------------------------------------------------- @@ -70,16 +68,25 @@ public class AetherServiceLocator extends DefaultServiceLocator * Constructs ... * */ - public AetherServiceLocator() + AetherServiceLocator() { - setServices(Logger.class, logger); - addService(VersionResolver.class, DefaultVersionResolver.class); - addService(VersionRangeResolver.class, DefaultVersionRangeResolver.class); - addService(ArtifactDescriptorReader.class, - DefaultArtifactDescriptorReader.class); - addService(RepositoryConnectorFactory.class, - AsyncRepositoryConnectorFactory.class); - addService(RepositoryConnectorFactory.class, - FileRepositoryConnectorFactory.class); + delegate = MavenRepositorySystemUtils.newServiceLocator(); + delegate.setService(LoggerFactory.class, Slf4jLoggerFactory.class); + delegate.addService(VersionResolver.class, DefaultVersionResolver.class); + delegate.addService(VersionRangeResolver.class, DefaultVersionRangeResolver.class); + delegate.addService(ArtifactDescriptorReader.class, DefaultArtifactDescriptorReader.class); + delegate.addService(TransporterFactory.class, HttpTransporterFactory.class); + delegate.addService(TransporterFactory.class, FileTransporterFactory.class); + delegate.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); + } + + @Override + public T getService(Class type) { + return delegate.getService(type); + } + + @Override + public List getServices(Class type) { + return delegate.getServices(type); } } diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultProxySelector.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultProxySelector.java index fd3ad16507..ba694e01a8 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultProxySelector.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultProxySelector.java @@ -34,13 +34,13 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import org.eclipse.aether.repository.Authentication; +import org.eclipse.aether.repository.Proxy; +import org.eclipse.aether.repository.ProxySelector; +import org.eclipse.aether.repository.RemoteRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.sonatype.aether.repository.Authentication; -import org.sonatype.aether.repository.Proxy; -import org.sonatype.aether.repository.ProxySelector; -import org.sonatype.aether.repository.RemoteRepository; import sonia.scm.config.ScmConfiguration; import sonia.scm.util.Util; @@ -89,8 +89,11 @@ public class DefaultProxySelector implements ProxySelector if (Util.isNotEmpty(username) || Util.isNotEmpty(password)) { - authentication = new Authentication(Util.nonNull(username), - Util.nonNull(password)); + /* + TODO + authentication = new Authentication(Util.nonNull(username), Util.nonNull(password)); + */ + } return new Proxy(Proxy.TYPE_HTTP, configuration.getProxyServer(), diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/StringDependencyGraphDumper.java b/scm-webapp/src/main/java/sonia/scm/plugin/StringDependencyGraphDumper.java index 5bfcdebd23..126be9da6a 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/StringDependencyGraphDumper.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/StringDependencyGraphDumper.java @@ -34,8 +34,8 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- -import org.sonatype.aether.graph.DependencyNode; -import org.sonatype.aether.graph.DependencyVisitor; +import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.graph.DependencyVisitor; /** *