aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Michajlo Matijkiw <michajlo@google.com>2015-08-17 14:19:44 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-08-17 14:31:57 +0000
commit3895dc0fea3572e72195f7fe8298347a34d24f89 (patch)
tree49e257b1d22c0caa3250a24b0694c0f59ae53507 /src
parent5a4596df08ad3db26257eab72f8b4162e75eaa6c (diff)
Memoize RepositoryNames
The unique names are generally limited. -- MOS_MIGRATED_REVID=100821922
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/PackageIdentifier.java35
1 files changed, 28 insertions, 7 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageIdentifier.java b/src/main/java/com/google/devtools/build/lib/packages/PackageIdentifier.java
index e6883506d2..5a37107a29 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageIdentifier.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageIdentifier.java
@@ -15,6 +15,10 @@
package com.google.devtools.build.lib.packages;
import com.google.common.base.Preconditions;
+import com.google.common.base.Throwables;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
import com.google.common.collect.ComparisonChain;
import com.google.devtools.build.lib.cmdline.LabelValidator;
import com.google.devtools.build.lib.syntax.Label.SyntaxException;
@@ -29,6 +33,7 @@ import java.io.ObjectOutputStream;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.Objects;
+import java.util.concurrent.ExecutionException;
import javax.annotation.concurrent.Immutable;
@@ -46,22 +51,38 @@ public final class PackageIdentifier implements Comparable<PackageIdentifier>, S
* A human-readable name for the repository.
*/
public static final class RepositoryName {
- private final String name;
+ private static final LoadingCache<String, RepositoryName> repositoryNameCache =
+ CacheBuilder.newBuilder()
+ .weakValues()
+ .build(
+ new CacheLoader<String, RepositoryName> () {
+ @Override
+ public RepositoryName load(String name) throws SyntaxException {
+ String errorMessage = validate(name);
+ if (errorMessage != null) {
+ errorMessage = "invalid repository name '"
+ + StringUtilities.sanitizeControlChars(name) + "': " + errorMessage;
+ throw new SyntaxException(errorMessage);
+ }
+ return new RepositoryName(StringCanonicalizer.intern(name));
+ }
+ });
/**
* Makes sure that name is a valid repository name and creates a new RepositoryName using it.
* @throws SyntaxException if the name is invalid.
*/
public static RepositoryName create(String name) throws SyntaxException {
- String errorMessage = validate(name);
- if (errorMessage != null) {
- errorMessage = "invalid repository name '"
- + StringUtilities.sanitizeControlChars(name) + "': " + errorMessage;
- throw new SyntaxException(errorMessage);
+ try {
+ return repositoryNameCache.get(name);
+ } catch (ExecutionException e) {
+ Throwables.propagateIfInstanceOf(e.getCause(), SyntaxException.class);
+ throw new IllegalStateException("Failed to create RepositoryName from " + name, e);
}
- return new RepositoryName(StringCanonicalizer.intern(name));
}
+ private final String name;
+
private RepositoryName(String name) {
this.name = name;
}