http://git-wip-us.apache.org/repos/asf/maven-aether/blob/261b17db/src/main/java/org/apache/maven/aether/internal/ant/types/Exclusion.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/maven/aether/internal/ant/types/Exclusion.java b/src/main/java/org/apache/maven/aether/internal/ant/types/Exclusion.java new file mode 100644 index 0000000..9b99f80 --- /dev/null +++ b/src/main/java/org/apache/maven/aether/internal/ant/types/Exclusion.java @@ -0,0 +1,190 @@ +package org.apache.maven.aether.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-aether/blob/261b17db/src/main/java/org/apache/maven/aether/internal/ant/types/LocalRepository.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/maven/aether/internal/ant/types/LocalRepository.java b/src/main/java/org/apache/maven/aether/internal/ant/types/LocalRepository.java new file mode 100644 index 0000000..9371aab --- /dev/null +++ b/src/main/java/org/apache/maven/aether/internal/ant/types/LocalRepository.java @@ -0,0 +1,90 @@ +package org.apache.maven.aether.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.aether.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-aether/blob/261b17db/src/main/java/org/apache/maven/aether/internal/ant/types/Mirror.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/maven/aether/internal/ant/types/Mirror.java b/src/main/java/org/apache/maven/aether/internal/ant/types/Mirror.java new file mode 100644 index 0000000..bbb19bb --- /dev/null +++ b/src/main/java/org/apache/maven/aether/internal/ant/types/Mirror.java @@ -0,0 +1,155 @@ +package org.apache.maven.aether.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.aether.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-aether/blob/261b17db/src/main/java/org/apache/maven/aether/internal/ant/types/ModelValueExtractor.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/maven/aether/internal/ant/types/ModelValueExtractor.java b/src/main/java/org/apache/maven/aether/internal/ant/types/ModelValueExtractor.java new file mode 100644 index 0000000..73fed22 --- /dev/null +++ b/src/main/java/org/apache/maven/aether/internal/ant/types/ModelValueExtractor.java @@ -0,0 +1,99 @@ +package org.apache.maven.aether.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-aether/blob/261b17db/src/main/java/org/apache/maven/aether/internal/ant/types/Pom.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/maven/aether/internal/ant/types/Pom.java b/src/main/java/org/apache/maven/aether/internal/ant/types/Pom.java new file mode 100644 index 0000000..eff8591 --- /dev/null +++ b/src/main/java/org/apache/maven/aether/internal/ant/types/Pom.java @@ -0,0 +1,352 @@ +package org.apache.maven.aether.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.aether.internal.ant.AntRepoSys; +import org.apache.maven.aether.internal.ant.ProjectWorkspaceReader; +import org.apache.maven.aether.internal.ant.tasks.RefTask; +import org.apache.maven.model.Model; +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() + ")"; + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/261b17db/src/main/java/org/apache/maven/aether/internal/ant/types/PomPropertyEvaluator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/maven/aether/internal/ant/types/PomPropertyEvaluator.java b/src/main/java/org/apache/maven/aether/internal/ant/types/PomPropertyEvaluator.java new file mode 100644 index 0000000..1097e76 --- /dev/null +++ b/src/main/java/org/apache/maven/aether/internal/ant/types/PomPropertyEvaluator.java @@ -0,0 +1,62 @@ +package org.apache.maven.aether.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.PropertyHelper; +import org.apache.tools.ant.PropertyHelper.PropertyEvaluator; +import org.apache.tools.ant.property.NullReturn; + +/** + */ +class PomPropertyEvaluator + implements PropertyEvaluator +{ + + private final ModelValueExtractor extractor; + + public static void register( ModelValueExtractor extractor, PropertyHelper propertyHelper ) + { + propertyHelper.add( new PomPropertyEvaluator( extractor ) ); + } + + private PomPropertyEvaluator( ModelValueExtractor extractor ) + { + if ( extractor == null ) + { + throw new IllegalArgumentException( "no model value exractor specified" ); + } + this.extractor = extractor; + } + + public Object evaluate( String property, PropertyHelper propertyHelper ) + { + Object value = extractor.getValue( property ); + if ( value != null ) + { + return value; + } + else if ( extractor.isApplicable( property ) ) + { + return NullReturn.NULL; + } + return null; + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/261b17db/src/main/java/org/apache/maven/aether/internal/ant/types/PomPropertyHelper.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/maven/aether/internal/ant/types/PomPropertyHelper.java b/src/main/java/org/apache/maven/aether/internal/ant/types/PomPropertyHelper.java new file mode 100644 index 0000000..76af53b --- /dev/null +++ b/src/main/java/org/apache/maven/aether/internal/ant/types/PomPropertyHelper.java @@ -0,0 +1,65 @@ +package org.apache.maven.aether.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.PropertyHelper; + +/** + */ +@SuppressWarnings( "deprecation" ) +class PomPropertyHelper + extends PropertyHelper +{ + + private final ModelValueExtractor extractor; + + public static void register( ModelValueExtractor extractor, PropertyHelper propertyHelper ) + { + PomPropertyHelper helper = new PomPropertyHelper( extractor ); + helper.setNext( propertyHelper.getNext() ); + propertyHelper.setNext( helper ); + } + + public PomPropertyHelper( ModelValueExtractor extractor ) + { + if ( extractor == null ) + { + throw new IllegalArgumentException( "no model value exractor specified" ); + } + this.extractor = extractor; + setProject( extractor.getProject() ); + } + + @Override + public Object getPropertyHook( String ns, String name, boolean user ) + { + Object value = extractor.getValue( name ); + if ( value != null ) + { + return value; + } + else if ( extractor.isApplicable( name ) ) + { + return null; + } + return super.getPropertyHook( ns, name, user ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/261b17db/src/main/java/org/apache/maven/aether/internal/ant/types/Proxy.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/maven/aether/internal/ant/types/Proxy.java b/src/main/java/org/apache/maven/aether/internal/ant/types/Proxy.java new file mode 100644 index 0000000..0ff671a --- /dev/null +++ b/src/main/java/org/apache/maven/aether/internal/ant/types/Proxy.java @@ -0,0 +1,164 @@ +package org.apache.maven.aether.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.aether.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 Proxy + extends DataType +{ + + private String host; + + private int port; + + private String type; + + private String nonProxyHosts; + + private Authentication authentication; + + @Override + public void setProject( Project project ) + { + super.setProject( project ); + + AntRepoSys.getInstance( project ).addProxy( this ); + } + + protected Proxy getRef() + { + return (Proxy) getCheckedRef(); + } + + public void setRefid( Reference ref ) + { + if ( host != null || port != 0 || type != null || nonProxyHosts != null ) + { + throw tooManyAttributes(); + } + if ( authentication != null ) + { + throw noChildrenAllowed(); + } + super.setRefid( ref ); + } + + public String getHost() + { + if ( isReference() ) + { + return getRef().getHost(); + } + return host; + } + + public void setHost( String host ) + { + checkAttributesAllowed(); + this.host = host; + } + + public int getPort() + { + if ( isReference() ) + { + return getRef().getPort(); + } + return port; + } + + public void setPort( int port ) + { + checkAttributesAllowed(); + if ( port <= 0 || port > 0xFFFF ) + { + throw new BuildException( "The port number must be within the range 1 - 65535" ); + } + this.port = port; + } + + public String getType() + { + if ( isReference() ) + { + return getRef().getType(); + } + return type; + } + + public void setType( String type ) + { + checkAttributesAllowed(); + this.type = type; + } + + public String getNonProxyHosts() + { + if ( isReference() ) + { + return getRef().getNonProxyHosts(); + } + return nonProxyHosts; + } + + public void setNonProxyHosts( String nonProxyHosts ) + { + checkAttributesAllowed(); + this.nonProxyHosts = nonProxyHosts; + } + + public Authentication getAuthentication() + { + if ( isReference() ) + { + return getRef().getAuthentication(); + } + return authentication; + } + + public void addAuthentication( Authentication authentication ) + { + checkChildrenAllowed(); + if ( this.authentication != null ) + { + throw new BuildException( "You must not specify multiple <authentication> elements" ); + } + this.authentication = authentication; + } + + public void setAuthRef( Reference ref ) + { + if ( authentication == null ) + { + authentication = new Authentication(); + authentication.setProject( getProject() ); + } + authentication.setRefid( ref ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/261b17db/src/main/java/org/apache/maven/aether/internal/ant/types/RemoteRepositories.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/maven/aether/internal/ant/types/RemoteRepositories.java b/src/main/java/org/apache/maven/aether/internal/ant/types/RemoteRepositories.java new file mode 100644 index 0000000..063a3b6 --- /dev/null +++ b/src/main/java/org/apache/maven/aether/internal/ant/types/RemoteRepositories.java @@ -0,0 +1,97 @@ +package org.apache.maven.aether.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 RemoteRepositories + extends DataType + implements RemoteRepositoryContainer +{ + + private List<RemoteRepositoryContainer> containers = new ArrayList<RemoteRepositoryContainer>(); + + protected RemoteRepositories getRef() + { + return (RemoteRepositories) getCheckedRef(); + } + + public void validate( Task task ) + { + if ( isReference() ) + { + getRef().validate( task ); + } + else + { + for ( RemoteRepositoryContainer container : containers ) + { + container.validate( task ); + } + } + } + + public void setRefid( Reference ref ) + { + if ( !containers.isEmpty() ) + { + throw noChildrenAllowed(); + } + super.setRefid( ref ); + } + + public void addRemoterepo( RemoteRepository repository ) + { + checkChildrenAllowed(); + containers.add( repository ); + } + + public void addRemoterepos( RemoteRepositories repositories ) + { + checkChildrenAllowed(); + if ( repositories == this ) + { + throw circularReference(); + } + containers.add( repositories ); + } + + public List<RemoteRepository> getRepositories() + { + if ( isReference() ) + { + return getRef().getRepositories(); + } + List<RemoteRepository> repos = new ArrayList<RemoteRepository>(); + for ( RemoteRepositoryContainer container : containers ) + { + repos.addAll( container.getRepositories() ); + } + return repos; + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/261b17db/src/main/java/org/apache/maven/aether/internal/ant/types/RemoteRepository.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/maven/aether/internal/ant/types/RemoteRepository.java b/src/main/java/org/apache/maven/aether/internal/ant/types/RemoteRepository.java new file mode 100644 index 0000000..4720004 --- /dev/null +++ b/src/main/java/org/apache/maven/aether/internal/ant/types/RemoteRepository.java @@ -0,0 +1,351 @@ +package org.apache.maven.aether.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.Collections; +import java.util.List; + +import org.apache.maven.aether.internal.ant.AntRepoSys; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.DataType; +import org.apache.tools.ant.types.Reference; +import org.eclipse.aether.repository.RepositoryPolicy; + +/** + */ +public class RemoteRepository + extends DataType + implements RemoteRepositoryContainer +{ + + private String id; + + private String url; + + private String type; + + private Policy releasePolicy; + + private Policy snapshotPolicy; + + private boolean releases = true; + + private boolean snapshots = false; + + private String checksums; + + private String updates; + + private Authentication authentication; + + @Override + public void setProject( Project project ) + { + super.setProject( project ); + + // NOTE: Just trigger side-effect of default initialization before this type potentially overrides central + AntRepoSys.getInstance( project ); + } + + protected RemoteRepository getRef() + { + return (RemoteRepository) getCheckedRef(); + } + + public void validate( Task task ) + { + if ( isReference() ) + { + getRef().validate( task ); + } + else + { + if ( url == null || url.length() <= 0 ) + { + throw new BuildException( "You must specify the 'url' for a remote repository" ); + } + if ( id == null || id.length() <= 0 ) + { + throw new BuildException( "You must specify the 'id' for a remote repository" ); + } + } + } + + public void setRefid( Reference ref ) + { + if ( id != null || url != null || type != null || checksums != null || updates != null ) + { + throw tooManyAttributes(); + } + if ( releasePolicy != null || snapshotPolicy != null || authentication != null ) + { + throw noChildrenAllowed(); + } + super.setRefid( ref ); + } + + public String getId() + { + if ( isReference() ) + { + return getRef().getId(); + } + return id; + } + + public void setId( String id ) + { + this.id = id; + } + + public String getUrl() + { + if ( isReference() ) + { + return getRef().getUrl(); + } + return url; + } + + public void setUrl( String url ) + { + checkAttributesAllowed(); + this.url = url; + } + + public String getType() + { + if ( isReference() ) + { + return getRef().getType(); + } + return ( type != null ) ? type : "default"; + } + + public void setType( String type ) + { + checkAttributesAllowed(); + this.type = type; + } + + public Policy getReleasePolicy() + { + if ( isReference() ) + { + return getRef().getReleasePolicy(); + } + return releasePolicy; + } + + public void addReleases( Policy policy ) + { + checkChildrenAllowed(); + if ( this.releasePolicy != null ) + { + throw new BuildException( "You must not specify multiple <releases> elements" ); + } + this.releasePolicy = policy; + } + + public Policy getSnapshotPolicy() + { + if ( isReference() ) + { + return getRef().getSnapshotPolicy(); + } + return snapshotPolicy; + } + + public void addSnapshots( Policy policy ) + { + checkChildrenAllowed(); + if ( this.snapshotPolicy != null ) + { + throw new BuildException( "You must not specify multiple <snapshots> elements" ); + } + this.snapshotPolicy = policy; + } + + public boolean isReleases() + { + if ( isReference() ) + { + return getRef().isReleases(); + } + return releases; + } + + public void setReleases( boolean releases ) + { + checkAttributesAllowed(); + this.releases = releases; + } + + public boolean isSnapshots() + { + if ( isReference() ) + { + return getRef().isSnapshots(); + } + return snapshots; + } + + public void setSnapshots( boolean snapshots ) + { + checkAttributesAllowed(); + this.snapshots = snapshots; + } + + public String getUpdates() + { + if ( isReference() ) + { + return getRef().getUpdates(); + } + return ( updates != null ) ? updates : RepositoryPolicy.UPDATE_POLICY_DAILY; + } + + public void setUpdates( String updates ) + { + checkAttributesAllowed(); + checkUpdates( updates ); + this.updates = updates; + } + + protected static void checkUpdates( String updates ) + { + if ( !RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( updates ) + && !RepositoryPolicy.UPDATE_POLICY_DAILY.equals( updates ) + && !RepositoryPolicy.UPDATE_POLICY_NEVER.equals( updates ) + && !updates.startsWith( RepositoryPolicy.UPDATE_POLICY_INTERVAL ) ) + { + throw new BuildException( "'" + updates + "' is not a permitted update policy" ); + } + } + + public String getChecksums() + { + if ( isReference() ) + { + return getRef().getChecksums(); + } + return ( checksums != null ) ? checksums : RepositoryPolicy.CHECKSUM_POLICY_WARN; + } + + public void setChecksums( String checksums ) + { + checkAttributesAllowed(); + checkChecksums( checksums ); + this.checksums = checksums; + } + + protected static void checkChecksums( String checksums ) + { + if ( !RepositoryPolicy.CHECKSUM_POLICY_FAIL.equals( checksums ) + && !RepositoryPolicy.CHECKSUM_POLICY_WARN.equals( checksums ) + && !RepositoryPolicy.CHECKSUM_POLICY_IGNORE.equals( checksums ) ) + { + throw new BuildException( "'" + checksums + "' is not a permitted checksum policy" ); + } + } + + public Authentication getAuthentication() + { + if ( isReference() ) + { + return getRef().getAuthentication(); + } + return authentication; + } + + public void addAuthentication( Authentication authentication ) + { + checkChildrenAllowed(); + if ( this.authentication != null ) + { + throw new BuildException( "You must not specify multiple <authentication> elements" ); + } + this.authentication = authentication; + } + + public void setAuthRef( Reference ref ) + { + checkAttributesAllowed(); + if ( authentication == null ) + { + authentication = new Authentication(); + authentication.setProject( getProject() ); + } + authentication.setRefid( ref ); + } + + public List<RemoteRepository> getRepositories() + { + return Collections.singletonList( this ); + } + + /** + */ + public static class Policy + { + + private boolean enabled = true; + + private String checksumPolicy; + + private String updatePolicy; + + public boolean isEnabled() + { + return enabled; + } + + public void setEnabled( boolean enabled ) + { + this.enabled = enabled; + } + + public String getChecksums() + { + return checksumPolicy; + } + + public void setChecksums( String checksumPolicy ) + { + checkChecksums( checksumPolicy ); + this.checksumPolicy = checksumPolicy; + } + + public String getUpdates() + { + return updatePolicy; + } + + public void setUpdates( String updatePolicy ) + { + checkUpdates( updatePolicy ); + this.updatePolicy = updatePolicy; + } + + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/261b17db/src/main/java/org/apache/maven/aether/internal/ant/types/RemoteRepositoryContainer.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/maven/aether/internal/ant/types/RemoteRepositoryContainer.java b/src/main/java/org/apache/maven/aether/internal/ant/types/RemoteRepositoryContainer.java new file mode 100644 index 0000000..488ffb6 --- /dev/null +++ b/src/main/java/org/apache/maven/aether/internal/ant/types/RemoteRepositoryContainer.java @@ -0,0 +1,35 @@ +package org.apache.maven.aether.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 RemoteRepositoryContainer +{ + + void validate( Task task ); + + List<RemoteRepository> getRepositories(); + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/261b17db/src/main/java/org/apache/maven/aether/internal/ant/types/Settings.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/maven/aether/internal/ant/types/Settings.java b/src/main/java/org/apache/maven/aether/internal/ant/types/Settings.java new file mode 100644 index 0000000..85190b1 --- /dev/null +++ b/src/main/java/org/apache/maven/aether/internal/ant/types/Settings.java @@ -0,0 +1,86 @@ +package org.apache.maven.aether.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.aether.internal.ant.AntRepoSys; +import org.apache.tools.ant.types.DataType; +import org.apache.tools.ant.types.Reference; + +/** + */ +public class Settings + extends DataType +{ + + private File file; + + private File globalFile; + + protected Settings getRef() + { + return (Settings) getCheckedRef(); + } + + public void setRefid( Reference ref ) + { + if ( file != null || globalFile != null ) + { + throw tooManyAttributes(); + } + super.setRefid( ref ); + } + + public File getFile() + { + if ( isReference() ) + { + return getRef().getFile(); + } + return file; + } + + public void setFile( File file ) + { + checkAttributesAllowed(); + this.file = file; + + AntRepoSys.getInstance( getProject() ).setUserSettings( file ); + } + + public File getGlobalFile() + { + if ( isReference() ) + { + return getRef().getFile(); + } + return globalFile; + } + + public void setGlobalFile( File globalFile ) + { + checkAttributesAllowed(); + this.globalFile = globalFile; + + AntRepoSys.getInstance( getProject() ).setGlobalSettings( globalFile ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/261b17db/src/main/java/org/eclipse/aether/internal/ant/AetherUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/AetherUtils.java b/src/main/java/org/eclipse/aether/internal/ant/AetherUtils.java deleted file mode 100644 index 337c647..0000000 --- a/src/main/java/org/eclipse/aether/internal/ant/AetherUtils.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.eclipse.aether.internal.ant; - -/* - * 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.tools.ant.Project; -import org.eclipse.aether.internal.ant.types.RemoteRepositories; - -class AetherUtils -{ - - public static File findGlobalSettings( Project project ) - { - File file = new File( new File( project.getProperty( "ant.home" ), "etc" ), Names.SETTINGS_XML ); - if ( file.isFile() ) - { - return file; - } - else - { - String mavenHome = getMavenHome( project ); - if ( mavenHome != null ) - { - return new File( new File( mavenHome, "conf" ), Names.SETTINGS_XML ); - } - } - - return null; - } - - public static String getMavenHome( Project project ) - { - String mavenHome = project.getProperty( "maven.home" ); - if ( mavenHome != null ) - { - return mavenHome; - } - return System.getenv( "M2_HOME" ); - } - - public static File findUserSettings( Project project ) - { - File userHome = new File( project.getProperty( "user.home" ) ); - File file = new File( new File( userHome, ".ant" ), Names.SETTINGS_XML ); - if ( file.isFile() ) - { - return file; - } - else - { - return new File( new File( userHome, ".m2" ), Names.SETTINGS_XML ); - } - } - - public static RemoteRepositories getDefaultRepositories( Project project ) - { - Object obj = project.getReference( Names.ID_DEFAULT_REPOS ); - if ( obj instanceof RemoteRepositories ) - { - return (RemoteRepositories) obj; - } - return null; - } - -} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/261b17db/src/main/java/org/eclipse/aether/internal/ant/AntLogger.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/AntLogger.java b/src/main/java/org/eclipse/aether/internal/ant/AntLogger.java deleted file mode 100644 index 0071142..0000000 --- a/src/main/java/org/eclipse/aether/internal/ant/AntLogger.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.eclipse.aether.internal.ant; - -/* - * 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.Project; -import org.eclipse.aether.spi.log.Logger; - -/** - */ -class AntLogger - implements Logger -{ - - private Project project; - - public AntLogger( Project project ) - { - this.project = project; - } - - public void debug( String msg ) - { - project.log( msg, Project.MSG_DEBUG ); - } - - public void debug( String msg, Throwable error ) - { - project.log( msg, error, Project.MSG_DEBUG ); - } - - public boolean isDebugEnabled() - { - return true; - } - - public boolean isWarnEnabled() - { - return true; - } - - public void warn( String msg ) - { - project.log( msg, Project.MSG_WARN ); - } - - public void warn( String msg, Throwable error ) - { - project.log( msg, error, Project.MSG_WARN ); - } - -} http://git-wip-us.apache.org/repos/asf/maven-aether/blob/261b17db/src/main/java/org/eclipse/aether/internal/ant/AntModelResolver.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/eclipse/aether/internal/ant/AntModelResolver.java b/src/main/java/org/eclipse/aether/internal/ant/AntModelResolver.java deleted file mode 100644 index 0ea3a40..0000000 --- a/src/main/java/org/eclipse/aether/internal/ant/AntModelResolver.java +++ /dev/null @@ -1,157 +0,0 @@ -package org.eclipse.aether.internal.ant; - -/* - * 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.HashSet; -import java.util.List; -import java.util.Set; - -import org.apache.maven.model.Repository; -import org.apache.maven.model.building.FileModelSource; -import org.apache.maven.model.building.ModelSource; -import org.apache.maven.model.resolution.InvalidRepositoryException; -import org.apache.maven.model.resolution.ModelResolver; -import org.apache.maven.model.resolution.UnresolvableModelException; -import org.eclipse.aether.RepositorySystem; -import org.eclipse.aether.RepositorySystemSession; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.impl.RemoteRepositoryManager; -import org.eclipse.aether.repository.RemoteRepository; -import org.eclipse.aether.repository.RepositoryPolicy; -import org.eclipse.aether.resolution.ArtifactRequest; -import org.eclipse.aether.resolution.ArtifactResolutionException; - -/** - * A model resolver to assist building of dependency POMs. This resolver gives priority to those repositories that have - * been initially specified and repositories discovered in dependency POMs are recessively merged into the search chain. - * - */ -class AntModelResolver - implements ModelResolver -{ - - private final RepositorySystemSession session; - - private final String context; - - private List<org.eclipse.aether.repository.RemoteRepository> repositories; - - private final RepositorySystem repoSys; - - private final RemoteRepositoryManager remoteRepositoryManager; - - private final Set<String> repositoryIds; - - public AntModelResolver( RepositorySystemSession session, String context, RepositorySystem repoSys, - RemoteRepositoryManager remoteRepositoryManager, List<RemoteRepository> repositories ) - { - this.session = session; - this.context = context; - this.repoSys = repoSys; - this.remoteRepositoryManager = remoteRepositoryManager; - this.repositories = repositories; - this.repositoryIds = new HashSet<String>(); - } - - private AntModelResolver( AntModelResolver original ) - { - this.session = original.session; - this.context = original.context; - this.repoSys = original.repoSys; - this.remoteRepositoryManager = original.remoteRepositoryManager; - this.repositories = original.repositories; - this.repositoryIds = new HashSet<String>( original.repositoryIds ); - } - - public void addRepository( Repository repository ) - throws InvalidRepositoryException - { - if ( !repositoryIds.add( repository.getId() ) ) - { - return; - } - - List<RemoteRepository> newRepositories = Collections.singletonList( convert( repository ) ); - - this.repositories = - remoteRepositoryManager.aggregateRepositories( session, repositories, newRepositories, true ); - } - - static RemoteRepository convert( Repository repository ) - { - RemoteRepository.Builder builder = - new RemoteRepository.Builder( repository.getId(), repository.getLayout(), repository.getUrl() ); - builder.setSnapshotPolicy( convert( repository.getSnapshots() ) ); - builder.setReleasePolicy( convert( repository.getReleases() ) ); - return builder.build(); - } - - private static RepositoryPolicy convert( org.apache.maven.model.RepositoryPolicy policy ) - { - boolean enabled = true; - String checksums = RepositoryPolicy.CHECKSUM_POLICY_WARN; - String updates = RepositoryPolicy.UPDATE_POLICY_DAILY; - - if ( policy != null ) - { - enabled = policy.isEnabled(); - if ( policy.getUpdatePolicy() != null ) - { - updates = policy.getUpdatePolicy(); - } - if ( policy.getChecksumPolicy() != null ) - { - checksums = policy.getChecksumPolicy(); - } - } - - return new RepositoryPolicy( enabled, updates, checksums ); - } - - public ModelResolver newCopy() - { - return new AntModelResolver( this ); - } - - public ModelSource resolveModel( String groupId, String artifactId, String version ) - throws UnresolvableModelException - { - Artifact pomArtifact = new DefaultArtifact( groupId, artifactId, "", "pom", version ); - - try - { - ArtifactRequest request = new ArtifactRequest( pomArtifact, repositories, context ); - pomArtifact = repoSys.resolveArtifact( session, request ).getArtifact(); - } - catch ( ArtifactResolutionException e ) - { - throw new UnresolvableModelException( "Failed to resolve POM for " + groupId + ":" + artifactId + ":" - + version + " due to " + e.getMessage(), groupId, artifactId, version, e ); - } - - File pomFile = pomArtifact.getFile(); - - return new FileModelSource( pomFile ); - } - -}