/* * Copyright 2013 the original author or authors. * * Licensed 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. */ package org.gradle.api.publish.ivy.internal.artifact; import org.apache.commons.lang.StringUtils; import org.gradle.api.artifacts.PublishArtifact; import org.gradle.api.internal.file.FileResolver; import org.gradle.api.internal.plugins.DslObject; import org.gradle.api.publish.ivy.IvyArtifact; import org.gradle.api.publish.ivy.internal.publisher.IvyPublicationIdentity; import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.gradle.internal.Factory; import org.gradle.internal.exceptions.DiagnosticsVisitor; import org.gradle.internal.reflect.Instantiator; import org.gradle.internal.typeconversion.*; import java.io.File; import java.util.concurrent.Callable; public class IvyArtifactNotationParserFactory implements Factory<NotationParser<Object, IvyArtifact>> { private final Instantiator instantiator; private final FileResolver fileResolver; private final IvyPublicationIdentity publicationIdentity; public IvyArtifactNotationParserFactory(Instantiator instantiator, FileResolver fileResolver, IvyPublicationIdentity publicationIdentity) { this.instantiator = instantiator; this.fileResolver = fileResolver; this.publicationIdentity = publicationIdentity; } public NotationParser<Object, IvyArtifact> create() { FileNotationConverter fileNotationConverter = new FileNotationConverter(fileResolver); ArchiveTaskNotationConverter archiveTaskNotationConverter = new ArchiveTaskNotationConverter(); PublishArtifactNotationConverter publishArtifactNotationConverter = new PublishArtifactNotationConverter(); NotationParser<Object, IvyArtifact> sourceNotationParser = NotationParserBuilder .toType(IvyArtifact.class) .converter(archiveTaskNotationConverter) .converter(publishArtifactNotationConverter) .converter(fileNotationConverter) .toComposite(); IvyArtifactMapNotationConverter ivyArtifactMapNotationConverter = new IvyArtifactMapNotationConverter(sourceNotationParser); NotationParserBuilder<IvyArtifact> parserBuilder = NotationParserBuilder .toType(IvyArtifact.class) .converter(archiveTaskNotationConverter) .converter(publishArtifactNotationConverter) .converter(ivyArtifactMapNotationConverter) .converter(fileNotationConverter); return parserBuilder.toComposite(); } private DefaultIvyArtifact createDefaultIvyArtifact(File file, String extension, String type, String classifier) { DefaultIvyArtifact ivyArtifact = instantiator.newInstance( DefaultIvyArtifact.class, file, null, extension, type, classifier ); new DslObject(ivyArtifact).getConventionMapping().map("name", new Callable<String>() { public String call() throws Exception { return publicationIdentity.getModule(); } }); return ivyArtifact; } private class ArchiveTaskNotationConverter extends TypedNotationConverter<AbstractArchiveTask, IvyArtifact> { private ArchiveTaskNotationConverter() { super(AbstractArchiveTask.class); } @Override protected IvyArtifact parseType(AbstractArchiveTask archiveTask) { DefaultIvyArtifact ivyArtifact = createDefaultIvyArtifact( archiveTask.getArchivePath(), archiveTask.getExtension(), archiveTask.getExtension(), archiveTask.getClassifier()); ivyArtifact.builtBy(archiveTask); return ivyArtifact; } } private class PublishArtifactNotationConverter extends TypedNotationConverter<PublishArtifact, IvyArtifact> { private PublishArtifactNotationConverter() { super(PublishArtifact.class); } @Override protected IvyArtifact parseType(PublishArtifact publishArtifact) { DefaultIvyArtifact ivyArtifact = createDefaultIvyArtifact( publishArtifact.getFile(), publishArtifact.getExtension(), publishArtifact.getType(), publishArtifact.getClassifier()); ivyArtifact.builtBy(publishArtifact.getBuildDependencies()); return ivyArtifact; } } private class FileNotationConverter implements NotationConverter<Object, IvyArtifact> { private final NotationParser<Object, File> fileResolverNotationParser; private FileNotationConverter(FileResolver fileResolver) { this.fileResolverNotationParser = fileResolver.asNotationParser(); } public void convert(Object notation, NotationConvertResult<? super IvyArtifact> result) throws TypeConversionException { File file = fileResolverNotationParser.parseNotation(notation); result.converted(parseFile(file)); } protected IvyArtifact parseFile(File file) { String extension = StringUtils.substringAfterLast(file.getName(), "."); return createDefaultIvyArtifact(file, extension, extension, null); } @Override public void describe(DiagnosticsVisitor visitor) { fileResolverNotationParser.describe(visitor); } } private class IvyArtifactMapNotationConverter extends MapNotationConverter<IvyArtifact> { private final NotationParser<Object, IvyArtifact> sourceNotationParser; private IvyArtifactMapNotationConverter(NotationParser<Object, IvyArtifact> sourceNotationParser) { this.sourceNotationParser = sourceNotationParser; } protected IvyArtifact parseMap(@MapKey("source") Object source) { return sourceNotationParser.parseNotation(source); } @Override public void describe(DiagnosticsVisitor visitor) { visitor.candidate("Maps containing a 'source' entry").example("[source: '/path/to/file', extension: 'zip']"); } } }