IvyTagAttribute orgTagAttribute = new IvyTagAttribute("organisation",
"the name of the organisation that is the owner of this module.", true);
orgTagAttribute.setValueProvider(defaultOrganizationProvider);
IvyTagAttribute statusTagAttribute = new IvyTagAttribute("status",
"the status of this module.");
statusTagAttribute.setValueProvider(new ListValueProvider(getDefault("status")));
IvyTagAttribute pubTagAttribute = new IvyTagAttribute("publication",
"the date of publication of this module. \n"
+ "It should be given in this format: yyyyMMddHHmmss");
pubTagAttribute.setValueProvider(new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
return new String[] {Ivy.DATE_FORMAT.format(new Date())};
}
});
IvyTagAttribute moduleTagAttribute = new IvyTagAttribute("module",
"the name of the module described by this ivy file.", true);
IValueProvider projectNameValueProvider = new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
return new String[] {ivyFile.getProjectName()};
}
};
moduleTagAttribute.setValueProvider(projectNameValueProvider);
IvyTag info = new IvyTag("info", "gives general information about the described module",
new IvyTagAttribute[] {orgTagAttribute, moduleTagAttribute,
new IvyTagAttribute("branch", "the branch of this module."),
new IvyTagAttribute("revision", "the revision of this module."),
statusTagAttribute, pubTagAttribute});
addTag(info);
// extends
IvyTag extend = new IvyTag("extends", "gives information about the parent module");
IvyTagAttribute parentOrgAtt = new IvyTagAttribute("organisation",
"the name of the organisation of the parent module.", false);
parentOrgAtt.setValueProvider(new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
List ret = listDependencyTokenValues(att.getName(), ivyFile);
ret.add(getSettings().getDefaultOrganization());
String org = ((IvyModuleDescriptorFile) ivyFile).getOrganisation();
if (org != null) {
ret.add(org);
}
return (String[]) ret.toArray(new String[ret.size()]);
}
});
extend.addAttribute(parentOrgAtt);
IvyTagAttribute parentModuleAtt = new IvyTagAttribute("module",
"the module name of the parent module", true);
parentModuleAtt.setValueProvider(new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
List ret = listDependencyTokenValues(att.getName(), ivyFile);
return (String[]) ret.toArray(new String[ret.size()]);
}
});
extend.addAttribute(parentModuleAtt);
IvyTagAttribute parentRevAtt = new IvyTagAttribute("revision",
"the revision of the parent module");
extend.addAttribute(parentRevAtt);
addTag(extend);
info.addChildIvyTag(extend);
// license
IvyTag child = new IvyTag("license",
"gives information about the licenses of the described module");
child.addAttribute(new IvyTagAttribute("name", "the name of the license. \n"
+ "Try to respect spelling when using a classical license.", true,
new ListValueProvider(getDefault("license"))));
child
.addAttribute(new IvyTagAttribute("url", "an url pointing to the license text.",
false));
addTag(child);
info.addChildIvyTag(child);
child = new IvyTag("ivyauthor", "describes who has contributed to write the ivy file");
child.addAttribute(new IvyTagAttribute("name",
"the name of the author, as a person or a company.", true,
defaultOrganizationProvider));
child.addAttribute(new IvyTagAttribute("url",
"an url pointing to where the author can be reached.", false,
defaultOrganizationURLProvider));
addTag(child);
info.addChildIvyTag(child);
child = new IvyTag("repository",
"describes on which public repositories this module can be found");
child.addAttribute(new IvyTagAttribute("name", "the name of the repository. \n"
+ "Try to respect spelling for common repositories (ibiblio, ivyrep, ...)", true,
new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
return new String[] {"ibiblio", "ivyrep"};
}
}));
child.addAttribute(new IvyTagAttribute("url", "an url pointing to the repository.", true,
new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
Map allAttsValues = ivyFile.getAllAttsValues();
if (allAttsValues != null) {
String name = (String) allAttsValues.get("name");
if ("ibiblio".equals(name)) {
return new String[] {"http://www.ibiblio.org/maven/"};
} else if ("ivyrep".equals(name)) {
return new String[] {"http://www.jayasoft.fr/org/ivyrep/"};
}
}
return null;
}
}));
IvyTagAttribute reppatternTagAttribute = new IvyTagAttribute("pattern",
"an ivy pattern to find modules on this repository", false);
reppatternTagAttribute.setValueProvider(new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
Map allAttsValues = ivyFile.getAllAttsValues();
if (allAttsValues != null) {
String name = (String) allAttsValues.get("name");
if ("ibiblio".equals(name)) {
return new String[] {"[module]/[type]s/[artifact]-[revision].[ext]"};
} else if ("ivyrep".equals(name)) {
return new String[] {"[organisation]/[module]/[artifact]-[revision].[ext]"};
}
}
return null;
}
});
child.addAttribute(reppatternTagAttribute);
child.addAttribute(new IvyBooleanTagAttribute("ivys",
"true if ivy file can be found on this repository", false));
child.addAttribute(new IvyBooleanTagAttribute("artifacts",
"true if module artifacts can be found on this repository", false));
addTag(child);
info.addChildIvyTag(child);
child = new IvyTag("description", "gives general description about the module");
child.addAttribute(new IvyTagAttribute("homepage", "the url of the homepage of the module",
false, defaultOrganizationURLProvider));
addTag(child);
info.addChildIvyTag(child);
ivyTag.addChildIvyTag(info);
// configurations
IvyTag configurations = new IvyTag("configurations",
"container for configuration elements");
IvyTag conf = new IvyTag("conf", "declares a configuration of this module");
conf.addAttribute(new IvyTagAttribute("name", "the name of the declared configuration",
true));
conf.addAttribute(new IvyTagAttribute("description",
"a short description for the declared configuration", false));
IvyTagAttribute visibilityTagAttribute = new IvyTagAttribute("visibility",
"the visibility of the declared configuration.\n"
+ "'public' means that this configuration can be used by other modules, \n"
+ "while 'private' means that this configuration is used only in the\n"
+ "module itself, and is not exposed to other modules", false);
visibilityTagAttribute.setValueProvider(new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
return new String[] {"public", "private"};
}
});
conf.addAttribute(visibilityTagAttribute);
IvyTagAttribute confExtTagAttribute = new IvyTagAttribute("extends",
"a comma separated list of configurations of this module \n"
+ "that the current configuration extends", false);
IValueProvider masterConfsValueProvider = new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
StringBuffer base = new StringBuffer();
String qualifier = ivyFile.getAttributeValueQualifier();
int comma = qualifier.lastIndexOf(",") + 1;
base.append(qualifier.substring(0, comma));
qualifier = qualifier.substring(comma);
while (qualifier.length() > 0 && qualifier.charAt(0) == ' ') {
base.append(' ');
qualifier = qualifier.substring(1);
}
String[] confs = ((IvyModuleDescriptorFile) ivyFile).getConfigurationNames();
for (int i = 0; i < confs.length; i++) {
confs[i] = base + confs[i];
}
return confs;
}
};
IValueProvider masterConfValueProvider = new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
return ((IvyModuleDescriptorFile) ivyFile).getConfigurationNames();
}
};
confExtTagAttribute.setValueProvider(masterConfsValueProvider);
conf.addAttribute(confExtTagAttribute);
IvyTagAttribute deprecatedTagAttribute = new IvyTagAttribute("deprecated",
"indicates that this conf has been deprecated \n"
+ "by giving the date of the deprecation. \n"
+ "It should be given in this format: yyyyMMddHHmmss", false);
deprecatedTagAttribute.setValueProvider(new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
return new String[] {Ivy.DATE_FORMAT.format(new Date())};
}
});
conf.addAttribute(deprecatedTagAttribute);
configurations.addChildIvyTag(conf);
List allConf = new ArrayList();
allConf.add(conf);
addTag(conf.getName(), allConf);
ivyTag.addChildIvyTag(configurations);
addTag(configurations);
// configurations
IvyTag publications = new IvyTag("publications",
"container for published artifact elements");
IvyTag artifact = new IvyTag("artifact", "declares a published artifact for this module");
artifact.addAttribute(new IvyTagAttribute("name",
"the name of the published artifact. This name must not include revision.", true,
projectNameValueProvider));
artifact.addAttribute(new IvyTagAttribute("type", "the type of the published artifact. \n"
+ "It's usually its extension, but not necessarily. \n"
+ "For instance, ivy files are of type 'ivy' but have 'xml' extension", true,
new ListValueProvider(getDefault("type"))));
artifact.addAttribute(new IvyTagAttribute("ext", "the extension of the published artifact",
false, new ListValueProvider(getDefault("ext"))));
artifact.addAttribute(new IvyTagAttribute("conf",
"comma separated list of public configurations in which this artifact\n"
+ "is published. '*' wildcard can be used to designate all public\n"
+ "configurations of this module", false, masterConfsValueProvider));
IvyTag conf2 = new IvyTag("conf",
"indicates a public configuration in which this artifact is published");
conf2.addAttribute(new IvyTagAttribute("name",
"the name of a module public configuration in which this artifact\n"
+ "is published. '*' wildcard can be used to designate all\n"
+ "public configurations of this module", true, masterConfValueProvider));
allConf.add(conf2);
artifact.addChildIvyTag(conf2);
publications.addChildIvyTag(artifact);
addTag(publications);
addTag(artifact);
ivyTag.addChildIvyTag(publications);
// dependencies
IvyTag dependencies = new IvyTag("dependencies", "container for dependency elements");
// dependency
IvyTag dependency = new IvyTag("dependency", "declares a dependency for this module") {
public String[] getPossibleValuesForAttribute(String att, IvyFile ivyfile) {
String[] r = super.getPossibleValuesForAttribute(att, ivyfile);
if (r == null) { // listing can be used even for extra attributes
List ret = listDependencyTokenValues(att, ivyfile);
return (String[]) ret.toArray(new String[ret.size()]);
} else {
return r;
}
}
};
IvyTagAttribute orgAtt = new IvyTagAttribute("org",
"the name of the organisation of the dependency.", false);
orgAtt.setValueProvider(new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
List ret = listDependencyTokenValues(att.getName(), ivyFile);
ret.add(getSettings().getDefaultOrganization());
String org = ((IvyModuleDescriptorFile) ivyFile).getOrganisation();
if (org != null) {
ret.add(org);
}
return (String[]) ret.toArray(new String[ret.size()]);
}
});
dependency.addAttribute(orgAtt);
IvyTagAttribute module = new IvyTagAttribute("name", "the module name of the dependency",
true);
module.setValueProvider(new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
List ret = listDependencyTokenValues(att.getName(), ivyFile);
return (String[]) ret.toArray(new String[ret.size()]);
}
});
dependency.addAttribute(module);
IvyTagAttribute branch = new IvyTagAttribute("branch",
"the branch of the dependency. \nDo not set if not needed.", false);
branch.setValueProvider(new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
List ret = listDependencyTokenValues(att.getName(), ivyFile);
return (String[]) ret.toArray(new String[ret.size()]);
}
});
dependency.addAttribute(branch);
IvyTagAttribute rev = new IvyTagAttribute("rev", "the revision of the dependency. \n"
+ "Use 'latest.integration' to get the latest version of the dependency. \n"
+ "You can also end the revision asked with a '+' to get the latest"
+ " matching revision.", true);
rev.setValueProvider(new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
List ret = listDependencyTokenValues(att.getName(), ivyFile);
ret.add("latest.integration");
return (String[]) ret.toArray(new String[ret.size()]);
}
});
dependency.addAttribute(rev);
dependency.addAttribute(new IvyBooleanTagAttribute("force",
"a boolean to give an indication to conflict manager \n"
+ "that this dependency should be forced to this revision", false));
dependency.addAttribute(new IvyBooleanTagAttribute("transitive",
"a boolean indicating if this dependency should be resolved transitively or not",
false));
IvyTagAttribute confAtt = new IvyTagAttribute("conf",
"an inline mapping configuration spec", false);
dependency.addAttribute(confAtt);
confAtt.setValueProvider(new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
String qualifier = ivyFile.getAttributeValueQualifier();
int index = qualifier.lastIndexOf(';') + 1;
StringBuffer base = new StringBuffer(qualifier.substring(0, index));
qualifier = qualifier.substring(index);
int arrowIndex = qualifier.indexOf("->");
if (arrowIndex > -1) {
// we are looking for a dep conf
String org = ((IvyModuleDescriptorFile) ivyFile).getDependencyOrganisation();
Map otherAttValues = ivyFile.getAllAttsValues();
if (org != null && otherAttValues != null && otherAttValues.get("name") != null
&& otherAttValues.get("rev") != null) {
otherAttValues.remove("org");
String branch = (String) otherAttValues.remove("branch");
otherAttValues.remove("conf");
otherAttValues.remove("force");
otherAttValues.remove("transitive");
otherAttValues.remove("changing");
return getDependencyConfs(org, (String) otherAttValues.remove("name"),
branch, (String) otherAttValues.remove("rev"), otherAttValues,
qualifier, base, arrowIndex);
}
} else {
// we are looking for a master conf
return getMasterConfs(ivyFile, qualifier, base, arrowIndex);
}
return null;
}
private String[] getMasterConfs(IvyFile ivyFile, String qualifier, StringBuffer base,
int arrowIndex) {
// search for word after last comma
int comma = qualifier.lastIndexOf(",") + 1;
base.append(qualifier.substring(0, comma));
qualifier = qualifier.substring(comma);
while (qualifier.length() > 0 && qualifier.charAt(0) == ' ') {
base.append(' ');
qualifier = qualifier.substring(1);
}
String[] confs = ((IvyModuleDescriptorFile) ivyFile).getConfigurationNames();
for (int i = 0; i < confs.length; i++) {
confs[i] = base + confs[i];
}
List ret = new ArrayList(Arrays.asList(confs));
ret.add("*");
return (String[]) ret.toArray(new String[ret.size()]);
}
private String[] getDependencyConfs(String org, String name, String branch, String rev,
Map otherAtts, String qualifier, StringBuffer base, int arrowIndex) {
Ivy ivy = getIvy();
if (ivy == null) {
return null;
}
base.append(qualifier.substring(0, arrowIndex + 2));
qualifier = qualifier.substring(arrowIndex + 2);
// search for word after last comma
int comma = qualifier.lastIndexOf(",") + 1;
base.append(qualifier.substring(0, comma));
qualifier = qualifier.substring(comma);
while (qualifier.length() > 0 && qualifier.charAt(0) == ' ') {
base.append(' ');
qualifier = qualifier.substring(1);
}
ResolveData data = new ResolveData(ivy.getResolveEngine(), new ResolveOptions());
ModuleRevisionId mrid = ModuleRevisionId.newInstance(org, name, branch, rev,
otherAtts);
DefaultDependencyDescriptor ddd = new DefaultDependencyDescriptor(mrid, false);
try {
DependencyResolver resolver = ivy.getSettings().getResolver(mrid);
if (resolver == null) {
return null;
}
ResolvedModuleRevision dep = resolver.getDependency(ddd, data);
if (dep == null) {
return null;
}
String[] confs = dep.getDescriptor().getConfigurationsNames();
for (int i = 0; i < confs.length; i++) {
confs[i] = base + confs[i];
}
List ret = new ArrayList(Arrays.asList(confs));
ret.add("*");
return (String[]) ret.toArray(new String[ret.size()]);
} catch (ParseException e) {
getSettings().logError("The dependencies of " + mrid + " could not be parsed",
e);
return null;
}
}
});
IvyTag conf3 = new IvyTag("conf", "defines configuration mapping has sub element");
conf3.addAttribute(new IvyTagAttribute(
"name",
"the name of the master configuration to map. \n"
+ "'*' wildcard can be used to designate all configurations of this module",
true, masterConfValueProvider));
conf3.addAttribute(new IvyTagAttribute("mapped",
"a comma separated list of dependency configurations \n"
+ "to which this master configuration should be mapped", false,
new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
Ivy ivy = getIvy();
int[] indexes = ivyFile.getParentTagIndex();
if (indexes != null && ivy != null) {
Map otherAttValues = ivyFile.getAllAttsValues(indexes[0] + 1);
String org = ((IvyModuleDescriptorFile) ivyFile)
.getDependencyOrganisation(otherAttValues);
if (org != null && otherAttValues != null
&& otherAttValues.get("name") != null
&& otherAttValues.get("rev") != null) {
StringBuffer base = new StringBuffer();
String qualifier = ivyFile.getAttributeValueQualifier();
// search for word after last comma
int comma = qualifier.lastIndexOf(",") + 1;
base.append(qualifier.substring(0, comma));
qualifier = qualifier.substring(comma);
while (qualifier.length() > 0 && qualifier.charAt(0) == ' ') {
base.append(' ');
qualifier = qualifier.substring(1);
}
ResolveData data = new ResolveData(ivy.getResolveEngine(),
new ResolveOptions());
ModuleRevisionId mrid = ModuleRevisionId.newInstance(org,
(String) otherAttValues.get("name"), (String) otherAttValues
.get("rev"));
DefaultDependencyDescriptor ddd = new DefaultDependencyDescriptor(
mrid, false);
try {
String[] confs = ivy.getSettings().getResolver(mrid)
.getDependency(ddd, data).getDescriptor()
.getConfigurationsNames();
for (int i = 0; i < confs.length; i++) {
confs[i] = base + confs[i];
}
List ret = new ArrayList(Arrays.asList(confs));
ret.add("*");
return (String[]) ret.toArray(new String[ret.size()]);
} catch (ParseException e) {
getSettings().logError(
"The dependencies of " + mrid + " could not be parsed", e);
return new String[] {"*"};
}
}
}
return new String[] {"*"};
}
}));
allConf.add(conf3);
IvyTag mapped = new IvyTag("mapped",
"map dependency configurations for this master configuration");
mapped.addAttribute(new IvyTagAttribute("name",
"the name of the dependency configuration mapped. \n"
+ "'*' wildcard can be used to designate all configurations of this module",
true, new IValueProvider() {
public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
Ivy ivy = getIvy();
int[] indexes = ivyFile.getParentTagIndex();
if (indexes == null || ivy == null) {
return new String[] {"*"};
}
indexes = ivyFile.getParentTagIndex(indexes[0]);
if (indexes == null) {
return new String[] {"*"};
}
Map otherAttValues = ivyFile.getAllAttsValues(indexes[0] + 1);
String org = ((IvyModuleDescriptorFile) ivyFile)
.getDependencyOrganisation(otherAttValues);
if (org == null || otherAttValues == null || otherAttValues.get("name") == null
|| otherAttValues.get("rev") == null) {
return new String[] {"*"};
}
ResolveData data = new ResolveData(ivy.getResolveEngine(),
new ResolveOptions());
ModuleRevisionId mrid = ModuleRevisionId.newInstance(org,
(String) otherAttValues.get("name"), (String) otherAttValues.get("rev"));
DefaultDependencyDescriptor ddd = new DefaultDependencyDescriptor(mrid, false);
try {
String[] confs = ivy.getSettings().getResolver(mrid)
.getDependency(ddd, data).getDescriptor().getConfigurationsNames();
List ret = new ArrayList(Arrays.asList(confs));
ret.add("*");
return (String[]) ret.toArray(new String[ret.size()]);
} catch (ParseException e) {
getSettings().logError("The dependencies of " + mrid
+ " could not be parsed", e);
}
return new String[] {"*"};
}
}));
conf3.addChildIvyTag(mapped);
addTag(mapped);
String[] matcherNames = new String[0];
Ivy ivy = getIvy();
if (ivy != null) {
matcherNames = (String[]) ivy.getSettings().getMatcherNames().toArray(new String[0]);
}
ListValueProvider matcherNamesProvider = new ListValueProvider(matcherNames);
IvyTag artifact2 = new IvyTag("artifact", "defines artifacts restriction \n"
+ "use only if you do not control dependency ivy file");
artifact2.addAttribute(new IvyTagAttribute("name", "the name of an artifact of the \n"
+ "dependency module to add to the include list, \n"
+ "or a regexp matching this name", false));
artifact2.addAttribute(new IvyTagAttribute("type", "the type of the artifact of the \n"
+ "dependency module to add to the include list, \n"
+ "or a regexp matching this name", false,
new ListValueProvider(getDefault("type"))));
artifact2
.addAttribute(new IvyTagAttribute("ext", "the extension of the artifact of the \n"
+ "dependency module to add to the include list, \n"
+ "or a regexp matching this name", false, new ListValueProvider(
getDefault("ext"))));
artifact2.addAttribute(new IvyTagAttribute("url",
"an url where this artifact can be found \n"
+ "if it isn't present at the standard \n" + "location in the repository",
false));
artifact2.addAttribute(new IvyTagAttribute("conf",
"comma separated list of the master configurations \n"
+ "in which this artifact should be included. \n"
+ "'*' wildcard can be used to designate all configurations of this module",
false, masterConfsValueProvider));
IvyTag conf4 = new IvyTag("conf", "configuration in which the artifact should be included");
conf4.addAttribute(new IvyTagAttribute("name",
"the name of the master configuration in which \n"
+ "the enclosing artifact should be included", true,
masterConfValueProvider));
allConf.add(conf4);
artifact2.addChildIvyTag(conf4);
addTag(artifact2);
IvyTag include = new IvyTag("include", "defines artifacts restriction \n"
+ "use only if you do not control dependency ivy file");
include.addAttribute(new IvyTagAttribute("name", "the name of an artifact of the \n"
+ "dependency module to add to the include list, \n"
+ "or a regexp matching this name", false));
include.addAttribute(new IvyTagAttribute("type", "the type of the artifact of the \n"
+ "dependency module to add to the include list, \n"
+ "or a regexp matching this name", false,
new ListValueProvider(getDefault("type"))));
include
.addAttribute(new IvyTagAttribute("ext", "the extension of the artifact of the \n"
+ "dependency module to add to the include list, \n"
+ "or a regexp matching this name", false, new ListValueProvider(
getDefault("ext"))));
include.addAttribute(new IvyTagAttribute("matcher",
"the matcher to use to match the modules to include", false, matcherNamesProvider));
include.addAttribute(new IvyTagAttribute("conf",
"comma separated list of the master configurations \n"
+ "in which this artifact should be included. \n"
+ "'*' wildcard can be used to designate all configurations of this module",
false, masterConfsValueProvider));
IvyTag conf5 = new IvyTag("conf", "configuration in which the artifact should be included");
conf5.addAttribute(new IvyTagAttribute("name",
"the name of the master configuration in which \n"
+ "the enclosing artifact should be included", true,
masterConfValueProvider));
include.addChildIvyTag(conf5);
addTag(include);
allConf.add(conf5);
IvyTag exclude = new IvyTag("exclude", "defines artifacts restriction \n"
+ "use only if you do not control dependency ivy file");
exclude.addAttribute(new IvyTagAttribute("org", "the organisation of the dependency \n"
+ "module or artifact to exclude, \n" + "or a pattern matching this organisation",
false));
exclude.addAttribute(new IvyTagAttribute("module", "the name of the dependency \n"
+ "module or the artifact to exclude, \n"
+ "or a pattern matching this module name", false));
exclude.addAttribute(new IvyTagAttribute("name", "the name of an artifact of the \n"
+ "dependency module to add to the exclude list, \n"
+ "or a pattern matching this name", false));
exclude.addAttribute(new IvyTagAttribute("type", "the type of the artifact of the \n"
+ "dependency module to add to the exclude list, \n"
+ "or a pattern matching this name", false, new ListValueProvider(
getDefault("type"))));
exclude.addAttribute(new IvyTagAttribute("ext", "the extension of the artifact of the \n"
+ "dependency module to add to the exclude list, \n"
+ "or a pattern matching this name", false,
new ListValueProvider(getDefault("ext"))));
exclude.addAttribute(new IvyTagAttribute("matcher",
"the matcher to use to match the modules to include", false, matcherNamesProvider));
exclude.addAttribute(new IvyTagAttribute("conf",
"comma separated list of the master configurations \n"
+ "in which this artifact should be excluded. \n"