aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/packages
diff options
context:
space:
mode:
authorGravatar Michajlo Matijkiw <michajlo@google.com>2015-11-17 18:50:27 +0000
committerGravatar Lukacs Berki <lberki@google.com>2015-11-18 15:30:05 +0000
commitf30d375c411e0aad9a8248bd7e1508dfa9e7c5ce (patch)
tree653b1535b95b71259db6e50307b29b9aed7d41ca /src/main/java/com/google/devtools/build/lib/packages
parent16ef20b3a25674596b50fe3639fe28b870e12ef9 (diff)
Package serialization operates on Coded{Input,Output}Streams
-- MOS_MIGRATED_REVID=108056940
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/packages')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java38
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java37
2 files changed, 42 insertions, 33 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 de36382811..2a57d5e567 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
@@ -44,9 +44,10 @@ import com.google.devtools.build.lib.syntax.GlobList;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.ExtensionRegistryLite;
import java.io.IOException;
-import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -371,7 +372,7 @@ public class PackageDeserializer {
* @throws InterruptedException
*/
private void deserializeInternal(Build.Package packagePb, StoredEventHandler eventHandler,
- Package.Builder builder, InputStream in)
+ Package.Builder builder, CodedInputStream codedIn)
throws PackageDeserializationException, IOException, InterruptedException {
Path buildFile = packageDeserializationEnvironment.getPath(packagePb.getBuildFilePath());
Preconditions.checkNotNull(buildFile);
@@ -433,13 +434,13 @@ public class PackageDeserializer {
builder.setWorkspaceName(packagePb.getWorkspaceName());
- deserializeTargets(in, context);
+ deserializeTargets(codedIn, context);
}
- private void deserializeTargets(InputStream in, DeserializationContext context)
+ private void deserializeTargets(CodedInputStream codedIn, DeserializationContext context)
throws IOException, PackageDeserializationException, InterruptedException {
Build.TargetOrTerminator tot;
- while (!(tot = Build.TargetOrTerminator.parseDelimitedFrom(in)).getIsTerminator()) {
+ while (!(tot = readTargetOrTerminator(codedIn)).getIsTerminator()) {
Build.Target target = tot.getTarget();
switch (target.getType()) {
case SOURCE_FILE:
@@ -457,37 +458,44 @@ public class PackageDeserializer {
}
}
+ private static Build.TargetOrTerminator readTargetOrTerminator(CodedInputStream codedIn)
+ throws IOException {
+ Build.TargetOrTerminator.Builder builder = Build.TargetOrTerminator.newBuilder();
+ codedIn.readMessage(builder, ExtensionRegistryLite.getEmptyRegistry());
+ return builder.build();
+ }
+
/**
* Deserializes a {@link Package} from {@code in}. The inverse of
* {@link PackageSerializer#serialize}.
*
- * <p>Expects {@code in} to contain a single
+ * <p>Expects {@code codedIn} to contain a single
* {@link com.google.devtools.build.lib.query2.proto.proto2api.Build.Package} message followed
* by a series of
* {@link com.google.devtools.build.lib.query2.proto.proto2api.Build.TargetOrTerminator}
* messages encoding the associated targets.
*
- * @param in stream to read from
+ * @param codedIn stream to read from
* @return a new {@link Package} as read from {@code in}
* @throws PackageDeserializationException on failures deserializing the input
* @throws IOException on failures reading from {@code in}
* @throws InterruptedException
*/
- public Package deserialize(InputStream in)
+ public Package deserialize(CodedInputStream codedIn)
throws PackageDeserializationException, IOException, InterruptedException {
try {
- return deserializeInternal(in);
+ return deserializeInternal(codedIn);
} catch (PackageDeserializationException | RuntimeException e) {
LOG.log(Level.WARNING, "Failed to deserialize Package object", e);
throw e;
}
}
- private Package deserializeInternal(InputStream in)
+ private Package deserializeInternal(CodedInputStream codedIn)
throws PackageDeserializationException, IOException, InterruptedException {
// Read the initial Package message so we have the data to initialize the builder. We will read
// the Targets in individually later.
- Build.Package packagePb = Build.Package.parseDelimitedFrom(in);
+ Build.Package packagePb = readPackageProto(codedIn);
Package.Builder builder;
try {
builder = new Package.Builder(
@@ -498,11 +506,17 @@ public class PackageDeserializer {
throw new PackageDeserializationException(e);
}
StoredEventHandler eventHandler = new StoredEventHandler();
- deserializeInternal(packagePb, eventHandler, builder, in);
+ deserializeInternal(packagePb, eventHandler, builder, codedIn);
builder.addEvents(eventHandler.getEvents());
return builder.build();
}
+ private static Build.Package readPackageProto(CodedInputStream codedIn) throws IOException {
+ Build.Package.Builder builder = Build.Package.newBuilder();
+ codedIn.readMessage(builder, ExtensionRegistryLite.getEmptyRegistry());
+ return builder.build();
+ }
+
private static void deserializeEvent(StoredEventHandler eventHandler, Build.Event event) {
String message = event.getMessage();
switch (event.getKind()) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java b/src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java
index 2462423c7f..899651277a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java
@@ -45,9 +45,9 @@ import com.google.devtools.build.lib.query2.proto.proto2api.Build;
import com.google.devtools.build.lib.query2.proto.proto2api.Build.Rule.Builder;
import com.google.devtools.build.lib.syntax.GlobCriteria;
import com.google.devtools.build.lib.syntax.GlobList;
+import com.google.protobuf.CodedOutputStream;
import java.io.IOException;
-import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
@@ -131,15 +131,10 @@ public class PackageSerializer {
* encoding the targets.
*
* @param pkg the {@link Package} to be serialized
- * @param out the stream to pkg's serialized representation to
+ * @param codedOut the stream to pkg's serialized representation to
* @throws IOException on failure writing to {@code out}
*/
- public void serialize(Package pkg, OutputStream out) throws IOException {
- serializePackageInternal(pkg, out);
- }
-
- /** Serializes pkg to out as a series of protocol buffers */
- private void serializePackageInternal(Package pkg, OutputStream out) throws IOException {
+ public void serialize(Package pkg, CodedOutputStream codedOut) throws IOException {
Build.Package.Builder builder = Build.Package.newBuilder();
builder.setName(pkg.getName());
builder.setRepository(pkg.getPackageIdentifier().getRepository().toString());
@@ -197,11 +192,11 @@ public class PackageSerializer {
builder.setWorkspaceName(pkg.getWorkspaceName());
- builder.build().writeDelimitedTo(out);
+ codedOut.writeMessageNoTag(builder.build());
// Targets are emitted separately as individual protocol buffers as to prevent overwhelming
// protocol buffer deserialization size limits.
- emitTargets(pkg.getTargets(), out);
+ emitTargets(pkg.getTargets(), codedOut);
}
/**
@@ -541,31 +536,31 @@ public class PackageSerializer {
}
/** Writes targets as a series of separate TargetOrTerminator messages to out. */
- private void emitTargets(Collection<Target> targets, OutputStream out) throws IOException {
+ private void emitTargets(Collection<Target> targets, CodedOutputStream codedOut)
+ throws IOException {
for (Target target : targets) {
if (target instanceof InputFile) {
- emitTarget(serializeInputFile((InputFile) target), out);
+ emitTarget(serializeInputFile((InputFile) target), codedOut);
} else if (target instanceof OutputFile) {
// Output files are not serialized; they are recreated by the RuleClass on deserialization.
} else if (target instanceof PackageGroup) {
- emitTarget(serializePackageGroup((PackageGroup) target), out);
+ emitTarget(serializePackageGroup((PackageGroup) target), codedOut);
} else if (target instanceof Rule) {
- emitTarget(serializeRule((Rule) target), out);
+ emitTarget(serializeRule((Rule) target), codedOut);
}
}
// Terminate stream with isTerminator = true.
- Build.TargetOrTerminator.newBuilder()
+ codedOut.writeMessageNoTag(Build.TargetOrTerminator.newBuilder()
.setIsTerminator(true)
- .build()
- .writeDelimitedTo(out);
+ .build());
}
- private static void emitTarget(Build.Target target, OutputStream out) throws IOException {
- Build.TargetOrTerminator.newBuilder()
+ private static void emitTarget(Build.Target target, CodedOutputStream codedOut)
+ throws IOException {
+ codedOut.writeMessageNoTag(Build.TargetOrTerminator.newBuilder()
.setTarget(target)
- .build()
- .writeDelimitedTo(out);
+ .build());
}
// This is needed because I do not want to use the SymlinkBehavior from the