/**
   * Processes the previously set WADL file and generated code in the specified package and target
   * directory.
   *
   * @throws org.apache.tools.ant.BuildException if processing of the WADL file fails.
   */
  public void execute() throws BuildException {
    if (pkg == null) throw new BuildException(Wadl2JavaMessages.PACKAGE_ATTRIBUTE_REQUIRED());
    if (target == null) throw new BuildException(Wadl2JavaMessages.TARGET_ATTRIBUTE_REQUIRED());
    if (!target.exists())
      throw new BuildException(Wadl2JavaMessages.TARGET_DIRECTORY_MUST_EXIST(target.toString()));
    if (!target.isDirectory())
      throw new BuildException(Wadl2JavaMessages.TARGET_ATTRIBUTE_DIRECTORY(target.toString()));
    if (desc == null) throw new BuildException(Wadl2JavaMessages.DESCRIPTION_REQUIRED());

    List<File> customizations = new ArrayList<File>();
    for (FileSet fs : customizationFileSets) {
      DirectoryScanner ds = fs.getDirectoryScanner(getProject());
      String[] includedFiles = ds.getIncludedFiles();
      for (String filename : includedFiles) {
        File f = new File(ds.getBasedir(), filename);
        customizations.add(f);
      }
    }

    if (desc.getScheme() == null || desc.getScheme().equals("file")) {
      // assume a file if not explicitly told otherwise
      File fileDesc = new File(this.getOwningTarget().getProject().getBaseDir(), desc.getPath());
      if (!fileDesc.exists())
        throw new BuildException(Wadl2JavaMessages.WADL_DESCRIPTION_MUST_EXIST(desc.toString()));
      if (!fileDesc.isFile())
        throw new BuildException(Wadl2JavaMessages.WADL_DESCRIPTION_FILE(desc.toString()));
      desc = fileDesc.toURI();

      // check if description has changed since code was last generated
      long earliestProducedFileStamp = Long.MAX_VALUE;
      for (FileSet fs : producedFileSets) {
        DirectoryScanner ds = fs.getDirectoryScanner(getProject());
        String[] includedFiles = ds.getIncludedFiles();
        for (String filename : includedFiles) {
          File f = new File(ds.getBasedir(), filename);
          if (f.lastModified() < earliestProducedFileStamp)
            earliestProducedFileStamp = f.lastModified();
        }
      }
      long latestConsumedFileStamp = fileDesc.lastModified();
      for (FileSet fs : consumedFileSets) {
        DirectoryScanner ds = fs.getDirectoryScanner(getProject());
        String[] includedFiles = ds.getIncludedFiles();
        for (String filename : includedFiles) {
          File f = new File(ds.getBasedir(), filename);
          if (f.lastModified() > latestConsumedFileStamp)
            latestConsumedFileStamp = f.lastModified();
        }
      }
      for (File f : customizations) {
        if (f.lastModified() > latestConsumedFileStamp) latestConsumedFileStamp = f.lastModified();
      }

      if (earliestProducedFileStamp < Long.MAX_VALUE
          && latestConsumedFileStamp < earliestProducedFileStamp) {
        log(Wadl2JavaMessages.SKIPPING_COMPILATION());
        return;
      }
    }

    // pre-requisites satisfied, compile the description
    try {
      Wadl2Java wadlProcessor = new Wadl2Java(target, pkg, autoPackage, customizations);
      wadlProcessor.process(desc);
    } catch (Exception ex) {
      ex.printStackTrace();
      throw new BuildException(Wadl2JavaMessages.PROCESSING_FAILED(), ex);
    }
  }