You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by jk...@apache.org on 2004/12/11 22:16:48 UTC

cvs commit: ant/src/main/org/apache/tools/ant/taskdefs Replace.java

jkf         2004/12/11 13:16:48

  Modified:    src/main/org/apache/tools/ant/taskdefs Replace.java
  Log:
  PR: 13690
  Patch that reduces the memory need of the Replace task,
  by not creating duplicates of a lot of strings.
  
  Revision  Changes    Path
  1.55      +53 -77    ant/src/main/org/apache/tools/ant/taskdefs/Replace.java
  
  Index: Replace.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Replace.java,v
  retrieving revision 1.54
  retrieving revision 1.55
  diff -u -r1.54 -r1.55
  --- Replace.java	12 Nov 2004 15:14:59 -0000	1.54
  +++ Replace.java	11 Dec 2004 21:16:47 -0000	1.55
  @@ -92,7 +92,7 @@
            * @return the text
            */
           public String getText() {
  -            return buf.substring(0);
  +            return buf.toString();
           }
       }
   
  @@ -162,7 +162,7 @@
                   return Replace.this.value.getText();
               } else {
                   //Default is empty string
  -                return new String("");
  +                return "";
               }
           }
   
  @@ -228,6 +228,21 @@
           Properties savedProperties =
               properties == null ? null : (Properties) properties.clone();
   
  +        if (token != null) {
  +            // line separators in values and tokens are "\n"
  +            // in order to compare with the file contents, replace them
  +            // as needed
  +            StringBuffer val = new StringBuffer(value.getText());
  +            stringReplace(val, "\r\n", "\n", false);
  +            stringReplace(val, "\n", StringUtils.LINE_SEP, false);
  +            StringBuffer tok = new StringBuffer(token.getText());
  +            stringReplace(tok, "\r\n", "\n", false);
  +            stringReplace(tok, "\n", StringUtils.LINE_SEP, false);
  +            Replacefilter firstFilter = createPrimaryfilter();
  +            firstFilter.setToken(tok.toString());
  +            firstFilter.setValue(val.toString());
  +        }
  +
           try {
               if (replaceFilterFile != null) {
                   Properties props = getProperties(replaceFilterFile);
  @@ -367,67 +382,43 @@
                                        + " doesn't exist", getLocation());
           }
   
  -        File temp = fileUtils.createTempFile("rep", ".tmp",
  -                                             fileUtils.getParentFile(src));
  -        temp.deleteOnExit();
  -
  +        File temp = null;
           Reader reader = null;
           Writer writer = null;
           try {
               reader = encoding == null ? new FileReader(src)
                   : new InputStreamReader(new FileInputStream(src), encoding);
  -            writer = encoding == null ? new FileWriter(temp)
  -                : new OutputStreamWriter(new FileOutputStream(temp), encoding);
   
               BufferedReader br = new BufferedReader(reader);
  -            BufferedWriter bw = new BufferedWriter(writer);
   
               String buf = FileUtils.readFully(br);
  +            br.close();
  +            reader = null;
  +
               if (buf == null) {
                   buf = "";
               }
   
  -            //Preserve original string (buf) so we can compare the result
  -            String newString = new String(buf);
  +            StringBuffer buffer = new StringBuffer(buf);
  +            buf = null;
   
  -            if (token != null) {
  -                // line separators in values and tokens are "\n"
  -                // in order to compare with the file contents, replace them
  -                // as needed
  -                String val = stringReplace(value.getText(), "\r\n",
  -                                           "\n", false);
  -                val = stringReplace(val, "\n",
  -                                           StringUtils.LINE_SEP, false);
  -                String tok = stringReplace(token.getText(), "\r\n",
  -                                            "\n", false);
  -                tok = stringReplace(tok, "\n",
  -                                           StringUtils.LINE_SEP, false);
  -
  -                // for each found token, replace with value
  -                log("Replacing in " + src.getPath() + ": " + token.getText()
  -                    + " --> " + value.getText(), Project.MSG_VERBOSE);
  -                newString = stringReplace(newString, tok, val, true);
  -            }
  +            int repCountStart = replaceCount;
   
  -            if (replacefilters.size() > 0) {
  -                newString = processReplacefilters(newString, src.getPath());
  -            }
  +            processReplacefilters(buffer, src.getPath());
   
  -            boolean changes = !newString.equals(buf);
  +            boolean changes = (replaceCount != repCountStart);
               if (changes) {
  -                bw.write(newString, 0, newString.length());
  +                String out = buffer.toString();
  +                temp = fileUtils.createTempFile("rep", ".tmp",
  +                        src.getParentFile());
  +                temp.deleteOnExit();
  +                writer = encoding == null ? new FileWriter(temp)
  +                        : new OutputStreamWriter(new FileOutputStream(temp), encoding);
  +                BufferedWriter bw = new BufferedWriter(writer);
  +                bw.write(out, 0, out.length());
                   bw.flush();
  -            }
  -
  -            // cleanup
  -            bw.close();
  -            writer = null;
  -            br.close();
  -            reader = null;
  -
  -            // If there were changes, move the new one to the old one;
  -            // otherwise, delete the new one
  -            if (changes) {
  +                bw.close();
  +                writer = null;
                   ++fileCount;
                   fileUtils.rename(temp, src);
                   temp = null;
  @@ -460,24 +451,19 @@
   
       /**
        * apply all replace filters to a buffer
  -     * @param buffer string to filter
  +     * @param buffer stringbuffer to filter
        * @param filename filename for logging purposes
  -     * @return filtered string
        */
  -    private String processReplacefilters(String buffer, String filename) {
  -        String newString = new String(buffer);
  -
  +    private void processReplacefilters(StringBuffer buffer, String filename) {
           for (int i = 0; i < replacefilters.size(); i++) {
               Replacefilter filter = (Replacefilter) replacefilters.elementAt(i);
   
               //for each found token, replace with value
               log("Replacing in " + filename + ": " + filter.getToken()
                   + " --> " + filter.getReplaceValue(), Project.MSG_VERBOSE);
  -            newString = stringReplace(newString, filter.getToken(),
  +            stringReplace(buffer, filter.getToken(),
                                         filter.getReplaceValue(), true);
           }
  -
  -        return newString;
       }
   
   
  @@ -593,38 +579,28 @@
       }
   
       /**
  -     * Replace occurrences of str1 in string str with str2
  +     * Adds the token and value as first &lt;replacefilter&gt; element.
  +     * The token and value are always processed first.
  +     * @return a nested ReplaceFilter object to be configured
  +     */
  +    private Replacefilter createPrimaryfilter() {
  +        Replacefilter filter = new Replacefilter();
  +        replacefilters.insertElementAt(filter, 0);
  +        return filter;
  +    }
  +    /**
  +     * Replace occurrences of str1 in stringbuffer str with str2
        */
  -    private String stringReplace(String str, String str1, String str2,
  +    private void stringReplace(StringBuffer str, String str1, String str2,
                                    boolean countReplaces) {
  -        StringBuffer ret = new StringBuffer();
  -        int start = 0;
           int found = str.indexOf(str1);
           while (found >= 0) {
  -            // write everything up to the found str1
  -            if (found > start) {
  -                ret.append(str.substring(start, found));
  -            }
  -
  -            // write the replacement str2
  -            if (str2 != null) {
  -                ret.append(str2);
  -            }
  -
  -            // search again
  -            start = found + str1.length();
  -            found = str.indexOf(str1, start);
  +            str.replace(found, found + str1.length(), str2);
  +            found = str.indexOf(str1, found + str2.length());
               if (countReplaces) {
                   ++replaceCount;
               }
           }
  -
  -        // write the remaining characters
  -        if (str.length() > start) {
  -            ret.append(str.substring(start, str.length()));
  -        }
  -
  -        return ret.toString();
       }
   
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org