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() + ")";
+    }
+
+}

Reply via email to