aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java58
1 files changed, 31 insertions, 27 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
index e4bc250333..d5a612efa5 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
@@ -34,7 +34,6 @@ import com.google.devtools.build.lib.syntax.GlobCriteria;
import com.google.devtools.build.lib.syntax.GlobList;
import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.build.lib.syntax.Label.SyntaxException;
-import com.google.devtools.build.lib.vfs.FileSystem;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -55,11 +54,23 @@ public class PackageDeserializer {
private static final Logger LOG = Logger.getLogger(PackageDeserializer.class.getName());
- // Workaround for Java serialization not allowing to pass in a context manually.
+ /**
+ * Provides the deserializer with tools it needs to build a package from its serialized form.
+ */
+ public interface PackageDeserializationEnvironment {
+
+ /** Converts the serialized package's path string into a {@link Path} object. */
+ Path getPath(String buildFilePath);
+
+ /** Returns a {@link RuleClass} object for the serialized rule. */
+ RuleClass getRuleClass(Build.Rule rulePb, Location ruleLocation);
+ }
+
+ // Workaround for Java serialization making it tough to pass in a deserialization environment
+ // manually.
// volatile is needed to ensure that the objects are published safely.
- // TODO(bazel-team): Subclass ObjectOutputStream to pass through environment variables.
- public static volatile RuleClassProvider defaultRuleClassProvider;
- public static volatile FileSystem defaultDeserializerFileSystem;
+ // TODO(bazel-team): Subclass ObjectOutputStream to pass this through instead.
+ public static volatile PackageDeserializationEnvironment defaultPackageDeserializationEnvironment;
private class Context {
private final Package.Builder packageBuilder;
@@ -120,15 +131,9 @@ public class PackageDeserializer {
}
}
- void deserializeRule(Build.Rule rulePb)
- throws PackageDeserializationException {
- String ruleClassName = rulePb.getRuleClass();
- RuleClass ruleClass = ruleClassProvider.getRuleClassMap().get(ruleClassName);
- if (ruleClass == null) {
- throw new PackageDeserializationException(
- String.format("Invalid rule class '%s'", ruleClassName));
- }
-
+ void deserializeRule(Build.Rule rulePb) throws PackageDeserializationException {
+ Location ruleLocation = deserializeLocation(rulePb.getParseableLocation());
+ RuleClass ruleClass = packageDeserializationEnvironment.getRuleClass(rulePb, ruleLocation);
Map<String, ParsedAttributeValue> attributeValues = new HashMap<>();
for (Build.Attribute attrPb : rulePb.getAttributeList()) {
Type<?> type = ruleClass.getAttributeByName(attrPb.getName()).getType();
@@ -136,7 +141,6 @@ public class PackageDeserializer {
}
Label ruleLabel = deserializeLabel(rulePb.getName());
- Location ruleLocation = deserializeLocation(rulePb.getParseableLocation());
try {
Rule rule = ruleClass.createRuleWithParsedAttributeValues(
ruleLabel, packageBuilder, ruleLocation, attributeValues,
@@ -150,8 +154,7 @@ public class PackageDeserializer {
}
}
- private final FileSystem fileSystem;
- private final RuleClassProvider ruleClassProvider;
+ private final PackageDeserializationEnvironment packageDeserializationEnvironment;
@Immutable
private static final class ExplicitLocation extends Location {
@@ -196,15 +199,16 @@ public class PackageDeserializer {
}
}
- public PackageDeserializer(FileSystem fileSystem, RuleClassProvider ruleClassProvider) {
- if (fileSystem == null) {
- fileSystem = defaultDeserializerFileSystem;
- }
- this.fileSystem = Preconditions.checkNotNull(fileSystem);
- if (ruleClassProvider == null) {
- ruleClassProvider = defaultRuleClassProvider;
- }
- this.ruleClassProvider = Preconditions.checkNotNull(ruleClassProvider);
+ /**
+ * Creates a {@link PackageDeserializer} using {@link #defaultPackageDeserializationEnvironment}.
+ */
+ public PackageDeserializer() {
+ this.packageDeserializationEnvironment = defaultPackageDeserializationEnvironment;
+ }
+
+ public PackageDeserializer(PackageDeserializationEnvironment packageDeserializationEnvironment) {
+ this.packageDeserializationEnvironment =
+ Preconditions.checkNotNull(packageDeserializationEnvironment);
}
/**
@@ -310,7 +314,7 @@ public class PackageDeserializer {
*/
private void deserializeInternal(Build.Package packagePb, StoredEventHandler eventHandler,
Package.Builder builder, InputStream in) throws PackageDeserializationException, IOException {
- Path buildFile = fileSystem.getPath(packagePb.getBuildFilePath());
+ Path buildFile = packageDeserializationEnvironment.getPath(packagePb.getBuildFilePath());
Preconditions.checkNotNull(buildFile);
Context context = new Context(buildFile, builder);
builder.setFilename(buildFile);