@SuppressWarnings("unchecked")
    public List<IvyModuleInfo> call() throws Throwable {
      File ws = new File(workspace);
      FileSet ivyFiles = Util.createFileSet(ws, ivyFilePattern, ivyFileExcludePattern);
      final PrintStream logger = listener.getLogger();

      Ivy ivy = getIvy(logger);
      HashMap<ModuleDescriptor, String> moduleDescriptors = new HashMap<ModuleDescriptor, String>();
      for (String ivyFilePath : ivyFiles.getDirectoryScanner().getIncludedFiles()) {
        final File ivyFile = new File(ws, ivyFilePath);

        ModuleDescriptor module =
            (ModuleDescriptor)
                ivy.execute(
                    new IvyCallback() {
                      public Object doInIvyContext(Ivy ivy, IvyContext context) {
                        try {
                          return ModuleDescriptorParserRegistry.getInstance()
                              .parseDescriptor(
                                  ivy.getSettings(),
                                  ivyFile.toURI().toURL(),
                                  ivy.getSettings().doValidate());
                        } catch (MalformedURLException e) {
                          logger.println("The URL is malformed : " + ivyFile);
                          return null;
                        } catch (ParseException e) {
                          logger.println("Parsing error while reading the ivy file " + ivyFile);
                          return null;
                        } catch (IOException e) {
                          logger.println("I/O error while reading the ivy file " + ivyFile);
                          return null;
                        }
                      }
                    });
        moduleDescriptors.put(module, ivyFilePath.replace('\\', '/'));
      }

      List<IvyModuleInfo> infos = new ArrayList<IvyModuleInfo>();
      List<ModuleDescriptor> sortedModuleDescriptors =
          ivy.sortModuleDescriptors(moduleDescriptors.keySet(), SortOptions.DEFAULT);
      for (ModuleDescriptor moduleDescriptor : sortedModuleDescriptors) {
        infos.add(new IvyModuleInfo(moduleDescriptor, moduleDescriptors.get(moduleDescriptor)));
      }

      if (verbose) {
        for (IvyModuleInfo moduleInfo : infos) {
          logger.printf(
              "Discovered module %s at %s.\n",
              moduleInfo.displayName, moduleInfo.relativePathToDescriptor);
        }
      }

      return infos;
    }
  public void doExecute() throws BuildException {
    if (organisation == null) {
      throw new BuildException("no organisation provided for ivy listmodules task");
    }
    if (module == null) {
      throw new BuildException("no module name provided for ivy listmodules task");
    }
    if (revision == null) {
      throw new BuildException("no revision provided for ivy listmodules task");
    }
    if (property == null) {
      throw new BuildException("no property provided for ivy listmodules task");
    }
    if (value == null) {
      throw new BuildException("no value provided for ivy listmodules task");
    }

    Ivy ivy = getIvyInstance();
    IvySettings settings = ivy.getSettings();

    SearchEngine searcher = new SearchEngine(settings);
    PatternMatcher patternMatcher = settings.getMatcher(matcher);

    ModuleRevisionId[] mrids;
    if (resolver == null) {
      mrids =
          searcher.listModules(
              ModuleRevisionId.newInstance(organisation, module, branch, revision), patternMatcher);
    } else {
      DependencyResolver depResolver = settings.getResolver(resolver);
      if (depResolver == null) {
        throw new BuildException("Unknown resolver: " + resolver);
      }
      mrids =
          searcher.listModules(
              depResolver,
              ModuleRevisionId.newInstance(organisation, module, branch, revision),
              patternMatcher);
    }

    for (int i = 0; i < mrids.length; i++) {
      String name = IvyPatternHelper.substitute(settings.substitute(property), mrids[i]);
      String value = IvyPatternHelper.substitute(settings.substitute(this.value), mrids[i]);
      getProject().setProperty(name, value);
    }
  }
 /**
  * Return true if this module match the DependencyDescriptor with the given versionMatcher. If
  * this module has no version defined, then true is always returned.
  */
 public boolean match(DependencyDescriptor descriptor, VersionMatcher versionMatcher) {
   ModuleDescriptor md = module;
   return md.getResolvedModuleRevisionId().getRevision() == null
       || md.getResolvedModuleRevisionId().getRevision().equals(Ivy.getWorkingRevision())
       || versionMatcher.accept(descriptor.getDependencyRevisionId(), md);
   // Checking md.getResolvedModuleRevisionId().getRevision().equals(Ivy.getWorkingRevision()
   // allow to consider any local non resolved ivy.xml
   // as a valid module.
 }
  public void testUpdate() throws Exception {
    /*
     * For updated file to be equals to updated.xml, we have to fix the line separator to the
     * one used in updated.xml, in order for this test to works in all platforms (default line
     * separator used in updater being platform dependent
     */
    XmlModuleDescriptorUpdater.LINE_SEPARATOR = "\n";
    File dest = new File("build/updated-test.xml");
    dest.deleteOnExit();
    Map resolvedRevisions = new HashMap();
    resolvedRevisions.put(
        ModuleRevisionId.newInstance("yourorg", "yourmodule2", "branch1", "2+"), "2.5");
    resolvedRevisions.put(
        ModuleRevisionId.newInstance("yourorg", "yourmodule6", "trunk", "latest.integration"),
        "6.3");

    Map resolvedBranches = new HashMap();
    resolvedBranches.put(ModuleRevisionId.newInstance("yourorg", "yourmodule3", "3.1"), "branch1");
    resolvedBranches.put(
        ModuleRevisionId.newInstance("yourorg", "yourmodule2", "branch1", "2+"), null);

    GregorianCalendar cal = new GregorianCalendar();
    cal.set(2005, 2, 22, 14, 32, 54);

    Ivy ivy = Ivy.newInstance();
    ivy.setVariable("myvar", "myconf1");
    XmlModuleDescriptorUpdater.update(
        XmlModuleUpdaterTest.class.getResource("test-update.xml"),
        dest,
        getUpdateOptions(ivy.getSettings(), resolvedRevisions, "release", "mynewrev", cal.getTime())
            .setResolvedBranches(resolvedBranches));

    assertTrue(dest.exists());
    String expected =
        FileUtil.readEntirely(
            new BufferedReader(
                new InputStreamReader(
                    XmlModuleUpdaterTest.class.getResourceAsStream("updated.xml"))));
    String updated = FileUtil.readEntirely(new BufferedReader(new FileReader(dest)));
    assertEquals(expected, updated);
  }
Esempio n. 5
0
  // ---------------------------------------------------------------------------
  public void doMakeAction(Rule rule) throws TablesawException {
    System.out.println("Ivy retrieving dependencies.");
    try {
      ModuleDescriptor md = m_resolveRule.getReport().getModuleDescriptor();

      Ivy ivy = m_resolveRule.getIvyInstance();

      String pattern;

      if (m_useWorkingDir && m_make.getWorkingDirectory() != null) {
        pattern = m_make.getWorkingDirectory().getPath();
        pattern += "/" + m_retrievePattern;
      } else pattern = m_retrievePattern;

      if (m_make.isVerbose()) System.out.println("Ivy retrieve pattern: " + pattern);

      ivy.retrieve(md.getModuleRevisionId(), pattern, m_retreiveOptions);
    } catch (IOException ioe) {
      throw new TablesawException(ioe);
    }
  }
  private List listDependencyTokenValues(String att, Map otherAttValues) {
    List ret = new ArrayList();
    Ivy ivy = getIvy();
    if (ivy != null) {
      replaceToken(otherAttValues, "org", IvyPatternHelper.ORGANISATION_KEY);
      replaceToken(otherAttValues, "name", IvyPatternHelper.MODULE_KEY);
      replaceToken(otherAttValues, "rev", IvyPatternHelper.REVISION_KEY);

      if (!otherAttValues.containsKey(IvyPatternHelper.BRANCH_KEY)) {
        otherAttValues.put(IvyPatternHelper.BRANCH_KEY, ivy.getSettings().getDefaultBranch());
      }

      String stdAtt = standardiseDependencyAttribute(att);
      otherAttValues.remove(stdAtt);
      String[] revs = ivy.listTokenValues(stdAtt, otherAttValues);
      if (revs != null) {
        ret.addAll(Arrays.asList(revs));
      }
    }
    return ret;
  }
 public ResolvedConfiguration resolve(
     Configuration configuration, Ivy ivy, ModuleDescriptor moduleDescriptor) {
   Clock clock = new Clock();
   ResolveOptions resolveOptions = createResolveOptions(configuration);
   ResolveReport resolveReport;
   try {
     resolveReport = ivy.resolve(moduleDescriptor, resolveOptions);
   } catch (Exception e) {
     throw new RuntimeException(e);
   }
   logger.debug("Timing: Ivy resolve took {}", clock.getTime());
   return new ResolvedConfigurationImpl(resolveReport, configuration);
 }
    /**
     * @return the Ivy instance based on the {@link #ivyConfName}
     * @throws AbortException
     * @throws ParseException
     * @throws IOException
     */
    public Ivy getIvy(PrintStream logger) throws AbortException {
      Message.setDefaultLogger(new IvyMessageImpl());

      File settingsLoc = (ivySettingsFile == null) ? null : new File(ivySettingsFile);

      if ((settingsLoc != null) && (!settingsLoc.exists())) {
        throw new AbortException(
            Messages.IvyModuleSetBuild_NoSuchIvySettingsFile(settingsLoc.getAbsolutePath()));
      }

      ArrayList<File> propertyFiles = new ArrayList<File>();
      if (StringUtils.isNotBlank(ivySettingsPropertyFiles)) {
        for (String file : StringUtils.split(ivySettingsPropertyFiles, ',')) {
          File propertyFile = new File(workspaceProper, file.trim());
          if (!propertyFile.exists()) {
            propertyFile = new File(file.trim());
            if (!propertyFile.isAbsolute() || !propertyFile.exists()) {
              throw new AbortException(Messages.IvyModuleSetBuild_NoSuchPropertyFile(file));
            }
          }
          propertyFiles.add(propertyFile);
        }
      }

      try {
        IvySettings ivySettings = new IvySettings();
        for (File file : propertyFiles) {
          ivySettings.loadProperties(file);
        }
        if (settingsLoc != null) {
          ivySettings.load(settingsLoc);
          if (verbose)
            logger.println("Configured Ivy using custom settings " + settingsLoc.getAbsolutePath());
        } else {
          ivySettings.loadDefault();
          if (verbose) logger.println("Configured Ivy using default 2.1 settings");
        }
        if (ivyBranch != null) {
          ivySettings.setDefaultBranch(ivyBranch);
        }
        return Ivy.newInstance(ivySettings);
      } catch (Exception e) {
        logger.println("Error while reading the default Ivy 2.1 settings: " + e.getMessage());
        logger.println(e.getStackTrace());
      }
      return null;
    }
  public void testVariableReplacement() throws Exception {
    /*
     * For updated file to be equals to updated.xml, we have to fix the line separator to the
     * one used in updated.xml, in order for this test to works in all platforms (default line
     * separator used in updater being platform dependent
     */
    XmlModuleDescriptorUpdater.LINE_SEPARATOR = "\n";
    File dest = new File("build/updated-test2.xml");
    dest.deleteOnExit();
    Map resolvedRevisions = new HashMap();
    resolvedRevisions.put(
        ModuleRevisionId.newInstance("yourorg", "yourmodule2", "branch1", "2+"), "2.5");
    resolvedRevisions.put(
        ModuleRevisionId.newInstance("yourorg", "yourmodule6", "trunk", "latest.integration"),
        "6.3");

    Map resolvedBranches = new HashMap();
    resolvedBranches.put(ModuleRevisionId.newInstance("yourorg", "yourmodule3", "3.1"), "branch1");
    resolvedBranches.put(
        ModuleRevisionId.newInstance("yourorg", "yourmodule2", "branch1", "2+"), null);

    GregorianCalendar cal = new GregorianCalendar();
    cal.set(2005, 2, 22, 14, 32, 54);

    Ivy ivy = Ivy.newInstance();
    ivy.setVariable("myorg", "myorg");
    ivy.setVariable("mymodule", "mymodule");
    ivy.setVariable("myrev", "myrev");
    ivy.setVariable("mystatus", "integration");
    ivy.setVariable("mypubdate", "20050322143254");
    ivy.setVariable("mylicense", "MyLicense");
    ivy.setVariable("mylicenseurl", "http://www.my.org/mymodule/mylicense.html");
    ivy.setVariable("myorgurl", "http://www.myorg.org/");
    ivy.setVariable("ivyrep", "ivyrep");
    ivy.setVariable("ivyrepurl", "http://www.jayasoft.fr/org/ivyrep/");
    ivy.setVariable("ivyreppattern", "[organisation]/[module]/ivy-[revision].xml");
    ivy.setVariable("ivys", "true");
    ivy.setVariable("artifacts", "false");
    ivy.setVariable("homepage", "http://www.my.org/mymodule/");
    ivy.setVariable("includefile", "imported-configurations-with-mapping.xml");
    ivy.setVariable("mydesc", "desc 1");
    ivy.setVariable("visibility", "public");
    ivy.setVariable("myvar", "myconf1");
    ivy.setVariable("deprecated", "20050115");
    ivy.setVariable("myartifact1", "myartifact1");
    ivy.setVariable("mytype", "jar");
    ivy.setVariable("mymodule2", "mymodule2");
    ivy.setVariable("mymodule2rev", "2.0");
    ivy.setVariable("changing", "true");
    ivy.setVariable("transitive", "false");
    ivy.setVariable("targetconf", "yourconf1");
    ivy.setVariable("art9-1", "yourartifact9-1");
    ivy.setVariable("conf3", "myconf3");
    ivy.setVariable("includename", "your.*");
    ivy.setVariable("includeext", "xml");
    ivy.setVariable("excludename", "toexclude");
    ivy.setVariable("excludemodule", "*servlet*");
    ivy.setVariable("excludematcher", "glob");
    ivy.setVariable("excludeorg", "acme");
    ivy.setVariable("excludeartifact", "test");
    ivy.setVariable("excludetype", "source");
    ivy.setVariable("yourorg", "yourorg");
    ivy.setVariable("yourmodule", ".*");
    ivy.setVariable("all", "all");
    ivy.setVariable("regexp", "regexp");
    ivy.setVariable("theirrev", "1.0, 1.1");

    XmlModuleDescriptorUpdater.update(
        XmlModuleUpdaterTest.class.getResource("test-update-withvar.xml"),
        dest,
        getUpdateOptions(ivy.getSettings(), resolvedRevisions, "release", "mynewrev", cal.getTime())
            .setResolvedBranches(resolvedBranches));

    assertTrue(dest.exists());
    String expected =
        FileUtil.readEntirely(
            new BufferedReader(
                new InputStreamReader(
                    XmlModuleUpdaterTest.class.getResourceAsStream("updated.xml"))));
    String updated = FileUtil.readEntirely(new BufferedReader(new FileReader(dest)));
    assertEquals(expected, updated);
  }
  public IvyModuleDescriptorModel(IvyModelSettings settings) {
    super(settings);

    // ivy-module
    IvyTag ivyTag = new IvyTag("ivy-module", "root tag of ivy file");
    ivyTag.setDoc("Root tag of any ivy-file.");
    ivyTag.addAttribute(
        new IvyTagAttribute(
            "version",
            "The version of the ivy file specification \n"
                + "should be '2.0' with current version of ivy",
            true));
    addTag(ivyTag);

    IValueProvider defaultOrganizationProvider =
        new IValueProvider() {
          public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
            return new String[] {getSettings().getDefaultOrganization()};
          }
        };
    IValueProvider defaultOrganizationURLProvider =
        new IValueProvider() {
          public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
            return new String[] {getSettings().getDefaultOrganizationURL()};
          }
        };

    // info
    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"
                + "'*' wildcard can be used to designate all configurations of"
                + " this module",
            false,
            masterConfsValueProvider));
    IvyTag conf6 = new IvyTag("conf", "configuration in which the artifact should be excluded");
    conf6.addAttribute(
        new IvyTagAttribute(
            "name",
            "the name of the master configuration in which \n"
                + "the enclosing artifact should be excluded",
            true,
            masterConfValueProvider));
    allConf.add(conf6);
    exclude.addChildIvyTag(conf6);
    addTag(exclude);
    dependency.addChildIvyTag(conf3);
    dependency.addChildIvyTag(artifact2);
    dependency.addChildIvyTag(include);
    dependency.addChildIvyTag(exclude);
    dependencies.addChildIvyTag(dependency);
    ivyTag.addChildIvyTag(dependencies);
    addTag(dependency);
    addTag(dependencies);

    // dependencies

    IvyTag conflicts = new IvyTag("conflicts", "conflicts managers definition section");
    IvyTag manager = new IvyTag("manager", "declares a conflict manager for this module");
    manager.addAttribute(
        new IvyTagAttribute(
            "org",
            "the name, or a regexp matching the name of organisation \n"
                + "to which this conflict manager should apply",
            false));
    manager.addAttribute(
        new IvyTagAttribute(
            "module",
            "the name, or a regexp matching the name of module \n"
                + "to which this conflict manager should apply",
            false));
    manager.addAttribute(
        new IvyTagAttribute("name", "the name of the conflict manager to use", false));
    manager.addAttribute(
        new IvyTagAttribute(
            "rev",
            "a comma separated list of revisions this conflict manager should select",
            false));
    manager.addAttribute(
        new IvyTagAttribute(
            "matcher",
            "the matcher to use to match the modules for which \n"
                + "the conflict manager should be used",
            false));
    conflicts.addChildIvyTag(manager);
    ivyTag.addChildIvyTag(conflicts);
    addTag(conflicts);
    addTag(manager);
  }