aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-12-19 12:25:43 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2017-12-19 12:27:53 -0800
commit2258b811e451451b8716d1267c228b7f59e1e56d (patch)
treece30fd309ce9ba6e3737c4ad8ca268dbf46a777a /src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
parent16f1c19c2c4f68555bb23891e3a4da4d5ac4a68d (diff)
Makes PathFragment have internal CODEC definition.
PiperOrigin-RevId: 179588512
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
index da3846cd9f..05e4ee86c8 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
@@ -21,11 +21,17 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
+import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrintable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
import com.google.devtools.build.lib.util.OS;
import com.google.devtools.build.lib.util.StringCanonicalizer;
+import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.CodedOutputStream;
import java.io.File;
+import java.io.IOException;
import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.io.Serializable;
@@ -65,6 +71,8 @@ public abstract class PathFragment
/** The path fragment representing the root directory. */
public static final PathFragment ROOT_FRAGMENT = create(ROOT_DIR);
+ public static final ObjectCodec<PathFragment> CODEC = new PathFragmentCodec();
+
/**
* A helper object for manipulating the various internal {@link PathFragment} implementations.
*
@@ -743,6 +751,39 @@ public abstract class PathFragment
printer.append(getPathString());
}
+ private static class PathFragmentCodec implements ObjectCodec<PathFragment> {
+ private final ObjectCodec<String> stringCodec = StringCodecs.asciiOptimized();
+
+ @Override
+ public Class<PathFragment> getEncodedClass() {
+ return PathFragment.class;
+ }
+
+ @Override
+ public void serialize(PathFragment pathFragment, CodedOutputStream codedOut)
+ throws IOException, SerializationException {
+ codedOut.writeInt32NoTag(pathFragment.getDriveLetter());
+ codedOut.writeBoolNoTag(pathFragment.isAbsolute());
+ codedOut.writeInt32NoTag(pathFragment.segmentCount());
+ for (int i = 0; i < pathFragment.segmentCount(); i++) {
+ stringCodec.serialize(pathFragment.getSegment(i), codedOut);
+ }
+ }
+
+ @Override
+ public PathFragment deserialize(CodedInputStream codedIn)
+ throws IOException, SerializationException {
+ char driveLetter = (char) codedIn.readInt32();
+ boolean isAbsolute = codedIn.readBool();
+ int segmentCount = codedIn.readInt32();
+ String[] segments = new String[segmentCount];
+ for (int i = 0; i < segmentCount; i++) {
+ segments[i] = stringCodec.deserialize(codedIn);
+ }
+ return PathFragment.create(driveLetter, isAbsolute, segments);
+ }
+ }
+
private static void checkBaseName(String baseName) {
if (baseName.length() == 0) {
throw new IllegalArgumentException("Child must not be empty string ('')");