| /******************************************************************************* |
| * Copyright (c) 2010, 2014 Sonatype, Inc. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Sonatype, Inc. - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.aether.ant.types; |
| |
| 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; |
| } |
| |
| } |