Skip to content

Commit 68d1c17

Browse files
committed
Merge pull request #1237 from bimargulies/java-nio-path
Issue #1235; rework to complete the implementation for Path.
2 parents b1041d0 + de160fd commit 68d1c17

File tree

8 files changed

+91
-8
lines changed

8 files changed

+91
-8
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@
8181
<version>1.0.0</version>
8282
<scope>test</scope>
8383
</dependency>
84+
<dependency>
85+
<groupId>com.google.jimfs</groupId>
86+
<artifactId>jimfs</artifactId>
87+
<version>1.1</version>
88+
<scope>test</scope>
89+
</dependency>
8490
</dependencies>
8591

8692
<build>

src/main/java/com/fasterxml/jackson/databind/ext/Java7PathDeserializer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
import com.fasterxml.jackson.databind.DeserializationContext;
1010
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
1111

12+
/**
13+
* Obsolete deserializer for Java.nio.file.Path that only handles the default file system.
14+
*/
15+
@Deprecated
1216
public class Java7PathDeserializer extends StdScalarDeserializer<Path>
1317
{
1418
private static final long serialVersionUID = 1;

src/main/java/com/fasterxml/jackson/databind/ext/Java7Support.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.fasterxml.jackson.databind.ext;
22

33
import com.fasterxml.jackson.databind.JsonDeserializer;
4+
import com.fasterxml.jackson.databind.JsonSerializer;
45
import com.fasterxml.jackson.databind.PropertyName;
56
import com.fasterxml.jackson.databind.introspect.Annotated;
67
import com.fasterxml.jackson.databind.introspect.AnnotatedParameter;
@@ -42,4 +43,6 @@ public static Java7Support instance() {
4243
public abstract Class<?> getClassJavaNioFilePath();
4344

4445
public abstract JsonDeserializer<?> getDeserializerForJavaNioFilePath(Class<?> rawType);
46+
47+
public abstract JsonSerializer<?> getSerializerForJavaNioFilePath(Class<?> rawType);
4548
}

src/main/java/com/fasterxml/jackson/databind/ext/Java7SupportImpl.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.nio.file.Path;
66

77
import com.fasterxml.jackson.databind.JsonDeserializer;
8+
import com.fasterxml.jackson.databind.JsonSerializer;
89
import com.fasterxml.jackson.databind.PropertyName;
910
import com.fasterxml.jackson.databind.introspect.Annotated;
1011
import com.fasterxml.jackson.databind.introspect.AnnotatedParameter;
@@ -33,11 +34,19 @@ public Class<?> getClassJavaNioFilePath() {
3334
@Override
3435
public JsonDeserializer<?> getDeserializerForJavaNioFilePath(Class<?> rawType) {
3536
if (rawType == Path.class) {
36-
return new Java7PathDeserializer();
37+
return new NioPathDeserializer();
3738
}
3839
return null;
3940
}
40-
41+
42+
@Override
43+
public JsonSerializer<?> getSerializerForJavaNioFilePath(Class<?> rawType) {
44+
if (Path.class.isAssignableFrom(rawType)) {
45+
return new NioPathSerializer();
46+
}
47+
return null;
48+
}
49+
4150
@Override
4251
public Boolean findTransient(Annotated a) {
4352
Transient t = a.getAnnotation(Transient.class);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.fasterxml.jackson.databind.ext;
2+
3+
import com.fasterxml.jackson.core.JsonParser;
4+
import com.fasterxml.jackson.core.JsonToken;
5+
import com.fasterxml.jackson.databind.DeserializationContext;
6+
import com.fasterxml.jackson.databind.JsonDeserializer;
7+
8+
import java.io.IOException;
9+
import java.net.URI;
10+
import java.net.URISyntaxException;
11+
import java.nio.file.Path;
12+
import java.nio.file.Paths;
13+
14+
/**
15+
*
16+
*/
17+
public class NioPathDeserializer extends JsonDeserializer<Path> {
18+
@Override
19+
public Path deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
20+
if (p.getCurrentToken() == JsonToken.VALUE_NULL) {
21+
return null;
22+
} else if (p.getCurrentToken() != JsonToken.VALUE_STRING) {
23+
throw ctxt.wrongTokenException(p, JsonToken.VALUE_STRING, "The value of a java.nio.file.Path must be a string");
24+
}
25+
URI uri;
26+
try {
27+
uri = new URI(p.readValueAs(String.class));
28+
} catch (URISyntaxException e) {
29+
throw ctxt.instantiationException(Path.class, e);
30+
}
31+
return Paths.get(uri);
32+
}
33+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
2+
package com.fasterxml.jackson.databind.ext;
3+
4+
import com.fasterxml.jackson.core.JsonGenerator;
5+
import com.fasterxml.jackson.databind.JsonSerializer;
6+
import com.fasterxml.jackson.databind.SerializerProvider;
7+
8+
import java.io.IOException;
9+
import java.nio.file.Path;
10+
11+
/**
12+
*
13+
*/
14+
public class NioPathSerializer extends JsonSerializer<Path> {
15+
@Override
16+
public void serialize(Path value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
17+
if (value == null) {
18+
gen.writeNull();
19+
} else {
20+
// write the Path as a URI, always.
21+
gen.writeString(value.toUri().toString());
22+
}
23+
}
24+
}

src/main/java/com/fasterxml/jackson/databind/ext/OptionalHandlerFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType typ
8585
final Class<?> rawType = type.getRawClass();
8686

8787
if (_jdk7Helper != null) {
88-
Class<?> path = _jdk7Helper.getClassJavaNioFilePath();
89-
if (path.isAssignableFrom(rawType)) {
90-
return ToStringSerializer.instance;
88+
JsonSerializer<?> ser = _jdk7Helper.getSerializerForJavaNioFilePath(rawType);
89+
if (ser != null) {
90+
return ser;
9191
}
9292
}
9393
if ((CLASS_DOM_NODE != null) && CLASS_DOM_NODE.isAssignableFrom(rawType)) {
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.fasterxml.jackson.databind.ext;
22

3+
import java.nio.file.FileSystem;
34
import java.nio.file.Path;
45
import java.nio.file.Paths;
56

67
import com.fasterxml.jackson.databind.*;
8+
import com.google.common.jimfs.Configuration;
9+
import com.google.common.jimfs.Jimfs;
710

811
/**
912
* @since 2.7
@@ -13,9 +16,9 @@ public class TestJdk7Types extends BaseMapTest
1316
public void testPathRoundtrip() throws Exception
1417
{
1518
ObjectMapper mapper = new ObjectMapper();
16-
17-
// Start with serialization, actually
18-
Path input = Paths.get("tmp", "foo.txt");
19+
20+
FileSystem fs = Jimfs.newFileSystem(Configuration.unix());
21+
Path input = fs.getPath("/tmp", "foo.txt");
1922

2023
String json = mapper.writeValueAsString(input);
2124
assertNotNull(json);
@@ -24,5 +27,6 @@ public void testPathRoundtrip() throws Exception
2427
assertNotNull(p);
2528

2629
assertEquals(input.toUri(), p.toUri());
30+
assertEquals(input, p);
2731
}
2832
}

0 commit comments

Comments
 (0)