HADOOP-13519. Make Path Serializable. Contributed by Steve Loughran
This commit is contained in:
parent
b6d839a60c
commit
1192781a78
|
@ -19,6 +19,9 @@
|
||||||
package org.apache.hadoop.fs;
|
package org.apache.hadoop.fs;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InvalidObjectException;
|
||||||
|
import java.io.ObjectInputValidation;
|
||||||
|
import java.io.Serializable;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
@ -37,7 +40,7 @@ import org.apache.hadoop.conf.Configuration;
|
||||||
@Stringable
|
@Stringable
|
||||||
@InterfaceAudience.Public
|
@InterfaceAudience.Public
|
||||||
@InterfaceStability.Stable
|
@InterfaceStability.Stable
|
||||||
public class Path implements Comparable {
|
public class Path implements Comparable, Serializable, ObjectInputValidation {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The directory separator, a slash.
|
* The directory separator, a slash.
|
||||||
|
@ -66,6 +69,8 @@ public class Path implements Comparable {
|
||||||
private static final Pattern HAS_DRIVE_LETTER_SPECIFIER =
|
private static final Pattern HAS_DRIVE_LETTER_SPECIFIER =
|
||||||
Pattern.compile("^/?[a-zA-Z]:");
|
Pattern.compile("^/?[a-zA-Z]:");
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 0xad00f;
|
||||||
|
|
||||||
private URI uri; // a hierarchical uri
|
private URI uri; // a hierarchical uri
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -565,4 +570,17 @@ public class Path implements Comparable {
|
||||||
}
|
}
|
||||||
return new Path(newUri);
|
return new Path(newUri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate the contents of a deserialized Path, so as
|
||||||
|
* to defend against malicious object streams.
|
||||||
|
* @throws InvalidObjectException if there's no URI
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void validateObject() throws InvalidObjectException {
|
||||||
|
if (uri == null) {
|
||||||
|
throw new InvalidObjectException("No URI in deserialized Path");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,9 +17,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.apache.hadoop.fs;
|
package org.apache.hadoop.fs;
|
||||||
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -506,4 +511,19 @@ public class TestPath {
|
||||||
assertFalse(Path.isWindowsAbsolutePath("C:test", false));
|
assertFalse(Path.isWindowsAbsolutePath("C:test", false));
|
||||||
assertFalse(Path.isWindowsAbsolutePath("/C:test", true));
|
assertFalse(Path.isWindowsAbsolutePath("/C:test", true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(timeout = 30000)
|
||||||
|
public void testSerDeser() throws Throwable {
|
||||||
|
Path source = new Path("hdfs://localhost:4040/scratch");
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream(256);
|
||||||
|
try(ObjectOutputStream oos = new ObjectOutputStream(baos)) {
|
||||||
|
oos.writeObject(source);
|
||||||
|
}
|
||||||
|
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
|
||||||
|
try (ObjectInputStream ois = new ObjectInputStream(bais)) {
|
||||||
|
Path deser = (Path) ois.readObject();
|
||||||
|
Assert.assertEquals(source, deser);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue