http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/ant/types/RemoteRepository.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/ant/types/RemoteRepository.java b/src/main/java/org/eclipse/aether/ant/types/RemoteRepository.java deleted file mode 100644 index 54c8367..0000000 --- a/src/main/java/org/eclipse/aether/ant/types/RemoteRepository.java +++ /dev/null @@ -1,340 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010, 2011 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 - * - * Contributors: - * Sonatype, Inc. - initial API and implementation - *******************************************************************************/ -package org.eclipse.aether.ant.types; - -import java.util.Collections; -import java.util.List; - -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.Project; -import org.apache.tools.ant.Task; -import org.apache.tools.ant.types.DataType; -import org.apache.tools.ant.types.Reference; -import org.eclipse.aether.ant.AntRepoSys; -import org.eclipse.aether.repository.RepositoryPolicy; - -/** - */ -public class RemoteRepository - extends DataType - implements RemoteRepositoryContainer -{ - - private String id; - - private String url; - - private String type; - - private Policy releasePolicy; - - private Policy snapshotPolicy; - - private boolean releases = true; - - private boolean snapshots = false; - - private String checksums; - - private String updates; - - private Authentication authentication; - - @Override - public void setProject( Project project ) - { - super.setProject( project ); - - // NOTE: Just trigger side-effect of default initialization before this type potentially overrides central - AntRepoSys.getInstance( project ); - } - - protected RemoteRepository getRef() - { - return (RemoteRepository) getCheckedRef(); - } - - public void validate( Task task ) - { - if ( isReference() ) - { - getRef().validate( task ); - } - else - { - if ( url == null || url.length() <= 0 ) - { - throw new BuildException( "You must specify the 'url' for a remote repository" ); - } - if ( id == null || id.length() <= 0 ) - { - throw new BuildException( "You must specify the 'id' for a remote repository" ); - } - } - } - - public void setRefid( Reference ref ) - { - if ( id != null || url != null || type != null || checksums != null || updates != null ) - { - throw tooManyAttributes(); - } - if ( releasePolicy != null || snapshotPolicy != null || authentication != null ) - { - throw noChildrenAllowed(); - } - super.setRefid( ref ); - } - - public String getId() - { - if ( isReference() ) - { - return getRef().getId(); - } - return id; - } - - public void setId( String id ) - { - this.id = id; - } - - public String getUrl() - { - if ( isReference() ) - { - return getRef().getUrl(); - } - return url; - } - - public void setUrl( String url ) - { - checkAttributesAllowed(); - this.url = url; - } - - public String getType() - { - if ( isReference() ) - { - return getRef().getType(); - } - return ( type != null ) ? type : "default"; - } - - public void setType( String type ) - { - checkAttributesAllowed(); - this.type = type; - } - - public Policy getReleasePolicy() - { - if ( isReference() ) - { - return getRef().getReleasePolicy(); - } - return releasePolicy; - } - - public void addReleases( Policy policy ) - { - checkChildrenAllowed(); - if ( this.releasePolicy != null ) - { - throw new BuildException( "You must not specify multiple <releases> elements" ); - } - this.releasePolicy = policy; - } - - public Policy getSnapshotPolicy() - { - if ( isReference() ) - { - return getRef().getSnapshotPolicy(); - } - return snapshotPolicy; - } - - public void addSnapshots( Policy policy ) - { - checkChildrenAllowed(); - if ( this.snapshotPolicy != null ) - { - throw new BuildException( "You must not specify multiple <snapshots> elements" ); - } - this.snapshotPolicy = policy; - } - - public boolean isReleases() - { - if ( isReference() ) - { - return getRef().isReleases(); - } - return releases; - } - - public void setReleases( boolean releases ) - { - checkAttributesAllowed(); - this.releases = releases; - } - - public boolean isSnapshots() - { - if ( isReference() ) - { - return getRef().isSnapshots(); - } - return snapshots; - } - - public void setSnapshots( boolean snapshots ) - { - checkAttributesAllowed(); - this.snapshots = snapshots; - } - - public String getUpdates() - { - if ( isReference() ) - { - return getRef().getUpdates(); - } - return ( updates != null ) ? updates : RepositoryPolicy.UPDATE_POLICY_DAILY; - } - - public void setUpdates( String updates ) - { - checkAttributesAllowed(); - checkUpdates( updates ); - this.updates = updates; - } - - protected static void checkUpdates( String updates ) - { - if ( !RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( updates ) - && !RepositoryPolicy.UPDATE_POLICY_DAILY.equals( updates ) - && !RepositoryPolicy.UPDATE_POLICY_NEVER.equals( updates ) - && !updates.startsWith( RepositoryPolicy.UPDATE_POLICY_INTERVAL ) ) - { - throw new BuildException( "'" + updates + "' is not a permitted update policy" ); - } - } - - public String getChecksums() - { - if ( isReference() ) - { - return getRef().getChecksums(); - } - return ( checksums != null ) ? checksums : RepositoryPolicy.CHECKSUM_POLICY_WARN; - } - - public void setChecksums( String checksums ) - { - checkAttributesAllowed(); - checkChecksums( checksums ); - this.checksums = checksums; - } - - protected static void checkChecksums( String checksums ) - { - if ( !RepositoryPolicy.CHECKSUM_POLICY_FAIL.equals( checksums ) - && !RepositoryPolicy.CHECKSUM_POLICY_WARN.equals( checksums ) - && !RepositoryPolicy.CHECKSUM_POLICY_IGNORE.equals( checksums ) ) - { - throw new BuildException( "'" + checksums + "' is not a permitted checksum policy" ); - } - } - - public Authentication getAuthentication() - { - if ( isReference() ) - { - return getRef().getAuthentication(); - } - return authentication; - } - - public void addAuthentication( Authentication authentication ) - { - checkChildrenAllowed(); - if ( this.authentication != null ) - { - throw new BuildException( "You must not specify multiple <authentication> elements" ); - } - this.authentication = authentication; - } - - public void setAuthRef( Reference ref ) - { - checkAttributesAllowed(); - if ( authentication == null ) - { - authentication = new Authentication(); - authentication.setProject( getProject() ); - } - authentication.setRefid( ref ); - } - - public List<RemoteRepository> getRepositories() - { - return Collections.singletonList( this ); - } - - public static class Policy - { - - private boolean enabled = true; - - private String checksumPolicy; - - private String updatePolicy; - - public boolean isEnabled() - { - return enabled; - } - - public void setEnabled( boolean enabled ) - { - this.enabled = enabled; - } - - public String getChecksums() - { - return checksumPolicy; - } - - public void setChecksums( String checksumPolicy ) - { - checkChecksums( checksumPolicy ); - this.checksumPolicy = checksumPolicy; - } - - public String getUpdates() - { - return updatePolicy; - } - - public void setUpdates( String updatePolicy ) - { - checkUpdates( updatePolicy ); - this.updatePolicy = updatePolicy; - } - - } - -}
http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/ant/types/RemoteRepositoryContainer.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/ant/types/RemoteRepositoryContainer.java b/src/main/java/org/eclipse/aether/ant/types/RemoteRepositoryContainer.java deleted file mode 100644 index 90ea8e7..0000000 --- a/src/main/java/org/eclipse/aether/ant/types/RemoteRepositoryContainer.java +++ /dev/null @@ -1,26 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010, 2011 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 - * - * Contributors: - * Sonatype, Inc. - initial API and implementation - *******************************************************************************/ -package org.eclipse.aether.ant.types; - -import java.util.List; - -import org.apache.tools.ant.Task; - -/** - */ -public interface RemoteRepositoryContainer -{ - - void validate( Task task ); - - List<RemoteRepository> getRepositories(); - -} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/ant/types/Settings.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/ant/types/Settings.java b/src/main/java/org/eclipse/aether/ant/types/Settings.java deleted file mode 100644 index 4c2d529..0000000 --- a/src/main/java/org/eclipse/aether/ant/types/Settings.java +++ /dev/null @@ -1,77 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010, 2011 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 - * - * Contributors: - * Sonatype, Inc. - initial API and implementation - *******************************************************************************/ -package org.eclipse.aether.ant.types; - -import java.io.File; - -import org.apache.tools.ant.types.DataType; -import org.apache.tools.ant.types.Reference; -import org.eclipse.aether.ant.AntRepoSys; - -/** - */ -public class Settings - extends DataType -{ - - private File file; - - private File globalFile; - - protected Settings getRef() - { - return (Settings) getCheckedRef(); - } - - public void setRefid( Reference ref ) - { - if ( file != null || globalFile != null ) - { - throw tooManyAttributes(); - } - super.setRefid( ref ); - } - - public File getFile() - { - if ( isReference() ) - { - return getRef().getFile(); - } - return file; - } - - public void setFile( File file ) - { - checkAttributesAllowed(); - this.file = file; - - AntRepoSys.getInstance( getProject() ).setUserSettings( file ); - } - - public File getGlobalFile() - { - if ( isReference() ) - { - return getRef().getFile(); - } - return globalFile; - } - - public void setGlobalFile( File globalFile ) - { - checkAttributesAllowed(); - this.globalFile = globalFile; - - AntRepoSys.getInstance( getProject() ).setGlobalSettings( globalFile ); - } - -} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/ant/util/AetherUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/ant/util/AetherUtils.java b/src/main/java/org/eclipse/aether/ant/util/AetherUtils.java deleted file mode 100644 index f37556c..0000000 --- a/src/main/java/org/eclipse/aether/ant/util/AetherUtils.java +++ /dev/null @@ -1,75 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010, 2011 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 - * - * Contributors: - * Sonatype, Inc. - initial API and implementation - *******************************************************************************/ -package org.eclipse.aether.ant.util; - -import java.io.File; - -import org.apache.tools.ant.Project; -import org.eclipse.aether.ant.Names; -import org.eclipse.aether.ant.types.RemoteRepositories; - -public class AetherUtils -{ - - public static File findGlobalSettings( Project project ) - { - File file = new File( new File( project.getProperty( "ant.home" ), "etc" ), Names.SETTINGS_XML ); - if ( file.isFile() ) - { - return file; - } - else - { - String mavenHome = getMavenHome( project ); - if ( mavenHome != null ) - { - return new File( new File( mavenHome, "conf" ), Names.SETTINGS_XML ); - } - } - - return null; - } - - public static String getMavenHome( Project project ) - { - String mavenHome = project.getProperty( "maven.home" ); - if ( mavenHome != null ) - { - return mavenHome; - } - return System.getenv( "M2_HOME" ); - } - - public static File findUserSettings( Project project ) - { - File userHome = new File( project.getProperty( "user.home" ) ); - File file = new File( new File( userHome, ".ant" ), Names.SETTINGS_XML ); - if ( file.isFile() ) - { - return file; - } - else - { - return new File( new File( userHome, ".m2" ), Names.SETTINGS_XML ); - } - } - - public static RemoteRepositories getDefaultRepositories( Project project ) - { - Object obj = project.getReference( Names.ID_DEFAULT_REPOS ); - if ( obj instanceof RemoteRepositories ) - { - return (RemoteRepositories) obj; - } - return null; - } - -} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/ant/util/ConverterUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/ant/util/ConverterUtils.java b/src/main/java/org/eclipse/aether/ant/util/ConverterUtils.java deleted file mode 100644 index c7d9bf7..0000000 --- a/src/main/java/org/eclipse/aether/ant/util/ConverterUtils.java +++ /dev/null @@ -1,218 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010, 2012 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 - * - * Contributors: - * Sonatype, Inc. - initial API and implementation - *******************************************************************************/ -package org.eclipse.aether.ant.util; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import org.apache.tools.ant.Project; -import org.eclipse.aether.ant.types.Authentication; -import org.eclipse.aether.ant.types.Dependency; -import org.eclipse.aether.ant.types.Exclusion; -import org.eclipse.aether.ant.types.Proxy; -import org.eclipse.aether.ant.types.RemoteRepositories; -import org.eclipse.aether.ant.types.RemoteRepository; -import org.eclipse.aether.RepositorySystemSession; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.artifact.ArtifactProperties; -import org.eclipse.aether.artifact.ArtifactType; -import org.eclipse.aether.artifact.ArtifactTypeRegistry; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.artifact.DefaultArtifactType; -import org.eclipse.aether.impl.RemoteRepositoryManager; -import org.eclipse.aether.repository.RepositoryPolicy; -import org.eclipse.aether.util.repository.AuthenticationBuilder; - -/** - * Utility methods to convert between Aether and Ant objects. - */ -public class ConverterUtils -{ - - private static org.eclipse.aether.artifact.Artifact toArtifact( Dependency dependency, ArtifactTypeRegistry types ) - { - ArtifactType type = types.get( dependency.getType() ); - if ( type == null ) - { - type = new DefaultArtifactType( dependency.getType() ); - } - - Map<String, String> props = null; - if ( "system".equals( dependency.getScope() ) && dependency.getSystemPath() != null ) - { - props = Collections.singletonMap( ArtifactProperties.LOCAL_PATH, dependency.getSystemPath().getPath() ); - } - - Artifact artifact = - new DefaultArtifact( dependency.getGroupId(), dependency.getArtifactId(), dependency.getClassifier(), null, - dependency.getVersion(), props, type ); - - return artifact; - } - - public static org.eclipse.aether.repository.Authentication toAuthentication( Authentication auth ) - { - if ( auth == null ) - { - return null; - } - AuthenticationBuilder authBuilder = new AuthenticationBuilder(); - authBuilder.addUsername( auth.getUsername() ).addPassword( auth.getPassword() ); - authBuilder.addPrivateKey( auth.getPrivateKeyFile(), auth.getPassphrase() ); - return authBuilder.build(); - } - - public static org.eclipse.aether.graph.Dependency toDependency( Dependency dependency, List<Exclusion> exclusions, - RepositorySystemSession session ) - { - return new org.eclipse.aether.graph.Dependency( toArtifact( dependency, session.getArtifactTypeRegistry() ), - dependency.getScope(), false, - toExclusions( dependency.getExclusions(), exclusions ) ); - } - - /** - * Converts the given ant repository type to an Aether repository instance with authentication and proxy filled in - * via the sessions' selectors. - */ - public static org.eclipse.aether.repository.RemoteRepository toDistRepository( RemoteRepository repo, - RepositorySystemSession session ) - { - org.eclipse.aether.repository.RemoteRepository result = toRepository( repo ); - org.eclipse.aether.repository.RemoteRepository.Builder builder = - new org.eclipse.aether.repository.RemoteRepository.Builder( result ); - builder.setAuthentication( session.getAuthenticationSelector().getAuthentication( result ) ); - builder.setProxy( session.getProxySelector().getProxy( result ) ); - return builder.build(); - } - - private static org.eclipse.aether.graph.Exclusion toExclusion( Exclusion exclusion ) - { - return new org.eclipse.aether.graph.Exclusion( exclusion.getGroupId(), exclusion.getArtifactId(), - exclusion.getClassifier(), exclusion.getExtension() ); - } - - private static Collection<org.eclipse.aether.graph.Exclusion> toExclusions( Collection<Exclusion> exclusions1, - Collection<Exclusion> exclusions2 ) - { - Collection<org.eclipse.aether.graph.Exclusion> results = - new LinkedHashSet<org.eclipse.aether.graph.Exclusion>(); - if ( exclusions1 != null ) - { - for ( Exclusion exclusion : exclusions1 ) - { - results.add( toExclusion( exclusion ) ); - } - } - if ( exclusions2 != null ) - { - for ( Exclusion exclusion : exclusions2 ) - { - results.add( toExclusion( exclusion ) ); - } - } - return results; - } - - private static RepositoryPolicy toPolicy( RemoteRepository.Policy policy, boolean enabled, String updates, - String checksums ) - { - if ( policy != null ) - { - enabled = policy.isEnabled(); - if ( policy.getChecksums() != null ) - { - checksums = policy.getChecksums(); - } - if ( policy.getUpdates() != null ) - { - updates = policy.getUpdates(); - } - } - return new RepositoryPolicy( enabled, updates, checksums ); - } - - /** - * Adds every <String, String>-entry in the map as a property to the given Properties. - */ - public static Properties addProperties( Properties props, Map<?, ?> map ) - { - if ( props == null ) - { - props = new Properties(); - } - for ( Map.Entry<?, ?> entry : map.entrySet() ) - { - if ( entry.getKey() instanceof String && entry.getValue() instanceof String ) - { - props.put( entry.getKey(), entry.getValue() ); - } - } - return props; - } - - public static org.eclipse.aether.repository.Proxy toProxy( Proxy proxy ) - { - if ( proxy == null ) - { - return null; - } - return new org.eclipse.aether.repository.Proxy( proxy.getType(), proxy.getHost(), proxy.getPort(), - toAuthentication( proxy.getAuthentication() ) ); - } - - private static org.eclipse.aether.repository.RemoteRepository toRepository( RemoteRepository repo ) - { - org.eclipse.aether.repository.RemoteRepository.Builder builder = - new org.eclipse.aether.repository.RemoteRepository.Builder( repo.getId(), repo.getType(), repo.getUrl() ); - builder.setSnapshotPolicy( toPolicy( repo.getSnapshotPolicy(), repo.isSnapshots(), repo.getUpdates(), - repo.getChecksums() ) ); - builder.setReleasePolicy( toPolicy( repo.getReleasePolicy(), repo.isReleases(), repo.getUpdates(), - repo.getChecksums() ) ); - builder.setAuthentication( toAuthentication( repo.getAuthentication() ) ); - return builder.build(); - } - - public static List<org.eclipse.aether.repository.RemoteRepository> toRepositories( Project project, - RepositorySystemSession session, - RemoteRepositories repos, RemoteRepositoryManager remoteRepositoryManager ) - { - List<RemoteRepository> repositories; - - if ( repos != null ) - { - repositories = repos.getRepositories(); - } - else - { - repositories = new ArrayList<RemoteRepository>(); - } - - List<org.eclipse.aether.repository.RemoteRepository> results = - new ArrayList<org.eclipse.aether.repository.RemoteRepository>(); - for ( RemoteRepository repo : repositories ) - { - results.add( toRepository( repo ) ); - } - - results = - remoteRepositoryManager.aggregateRepositories( session, - Collections.<org.eclipse.aether.repository.RemoteRepository> emptyList(), - results, true ); - - return results; - } - -} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/ant/util/SettingsUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/ant/util/SettingsUtils.java b/src/main/java/org/eclipse/aether/ant/util/SettingsUtils.java deleted file mode 100644 index 4103bfe..0000000 --- a/src/main/java/org/eclipse/aether/ant/util/SettingsUtils.java +++ /dev/null @@ -1,173 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010, 2011 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 - * - * Contributors: - * Sonatype, Inc. - initial API and implementation - *******************************************************************************/ -package org.eclipse.aether.ant.util; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.maven.settings.Activation; -import org.apache.maven.settings.ActivationFile; -import org.apache.maven.settings.ActivationOS; -import org.apache.maven.settings.ActivationProperty; -import org.apache.maven.settings.Profile; -import org.apache.maven.settings.Repository; -import org.apache.maven.settings.RepositoryPolicy; - -/** - * Utility methods to read settings from Mavens settings.xml. - */ -public class SettingsUtils -{ - - public static List<org.apache.maven.model.Profile> convert( List<Profile> profiles ) - { - if ( profiles == null ) - { - return null; - } - - List<org.apache.maven.model.Profile> results = new ArrayList<org.apache.maven.model.Profile>(); - - for ( Profile profile : profiles ) - { - results.add( convert( profile ) ); - } - - return results; - } - - static org.apache.maven.model.Profile convert( Profile profile ) - { - if ( profile == null ) - { - return null; - } - - org.apache.maven.model.Profile result = new org.apache.maven.model.Profile(); - - result.setId( profile.getId() ); - result.setProperties( profile.getProperties() ); - result.setSource( "settings.xml" ); - result.setActivation( convert( profile.getActivation() ) ); - - for ( Repository repo : profile.getRepositories() ) - { - result.addRepository( convert( repo ) ); - } - - for ( Repository repo : profile.getPluginRepositories() ) - { - result.addPluginRepository( convert( repo ) ); - } - - return result; - } - - static org.apache.maven.model.Activation convert( Activation activation ) - { - if ( activation == null ) - { - return null; - } - - org.apache.maven.model.Activation result = new org.apache.maven.model.Activation(); - - result.setActiveByDefault( activation.isActiveByDefault() ); - result.setJdk( activation.getJdk() ); - result.setFile( convert( activation.getFile() ) ); - result.setProperty( convert( activation.getProperty() ) ); - result.setOs( convert( activation.getOs() ) ); - - return result; - } - - static org.apache.maven.model.ActivationOS convert( ActivationOS activation ) - { - if ( activation == null ) - { - return null; - } - - org.apache.maven.model.ActivationOS result = new org.apache.maven.model.ActivationOS(); - - result.setArch( activation.getArch() ); - result.setFamily( activation.getFamily() ); - result.setName( activation.getName() ); - result.setVersion( activation.getVersion() ); - - return result; - } - - static org.apache.maven.model.ActivationProperty convert( ActivationProperty activation ) - { - if ( activation == null ) - { - return null; - } - - org.apache.maven.model.ActivationProperty result = new org.apache.maven.model.ActivationProperty(); - - result.setName( activation.getName() ); - result.setValue( activation.getValue() ); - - return result; - } - - static org.apache.maven.model.ActivationFile convert( ActivationFile activation ) - { - if ( activation == null ) - { - return null; - } - - org.apache.maven.model.ActivationFile result = new org.apache.maven.model.ActivationFile(); - - result.setExists( activation.getExists() ); - result.setMissing( activation.getMissing() ); - - return result; - } - - static org.apache.maven.model.Repository convert( Repository repo ) - { - if ( repo == null ) - { - return null; - } - - org.apache.maven.model.Repository result = new org.apache.maven.model.Repository(); - - result.setId( repo.getId() ); - result.setUrl( repo.getUrl() ); - result.setLayout( repo.getLayout() ); - result.setReleases( convert( repo.getReleases() ) ); - result.setSnapshots( convert( repo.getSnapshots() ) ); - - return result; - } - - static org.apache.maven.model.RepositoryPolicy convert( RepositoryPolicy policy ) - { - if ( policy == null ) - { - return null; - } - - org.apache.maven.model.RepositoryPolicy result = new org.apache.maven.model.RepositoryPolicy(); - - result.setEnabled( policy.isEnabled() ); - result.setChecksumPolicy( policy.getChecksumPolicy() ); - result.setUpdatePolicy( policy.getUpdatePolicy() ); - - return result; - } - -} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/internal/ant/AntLogger.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/AntLogger.java b/src/main/java/org/eclipse/aether/internal/ant/AntLogger.java new file mode 100644 index 0000000..033dfdc --- /dev/null +++ b/src/main/java/org/eclipse/aether/internal/ant/AntLogger.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2010, 2014 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 + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.aether.internal.ant; + +import org.apache.tools.ant.Project; +import org.eclipse.aether.spi.log.Logger; + +/** + */ +class AntLogger + implements Logger +{ + + private Project project; + + public AntLogger( Project project ) + { + this.project = project; + } + + public void debug( String msg ) + { + project.log( msg, Project.MSG_DEBUG ); + } + + public void debug( String msg, Throwable error ) + { + project.log( msg, error, Project.MSG_DEBUG ); + } + + public boolean isDebugEnabled() + { + return true; + } + + public boolean isWarnEnabled() + { + return true; + } + + public void warn( String msg ) + { + project.log( msg, Project.MSG_WARN ); + } + + public void warn( String msg, Throwable error ) + { + project.log( msg, error, Project.MSG_WARN ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/internal/ant/AntModelResolver.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/AntModelResolver.java b/src/main/java/org/eclipse/aether/internal/ant/AntModelResolver.java new file mode 100644 index 0000000..dc7ef72 --- /dev/null +++ b/src/main/java/org/eclipse/aether/internal/ant/AntModelResolver.java @@ -0,0 +1,148 @@ +/******************************************************************************* + * Copyright (c) 2010, 2014 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 + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.aether.internal.ant; + +import java.io.File; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.maven.model.Repository; +import org.apache.maven.model.building.FileModelSource; +import org.apache.maven.model.building.ModelSource; +import org.apache.maven.model.resolution.InvalidRepositoryException; +import org.apache.maven.model.resolution.ModelResolver; +import org.apache.maven.model.resolution.UnresolvableModelException; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.impl.RemoteRepositoryManager; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.repository.RepositoryPolicy; +import org.eclipse.aether.resolution.ArtifactRequest; +import org.eclipse.aether.resolution.ArtifactResolutionException; + +/** + * A model resolver to assist building of dependency POMs. This resolver gives priority to those repositories that have + * been initially specified and repositories discovered in dependency POMs are recessively merged into the search chain. + * + */ +class AntModelResolver + implements ModelResolver +{ + + private final RepositorySystemSession session; + + private final String context; + + private List<org.eclipse.aether.repository.RemoteRepository> repositories; + + private final RepositorySystem repoSys; + + private final RemoteRepositoryManager remoteRepositoryManager; + + private final Set<String> repositoryIds; + + public AntModelResolver( RepositorySystemSession session, String context, RepositorySystem repoSys, + RemoteRepositoryManager remoteRepositoryManager, List<RemoteRepository> repositories ) + { + this.session = session; + this.context = context; + this.repoSys = repoSys; + this.remoteRepositoryManager = remoteRepositoryManager; + this.repositories = repositories; + this.repositoryIds = new HashSet<String>(); + } + + private AntModelResolver( AntModelResolver original ) + { + this.session = original.session; + this.context = original.context; + this.repoSys = original.repoSys; + this.remoteRepositoryManager = original.remoteRepositoryManager; + this.repositories = original.repositories; + this.repositoryIds = new HashSet<String>( original.repositoryIds ); + } + + public void addRepository( Repository repository ) + throws InvalidRepositoryException + { + if ( !repositoryIds.add( repository.getId() ) ) + { + return; + } + + List<RemoteRepository> newRepositories = Collections.singletonList( convert( repository ) ); + + this.repositories = + remoteRepositoryManager.aggregateRepositories( session, repositories, newRepositories, true ); + } + + static RemoteRepository convert( Repository repository ) + { + RemoteRepository.Builder builder = + new RemoteRepository.Builder( repository.getId(), repository.getLayout(), repository.getUrl() ); + builder.setSnapshotPolicy( convert( repository.getSnapshots() ) ); + builder.setReleasePolicy( convert( repository.getReleases() ) ); + return builder.build(); + } + + private static RepositoryPolicy convert( org.apache.maven.model.RepositoryPolicy policy ) + { + boolean enabled = true; + String checksums = RepositoryPolicy.CHECKSUM_POLICY_WARN; + String updates = RepositoryPolicy.UPDATE_POLICY_DAILY; + + if ( policy != null ) + { + enabled = policy.isEnabled(); + if ( policy.getUpdatePolicy() != null ) + { + updates = policy.getUpdatePolicy(); + } + if ( policy.getChecksumPolicy() != null ) + { + checksums = policy.getChecksumPolicy(); + } + } + + return new RepositoryPolicy( enabled, updates, checksums ); + } + + public ModelResolver newCopy() + { + return new AntModelResolver( this ); + } + + public ModelSource resolveModel( String groupId, String artifactId, String version ) + throws UnresolvableModelException + { + Artifact pomArtifact = new DefaultArtifact( groupId, artifactId, "", "pom", version ); + + try + { + ArtifactRequest request = new ArtifactRequest( pomArtifact, repositories, context ); + pomArtifact = repoSys.resolveArtifact( session, request ).getArtifact(); + } + catch ( ArtifactResolutionException e ) + { + throw new UnresolvableModelException( "Failed to resolve POM for " + groupId + ":" + artifactId + ":" + + version + " due to " + e.getMessage(), groupId, artifactId, version, e ); + } + + File pomFile = pomArtifact.getFile(); + + return new FileModelSource( pomFile ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/internal/ant/AntRepoSys.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/AntRepoSys.java b/src/main/java/org/eclipse/aether/internal/ant/AntRepoSys.java new file mode 100644 index 0000000..860b203 --- /dev/null +++ b/src/main/java/org/eclipse/aether/internal/ant/AntRepoSys.java @@ -0,0 +1,751 @@ +/******************************************************************************* + * Copyright (c) 2010, 2014 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 + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.aether.internal.ant; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.maven.model.Model; +import org.apache.maven.model.building.DefaultModelBuilderFactory; +import org.apache.maven.model.building.DefaultModelBuildingRequest; +import org.apache.maven.model.building.FileModelSource; +import org.apache.maven.model.building.ModelBuilder; +import org.apache.maven.model.building.ModelBuildingException; +import org.apache.maven.model.building.ModelBuildingRequest; +import org.apache.maven.model.resolution.ModelResolver; +import org.apache.maven.repository.internal.MavenRepositorySystemUtils; +import org.apache.maven.settings.Server; +import org.apache.maven.settings.Settings; +import org.apache.maven.settings.building.DefaultSettingsBuilderFactory; +import org.apache.maven.settings.building.DefaultSettingsBuildingRequest; +import org.apache.maven.settings.building.SettingsBuilder; +import org.apache.maven.settings.building.SettingsBuildingException; +import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest; +import org.apache.maven.settings.crypto.SettingsDecrypter; +import org.apache.maven.settings.crypto.SettingsDecryptionResult; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.taskdefs.condition.Os; +import org.apache.tools.ant.types.Reference; +import org.codehaus.plexus.util.xml.Xpp3Dom; +import org.eclipse.aether.ConfigurationProperties; +import org.eclipse.aether.DefaultRepositoryCache; +import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.collection.CollectResult; +import org.eclipse.aether.collection.DependencyCollectionException; +import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; +import org.eclipse.aether.impl.DefaultServiceLocator; +import org.eclipse.aether.impl.RemoteRepositoryManager; +import org.eclipse.aether.internal.ant.types.Authentication; +import org.eclipse.aether.internal.ant.types.Dependencies; +import org.eclipse.aether.internal.ant.types.Dependency; +import org.eclipse.aether.internal.ant.types.DependencyContainer; +import org.eclipse.aether.internal.ant.types.Exclusion; +import org.eclipse.aether.internal.ant.types.LocalRepository; +import org.eclipse.aether.internal.ant.types.Mirror; +import org.eclipse.aether.internal.ant.types.Pom; +import org.eclipse.aether.internal.ant.types.Proxy; +import org.eclipse.aether.internal.ant.types.RemoteRepositories; +import org.eclipse.aether.internal.ant.types.RemoteRepository; +import org.eclipse.aether.internal.ant.util.AetherUtils; +import org.eclipse.aether.internal.ant.util.ConverterUtils; +import org.eclipse.aether.internal.ant.util.SettingsUtils; +import org.eclipse.aether.repository.AuthenticationSelector; +import org.eclipse.aether.repository.LocalRepositoryManager; +import org.eclipse.aether.repository.MirrorSelector; +import org.eclipse.aether.repository.ProxySelector; +import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; +import org.eclipse.aether.spi.connector.transport.TransporterFactory; +import org.eclipse.aether.spi.log.Logger; +import org.eclipse.aether.transport.classpath.ClasspathTransporterFactory; +import org.eclipse.aether.transport.file.FileTransporterFactory; +import org.eclipse.aether.transport.http.HttpTransporterFactory; +import org.eclipse.aether.util.repository.AuthenticationBuilder; +import org.eclipse.aether.util.repository.ConservativeAuthenticationSelector; +import org.eclipse.aether.util.repository.DefaultAuthenticationSelector; +import org.eclipse.aether.util.repository.DefaultMirrorSelector; +import org.eclipse.aether.util.repository.DefaultProxySelector; + +/** + */ +public class AntRepoSys +{ + + private static boolean OS_WINDOWS = Os.isFamily( "windows" ); + + private static final ModelBuilder modelBuilder = new DefaultModelBuilderFactory().newInstance(); + + private static final SettingsBuilder settingsBuilder = new DefaultSettingsBuilderFactory().newInstance(); + + private static final SettingsDecrypter settingsDecrypter = new AntSettingsDecryptorFactory().newInstance(); + + private final Project project; + + private final DefaultServiceLocator locator; + + private RepositorySystem repoSys; + + private RemoteRepositoryManager remoteRepoMan; + + private File userSettings; + + private File globalSettings; + + private Settings settings; + + private final List<Mirror> mirrors = new CopyOnWriteArrayList<Mirror>(); + + private final List<Proxy> proxies = new CopyOnWriteArrayList<Proxy>(); + + private final List<Authentication> authentications = new CopyOnWriteArrayList<Authentication>(); + + private LocalRepository localRepository; + + private Pom defaultPom; + + private static <T> boolean eq( T o1, T o2 ) + { + return ( o1 == null ) ? o2 == null : o1.equals( o2 ); + } + + public static synchronized AntRepoSys getInstance( Project project ) + { + Object obj = project.getReference( Names.ID ); + if ( obj instanceof AntRepoSys ) + { + return (AntRepoSys) obj; + } + AntRepoSys instance = new AntRepoSys( project ); + project.addReference( Names.ID, instance ); + instance.initDefaults(); + return instance; + } + + private AntRepoSys( Project project ) + { + this.project = project; + + locator = MavenRepositorySystemUtils.newServiceLocator(); + locator.setErrorHandler( new AntServiceLocatorErrorHandler( project ) ); + locator.setServices( Logger.class, new AntLogger( project ) ); + locator.setServices( ModelBuilder.class, modelBuilder ); + locator.addService( RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class ); + locator.addService( TransporterFactory.class, FileTransporterFactory.class ); + locator.addService( TransporterFactory.class, HttpTransporterFactory.class ); + locator.addService( TransporterFactory.class, ClasspathTransporterFactory.class ); + } + + private void initDefaults() + { + RemoteRepository repo = new RemoteRepository(); + repo.setProject( project ); + repo.setId( "central" ); + repo.setUrl( "http://repo1.maven.org/maven2/" ); + project.addReference( Names.ID_CENTRAL, repo ); + + repo = new RemoteRepository(); + repo.setProject( project ); + repo.setRefid( new Reference( project, Names.ID_CENTRAL ) ); + RemoteRepositories repos = new RemoteRepositories(); + repos.setProject( project ); + repos.addRemoterepo( repo ); + project.addReference( Names.ID_DEFAULT_REPOS, repos ); + } + + public synchronized RepositorySystem getSystem() + { + if ( repoSys == null ) + { + repoSys = locator.getService( RepositorySystem.class ); + if ( repoSys == null ) + { + throw new BuildException( "The repository system could not be initialized" ); + } + } + return repoSys; + } + + private synchronized RemoteRepositoryManager getRemoteRepoMan() + { + if ( remoteRepoMan == null ) + { + remoteRepoMan = locator.getService( RemoteRepositoryManager.class ); + if ( remoteRepoMan == null ) + { + throw new BuildException( "The repository system could not be initialized" ); + } + } + return remoteRepoMan; + } + + public RepositorySystemSession getSession( Task task, LocalRepository localRepo ) + { + DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); + + Map<Object, Object> configProps = new LinkedHashMap<Object, Object>(); + configProps.put( ConfigurationProperties.USER_AGENT, getUserAgent() ); + configProps.putAll( (Map<?, ?>) project.getProperties() ); + processServerConfiguration( configProps ); + session.setConfigProperties( configProps ); + + session.setOffline( isOffline() ); + session.setUserProperties( project.getUserProperties() ); + + session.setProxySelector( getProxySelector() ); + session.setMirrorSelector( getMirrorSelector() ); + session.setAuthenticationSelector( getAuthSelector() ); + + session.setCache( new DefaultRepositoryCache() ); + + session.setRepositoryListener( new AntRepositoryListener( task ) ); + session.setTransferListener( new AntTransferListener( task ) ); + + session.setLocalRepositoryManager( getLocalRepoMan( session, localRepo ) ); + + session.setWorkspaceReader( ProjectWorkspaceReader.getInstance() ); + + return session; + } + + private String getUserAgent() + { + StringBuilder buffer = new StringBuilder( 128 ); + + buffer.append( "Apache-Ant/" ).append( project.getProperty( "ant.version" ) ); + buffer.append( " (" ); + buffer.append( "Java " ).append( System.getProperty( "java.version" ) ); + buffer.append( "; " ); + buffer.append( System.getProperty( "os.name" ) ).append( " " ).append( System.getProperty( "os.version" ) ); + buffer.append( ")" ); + buffer.append( " Aether" ); + + return buffer.toString(); + } + + private boolean isOffline() + { + String prop = project.getProperty( Names.PROPERTY_OFFLINE ); + if ( prop != null ) + { + return Boolean.parseBoolean( prop ); + } + return getSettings().isOffline(); + } + + private void processServerConfiguration( Map<Object, Object> configProps ) + { + Settings settings = getSettings(); + for ( Server server : settings.getServers() ) + { + if ( server.getConfiguration() != null ) + { + Xpp3Dom dom = (Xpp3Dom) server.getConfiguration(); + for ( int i = dom.getChildCount() - 1; i >= 0; i-- ) + { + Xpp3Dom child = dom.getChild( i ); + if ( "wagonProvider".equals( child.getName() ) ) + { + dom.removeChild( i ); + } + else if ( "httpHeaders".equals( child.getName() ) ) + { + configProps.put( ConfigurationProperties.HTTP_HEADERS + "." + server.getId(), + getHttpHeaders( child ) ); + } + } + + configProps.put( "aether.connector.wagon.config." + server.getId(), dom ); + } + + configProps.put( "aether.connector.perms.fileMode." + server.getId(), server.getFilePermissions() ); + configProps.put( "aether.connector.perms.dirMode." + server.getId(), server.getDirectoryPermissions() ); + } + } + + private Map<String, String> getHttpHeaders( Xpp3Dom dom ) + { + Map<String, String> headers = new HashMap<String, String>(); + for ( int i = 0; i < dom.getChildCount(); i++ ) + { + Xpp3Dom child = dom.getChild( i ); + Xpp3Dom name = child.getChild( "name" ); + Xpp3Dom value = child.getChild( "value" ); + if ( name != null && name.getValue() != null ) + { + headers.put( name.getValue(), ( value != null ) ? value.getValue() : null ); + } + } + return Collections.unmodifiableMap( headers ); + } + + private File getDefaultLocalRepoDir() + { + String dir = project.getProperty( "maven.repo.local" ); + if ( dir != null ) + { + return project.resolveFile( dir ); + } + + Settings settings = getSettings(); + if ( settings.getLocalRepository() != null ) + { + return new File( settings.getLocalRepository() ); + } + + return new File( new File( project.getProperty( "user.home" ), ".m2" ), "repository" ); + } + + private LocalRepositoryManager getLocalRepoMan( RepositorySystemSession session, LocalRepository localRepo ) + { + if ( localRepo == null ) + { + localRepo = localRepository; + } + + File repoDir; + if ( localRepo != null && localRepo.getDir() != null ) + { + repoDir = localRepo.getDir(); + } + else + { + repoDir = getDefaultLocalRepoDir(); + } + + org.eclipse.aether.repository.LocalRepository repo = + new org.eclipse.aether.repository.LocalRepository( repoDir ); + + return getSystem().newLocalRepositoryManager( session, repo ); + } + + private synchronized Settings getSettings() + { + if ( settings == null ) + { + DefaultSettingsBuildingRequest request = new DefaultSettingsBuildingRequest(); + request.setUserSettingsFile( getUserSettings() ); + request.setGlobalSettingsFile( getGlobalSettings() ); + request.setSystemProperties( getSystemProperties() ); + request.setUserProperties( getUserProperties() ); + + try + { + settings = settingsBuilder.build( request ).getEffectiveSettings(); + } + catch ( SettingsBuildingException e ) + { + project.log( "Could not process settings.xml: " + e.getMessage(), e, Project.MSG_WARN ); + } + + SettingsDecryptionResult result = + settingsDecrypter.decrypt( new DefaultSettingsDecryptionRequest( settings ) ); + settings.setServers( result.getServers() ); + settings.setProxies( result.getProxies() ); + } + return settings; + } + + private ProxySelector getProxySelector() + { + DefaultProxySelector selector = new DefaultProxySelector(); + + for ( Proxy proxy : proxies ) + { + selector.add( ConverterUtils.toProxy( proxy ), proxy.getNonProxyHosts() ); + } + + Settings settings = getSettings(); + for ( org.apache.maven.settings.Proxy proxy : settings.getProxies() ) + { + AuthenticationBuilder auth = new AuthenticationBuilder(); + auth.addUsername( proxy.getUsername() ).addPassword( proxy.getPassword() ); + selector.add( new org.eclipse.aether.repository.Proxy( proxy.getProtocol(), proxy.getHost(), + proxy.getPort(), auth.build() ), + proxy.getNonProxyHosts() ); + } + + return selector; + } + + private MirrorSelector getMirrorSelector() + { + DefaultMirrorSelector selector = new DefaultMirrorSelector(); + + for ( Mirror mirror : mirrors ) + { + selector.add( mirror.getId(), mirror.getUrl(), mirror.getType(), false, mirror.getMirrorOf(), null ); + } + + Settings settings = getSettings(); + for ( org.apache.maven.settings.Mirror mirror : settings.getMirrors() ) + { + selector.add( String.valueOf( mirror.getId() ), mirror.getUrl(), mirror.getLayout(), false, + mirror.getMirrorOf(), mirror.getMirrorOfLayouts() ); + } + + return selector; + } + + private AuthenticationSelector getAuthSelector() + { + DefaultAuthenticationSelector selector = new DefaultAuthenticationSelector(); + + Collection<String> ids = new HashSet<String>(); + for ( Authentication auth : authentications ) + { + List<String> servers = auth.getServers(); + if ( !servers.isEmpty() ) + { + org.eclipse.aether.repository.Authentication a = ConverterUtils.toAuthentication( auth ); + for ( String server : servers ) + { + if ( ids.add( server ) ) + { + selector.add( server, a ); + } + } + } + } + + Settings settings = getSettings(); + for ( Server server : settings.getServers() ) + { + AuthenticationBuilder auth = new AuthenticationBuilder(); + auth.addUsername( server.getUsername() ).addPassword( server.getPassword() ); + auth.addPrivateKey( server.getPrivateKey(), server.getPassphrase() ); + selector.add( server.getId(), auth.build() ); + } + + return new ConservativeAuthenticationSelector( selector ); + } + + public synchronized void setUserSettings( File file ) + { + if ( !eq( this.userSettings, file ) ) + { + settings = null; + } + this.userSettings = file; + } + + /* UT */File getUserSettings() + { + if ( userSettings == null ) + { + userSettings = AetherUtils.findUserSettings( project ); + } + return userSettings; + } + + public void setGlobalSettings( File file ) + { + if ( !eq( this.globalSettings, file ) ) + { + settings = null; + } + this.globalSettings = file; + } + + /* UT */File getGlobalSettings() + { + if ( globalSettings == null ) + { + globalSettings = AetherUtils.findGlobalSettings( project ); + } + return globalSettings; + } + + public void addProxy( Proxy proxy ) + { + proxies.add( proxy ); + } + + public void addMirror( Mirror mirror ) + { + mirrors.add( mirror ); + } + + public void addAuthentication( Authentication authentication ) + { + authentications.add( authentication ); + } + + public void setLocalRepository( LocalRepository localRepository ) + { + this.localRepository = localRepository; + } + + public Model loadModel( Task task, File pomFile, boolean local, RemoteRepositories remoteRepositories ) + { + RepositorySystemSession session = getSession( task, null ); + + remoteRepositories = + remoteRepositories == null ? AetherUtils.getDefaultRepositories( project ) : remoteRepositories; + + List<org.eclipse.aether.repository.RemoteRepository> repositories = + ConverterUtils.toRepositories( task.getProject(), session, remoteRepositories, getRemoteRepoMan() ); + + ModelResolver modelResolver = + new AntModelResolver( session, "project", getSystem(), getRemoteRepoMan(), repositories ); + + Settings settings = getSettings(); + + try + { + DefaultModelBuildingRequest request = new DefaultModelBuildingRequest(); + request.setLocationTracking( true ); + request.setProcessPlugins( false ); + if ( local ) + { + request.setPomFile( pomFile ); + request.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_STRICT ); + } + else + { + request.setModelSource( new FileModelSource( pomFile ) ); + request.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL ); + } + request.setSystemProperties( getSystemProperties() ); + request.setUserProperties( getUserProperties() ); + request.setProfiles( SettingsUtils.convert( settings.getProfiles() ) ); + request.setActiveProfileIds( settings.getActiveProfiles() ); + request.setModelResolver( modelResolver ); + return modelBuilder.build( request ).getEffectiveModel(); + } + catch ( ModelBuildingException e ) + { + throw new BuildException( "Could not load POM " + pomFile + ": " + e.getMessage(), e ); + } + } + + private Properties getSystemProperties() + { + Properties props = new Properties(); + getEnvProperties( props ); + props.putAll( System.getProperties() ); + ConverterUtils.addProperties( props, project.getProperties() ); + return props; + } + + private Properties getEnvProperties( Properties props ) + { + if ( props == null ) + { + props = new Properties(); + } + boolean envCaseInsensitive = OS_WINDOWS; + for ( Map.Entry<String, String> entry : System.getenv().entrySet() ) + { + String key = entry.getKey(); + if ( envCaseInsensitive ) + { + key = key.toUpperCase( Locale.ENGLISH ); + } + key = "env." + key; + props.put( key, entry.getValue() ); + } + return props; + } + + private Properties getUserProperties() + { + return ConverterUtils.addProperties( null, project.getUserProperties() ); + } + + /** + * Sets the default POM. + */ + public void setDefaultPom( Pom pom ) + { + this.defaultPom = pom; + } + + /** + * Returns the current default POM. + */ + public Pom getDefaultPom() + { + return defaultPom; + } + + public CollectResult collectDependencies( Task task, Dependencies dependencies, LocalRepository localRepository, + RemoteRepositories remoteRepositories ) + { + RepositorySystemSession session = getSession( task, localRepository ); + + remoteRepositories = + remoteRepositories == null ? AetherUtils.getDefaultRepositories( project ) : remoteRepositories; + + List<org.eclipse.aether.repository.RemoteRepository> repos = + ConverterUtils.toRepositories( project, session, remoteRepositories, getRemoteRepoMan() ); + + CollectRequest collectRequest = new CollectRequest(); + collectRequest.setRequestContext( "project" ); + + for ( org.eclipse.aether.repository.RemoteRepository repo : repos ) + { + task.getProject().log( "Using remote repository " + repo, Project.MSG_VERBOSE ); + collectRequest.addRepository( repo ); + } + + if ( dependencies != null ) + { + populateCollectRequest( collectRequest, task, session, dependencies, Collections.<Exclusion> emptyList() ); + } + + task.getProject().log( "Collecting dependencies", Project.MSG_VERBOSE ); + + CollectResult result; + try + { + result = getSystem().collectDependencies( session, collectRequest ); + } + catch ( DependencyCollectionException e ) + { + throw new BuildException( "Could not collect dependencies: " + e.getMessage(), e ); + } + + return result; + } + + private void populateCollectRequest( CollectRequest collectRequest, Task task, RepositorySystemSession session, + Dependencies dependencies, List<Exclusion> exclusions ) + { + List<Exclusion> globalExclusions = exclusions; + if ( !dependencies.getExclusions().isEmpty() ) + { + globalExclusions = new ArrayList<Exclusion>( exclusions ); + globalExclusions.addAll( dependencies.getExclusions() ); + } + + Collection<String> ids = new HashSet<String>(); + + for ( DependencyContainer container : dependencies.getDependencyContainers() ) + { + if ( container instanceof Dependency ) + { + Dependency dep = (Dependency) container; + ids.add( dep.getVersionlessKey() ); + collectRequest.addDependency( ConverterUtils.toDependency( dep, globalExclusions, session ) ); + } + else + { + populateCollectRequest( collectRequest, task, session, (Dependencies) container, globalExclusions ); + } + } + + if ( dependencies.getPom() != null ) + { + Model model = dependencies.getPom().getModel( task ); + for ( org.apache.maven.model.Dependency dep : model.getDependencies() ) + { + Dependency dependency = new Dependency(); + dependency.setArtifactId( dep.getArtifactId() ); + dependency.setClassifier( dep.getClassifier() ); + dependency.setGroupId( dep.getGroupId() ); + dependency.setScope( dep.getScope() ); + dependency.setType( dep.getType() ); + dependency.setVersion( dep.getVersion() ); + if ( ids.contains( dependency.getVersionlessKey() ) ) + { + project.log( "Ignoring dependency " + dependency.getVersionlessKey() + " from " + model.getId() + + ", already declared locally", Project.MSG_VERBOSE ); + continue; + } + if ( dep.getSystemPath() != null && dep.getSystemPath().length() > 0 ) + { + dependency.setSystemPath( task.getProject().resolveFile( dep.getSystemPath() ) ); + } + for ( org.apache.maven.model.Exclusion exc : dep.getExclusions() ) + { + Exclusion exclusion = new Exclusion(); + exclusion.setGroupId( exc.getGroupId() ); + exclusion.setArtifactId( exc.getArtifactId() ); + exclusion.setClassifier( "*" ); + exclusion.setExtension( "*" ); + dependency.addExclusion( exclusion ); + } + collectRequest.addDependency( ConverterUtils.toDependency( dependency, globalExclusions, session ) ); + } + } + + if ( dependencies.getFile() != null ) + { + List<Dependency> deps = readDependencies( dependencies.getFile() ); + for ( Dependency dependency : deps ) + { + if ( ids.contains( dependency.getVersionlessKey() ) ) + { + project.log( "Ignoring dependency " + dependency.getVersionlessKey() + " from " + + dependencies.getFile() + ", already declared locally", Project.MSG_VERBOSE ); + continue; + } + collectRequest.addDependency( ConverterUtils.toDependency( dependency, globalExclusions, session ) ); + } + } + } + + private List<Dependency> readDependencies( File file ) + { + List<Dependency> dependencies = new ArrayList<Dependency>(); + try + { + BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( file ), "UTF-8" ) ); + try + { + for ( String line = reader.readLine(); line != null; line = reader.readLine() ) + { + int comment = line.indexOf( '#' ); + if ( comment >= 0 ) + { + line = line.substring( 0, comment ); + } + line = line.trim(); + if ( line.length() <= 0 ) + { + continue; + } + Dependency dependency = new Dependency(); + dependency.setCoords( line ); + dependencies.add( dependency ); + } + } + finally + { + reader.close(); + } + } + catch ( IOException e ) + { + throw new BuildException( "Cannot read " + file, e ); + } + return dependencies; + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/internal/ant/AntRepositoryListener.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/AntRepositoryListener.java b/src/main/java/org/eclipse/aether/internal/ant/AntRepositoryListener.java new file mode 100644 index 0000000..6ed9772 --- /dev/null +++ b/src/main/java/org/eclipse/aether/internal/ant/AntRepositoryListener.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright (c) 2010, 2014 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 + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.aether.internal.ant; + +import java.io.FileNotFoundException; + +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.eclipse.aether.AbstractRepositoryListener; +import org.eclipse.aether.RepositoryEvent; +import org.eclipse.aether.transfer.MetadataNotFoundException; + +/** + * Logs repository events like installed and unresolved artifacts and metadata. + */ +class AntRepositoryListener + extends AbstractRepositoryListener +{ + + private Task task; + + public AntRepositoryListener( Task task ) + { + this.task = task; + } + + @Override + public void artifactInstalling( RepositoryEvent event ) + { + task.log( "Installing " + event.getArtifact().getFile() + " to " + event.getFile() ); + } + + @Override + public void metadataInstalling( RepositoryEvent event ) + { + task.log( "Installing " + event.getMetadata() + " to " + event.getFile() ); + } + + @Override + public void metadataResolved( RepositoryEvent event ) + { + Exception e = event.getException(); + if ( e != null ) + { + if ( e instanceof MetadataNotFoundException ) + { + task.log( e.getMessage(), Project.MSG_DEBUG ); + } + else + { + task.log( e.getMessage(), e, Project.MSG_WARN ); + } + } + } + + @Override + public void metadataInvalid( RepositoryEvent event ) + { + Exception exception = event.getException(); + + StringBuilder buffer = new StringBuilder( 256 ); + buffer.append( "The metadata " ); + if ( event.getMetadata().getFile() != null ) + { + buffer.append( event.getMetadata().getFile() ); + } + else + { + buffer.append( event.getMetadata() ); + } + + if ( exception instanceof FileNotFoundException ) + { + buffer.append( " is inaccessible" ); + } + else + { + buffer.append( " is invalid" ); + } + + if ( exception != null ) + { + buffer.append( ": " ); + buffer.append( exception.getMessage() ); + } + + task.log( buffer.toString(), exception, Project.MSG_WARN ); + } + + @Override + public void artifactDescriptorInvalid( RepositoryEvent event ) + { + task.log( "The POM for " + event.getArtifact() + " is invalid" + + ", transitive dependencies (if any) will not be available: " + + event.getException().getMessage(), + event.getException(), Project.MSG_WARN ); + }; + + @Override + public void artifactDescriptorMissing( RepositoryEvent event ) + { + task.log( "The POM for " + event.getArtifact() + " is missing, no dependency information available", + Project.MSG_WARN ); + }; + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/internal/ant/AntSecDispatcher.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/AntSecDispatcher.java b/src/main/java/org/eclipse/aether/internal/ant/AntSecDispatcher.java new file mode 100644 index 0000000..e480d77 --- /dev/null +++ b/src/main/java/org/eclipse/aether/internal/ant/AntSecDispatcher.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2010, 2014 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 + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.aether.internal.ant; + +import org.sonatype.plexus.components.cipher.DefaultPlexusCipher; +import org.sonatype.plexus.components.cipher.PlexusCipherException; +import org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher; + +/** + */ +class AntSecDispatcher + extends DefaultSecDispatcher +{ + + public AntSecDispatcher() + { + _configurationFile = "~/.m2/settings-security.xml"; + try + { + _cipher = new DefaultPlexusCipher(); + } + catch ( PlexusCipherException e ) + { + e.printStackTrace(); + } + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/internal/ant/AntServiceLocatorErrorHandler.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/AntServiceLocatorErrorHandler.java b/src/main/java/org/eclipse/aether/internal/ant/AntServiceLocatorErrorHandler.java new file mode 100644 index 0000000..9715246 --- /dev/null +++ b/src/main/java/org/eclipse/aether/internal/ant/AntServiceLocatorErrorHandler.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2010, 2014 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 + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.aether.internal.ant; + +import org.apache.tools.ant.Project; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.impl.DefaultServiceLocator; + +/** + */ +class AntServiceLocatorErrorHandler + extends DefaultServiceLocator.ErrorHandler +{ + + private Project project; + + public AntServiceLocatorErrorHandler( Project project ) + { + this.project = project; + } + + public void serviceCreationFailed( Class<?> type, Class<?> impl, Throwable exception ) + { + String msg = "Could not initialize repository system"; + if ( !RepositorySystem.class.equals( type ) ) + { + msg += ", service " + type.getName() + " (" + impl.getName() + ") failed to initialize"; + } + msg += ": " + exception.getMessage(); + project.log( msg, exception, Project.MSG_ERR ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/internal/ant/AntSettingsDecryptorFactory.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/AntSettingsDecryptorFactory.java b/src/main/java/org/eclipse/aether/internal/ant/AntSettingsDecryptorFactory.java new file mode 100644 index 0000000..0195292 --- /dev/null +++ b/src/main/java/org/eclipse/aether/internal/ant/AntSettingsDecryptorFactory.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2010, 2014 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 + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.aether.internal.ant; + +import java.lang.reflect.Field; + +import org.apache.maven.settings.crypto.DefaultSettingsDecrypter; + +/** + */ +class AntSettingsDecryptorFactory +{ + + public DefaultSettingsDecrypter newInstance() + { + AntSecDispatcher secDispatcher = new AntSecDispatcher(); + + DefaultSettingsDecrypter decrypter = new DefaultSettingsDecrypter(); + + try + { + Field field = decrypter.getClass().getDeclaredField( "securityDispatcher" ); + field.setAccessible( true ); + field.set( decrypter, secDispatcher ); + } + catch ( Exception e ) + { + throw new IllegalStateException( e ); + } + + return decrypter; + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/internal/ant/AntTransferListener.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/AntTransferListener.java b/src/main/java/org/eclipse/aether/internal/ant/AntTransferListener.java new file mode 100644 index 0000000..914cd1f --- /dev/null +++ b/src/main/java/org/eclipse/aether/internal/ant/AntTransferListener.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * Copyright (c) 2010, 2014 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 + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.aether.internal.ant; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; + +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.eclipse.aether.transfer.AbstractTransferListener; +import org.eclipse.aether.transfer.TransferCancelledException; +import org.eclipse.aether.transfer.TransferEvent; +import org.eclipse.aether.transfer.TransferResource; + +/** + * Logs up- and downloads. + */ +class AntTransferListener + extends AbstractTransferListener +{ + + private Task task; + + public AntTransferListener( Task task ) + { + this.task = task; + } + + @Override + public void transferInitiated( TransferEvent event ) + throws TransferCancelledException + { + String msg = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading"; + msg += " " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName(); + task.log( msg ); + } + + @Override + public void transferCorrupted( TransferEvent event ) + throws TransferCancelledException + { + TransferResource resource = event.getResource(); + + task.log( event.getException().getMessage() + " for " + resource.getRepositoryUrl() + + resource.getResourceName(), Project.MSG_WARN ); + } + + @Override + public void transferSucceeded( TransferEvent event ) + { + String msg = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded" : "Downloaded"; + msg += " " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName(); + + long contentLength = event.getTransferredBytes(); + if ( contentLength >= 0 ) + { + String len = contentLength >= 1024 ? ( ( contentLength + 1023 ) / 1024 ) + " KB" : contentLength + " B"; + + String throughput = ""; + long duration = System.currentTimeMillis() - event.getResource().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"; + } + + msg += " (" + len + throughput + ")"; + } + task.log( msg ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/internal/ant/Names.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/Names.java b/src/main/java/org/eclipse/aether/internal/ant/Names.java new file mode 100644 index 0000000..7d6e8c2 --- /dev/null +++ b/src/main/java/org/eclipse/aether/internal/ant/Names.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2010, 2014 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 + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.aether.internal.ant; + +public final class Names +{ + + private Names() + { + // hide constructor + } + + public static final String ID = "aether"; + + public static final String ID_DEFAULT_REPOS = ID + ".repositories"; + + public static final String ID_DEFAULT_POM = ID + ".pom"; + + public static final String ID_CENTRAL = "central"; + + public static final String PROPERTY_OFFLINE = "aether.offline"; + + public static final String SETTINGS_XML = "settings.xml"; + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/1ec78d99/src/main/java/org/eclipse/aether/internal/ant/ProjectWorkspaceReader.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/ProjectWorkspaceReader.java b/src/main/java/org/eclipse/aether/internal/ant/ProjectWorkspaceReader.java new file mode 100644 index 0000000..1215f9e --- /dev/null +++ b/src/main/java/org/eclipse/aether/internal/ant/ProjectWorkspaceReader.java @@ -0,0 +1,135 @@ +/******************************************************************************* + * Copyright (c) 2010, 2014 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 + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.aether.internal.ant; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.maven.model.Model; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.internal.ant.types.Pom; +import org.eclipse.aether.repository.WorkspaceReader; +import org.eclipse.aether.repository.WorkspaceRepository; +import org.eclipse.aether.util.artifact.ArtifactIdUtils; + +/** + * Workspace reader caching available POMs and artifacts for ant builds. + * <p/> + * <pom> elements are cached if they are defined by the 'file'-attribute, as they reference a backing pom.xml file that + * can be used for resolution with Aether. <artifact> elements are cached if they directly define a 'pom'-attribute + * or child. The POM may be file-based or in-memory. + */ +public class ProjectWorkspaceReader + implements WorkspaceReader +{ + + private static volatile ProjectWorkspaceReader instance; + + private static final Object LOCK = new Object(); + + private Map<String, Artifact> artifacts = new ConcurrentHashMap<String, Artifact>(); + + public void addPom( Pom pom ) + { + if ( pom.getFile() != null ) + { + Model model = pom.getModel( pom ); + Artifact aetherArtifact = + new DefaultArtifact( model.getGroupId(), model.getArtifactId(), null, "pom", model.getVersion() ); + aetherArtifact = aetherArtifact.setFile( pom.getFile() ); + String coords = coords( aetherArtifact ); + artifacts.put( coords, aetherArtifact ); + } + } + + public void addArtifact( org.eclipse.aether.internal.ant.types.Artifact artifact ) + { + if ( artifact.getPom() != null ) + { + Pom pom = artifact.getPom(); + Artifact aetherArtifact; + if ( pom.getFile() != null ) + { + Model model = pom.getModel( pom ); + aetherArtifact = + new DefaultArtifact( model.getGroupId(), model.getArtifactId(), artifact.getClassifier(), + artifact.getType(), model.getVersion() ); + } + else + { + aetherArtifact = + new DefaultArtifact( pom.getGroupId(), pom.getArtifactId(), artifact.getClassifier(), + artifact.getType(), pom.getVersion() ); + } + aetherArtifact = aetherArtifact.setFile( artifact.getFile() ); + + String coords = coords( aetherArtifact ); + artifacts.put( coords, aetherArtifact ); + } + } + + private String coords( Artifact artifact ) + { + return ArtifactIdUtils.toId( artifact ); + } + + public WorkspaceRepository getRepository() + { + return new WorkspaceRepository( "ant" ); + } + + public File findArtifact( Artifact artifact ) + { + artifact = artifacts.get( coords( artifact ) ); + return ( artifact != null ) ? artifact.getFile() : null; + } + + public List<String> findVersions( Artifact artifact ) + { + List<String> versions = new ArrayList<String>(); + for ( Artifact art : artifacts.values() ) + { + if ( ArtifactIdUtils.equalsVersionlessId( artifact, art ) ) + { + versions.add( art.getVersion() ); + } + } + return versions; + } + + ProjectWorkspaceReader() + { + } + + public static ProjectWorkspaceReader getInstance() + { + if ( instance == null ) + { + synchronized ( LOCK ) + { + if ( instance == null ) + { + instance = new ProjectWorkspaceReader(); + } + } + } + return instance; + } + + static void dropInstance() + { + instance = null; + } +}