diff options
author | Michael Valenta | 2007-07-04 18:18:47 +0000 |
---|---|---|
committer | Michael Valenta | 2007-07-04 18:18:47 +0000 |
commit | a1ace0265c5a4efcab068262b6505aec51d4e27f (patch) | |
tree | a604f2a50b30798e5276ca6b8eddb8d4fce56fa0 | |
parent | f98d89a8144e4b1e241665c5c00941a371091d8b (diff) | |
download | eclipse.platform.team-a1ace0265c5a4efcab068262b6505aec51d4e27f.tar.gz eclipse.platform.team-a1ace0265c5a4efcab068262b6505aec51d4e27f.tar.xz eclipse.platform.team-a1ace0265c5a4efcab068262b6505aec51d4e27f.zip |
Bug 194396 Reduce retained memory usage of LogEntry objects
-rw-r--r-- | bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java index a105eade7..28243167b 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java @@ -50,6 +50,9 @@ public class LogListener extends CommandOutputListener { //Tag used for accumulating all of a branch's revision info public final static String BRANCH_REVISION = "branchRevision"; //$NON-NLS-1$ + private static final CVSTag[] NO_TAGS = new CVSTag[0]; + private static final String[] NO_VERSIONS = new String[0]; + // Instance variables for accumulating Log information private RemoteFile currentFile; private int state = BEGIN; @@ -123,7 +126,7 @@ public class LogListener extends CommandOutputListener { } else if (line.startsWith("symbolic names:")) { //$NON-NLS-1$ state = SYMBOLIC_NAMES; } else if (line.startsWith("revision ")) { //$NON-NLS-1$ - revision = internString(line.substring(9)); + revision = internAndCopyString(line.substring(9)); state = REVISION; } else if (line.startsWith("total revisions:")){ //$NON-NLS-1$ //if there are no current revision selected and this is a branch then we are in the @@ -145,8 +148,8 @@ public class LogListener extends CommandOutputListener { state = BEGIN; } else { int firstColon = line.indexOf(':'); - String tagName = new String(line.substring(1, firstColon)); - String tagRevision = internString(line.substring(firstColon + 2)); + String tagName = internAndCopyString(line.substring(1, firstColon)); + String tagRevision = internAndCopyString(line.substring(firstColon + 2)); versions.add(new VersionInfo(tagRevision, tagName)); } break; @@ -158,10 +161,10 @@ public class LogListener extends CommandOutputListener { // get the author name int endOfAuthorIndex = line.indexOf(';', endOfDateIndex + 1); - author = internString(line.substring(endOfDateIndex + 11, endOfAuthorIndex)); + author = internAndCopyString(line.substring(endOfDateIndex + 11, endOfAuthorIndex)); // get the file state (because this revision might be "dead") - fileState = internString(line.substring(endOfAuthorIndex + 10, line.indexOf(';', endOfAuthorIndex + 1))); + fileState = internAndCopyString(line.substring(endOfAuthorIndex + 10, line.indexOf(';', endOfAuthorIndex + 1))); comment = new StringBuffer(); state = COMMENT; break; @@ -183,9 +186,9 @@ public class LogListener extends CommandOutputListener { } if (state == DONE) { // we are only interested in tag names for this revision, remove all others. - List thisRevisionTags = new ArrayList(3); + List thisRevisionTags = versions.isEmpty() ? Collections.EMPTY_LIST : new ArrayList(3); //a parallel lists for revision tags (used only for branches with no commits on them) - List revisionVersions = new ArrayList(3); + List revisionVersions = versions.isEmpty() ? Collections.EMPTY_LIST : new ArrayList(3); for (Iterator i = versions.iterator(); i.hasNext();) { VersionInfo version = (VersionInfo) i.next(); String tagName = version.getTagName(); @@ -204,7 +207,7 @@ public class LogListener extends CommandOutputListener { if (currentFile != null) { LogEntry entry = new LogEntry(currentFile, revision, author, creationDate, - comment.toString(), fileState, (CVSTag[]) thisRevisionTags.toArray(new CVSTag[thisRevisionTags.size()]), (String[]) revisionVersions.toArray(new String[revisionVersions.size()])); + internString(comment.toString()), fileState, !thisRevisionTags.isEmpty() ? (CVSTag[]) thisRevisionTags.toArray(new CVSTag[thisRevisionTags.size()]) : NO_TAGS, !revisionVersions.isEmpty() ? (String[]) revisionVersions.toArray(new String[revisionVersions.size()]) : NO_VERSIONS); addEntry(entry); } state = BEGIN; @@ -243,7 +246,7 @@ public class LogListener extends CommandOutputListener { } } - private String internString(String string) { + private String internAndCopyString(String string) { String internedString = (String) internedStrings.get(string); if (internedString == null) { internedString = new String(string); @@ -252,6 +255,15 @@ public class LogListener extends CommandOutputListener { return internedString; } + private String internString(String string) { + String internedString = (String) internedStrings.get(string); + if (internedString == null) { + internedString = string; + internedStrings.put(internedString, internedString); + } + return internedString; + } + private static class VersionInfo { private final String version; private final boolean isBranch; |