http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Install.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Install.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Install.java new file mode 100644 index 0000000..b79716b --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Install.java @@ -0,0 +1,41 @@ +package org.apache.maven.resolver.internal.ant.tasks; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.resolver.internal.ant.AntRepoSys; + +import org.apache.tools.ant.BuildException; + +/** + */ +public class Install + extends AbstractDistTask +{ + + @Override + public void execute() + throws BuildException + { + validate(); + + AntRepoSys.getInstance( getProject() ).install( this, getPom(), getArtifacts() ); + } + +}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Layout.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Layout.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Layout.java new file mode 100644 index 0000000..995c00f --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Layout.java @@ -0,0 +1,131 @@ +package org.apache.maven.resolver.internal.ant.tasks; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.TreeSet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.tools.ant.BuildException; +import org.eclipse.aether.artifact.Artifact; + +/** + */ +class Layout +{ + + public static final String GID = "{groupId}"; + + public static final String GID_DIRS = "{groupIdDirs}"; + + public static final String AID = "{artifactId}"; + + public static final String VER = "{version}"; + + public static final String BVER = "{baseVersion}"; + + public static final String EXT = "{extension}"; + + public static final String CLS = "{classifier}"; + + private String[] tokens; + + public Layout( String layout ) + throws BuildException + { + Collection<String> valid = new HashSet<String>( Arrays.asList( GID, GID_DIRS, AID, VER, BVER, EXT, CLS ) ); + List<String> tokens = new ArrayList<String>(); + Matcher m = Pattern.compile( "(\\{[^}]*\\})|([^{]+)" ).matcher( layout ); + while ( m.find() ) + { + if ( m.group( 1 ) != null && !valid.contains( m.group( 1 ) ) ) + { + throw new BuildException( "Invalid variable '" + m.group() + "' in layout, supported variables are " + + new TreeSet<String>( valid ) ); + } + tokens.add( m.group() ); + } + this.tokens = tokens.toArray( new String[tokens.size()] ); + } + + public String getPath( Artifact artifact ) + { + StringBuilder buffer = new StringBuilder( 128 ); + + for ( int i = 0; i < tokens.length; i++ ) + { + String token = tokens[i]; + if ( GID.equals( token ) ) + { + buffer.append( artifact.getGroupId() ); + } + else if ( GID_DIRS.equals( token ) ) + { + buffer.append( artifact.getGroupId().replace( '.', '/' ) ); + } + else if ( AID.equals( token ) ) + { + buffer.append( artifact.getArtifactId() ); + } + else if ( VER.equals( token ) ) + { + buffer.append( artifact.getVersion() ); + } + else if ( BVER.equals( token ) ) + { + buffer.append( artifact.getBaseVersion() ); + } + else if ( CLS.equals( token ) ) + { + if ( artifact.getClassifier().length() <= 0 ) + { + if ( i > 0 ) + { + String lt = tokens[i - 1]; + if ( lt.length() > 0 && "-_".indexOf( lt.charAt( lt.length() - 1 ) ) >= 0 ) + { + buffer.setLength( buffer.length() - 1 ); + } + } + } + else + { + buffer.append( artifact.getClassifier() ); + } + } + else if ( EXT.equals( token ) ) + { + buffer.append( artifact.getExtension() ); + } + else + { + buffer.append( token ); + } + } + + return buffer.toString(); + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/RefTask.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/RefTask.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/RefTask.java new file mode 100644 index 0000000..02e7083 --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/RefTask.java @@ -0,0 +1,98 @@ +package org.apache.maven.resolver.internal.ant.tasks; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.ComponentHelper; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.Reference; + +/** + */ +public abstract class RefTask + extends Task +{ + + private Reference ref; + + public boolean isReference() + { + return ref != null; + } + + public void setRefid( final Reference ref ) + { + this.ref = ref; + } + + protected void checkAttributesAllowed() + { + if ( isReference() ) + { + throw tooManyAttributes(); + } + } + + protected void checkChildrenAllowed() + { + if ( isReference() ) + { + throw noChildrenAllowed(); + } + } + + protected BuildException tooManyAttributes() + { + return new BuildException( "You must not specify more than one " + "attribute when using refid" ); + } + + protected BuildException noChildrenAllowed() + { + return new BuildException( "You must not specify nested elements " + "when using refid" ); + } + + protected String getDataTypeName() + { + return ComponentHelper.getElementName( getProject(), this, true ); + } + + protected Object getCheckedRef() + { + return getCheckedRef( getClass(), getDataTypeName(), getProject() ); + } + + protected Object getCheckedRef( final Class<?> requiredClass, final String dataTypeName, final Project project ) + { + if ( project == null ) + { + throw new BuildException( "No Project specified" ); + } + Object o = ref.getReferencedObject( project ); + if ( !( requiredClass.isAssignableFrom( o.getClass() ) ) ) + { + log( "Class " + o.getClass() + " is not a subclass of " + requiredClass, Project.MSG_VERBOSE ); + String msg = ref.getRefId() + " doesn\'t denote a " + dataTypeName; + throw new BuildException( msg ); + } + return o; + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Resolve.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Resolve.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Resolve.java new file mode 100644 index 0000000..da37563 --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Resolve.java @@ -0,0 +1,585 @@ +package org.apache.maven.resolver.internal.ant.tasks; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.apache.maven.resolver.internal.ant.AntRepoSys; +import org.apache.maven.resolver.internal.ant.Names; +import org.apache.maven.resolver.internal.ant.types.Dependencies; +import org.apache.maven.resolver.internal.ant.types.Pom; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectComponent; +import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.types.Reference; +import org.apache.tools.ant.types.resources.FileResource; +import org.apache.tools.ant.types.resources.Resources; +import org.apache.tools.ant.util.FileUtils; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.graph.DependencyFilter; +import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.resolution.ArtifactRequest; +import org.eclipse.aether.resolution.ArtifactResolutionException; +import org.eclipse.aether.resolution.ArtifactResult; +import org.eclipse.aether.util.artifact.SubArtifact; +import org.eclipse.aether.util.filter.ScopeDependencyFilter; + +/** + */ +public class Resolve + extends AbstractResolvingTask +{ + + private List<ArtifactConsumer> consumers = new ArrayList<ArtifactConsumer>(); + + private boolean failOnMissingAttachments; + + public void setFailOnMissingAttachments( boolean failOnMissingAttachments ) + { + this.failOnMissingAttachments = failOnMissingAttachments; + } + + public Path createPath() + { + Path path = new Path(); + consumers.add( path ); + return path; + } + + public Files createFiles() + { + Files files = new Files(); + consumers.add( files ); + return files; + } + + public Props createProperties() + { + Props props = new Props(); + consumers.add( props ); + return props; + } + + private void validate() + { + for ( ArtifactConsumer consumer : consumers ) + { + consumer.validate(); + } + + Pom pom = AntRepoSys.getInstance( getProject() ).getDefaultPom(); + if ( dependencies == null && pom != null ) + { + log( "Using default pom for dependency resolution (" + pom.toString() + ")", Project.MSG_INFO ); + dependencies = new Dependencies(); + dependencies.setProject( getProject() ); + getProject().addReference( Names.ID_DEFAULT_POM, pom ); + dependencies.setPomRef( new Reference( getProject(), Names.ID_DEFAULT_POM ) ); + } + + if ( dependencies != null ) + { + dependencies.validate( this ); + } + else + { + throw new BuildException( "No <dependencies> set for resolution" ); + } + } + + @Override + public void execute() + throws BuildException + { + validate(); + + + AntRepoSys sys = AntRepoSys.getInstance( getProject() ); + + RepositorySystemSession session = sys.getSession( this, localRepository ); + RepositorySystem system = sys.getSystem(); + log( "Using local repository " + session.getLocalRepository(), Project.MSG_VERBOSE ); + + DependencyNode root = collectDependencies().getRoot(); + root.accept( new DependencyGraphLogger( this ) ); + + Map<String, Group> groups = new HashMap<String, Group>(); + for ( ArtifactConsumer consumer : consumers ) + { + String classifier = consumer.getClassifier(); + Group group = groups.get( classifier ); + if ( group == null ) + { + group = new Group( classifier ); + groups.put( classifier, group ); + } + group.add( consumer ); + } + + for ( Group group : groups.values() ) + { + group.createRequests( root ); + } + + log( "Resolving artifacts", Project.MSG_INFO ); + + for ( Group group : groups.values() ) + { + List<ArtifactResult> results; + try + { + results = system.resolveArtifacts( session, group.getRequests() ); + } + catch ( ArtifactResolutionException e ) + { + if ( !group.isAttachments() || failOnMissingAttachments ) + { + throw new BuildException( "Could not resolve artifacts: " + e.getMessage(), e ); + } + results = e.getResults(); + for ( ArtifactResult result : results ) + { + if ( result.isMissing() ) + { + log( "Ignoring missing attachment " + result.getRequest().getArtifact(), Project.MSG_VERBOSE ); + } + else if ( !result.isResolved() ) + { + throw new BuildException( "Could not resolve artifacts: " + e.getMessage(), e ); + } + } + } + + group.processResults( results, session ); + } + } + + /** + */ + public abstract static class ArtifactConsumer + extends ProjectComponent + { + + private DependencyFilter filter; + + public boolean accept( org.eclipse.aether.graph.DependencyNode node, List<DependencyNode> parents ) + { + return filter == null || filter.accept( node, parents ); + } + + public String getClassifier() + { + return null; + } + + public void validate() + { + + } + + public abstract void process( Artifact artifact, RepositorySystemSession session ); + + public void setScopes( String scopes ) + { + if ( filter != null ) + { + throw new BuildException( "You must not specify both 'scopes' and 'classpath'" ); + } + + Collection<String> included = new HashSet<String>(); + Collection<String> excluded = new HashSet<String>(); + + String[] split = scopes.split( "[, ]" ); + for ( String scope : split ) + { + scope = scope.trim(); + Collection<String> dst; + if ( scope.startsWith( "-" ) || scope.startsWith( "!" ) ) + { + dst = excluded; + scope = scope.substring( 1 ); + } + else + { + dst = included; + } + if ( scope.length() > 0 ) + { + dst.add( scope ); + } + } + + filter = new ScopeDependencyFilter( included, excluded ); + } + + public void setClasspath( String classpath ) + { + if ( "compile".equals( classpath ) ) + { + setScopes( "provided,system,compile" ); + } + else if ( "runtime".equals( classpath ) ) + { + setScopes( "compile,runtime" ); + } + else if ( "test".equals( classpath ) ) + { + setScopes( "provided,system,compile,runtime,test" ); + } + else + { + throw new BuildException( "The classpath '" + classpath + "' is not defined" + + ", must be one of 'compile', 'runtime' or 'test'" ); + } + } + + } + + /** + */ + public class Path + extends ArtifactConsumer + { + + private String refid; + + private org.apache.tools.ant.types.Path path; + + public void setRefId( String refId ) + { + this.refid = refId; + } + + public void validate() + { + if ( refid == null ) + { + throw new BuildException( "You must specify the 'refid' for the path" ); + } + } + + public void process( Artifact artifact, RepositorySystemSession session ) + { + if ( path == null ) + { + path = new org.apache.tools.ant.types.Path( getProject() ); + getProject().addReference( refid, path ); + } + path.setLocation( artifact.getFile() ); + } + + } + + /** + */ + public class Files + extends ArtifactConsumer + { + + private static final String DEFAULT_LAYOUT = Layout.GID_DIRS + "/" + Layout.AID + "/" + Layout.BVER + "/" + + Layout.AID + "-" + Layout.VER + "-" + Layout.CLS + "." + Layout.EXT; + + private String refid; + + private String classifier; + + private File dir; + + private Layout layout; + + private FileSet fileset; + + private Resources resources; + + public void setRefId( String refId ) + { + this.refid = refId; + } + + public String getClassifier() + { + return classifier; + } + + public void setAttachments( String attachments ) + { + if ( "sources".equals( attachments ) ) + { + classifier = "*-sources"; + } + else if ( "javadoc".equals( attachments ) ) + { + classifier = "*-javadoc"; + } + else + { + throw new BuildException( "The attachment type '" + attachments + + "' is not defined, must be one of 'sources' or 'javadoc'" ); + } + } + + public void setDir( File dir ) + { + this.dir = dir; + if ( dir != null && layout == null ) + { + layout = new Layout( DEFAULT_LAYOUT ); + } + } + + public void setLayout( String layout ) + { + this.layout = new Layout( layout ); + } + + public void validate() + { + if ( refid == null && dir == null ) + { + throw new BuildException( "You must either specify the 'refid' for the resource collection" + + " or a 'dir' to copy the files to" ); + } + if ( dir == null && layout != null ) + { + throw new BuildException( "You must not specify a 'layout' unless 'dir' is also specified" ); + } + } + + public void process( Artifact artifact, RepositorySystemSession session ) + { + if ( dir != null ) + { + if ( refid != null && fileset == null ) + { + fileset = new FileSet(); + fileset.setProject( getProject() ); + fileset.setDir( dir ); + getProject().addReference( refid, fileset ); + } + + String path = layout.getPath( artifact ); + + if ( fileset != null ) + { + fileset.createInclude().setName( path ); + } + + File src = artifact.getFile(); + File dst = new File( dir, path ); + + if ( src.lastModified() != dst.lastModified() || src.length() != dst.length() ) + { + try + { + Resolve.this.log( "Copy " + src + " to " + dst, Project.MSG_VERBOSE ); + FileUtils.getFileUtils().copyFile( src, dst, null, true, true ); + } + catch ( IOException e ) + { + throw new BuildException( "Failed to copy artifact file " + src + " to " + dst + ": " + + e.getMessage(), e ); + } + } + else + { + Resolve.this.log( "Omit to copy " + src + " to " + dst + ", seems unchanged", Project.MSG_VERBOSE ); + } + } + else + { + if ( resources == null ) + { + resources = new Resources(); + resources.setProject( getProject() ); + getProject().addReference( refid, resources ); + } + + FileResource resource = new FileResource( artifact.getFile() ); + resource.setBaseDir( session.getLocalRepository().getBasedir() ); + resource.setProject( getProject() ); + resources.add( resource ); + } + } + + } + + /** + */ + public class Props + extends ArtifactConsumer + { + + private String prefix; + + private String classifier; + + public void setPrefix( String prefix ) + { + this.prefix = prefix; + } + + public String getClassifier() + { + return classifier; + } + + public void setAttachments( String attachments ) + { + if ( "sources".equals( attachments ) ) + { + classifier = "*-sources"; + } + else if ( "javadoc".equals( attachments ) ) + { + classifier = "*-javadoc"; + } + else + { + throw new BuildException( "The attachment type '" + attachments + + "' is not defined, must be one of 'sources' or 'javadoc'" ); + } + } + + public void process( Artifact artifact, RepositorySystemSession session ) + { + StringBuilder buffer = new StringBuilder( 256 ); + if ( prefix != null && prefix.length() > 0 ) + { + buffer.append( prefix ); + if ( !prefix.endsWith( "." ) ) + { + buffer.append( '.' ); + } + } + buffer.append( artifact.getGroupId() ); + buffer.append( ':' ); + buffer.append( artifact.getArtifactId() ); + buffer.append( ':' ); + buffer.append( artifact.getExtension() ); + if ( artifact.getClassifier().length() > 0 ) + { + buffer.append( ':' ); + buffer.append( artifact.getClassifier() ); + } + + String path = artifact.getFile().getAbsolutePath(); + + getProject().setProperty( buffer.toString(), path ); + } + + } + + private static class Group + { + + private String classifier; + + private List<ArtifactConsumer> consumers = new ArrayList<ArtifactConsumer>(); + + private List<ArtifactRequest> requests = new ArrayList<ArtifactRequest>(); + + public Group( String classifier ) + { + this.classifier = classifier; + } + + public boolean isAttachments() + { + return classifier != null; + } + + public void add( ArtifactConsumer consumer ) + { + consumers.add( consumer ); + } + + public void createRequests( DependencyNode node ) + { + createRequests( node, new LinkedList<DependencyNode>() ); + } + + private void createRequests( DependencyNode node, LinkedList<DependencyNode> parents ) + { + if ( node.getDependency() != null ) + { + for ( ArtifactConsumer consumer : consumers ) + { + if ( consumer.accept( node, parents ) ) + { + ArtifactRequest request = new ArtifactRequest( node ); + if ( classifier != null ) + { + request.setArtifact( new SubArtifact( request.getArtifact(), classifier, "jar" ) ); + } + requests.add( request ); + break; + } + } + } + + parents.addFirst( node ); + + for ( DependencyNode child : node.getChildren() ) + { + createRequests( child, parents ); + } + + parents.removeFirst(); + } + + public List<ArtifactRequest> getRequests() + { + return requests; + } + + public void processResults( List<ArtifactResult> results, RepositorySystemSession session ) + { + for ( ArtifactResult result : results ) + { + if ( !result.isResolved() ) + { + continue; + } + for ( ArtifactConsumer consumer : consumers ) + { + if ( consumer.accept( result.getRequest().getDependencyNode(), + Collections.<DependencyNode>emptyList() ) ) + { + consumer.process( result.getArtifact(), session ); + } + } + } + } + + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Artifact.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Artifact.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Artifact.java new file mode 100644 index 0000000..7a5d054 --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Artifact.java @@ -0,0 +1,181 @@ +package org.apache.maven.resolver.internal.ant.types; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.File; +import java.util.Collections; +import java.util.List; + +import org.apache.maven.resolver.internal.ant.ProjectWorkspaceReader; +import org.apache.maven.resolver.internal.ant.tasks.RefTask; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.Reference; + +/** + */ +public class Artifact + extends RefTask + implements ArtifactContainer +{ + + private File file; + + private String type; + + private String classifier; + + private Pom pom; + + protected Artifact getRef() + { + return (Artifact) getCheckedRef(); + } + + public void validate( Task task ) + { + if ( isReference() ) + { + getRef().validate( task ); + } + else + { + if ( file == null ) + { + throw new BuildException( "You must specify the 'file' for the artifact" ); + } + else if ( !file.isFile() ) + { + throw new BuildException( "The artifact file " + file + " does not exist" ); + } + if ( type == null || type.length() <= 0 ) + { + throw new BuildException( "You must specify the 'type' for the artifact" ); + } + } + } + + public void setRefid( Reference ref ) + { + if ( file != null || type != null || classifier != 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; + + if ( file != null && type == null ) + { + String name = file.getName(); + int period = name.lastIndexOf( '.' ); + if ( period >= 0 ) + { + type = name.substring( period + 1 ); + } + } + } + + public String getType() + { + if ( isReference() ) + { + return getRef().getType(); + } + return ( type != null ) ? type : "jar"; + } + + public void setType( String type ) + { + checkAttributesAllowed(); + this.type = type; + } + + public String getClassifier() + { + if ( isReference() ) + { + return getRef().getClassifier(); + } + return ( classifier != null ) ? classifier : ""; + } + + public void setClassifier( String classifier ) + { + checkAttributesAllowed(); + this.classifier = classifier; + } + + public void setPomRef( Reference ref ) + { + checkAttributesAllowed(); + Pom pom = new Pom(); + pom.setProject( getProject() ); + pom.setRefid( ref ); + this.pom = pom; + } + + public void addPom( Pom pom ) + { + checkChildrenAllowed(); + this.pom = pom; + } + + public Pom getPom() + { + if ( isReference() ) + { + return getRef().getPom(); + } + return pom; + } + + public List<Artifact> getArtifacts() + { + return Collections.singletonList( this ); + } + + @Override + public void execute() + throws BuildException + { + ProjectWorkspaceReader.getInstance().addArtifact( this ); + } + + public String toString() + { + String pomRepr = getPom() != null ? "(" + getPom().toString() + ":)" : ""; + return String.format( pomRepr + "%s:%s", getType(), getClassifier() ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/ArtifactContainer.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/ArtifactContainer.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/ArtifactContainer.java new file mode 100644 index 0000000..d447808 --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/ArtifactContainer.java @@ -0,0 +1,35 @@ +package org.apache.maven.resolver.internal.ant.types; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.List; + +import org.apache.tools.ant.Task; + +/** + */ +public interface ArtifactContainer +{ + + void validate( Task task ); + + List<Artifact> getArtifacts(); + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Artifacts.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Artifacts.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Artifacts.java new file mode 100644 index 0000000..85f8b78 --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Artifacts.java @@ -0,0 +1,97 @@ +package org.apache.maven.resolver.internal.ant.types; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.ArrayList; +import java.util.List; + +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.DataType; +import org.apache.tools.ant.types.Reference; + +/** + */ +public class Artifacts + extends DataType + implements ArtifactContainer +{ + + private List<ArtifactContainer> containers = new ArrayList<ArtifactContainer>(); + + protected Artifacts getRef() + { + return (Artifacts) getCheckedRef(); + } + + public void validate( Task task ) + { + if ( isReference() ) + { + getRef().validate( task ); + } + else + { + for ( ArtifactContainer container : containers ) + { + container.validate( task ); + } + } + } + + public void setRefid( Reference ref ) + { + if ( !containers.isEmpty() ) + { + throw noChildrenAllowed(); + } + super.setRefid( ref ); + } + + public void addArtifact( Artifact artifact ) + { + checkChildrenAllowed(); + containers.add( artifact ); + } + + public void addArtifacts( Artifacts artifacts ) + { + checkChildrenAllowed(); + if ( artifacts == this ) + { + throw circularReference(); + } + containers.add( artifacts ); + } + + public List<Artifact> getArtifacts() + { + if ( isReference() ) + { + return getRef().getArtifacts(); + } + List<Artifact> artifacts = new ArrayList<Artifact>(); + for ( ArtifactContainer container : containers ) + { + artifacts.addAll( container.getArtifacts() ); + } + return artifacts; + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Authentication.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Authentication.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Authentication.java new file mode 100644 index 0000000..6d212fc --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Authentication.java @@ -0,0 +1,152 @@ +package org.apache.maven.resolver.internal.ant.types; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.ArrayList; +import java.util.List; + +import org.apache.maven.resolver.internal.ant.AntRepoSys; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.types.DataType; +import org.apache.tools.ant.types.Reference; + +/** + */ +public class Authentication + extends DataType +{ + + private String username; + + private String password; + + private String privateKeyFile; + + private String passphrase; + + private List<String> servers = new ArrayList<String>(); + + @Override + public void setProject( Project project ) + { + super.setProject( project ); + + AntRepoSys.getInstance( project ).addAuthentication( this ); + } + + protected Authentication getRef() + { + return (Authentication) getCheckedRef(); + } + + public void setRefid( Reference ref ) + { + if ( username != null || password != null || privateKeyFile != null || passphrase != null ) + { + throw tooManyAttributes(); + } + super.setRefid( ref ); + } + + public String getUsername() + { + if ( isReference() ) + { + return getRef().getUsername(); + } + return username; + } + + public void setUsername( String username ) + { + checkAttributesAllowed(); + this.username = username; + } + + public String getPassword() + { + if ( isReference() ) + { + return getRef().getPassword(); + } + return password; + } + + public void setPassword( String password ) + { + checkAttributesAllowed(); + this.password = password; + } + + public String getPrivateKeyFile() + { + if ( isReference() ) + { + return getRef().getPrivateKeyFile(); + } + return privateKeyFile; + } + + public void setPrivateKeyFile( String privateKeyFile ) + { + checkAttributesAllowed(); + this.privateKeyFile = privateKeyFile; + } + + public String getPassphrase() + { + if ( isReference() ) + { + return getRef().getPassphrase(); + } + return passphrase; + } + + public void setPassphrase( String passphrase ) + { + checkAttributesAllowed(); + this.passphrase = passphrase; + } + + public List<String> getServers() + { + if ( isReference() ) + { + return getRef().getServers(); + } + return servers; + } + + public void setServers( String servers ) + { + checkAttributesAllowed(); + this.servers.clear(); + String[] split = servers.split( "[;:]" ); + for ( String server : split ) + { + server = server.trim(); + if ( server.length() > 0 ) + { + this.servers.add( server ); + } + } + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Dependencies.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Dependencies.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Dependencies.java new file mode 100644 index 0000000..5e1ea3c --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Dependencies.java @@ -0,0 +1,197 @@ +package org.apache.maven.resolver.internal.ant.types; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.DataType; +import org.apache.tools.ant.types.Reference; + +/** + */ +public class Dependencies + extends DataType + implements DependencyContainer +{ + + private File file; + + private Pom pom; + + private List<DependencyContainer> containers = new ArrayList<DependencyContainer>(); + + private List<Exclusion> exclusions = new ArrayList<Exclusion>(); + + private boolean nestedDependencies; + + protected Dependencies getRef() + { + return (Dependencies) getCheckedRef(); + } + + public void validate( Task task ) + { + if ( isReference() ) + { + getRef().validate( task ); + } + else + { + if ( getPom() != null && getPom().getFile() == null ) + { + throw new BuildException( "A <pom> used for dependency resolution has to be backed by a pom.xml file" ); + } + Map<String, String> ids = new HashMap<String, String>(); + for ( DependencyContainer container : containers ) + { + container.validate( task ); + if ( container instanceof Dependency ) + { + Dependency dependency = (Dependency) container; + String id = dependency.getVersionlessKey(); + String collision = ids.put( id, dependency.getVersion() ); + if ( collision != null ) + { + throw new BuildException( "You must not declare multiple <dependency> elements" + + " with the same coordinates but got " + id + " -> " + collision + " vs " + + dependency.getVersion() ); + } + } + } + } + } + + public void setRefid( Reference ref ) + { + if ( pom != null || !exclusions.isEmpty() || !containers.isEmpty() ) + { + throw noChildrenAllowed(); + } + super.setRefid( ref ); + } + + public void setFile( File file ) + { + checkAttributesAllowed(); + this.file = file; + checkExternalSources(); + } + + public File getFile() + { + if ( isReference() ) + { + return getRef().getFile(); + } + return file; + } + + public void addPom( Pom pom ) + { + checkChildrenAllowed(); + if ( this.pom != null ) + { + throw new BuildException( "You must not specify multiple <pom> elements" ); + } + this.pom = pom; + checkExternalSources(); + } + + public Pom getPom() + { + if ( isReference() ) + { + return getRef().getPom(); + } + return pom; + } + + public void setPomRef( Reference ref ) + { + if ( pom == null ) + { + pom = new Pom(); + pom.setProject( getProject() ); + } + pom.setRefid( ref ); + checkExternalSources(); + } + + private void checkExternalSources() + { + if ( file != null && pom != null ) + { + throw new BuildException( "You must not specify both a text file and a POM to list dependencies" ); + } + if ( ( file != null || pom != null ) && nestedDependencies ) + { + throw new BuildException( "You must not specify both a file/POM and nested dependency collections" ); + } + } + + public void addDependency( Dependency dependency ) + { + checkChildrenAllowed(); + containers.add( dependency ); + } + + public void addDependencies( Dependencies dependencies ) + { + checkChildrenAllowed(); + if ( dependencies == this ) + { + throw circularReference(); + } + containers.add( dependencies ); + nestedDependencies = true; + checkExternalSources(); + } + + public List<DependencyContainer> getDependencyContainers() + { + if ( isReference() ) + { + return getRef().getDependencyContainers(); + } + return containers; + } + + public void addExclusion( Exclusion exclusion ) + { + checkChildrenAllowed(); + this.exclusions.add( exclusion ); + } + + public List<Exclusion> getExclusions() + { + if ( isReference() ) + { + return getRef().getExclusions(); + } + return exclusions; + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Dependency.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Dependency.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Dependency.java new file mode 100644 index 0000000..9299a5f --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Dependency.java @@ -0,0 +1,329 @@ +package org.apache.maven.resolver.internal.ant.types; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +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; + +/** + */ +public class Dependency + extends DataType + implements DependencyContainer +{ + + private String groupId; + + private String artifactId; + + private String version; + + private String classifier; + + private String type; + + private String scope; + + private File systemPath; + + private List<Exclusion> exclusions = new ArrayList<Exclusion>(); + + protected Dependency getRef() + { + return (Dependency) getCheckedRef(); + } + + public void validate( Task task ) + { + if ( isReference() ) + { + getRef().validate( task ); + } + else + { + if ( groupId == null || groupId.length() <= 0 ) + { + throw new BuildException( "You must specify the 'groupId' for a dependency" ); + } + if ( artifactId == null || artifactId.length() <= 0 ) + { + throw new BuildException( "You must specify the 'artifactId' for a dependency" ); + } + if ( version == null || version.length() <= 0 ) + { + throw new BuildException( "You must specify the 'version' for a dependency" ); + } + + if ( "system".equals( scope ) ) + { + if ( systemPath == null ) + { + throw new BuildException( "You must specify 'systemPath' for dependencies with scope=system" ); + } + } + else if ( systemPath != null ) + { + throw new BuildException( "You may only specify 'systemPath' for dependencies with scope=system" ); + } + + if ( scope != null && !"compile".equals( scope ) && !"provided".equals( scope ) && !"system".equals( scope ) + && !"runtime".equals( scope ) && !"test".equals( scope ) ) + { + task.log( "Unknown scope '" + scope + "' for dependency", Project.MSG_WARN ); + } + + for ( Exclusion exclusion : exclusions ) + { + exclusion.validate( task ); + } + } + } + + public void setRefid( Reference ref ) + { + if ( groupId != null || artifactId != null || type != null || classifier != null || version != null + || scope != null || systemPath != null ) + { + throw tooManyAttributes(); + } + if ( !exclusions.isEmpty() ) + { + throw noChildrenAllowed(); + } + super.setRefid( ref ); + } + + public String getGroupId() + { + if ( isReference() ) + { + return getRef().getGroupId(); + } + return groupId; + } + + public void setGroupId( String groupId ) + { + checkAttributesAllowed(); + if ( this.groupId != null ) + { + throw ambiguousCoords(); + } + this.groupId = groupId; + } + + public String getArtifactId() + { + if ( isReference() ) + { + return getRef().getArtifactId(); + } + return artifactId; + } + + public void setArtifactId( String artifactId ) + { + checkAttributesAllowed(); + if ( this.artifactId != null ) + { + throw ambiguousCoords(); + } + this.artifactId = artifactId; + } + + public String getVersion() + { + if ( isReference() ) + { + return getRef().getVersion(); + } + return version; + } + + public void setVersion( String version ) + { + checkAttributesAllowed(); + if ( this.version != null ) + { + throw ambiguousCoords(); + } + this.version = version; + } + + public String getClassifier() + { + if ( isReference() ) + { + return getRef().getClassifier(); + } + return classifier; + } + + public void setClassifier( String classifier ) + { + checkAttributesAllowed(); + if ( this.classifier != null ) + { + throw ambiguousCoords(); + } + this.classifier = classifier; + } + + public String getType() + { + if ( isReference() ) + { + return getRef().getType(); + } + return ( type != null ) ? type : "jar"; + } + + public void setType( String type ) + { + checkAttributesAllowed(); + if ( this.type != null ) + { + throw ambiguousCoords(); + } + this.type = type; + } + + public String getScope() + { + if ( isReference() ) + { + return getRef().getScope(); + } + return ( scope != null ) ? scope : "compile"; + } + + public void setScope( String scope ) + { + checkAttributesAllowed(); + if ( this.scope != null ) + { + throw ambiguousCoords(); + } + this.scope = scope; + } + + public void setCoords( String coords ) + { + checkAttributesAllowed(); + if ( groupId != null || artifactId != null || version != null || type != null || classifier != null + || scope != null ) + { + throw ambiguousCoords(); + } + Pattern p = Pattern.compile( "([^: ]+):([^: ]+):([^: ]+)((:([^: ]+)(:([^: ]+))?)?:([^: ]+))?" ); + Matcher m = p.matcher( coords ); + if ( !m.matches() ) + { + throw new BuildException( "Bad dependency coordinates '" + coords + + "', expected format is <groupId>:<artifactId>:<version>[[:<type>[:<classifier>]]:<scope>]" ); + } + groupId = m.group( 1 ); + artifactId = m.group( 2 ); + version = m.group( 3 ); + type = m.group( 6 ); + if ( type == null || type.length() <= 0 ) + { + type = "jar"; + } + classifier = m.group( 8 ); + if ( classifier == null ) + { + classifier = ""; + } + scope = m.group( 9 ); + } + + public void setSystemPath( File systemPath ) + { + checkAttributesAllowed(); + this.systemPath = systemPath; + } + + public File getSystemPath() + { + if ( isReference() ) + { + return getRef().getSystemPath(); + } + return systemPath; + } + + public String getVersionlessKey() + { + if ( isReference() ) + { + return getRef().getVersionlessKey(); + } + StringBuilder key = new StringBuilder( 128 ); + if ( groupId != null ) + { + key.append( groupId ); + } + key.append( ':' ); + if ( artifactId != null ) + { + key.append( artifactId ); + } + key.append( ':' ); + key.append( ( type != null ) ? type : "jar" ); + if ( classifier != null && classifier.length() > 0 ) + { + key.append( ':' ); + key.append( classifier ); + } + return key.toString(); + } + + public void addExclusion( Exclusion exclusion ) + { + checkChildrenAllowed(); + this.exclusions.add( exclusion ); + } + + public List<Exclusion> getExclusions() + { + if ( isReference() ) + { + return getRef().getExclusions(); + } + return exclusions; + } + + private BuildException ambiguousCoords() + { + return new BuildException( "You must not specify both 'coords' and " + + "('groupId', 'artifactId', 'version', 'extension', 'classifier', 'scope')" ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/DependencyContainer.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/DependencyContainer.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/DependencyContainer.java new file mode 100644 index 0000000..bcca972 --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/DependencyContainer.java @@ -0,0 +1,31 @@ +package org.apache.maven.resolver.internal.ant.types; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.tools.ant.Task; + +/** + */ +public interface DependencyContainer +{ + + void validate( Task task ); + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Exclusion.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Exclusion.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Exclusion.java new file mode 100644 index 0000000..ea0e06e --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Exclusion.java @@ -0,0 +1,190 @@ +package org.apache.maven.resolver.internal.ant.types; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.DataType; +import org.apache.tools.ant.types.Reference; + +/** + */ +public class Exclusion + extends DataType +{ + + private static final String WILDCARD = "*"; + + private String groupId; + + private String artifactId; + + private String classifier; + + private String extension; + + protected Exclusion getRef() + { + return (Exclusion) getCheckedRef(); + } + + public void validate( Task task ) + { + if ( isReference() ) + { + getRef().validate( task ); + } + else + { + if ( groupId == null && artifactId == null && classifier == null && extension == null ) + { + throw new BuildException( "You must specify at least one of " + + "'groupId', 'artifactId', 'classifier' or 'extension'" ); + } + } + } + + public void setRefid( Reference ref ) + { + if ( groupId != null || artifactId != null || extension != null || classifier != null ) + { + throw tooManyAttributes(); + } + super.setRefid( ref ); + } + + public String getGroupId() + { + if ( isReference() ) + { + return getRef().getGroupId(); + } + return ( groupId != null ) ? groupId : WILDCARD; + } + + public void setGroupId( String groupId ) + { + checkAttributesAllowed(); + if ( this.groupId != null ) + { + throw ambiguousCoords(); + } + this.groupId = groupId; + } + + public String getArtifactId() + { + if ( isReference() ) + { + return getRef().getArtifactId(); + } + return ( artifactId != null ) ? artifactId : WILDCARD; + } + + public void setArtifactId( String artifactId ) + { + checkAttributesAllowed(); + if ( this.artifactId != null ) + { + throw ambiguousCoords(); + } + this.artifactId = artifactId; + } + + public String getClassifier() + { + if ( isReference() ) + { + return getRef().getClassifier(); + } + return ( classifier != null ) ? classifier : WILDCARD; + } + + public void setClassifier( String classifier ) + { + checkAttributesAllowed(); + if ( this.classifier != null ) + { + throw ambiguousCoords(); + } + this.classifier = classifier; + } + + public String getExtension() + { + if ( isReference() ) + { + return getRef().getExtension(); + } + return ( extension != null ) ? extension : WILDCARD; + } + + public void setExtension( String extension ) + { + checkAttributesAllowed(); + if ( this.extension != null ) + { + throw ambiguousCoords(); + } + this.extension = extension; + } + + public void setCoords( String coords ) + { + checkAttributesAllowed(); + if ( groupId != null || artifactId != null || extension != null || classifier != null ) + { + throw ambiguousCoords(); + } + Pattern p = Pattern.compile( "([^: ]+)(:([^: ]+)(:([^: ]+)(:([^: ]*))?)?)?" ); + Matcher m = p.matcher( coords ); + if ( !m.matches() ) + { + throw new BuildException( "Bad exclusion coordinates '" + coords + + "', expected format is <groupId>[:<artifactId>[:<extension>[:<classifier>]]]" ); + } + groupId = m.group( 1 ); + artifactId = m.group( 3 ); + if ( artifactId == null ) + { + artifactId = "*"; + } + extension = m.group( 5 ); + if ( extension == null ) + { + extension = "*"; + } + classifier = m.group( 7 ); + if ( classifier == null ) + { + classifier = "*"; + } + } + + private BuildException ambiguousCoords() + { + return new BuildException( "You must not specify both 'coords' and " + + "('groupId', 'artifactId', 'extension', 'classifier')" ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/LocalRepository.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/LocalRepository.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/LocalRepository.java new file mode 100644 index 0000000..8847e54 --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/LocalRepository.java @@ -0,0 +1,90 @@ +package org.apache.maven.resolver.internal.ant.types; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.File; + +import org.apache.maven.resolver.internal.ant.AntRepoSys; +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; + +/** + */ +public class LocalRepository + extends DataType +{ + + private final Task task; + + private File dir; + + public LocalRepository() + { + this( null ); + } + + public LocalRepository( Task task ) + { + this.task = task; + } + + @Override + public void setProject( Project project ) + { + super.setProject( project ); + + if ( task == null ) + { + AntRepoSys.getInstance( project ).setLocalRepository( this ); + } + } + + protected LocalRepository getRef() + { + return (LocalRepository) getCheckedRef(); + } + + public void setRefid( Reference ref ) + { + if ( dir != null ) + { + throw tooManyAttributes(); + } + super.setRefid( ref ); + } + + public File getDir() + { + if ( isReference() ) + { + return getRef().getDir(); + } + return dir; + } + + public void setDir( File dir ) + { + checkAttributesAllowed(); + this.dir = dir; + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Mirror.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Mirror.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Mirror.java new file mode 100644 index 0000000..21534e8 --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Mirror.java @@ -0,0 +1,154 @@ +package org.apache.maven.resolver.internal.ant.types; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.resolver.internal.ant.AntRepoSys; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.types.DataType; +import org.apache.tools.ant.types.Reference; + +/** + */ +public class Mirror + extends DataType +{ + + private String id; + + private String url; + + private String type; + + private String mirrorOf; + + private Authentication authentication; + + @Override + public void setProject( Project project ) + { + super.setProject( project ); + + AntRepoSys.getInstance( project ).addMirror( this ); + } + + protected Mirror getRef() + { + return (Mirror) getCheckedRef(); + } + + public void setRefid( Reference ref ) + { + if ( id != null || url != null || mirrorOf != null || type != null ) + { + throw tooManyAttributes(); + } + 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 String getMirrorOf() + { + if ( isReference() ) + { + return getRef().getMirrorOf(); + } + return mirrorOf; + } + + public void setMirrorOf( String mirrorOf ) + { + checkAttributesAllowed(); + this.mirrorOf = mirrorOf; + } + + public void addAuthentication( Authentication authentication ) + { + checkChildrenAllowed(); + if ( this.authentication != null ) + { + throw new BuildException( "You must not specify multiple <authentication> elements" ); + } + this.authentication = authentication; + } + + public Authentication getAuthentication() + { + if ( isReference() ) + { + getRef().getAuthentication(); + } + return authentication; + } + + public void setAuthRef( Reference ref ) + { + if ( authentication == null ) + { + authentication = new Authentication(); + authentication.setProject( getProject() ); + } + authentication.setRefid( ref ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/ModelValueExtractor.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/ModelValueExtractor.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/ModelValueExtractor.java new file mode 100644 index 0000000..c1ab45c --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/ModelValueExtractor.java @@ -0,0 +1,99 @@ +package org.apache.maven.resolver.internal.ant.types; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.model.Model; +import org.apache.tools.ant.Project; +import org.codehaus.plexus.interpolation.reflection.ReflectionValueExtractor; + +/** + */ +class ModelValueExtractor +{ + + private static final String PREFIX_PROPERTIES = "properties."; + + private final String prefix; + + private final Project project; + + private final Model model; + + public ModelValueExtractor( String prefix, Model model, Project project ) + { + if ( model == null ) + { + throw new IllegalArgumentException( "reference to Maven POM has not been specified" ); + } + if ( project == null ) + { + throw new IllegalArgumentException( "reference to Ant project has not been specified" ); + } + if ( prefix == null || prefix.length() <= 0 ) + { + prefix = "pom."; + } + else if ( !prefix.endsWith( "." ) ) + { + prefix += '.'; + } + this.prefix = prefix; + this.model = model; + this.project = project; + } + + public Project getProject() + { + return project; + } + + public boolean isApplicable( String expression ) + { + return expression.startsWith( prefix ); + } + + public Object getValue( String expression ) + { + if ( expression.startsWith( prefix ) ) + { + String expr = expression.substring( prefix.length() ); + try + { + if ( expr.startsWith( PREFIX_PROPERTIES ) ) + { + String key = expr.substring( PREFIX_PROPERTIES.length() ); + return model.getProperties().getProperty( key ); + } + + return ReflectionValueExtractor.evaluate( expr, model, false ); + } + catch ( Exception e ) + { + project.log( "Could not retrieve '" + expression + "' from POM: " + e.getMessage(), e, Project.MSG_WARN ); + return null; + } + } + else + { + return null; + } + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/a088cdfc/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Pom.java ---------------------------------------------------------------------- diff --git a/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Pom.java b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Pom.java new file mode 100644 index 0000000..62ca308 --- /dev/null +++ b/maven-resolver-ant-tasks/src/main/java/org/apache/maven/resolver/internal/ant/types/Pom.java @@ -0,0 +1,352 @@ +package org.apache.maven.resolver.internal.ant.types; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.File; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.maven.model.Model; +import org.apache.maven.resolver.internal.ant.AntRepoSys; +import org.apache.maven.resolver.internal.ant.ProjectWorkspaceReader; +import org.apache.maven.resolver.internal.ant.tasks.RefTask; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.PropertyHelper; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.Reference; + +/** + */ +public class Pom + extends RefTask +{ + + private Model model; + + private String id; + + private File file; + + private String groupId; + + private String artifactId; + + private String version; + + private String packaging = "jar"; + + private RemoteRepositories remoteRepositories; + + private String coords; + + protected Pom getRef() + { + return (Pom) getCheckedRef(); + } + + public void validate() + { + if ( isReference() ) + { + getRef().validate(); + } + else + { + if ( file == null ) + { + if ( groupId == null ) + { + throw new BuildException( "You must specify the 'groupId' for the POM" ); + } + if ( artifactId == null ) + { + throw new BuildException( "You must specify the 'artifactId' for the POM" ); + } + if ( version == null ) + { + throw new BuildException( "You must specify the 'version' for the POM" ); + } + } + } + + } + + public void setRefid( Reference ref ) + { + if ( id != null || file != null || groupId != null || artifactId != null || version != null ) + { + throw tooManyAttributes(); + } + if ( remoteRepositories != null ) + { + throw noChildrenAllowed(); + } + super.setRefid( ref ); + } + + public void setId( String id ) + { + checkAttributesAllowed(); + this.id = id; + } + + public File getFile() + { + if ( isReference() ) + { + return getRef().getFile(); + } + return file; + } + + public void setFile( File file ) + { + checkAttributesAllowed(); + if ( groupId != null || artifactId != null || version != null ) + { + throw ambiguousSource(); + } + + this.file = file; + + } + + public String getGroupId() + { + if ( isReference() ) + { + return getRef().getGroupId(); + } + return groupId; + } + + public void setGroupId( String groupId ) + { + checkAttributesAllowed(); + if ( this.groupId != null ) + { + throw ambiguousCoords(); + } + if ( file != null ) + { + throw ambiguousSource(); + } + this.groupId = groupId; + } + + public String getArtifactId() + { + if ( isReference() ) + { + return getRef().getArtifactId(); + } + return artifactId; + } + + public void setArtifactId( String artifactId ) + { + checkAttributesAllowed(); + if ( this.artifactId != null ) + { + throw ambiguousCoords(); + } + if ( file != null ) + { + throw ambiguousSource(); + } + this.artifactId = artifactId; + } + + public String getVersion() + { + if ( isReference() ) + { + return getRef().getVersion(); + } + return version; + } + + public void setVersion( String version ) + { + checkAttributesAllowed(); + if ( this.version != null ) + { + throw ambiguousCoords(); + } + if ( file != null ) + { + throw ambiguousSource(); + } + this.version = version; + } + + public String getCoords() + { + if ( isReference() ) + { + return getRef().getCoords(); + } + return coords; + } + + public void setCoords( String coords ) + { + checkAttributesAllowed(); + if ( file != null ) + { + throw ambiguousSource(); + } + if ( groupId != null || artifactId != null || version != null ) + { + throw ambiguousCoords(); + } + Pattern p = Pattern.compile( "([^: ]+):([^: ]+):([^: ]+)" ); + Matcher m = p.matcher( coords ); + if ( !m.matches() ) + { + throw new BuildException( "Bad POM coordinates, expected format is <groupId>:<artifactId>:<version>" ); + } + groupId = m.group( 1 ); + artifactId = m.group( 2 ); + version = m.group( 3 ); + } + + private BuildException ambiguousCoords() + { + return new BuildException( "You must not specify both 'coords' and ('groupId', 'artifactId', 'version')" ); + } + + private BuildException ambiguousSource() + { + return new BuildException( "You must not specify both 'file' and " + + "('coords', 'groupId', 'artifactId', 'version')" ); + } + + public String getPackaging() + { + if ( isReference() ) + { + return getRef().getPackaging(); + } + return packaging; + } + + public void setPackaging( String packaging ) + { + checkAttributesAllowed(); + if ( file != null ) + { + throw ambiguousSource(); + } + this.packaging = packaging; + } + + private RemoteRepositories getRemoteRepos() + { + if ( remoteRepositories == null ) + { + remoteRepositories = new RemoteRepositories(); + remoteRepositories.setProject( getProject() ); + } + return remoteRepositories; + } + + public void addRemoteRepo( RemoteRepository repository ) + { + getRemoteRepos().addRemoterepo( repository ); + } + + public void addRemoteRepos( RemoteRepositories repositories ) + { + getRemoteRepos().addRemoterepos( repositories ); + } + + public void setRemoteReposRef( Reference ref ) + { + RemoteRepositories repos = new RemoteRepositories(); + repos.setProject( getProject() ); + repos.setRefid( ref ); + getRemoteRepos().addRemoterepos( repos ); + } + + public Model getModel( Task task ) + { + if ( isReference() ) + { + return getRef().getModel( task ); + } + synchronized ( this ) + { + if ( model == null ) + { + if ( file != null ) + { + model = AntRepoSys.getInstance( getProject() ).loadModel( task, file, true, remoteRepositories ); + } + } + return model; + } + } + + @Override + public void execute() + { + validate(); + + if ( file != null && ( id == null || AntRepoSys.getInstance( getProject() ).getDefaultPom() == null ) ) + { + AntRepoSys.getInstance( getProject() ).setDefaultPom( this ); + } + + ProjectWorkspaceReader.getInstance().addPom( this ); + + Model model = getModel( this ); + + if ( model == null ) + { + coords = getGroupId() + ":" + getArtifactId() + ":" + getVersion(); + return; + } + + coords = model.getGroupId() + ":" + model.getArtifactId() + ":" + model.getVersion(); + + ModelValueExtractor extractor = new ModelValueExtractor( id, model, getProject() ); + + PropertyHelper propHelper = PropertyHelper.getPropertyHelper( getProject() ); + + try + { + // Ant 1.8.0 delegate + PomPropertyEvaluator.register( extractor, propHelper ); + } + catch ( LinkageError e ) + { + // Ant 1.6 - 1.7.1 interceptor chaining + PomPropertyHelper.register( extractor, propHelper ); + } + + } + + public String toString() + { + return coords + " (" + super.toString() + ")"; + } + +}