diff options
author | 2017-12-19 12:25:43 -0800 | |
---|---|---|
committer | 2017-12-19 12:27:53 -0800 | |
commit | 2258b811e451451b8716d1267c228b7f59e1e56d (patch) | |
tree | ce30fd309ce9ba6e3737c4ad8ca268dbf46a777a /src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java | |
parent | 16f1c19c2c4f68555bb23891e3a4da4d5ac4a68d (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.java | 41 |
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 ('')"); |