Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Valenta2007-07-04 18:18:47 +0000
committerMichael Valenta2007-07-04 18:18:47 +0000
commita1ace0265c5a4efcab068262b6505aec51d4e27f (patch)
treea604f2a50b30798e5276ca6b8eddb8d4fce56fa0
parentf98d89a8144e4b1e241665c5c00941a371091d8b (diff)
downloadeclipse.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.java30
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;

Back to the top