Пример #1
0
 /**
  * Return the result of the filters on the sourcefilename.
  *
  * @param sourceFileName the filename to map
  * @return a one-element array of converted filenames, or null if the filterchain returns an empty
  *     string.
  */
 public String[] mapFileName(String sourceFileName) {
   try {
     Reader stringReader = new StringReader(sourceFileName);
     ChainReaderHelper helper = new ChainReaderHelper();
     helper.setBufferSize(8192);
     helper.setPrimaryReader(stringReader);
     helper.setProject(getProject());
     Vector filterChains = new Vector();
     filterChains.add(this);
     helper.setFilterChains(filterChains);
     String result = FileUtils.readFully(helper.getAssembledReader());
     if (result.length() == 0) {
       return null;
     } else {
       return new String[] {result};
     }
   } catch (BuildException ex) {
     throw ex;
   } catch (Exception ex) {
     throw new BuildException(ex);
   }
 }
Пример #2
0
  /**
   * Convenience method to copy content from one Resource to another specifying whether token
   * filtering must be used, whether filter chains must be used, whether newer destination files may
   * be overwritten and whether the last modified time of <code>dest</code> file should be made
   * equal to the last modified time of <code>source</code>.
   *
   * @param source the Resource to copy from. Must not be <code>null</code>.
   * @param dest the Resource to copy to. Must not be <code>null</code>.
   * @param filters the collection of filters to apply to this copy.
   * @param filterChains filterChains to apply during the copy.
   * @param overwrite Whether or not the destination Resource should be overwritten if it already
   *     exists.
   * @param preserveLastModified Whether or not the last modified time of the destination Resource
   *     should be set to that of the source.
   * @param inputEncoding the encoding used to read the files.
   * @param outputEncoding the encoding used to write the files.
   * @param project the project instance.
   * @throws IOException if the copying fails.
   * @since Ant 1.7
   */
  public static void copyResource(
      Resource source,
      Resource dest,
      FilterSetCollection filters,
      Vector filterChains,
      boolean overwrite,
      boolean preserveLastModified,
      String inputEncoding,
      String outputEncoding,
      Project project)
      throws IOException {
    if (!overwrite) {
      long slm = source.getLastModified();
      if (dest.isExists() && slm != 0 && dest.getLastModified() > slm) {
        return;
      }
    }
    final boolean filterSetsAvailable = (filters != null && filters.hasFilters());
    final boolean filterChainsAvailable = (filterChains != null && filterChains.size() > 0);
    if (filterSetsAvailable) {
      BufferedReader in = null;
      BufferedWriter out = null;
      try {
        InputStreamReader isr = null;
        if (inputEncoding == null) {
          isr = new InputStreamReader(source.getInputStream());
        } else {
          isr = new InputStreamReader(source.getInputStream(), inputEncoding);
        }
        in = new BufferedReader(isr);
        OutputStreamWriter osw = null;
        if (outputEncoding == null) {
          osw = new OutputStreamWriter(dest.getOutputStream());
        } else {
          osw = new OutputStreamWriter(dest.getOutputStream(), outputEncoding);
        }
        out = new BufferedWriter(osw);
        if (filterChainsAvailable) {
          ChainReaderHelper crh = new ChainReaderHelper();
          crh.setBufferSize(FileUtils.BUF_SIZE);
          crh.setPrimaryReader(in);
          crh.setFilterChains(filterChains);
          crh.setProject(project);
          Reader rdr = crh.getAssembledReader();
          in = new BufferedReader(rdr);
        }
        LineTokenizer lineTokenizer = new LineTokenizer();
        lineTokenizer.setIncludeDelims(true);
        String newline = null;
        String line = lineTokenizer.getToken(in);
        while (line != null) {
          if (line.length() == 0) {
            // this should not happen, because the lines are
            // returned with the end of line delimiter
            out.newLine();
          } else {
            newline = filters.replaceTokens(line);
            out.write(newline);
          }
          line = lineTokenizer.getToken(in);
        }
      } finally {
        FileUtils.close(out);
        FileUtils.close(in);
      }
    } else if (filterChainsAvailable
        || (inputEncoding != null && !inputEncoding.equals(outputEncoding))
        || (inputEncoding == null && outputEncoding != null)) {
      BufferedReader in = null;
      BufferedWriter out = null;
      try {
        InputStreamReader isr = null;
        if (inputEncoding == null) {
          isr = new InputStreamReader(source.getInputStream());
        } else {
          isr = new InputStreamReader(source.getInputStream(), inputEncoding);
        }
        in = new BufferedReader(isr);
        OutputStreamWriter osw = null;
        if (outputEncoding == null) {
          osw = new OutputStreamWriter(dest.getOutputStream());
        } else {
          osw = new OutputStreamWriter(dest.getOutputStream(), outputEncoding);
        }
        out = new BufferedWriter(osw);
        if (filterChainsAvailable) {
          ChainReaderHelper crh = new ChainReaderHelper();
          crh.setBufferSize(FileUtils.BUF_SIZE);
          crh.setPrimaryReader(in);
          crh.setFilterChains(filterChains);
          crh.setProject(project);
          Reader rdr = crh.getAssembledReader();
          in = new BufferedReader(rdr);
        }
        char[] buffer = new char[FileUtils.BUF_SIZE];
        while (true) {
          int nRead = in.read(buffer, 0, buffer.length);
          if (nRead == -1) {
            break;
          }
          out.write(buffer, 0, nRead);
        }
      } finally {
        FileUtils.close(out);
        FileUtils.close(in);
      }
    } else {
      InputStream in = null;
      OutputStream out = null;
      try {
        in = source.getInputStream();
        out = dest.getOutputStream();

        byte[] buffer = new byte[FileUtils.BUF_SIZE];
        int count = 0;
        do {
          out.write(buffer, 0, count);
          count = in.read(buffer, 0, buffer.length);
        } while (count != -1);
      } finally {
        FileUtils.close(out);
        FileUtils.close(in);
      }
    }
    if (preserveLastModified && dest instanceof Touchable) {
      setLastModified((Touchable) dest, source.getLastModified());
    }
  }