blob: 857c6d816eacc6839804503a505b2a41e55c904d [file] [log] [blame]
/*
* 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
*
* https://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.apache.ivy.ant;
import java.io.File;
import java.net.MalformedURLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.apache.ivy.Ivy;
import org.apache.ivy.core.module.descriptor.Artifact;
import org.apache.ivy.core.module.descriptor.Configuration;
import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
import org.apache.ivy.core.module.id.ModuleId;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.resolve.ResolvedModuleRevision;
import org.apache.ivy.core.settings.IvySettings;
import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import static org.apache.ivy.core.module.descriptor.Configuration.Visibility.PUBLIC;
/**
* Parses information about an ivy file and make them available in ant.
*/
public class IvyInfo extends IvyTask {
private File file = null;
private String organisation;
private String module;
private String branch;
private String revision;
private String property = "ivy";
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getModule() {
return module;
}
public void setModule(String module) {
this.module = module;
}
public String getOrganisation() {
return organisation;
}
public void setOrganisation(String organisation) {
this.organisation = organisation;
}
public String getRevision() {
return revision;
}
public void setRevision(String revision) {
this.revision = revision;
}
public String getBranch() {
return branch;
}
public void setBranch(String branch) {
this.branch = branch;
}
public String getProperty() {
return property;
}
public void setProperty(String prefix) {
this.property = prefix;
}
public void doExecute() throws BuildException {
Ivy ivy = getIvyInstance();
IvySettings settings = ivy.getSettings();
try {
if (organisation != null || module != null || revision != null || branch != null) {
if (organisation == null) {
throw new BuildException("no organisation provided for ivy info task");
}
if (module == null) {
throw new BuildException("no module name provided for ivy info task");
}
if (revision == null) {
throw new BuildException("no revision provided for ivy info task");
}
if (branch == null) {
settings.getDefaultBranch(new ModuleId(organisation, module));
}
ResolvedModuleRevision rmr = ivy.findModule(ModuleRevisionId.newInstance(
organisation, module, branch, revision));
if (rmr != null) {
ModuleDescriptor md = rmr.getDescriptor();
ModuleRevisionId mrid = rmr.getId();
setProperties(md, mrid);
}
} else {
if (file == null) {
file = getProject().resolveFile(getProperty(settings, "ivy.dep.file"));
}
ModuleDescriptor md = ModuleDescriptorParserRegistry.getInstance().parseDescriptor(
settings, file.toURI().toURL(), doValidate(settings));
ModuleRevisionId mrid = md.getModuleRevisionId();
setProperties(md, mrid);
}
} catch (MalformedURLException e) {
throw new BuildException("unable to convert given ivy file to url: " + file + ": " + e,
e);
} catch (ParseException e) {
log(e.getMessage(), Project.MSG_ERR);
throw new BuildException("syntax errors in ivy file: " + e, e);
} catch (Exception e) {
throw new BuildException("impossible to resolve dependencies: " + e, e);
}
}
private void setProperties(ModuleDescriptor md, ModuleRevisionId mrid) {
getProject().setProperty(property + ".organisation", mrid.getOrganisation());
getProject().setProperty(property + ".module", mrid.getName());
if (mrid.getBranch() != null) {
getProject().setProperty(property + ".branch", mrid.getBranch());
}
getProject().setProperty(property + ".revision", mrid.getRevision());
getProject().setProperty(property + ".status", md.getStatus());
if (md.getPublicationDate() != null) {
getProject().setProperty(property + ".publication",
Long.toString(md.getPublicationDate().getTime()));
}
for (Map.Entry<String, String> entry : mrid.getExtraAttributes().entrySet()) {
getProject().setProperty(property + ".extra." + entry.getKey(),
entry.getValue());
}
getProject().setProperty(property + ".configurations",
mergeConfs(md.getConfigurationsNames()));
// store the public configurations in a separate property
List<String> publicConfigsList = new ArrayList<>();
for (Configuration config : md.getConfigurations()) {
String name = config.getName();
if (PUBLIC.equals(config.getVisibility())) {
publicConfigsList.add(name);
}
if (config.getDescription() != null) {
getProject().setProperty(property + ".configuration." + name + ".desc",
config.getDescription());
}
}
String[] publicConfigs = publicConfigsList.toArray(new String[publicConfigsList.size()]);
getProject().setProperty(property + ".public.configurations", mergeConfs(publicConfigs));
List<Artifact> artifacts = Arrays.asList(md.getAllArtifacts());
for (Artifact artifact : artifacts) {
int id = artifacts.indexOf(artifact) + 1;
getProject().setProperty(property + ".artifact." + id + ".name", artifact.getName());
getProject().setProperty(property + ".artifact." + id + ".type", artifact.getType());
getProject().setProperty(property + ".artifact." + id + ".ext", artifact.getExt());
getProject().setProperty(property + ".artifact." + id + ".conf",
mergeConfs(artifact.getConfigurations()));
for (Map.Entry<String, String> entry : artifact.getExtraAttributes().entrySet()) {
getProject().setProperty(property + ".artifact." + id + ".extra." + entry.getKey(),
entry.getValue());
}
}
}
}