diff options
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.java | 58 |
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); |