From 1aca5cf03666b5bd7b1d17eb16e727338681d525 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Fri, 4 Apr 2003 13:51:12 +0000 Subject: [PATCH] Avoid reusing StringBuffers to work around JDK 1.4.1 memory leak. I'm sure that my changes in most cases are of the paranoid type, ResourceUtils and FixCRLF look as if they really had a chance of running into trouble. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274397 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/tools/ant/RuntimeConfigurable.java | 2 +- .../apache/tools/ant/listener/MailLogger.java | 4 ++-- .../tools/ant/taskdefs/AntStructure.java | 6 +++--- .../org/apache/tools/ant/taskdefs/Concat.java | 4 ++-- .../org/apache/tools/ant/taskdefs/FixCRLF.java | 18 +++++++++--------- .../org/apache/tools/ant/taskdefs/Javadoc.java | 2 +- .../org/apache/tools/ant/taskdefs/Replace.java | 4 ++-- .../org/apache/tools/ant/taskdefs/SQLExec.java | 4 ++-- .../tools/ant/taskdefs/email/Message.java | 4 ++-- .../ant/taskdefs/optional/ReplaceRegExp.java | 6 +++--- .../ant/taskdefs/optional/junit/JUnitTask.java | 2 +- .../ant/taskdefs/optional/perforce/P4Add.java | 2 +- .../taskdefs/optional/perforce/P4Fstat.java | 2 +- .../optional/sitraka/bytecode/Utils.java | 6 +++--- .../apache/tools/ant/types/Commandline.java | 4 ++-- src/main/org/apache/tools/ant/types/Path.java | 2 +- .../tools/ant/util/DOMElementWriter.java | 5 ++--- .../tools/ant/util/RegexpPatternMapper.java | 4 ++-- .../apache/tools/ant/util/ResourceUtils.java | 3 +-- 19 files changed, 41 insertions(+), 43 deletions(-) diff --git a/src/main/org/apache/tools/ant/RuntimeConfigurable.java b/src/main/org/apache/tools/ant/RuntimeConfigurable.java index 9e63ddc97..dadc95373 100644 --- a/src/main/org/apache/tools/ant/RuntimeConfigurable.java +++ b/src/main/org/apache/tools/ant/RuntimeConfigurable.java @@ -324,7 +324,7 @@ public class RuntimeConfigurable implements Serializable { id = (String) attributeMap.get("id"); if (characters.length() != 0) { - ProjectHelper.addText(p, wrappedObject, characters.toString()); + ProjectHelper.addText(p, wrappedObject, characters.substring(0)); } Enumeration enum = children.elements(); diff --git a/src/main/org/apache/tools/ant/listener/MailLogger.java b/src/main/org/apache/tools/ant/listener/MailLogger.java index 9ffb1603b..23b4f8a5c 100644 --- a/src/main/org/apache/tools/ant/listener/MailLogger.java +++ b/src/main/org/apache/tools/ant/listener/MailLogger.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2002-2002 The Apache Software Foundation. All rights + * Copyright (c) 2002-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -158,7 +158,7 @@ public class MailLogger extends DefaultLogger { String subject = getValue(properties, prefix + ".subject", (success) ? "Build Success" : "Build Failure"); - sendMail(mailhost, port, from, toList, subject, buffer.toString()); + sendMail(mailhost, port, from, toList, subject, buffer.substring(0)); } catch (Exception e) { System.out.println("MailLogger failed to send e-mail!"); e.printStackTrace(System.err); diff --git a/src/main/org/apache/tools/ant/taskdefs/AntStructure.java b/src/main/org/apache/tools/ant/taskdefs/AntStructure.java index 1fa1740c7..ce38f9ce4 100644 --- a/src/main/org/apache/tools/ant/taskdefs/AntStructure.java +++ b/src/main/org/apache/tools/ant/taskdefs/AntStructure.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights + * Copyright (c) 2000-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -294,8 +294,8 @@ public class AntStructure extends Task { sb.append(">"); out.println(sb); - sb.setLength(0); - sb.append("= 0) { linebuf.append(line.substring(place, nextTab)); // copy to the TAB col += nextTab - place; @@ -731,7 +731,7 @@ public class FixCRLF extends MatchingTask { } // end of while linebuf.append(line.substring(place, line.length())); // if converting to spaces, all finished - String linestring = new String(linebuf.toString()); + String linestring = new String(linebuf.substring(0)); if (tabs == REMOVE) { try { outWriter.write(linestring); @@ -740,7 +740,7 @@ public class FixCRLF extends MatchingTask { } // end of try-catch } else { // tabs == ADD int tabCol; - linebuf2.setLength(0); + linebuf2 = new StringBuffer(); place = 0; col = bufline.getColumn(); int placediff = col - 0; @@ -782,7 +782,7 @@ public class FixCRLF extends MatchingTask { linebuf2.append(linestring.substring(place, linestring.length())); try { - outWriter.write(linebuf2.toString()); + outWriter.write(linebuf2.substring(0)); } catch (IOException e) { throw new BuildException(e); } // end of try-catch @@ -826,8 +826,8 @@ public class FixCRLF extends MatchingTask { int ch = -1; int eolcount = 0; - eolStr.setLength(0); - line.setLength(0); + eolStr = new StringBuffer(); + line = new StringBuffer(); try { ch = reader.read(); @@ -907,7 +907,7 @@ public class FixCRLF extends MatchingTask { } public String getEofStr() { - return eofStr.toString(); + return eofStr.substring(0); } public int getState() { @@ -928,7 +928,7 @@ public class FixCRLF extends MatchingTask { throw new NoSuchElementException("OneLiner"); } BufferLine tmpLine = - new BufferLine(line.toString(), eolStr.toString()); + new BufferLine(line.toString(), eolStr.substring(0)); nextLine(); return tmpLine; } diff --git a/src/main/org/apache/tools/ant/taskdefs/Javadoc.java b/src/main/org/apache/tools/ant/taskdefs/Javadoc.java index 8b79da7ea..afd037752 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Javadoc.java +++ b/src/main/org/apache/tools/ant/taskdefs/Javadoc.java @@ -362,7 +362,7 @@ public class Javadoc extends Task { * @return the current text. */ public String getText() { - return text.toString(); + return text.substring(0); } } diff --git a/src/main/org/apache/tools/ant/taskdefs/Replace.java b/src/main/org/apache/tools/ant/taskdefs/Replace.java index c8284dffd..06e55ac64 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Replace.java +++ b/src/main/org/apache/tools/ant/taskdefs/Replace.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights + * Copyright (c) 2000-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -124,7 +124,7 @@ public class Replace extends MatchingTask { } public String getText() { - return buf.toString(); + return buf.substring(0); } } diff --git a/src/main/org/apache/tools/ant/taskdefs/SQLExec.java b/src/main/org/apache/tools/ant/taskdefs/SQLExec.java index d86753bf3..0bbc284b2 100644 --- a/src/main/org/apache/tools/ant/taskdefs/SQLExec.java +++ b/src/main/org/apache/tools/ant/taskdefs/SQLExec.java @@ -555,7 +555,7 @@ public class SQLExec extends JDBCTask { } line.append(md.getColumnName(columnCount)); out.println(line); - line.setLength(0); + line = new StringBuffer(); } while (rs.next()) { boolean first = true; @@ -573,7 +573,7 @@ public class SQLExec extends JDBCTask { line.append(columnValue); } out.println(line); - line.setLength(0); + line = new StringBuffer(); } } } diff --git a/src/main/org/apache/tools/ant/taskdefs/email/Message.java b/src/main/org/apache/tools/ant/taskdefs/email/Message.java index 14313736e..7be15e1ba 100644 --- a/src/main/org/apache/tools/ant/taskdefs/email/Message.java +++ b/src/main/org/apache/tools/ant/taskdefs/email/Message.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2002 The Apache Software Foundation. All rights + * Copyright (c) 2002-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -162,7 +162,7 @@ public class Message extends ProjectComponent { freader.close(); } } else { - out.println(getProject().replaceProperties(buffer.toString())); + out.println(getProject().replaceProperties(buffer.substring(0))); } } diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java b/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java index e7d9f20a4..0bf3c4842 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java @@ -365,7 +365,7 @@ public class ReplaceRegExp extends Task { pw.print(res); pw.print('\r'); - linebuf.setLength(0); + linebuf = new StringBuffer(); // hasCR is still true (for the second one) } else { // first CR in this line @@ -388,7 +388,7 @@ public class ReplaceRegExp extends Task { } pw.print('\n'); - linebuf.setLength(0); + linebuf = new StringBuffer(); } else { // any other char if ((hasCR) || (c < 0)) { // Mac-style linebreak or EOF (or both) @@ -405,7 +405,7 @@ public class ReplaceRegExp extends Task { hasCR = false; } - linebuf.setLength(0); + linebuf = new StringBuffer(); } if (c >= 0) { diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java index 67446046d..91859e86a 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java @@ -640,7 +640,7 @@ public class JUnitTask extends Task { formatterArg.append(outFile); } cmd.createArgument().setValue(formatterArg.toString()); - formatterArg.setLength(0); + formatterArg = new StringBuffer(); } // Create a temporary file to pass the Ant properties to the diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Add.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Add.java index 887e8b21c..1a5d46f3b 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Add.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Add.java @@ -145,7 +145,7 @@ public class P4Add extends P4Base { filelist.append(" ").append('"').append(f.getAbsolutePath()).append('"'); if (filelist.length() > cmdLength) { execP4Add(filelist); - filelist.setLength(0); + filelist = new StringBuffer(); } } if (filelist.length() > 0) { diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Fstat.java b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Fstat.java index 9ac27284b..c3b6971b1 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Fstat.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/perforce/P4Fstat.java @@ -165,7 +165,7 @@ public class P4Fstat extends P4Base { if (filelist.length() > cmdLength) { execP4Fstat(filelist); - filelist.setLength(0); + filelist = new StringBuffer(); } } if (filelist.length() > 0) { diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/bytecode/Utils.java b/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/bytecode/Utils.java index 9550cf6bb..782cdb82a 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/bytecode/Utils.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/bytecode/Utils.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2001-2002 The Apache Software Foundation. All rights + * Copyright (c) 2001-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -122,8 +122,8 @@ public class Utils { StringBuffer param = new StringBuffer(); i++; while ((i = descriptor2java(descriptor, i, param)) < descriptor.length()) { - params.add(param.toString()); - param.setLength(0); // reset + params.add(param.substring(0)); + param = new StringBuffer(); if (descriptor.charAt(i) == ')') { i++; break; diff --git a/src/main/org/apache/tools/ant/types/Commandline.java b/src/main/org/apache/tools/ant/types/Commandline.java index 32c1a80e7..13eb19db6 100644 --- a/src/main/org/apache/tools/ant/types/Commandline.java +++ b/src/main/org/apache/tools/ant/types/Commandline.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights + * Copyright (c) 2000-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -399,7 +399,7 @@ public class Commandline implements Cloneable { } else if (" ".equals(nextTok)) { if (lastTokenHasBeenQuoted || current.length() != 0) { v.addElement(current.toString()); - current.setLength(0); + current = new StringBuffer(); } } else { current.append(nextTok); diff --git a/src/main/org/apache/tools/ant/types/Path.java b/src/main/org/apache/tools/ant/types/Path.java index ab99c95cc..68953aa46 100644 --- a/src/main/org/apache/tools/ant/types/Path.java +++ b/src/main/org/apache/tools/ant/types/Path.java @@ -397,7 +397,6 @@ public class Path extends DataType implements Cloneable { PathTokenizer tok = new PathTokenizer(source); StringBuffer element = new StringBuffer(); while (tok.hasMoreTokens()) { - element.setLength(0); String pathElement = tok.nextToken(); try { element.append(resolveFile(project, pathElement)); @@ -410,6 +409,7 @@ public class Path extends DataType implements Cloneable { translateFileSep(element, i); } result.addElement(element.toString()); + element = new StringBuffer(); } String[] res = new String[result.size()]; result.copyInto(res); diff --git a/src/main/org/apache/tools/ant/util/DOMElementWriter.java b/src/main/org/apache/tools/ant/util/DOMElementWriter.java index d0da06df7..45d4fd5a4 100644 --- a/src/main/org/apache/tools/ant/util/DOMElementWriter.java +++ b/src/main/org/apache/tools/ant/util/DOMElementWriter.java @@ -80,7 +80,6 @@ import org.w3c.dom.Text; public class DOMElementWriter { private static String lSep = System.getProperty("line.separator"); - private StringBuffer sb = new StringBuffer(); /** * Don't try to be too smart but at least recognize the predefined @@ -204,7 +203,7 @@ public class DOMElementWriter { * drop characters that are illegal in XML documents. */ public String encode(String value) { - sb.setLength(0); + StringBuffer sb = new StringBuffer(); int len = value.length(); for (int i = 0; i < len; i++) { char c = value.charAt(i); @@ -254,7 +253,7 @@ public class DOMElementWriter { */ public String encodedata(final String value) { - sb.setLength(0); + StringBuffer sb = new StringBuffer(); for (int i = 0; i < value.length(); ++i) { char c = value.charAt(i); if (isLegalCharacter(c)) { diff --git a/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java b/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java index f7b3e690e..366cacf84 100644 --- a/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java +++ b/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2000,2002 The Apache Software Foundation. All rights + * Copyright (c) 2000,2002-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -133,7 +133,7 @@ public class RegexpPatternMapper implements FileNameMapper { result.append(to[i]); } } - return result.toString(); + return result.substring(0); } } diff --git a/src/main/org/apache/tools/ant/util/ResourceUtils.java b/src/main/org/apache/tools/ant/util/ResourceUtils.java index 4c7b57cb1..cd19c2ac9 100644 --- a/src/main/org/apache/tools/ant/util/ResourceUtils.java +++ b/src/main/org/apache/tools/ant/util/ResourceUtils.java @@ -89,7 +89,6 @@ public class ResourceUtils { FileNameMapper mapper, ResourceFactory targets) { long now = (new java.util.Date()).getTime(); - StringBuffer targetList = new StringBuffer(); /* If we're on Windows, we have to munge the time up to 2 secs to @@ -116,7 +115,7 @@ public class ResourceUtils { .replace('/', File.separatorChar)); if (targetnames != null) { boolean added = false; - targetList.setLength(0); + StringBuffer targetList = new StringBuffer(); for (int ctarget = 0; !added && ctarget < targetnames.length; ctarget++) { Resource atarget =