This is an automated email from the ASF dual-hosted git repository.
rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git
The following commit(s) were added to refs/heads/master by this push:
new 3fc03a5 JOHNZON-239 transient support
3fc03a5 is described below
commit 3fc03a5a87f7050c9cdbd9b55d784b820ea04fb2
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Sat Aug 10 17:46:47 2019 +0200
JOHNZON-239 transient support
---
.../org/apache/johnzon/jsonb/JsonbAccessMode.java | 29 +++++++++++-
.../apache/johnzon/jsonb/JsonbTransientTest.java | 28 +++++++++++
.../org/apache/johnzon/jsonb/TransientTest.java | 55 ++++++++++++++++++++++
.../johnzon/mapper/access/FieldAccessMode.java | 7 +++
.../mapper/access/FieldAndMethodAccessMode.java | 22 ++++++++-
.../johnzon/mapper/access/MethodAccessMode.java | 7 +++
6 files changed, 144 insertions(+), 4 deletions(-)
diff --git
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
index 87819ca..a7ce489 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
@@ -28,6 +28,7 @@ import java.io.Closeable;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
@@ -424,7 +425,11 @@ public class JsonbAccessMode implements AccessMode,
Closeable {
final Map<String, Reader> result = keyComparator == null ? new
HashMap<>() : new TreeMap<>(keyComparator);
for (final Map.Entry<String, Reader> entry : readers.entrySet()) {
final Reader initialReader = entry.getValue();
- if (isTransient(initialReader, visibility) ||
initialReader.getAnnotation(JohnzonAny.class) != null) {
+ if (isTransient(initialReader, visibility)) {
+ validateAnnotationsOnTransientField(initialReader);
+ continue;
+ }
+ if (initialReader.getAnnotation(JohnzonAny.class) != null) {
continue;
}
@@ -508,6 +513,17 @@ public class JsonbAccessMode implements AccessMode,
Closeable {
return result;
}
+ private void validateAnnotationsOnTransientField(final DecoratedType type)
{
+ if (type.getAnnotation(JsonbProperty.class) != null
+ || type.getAnnotation(JsonbDateFormat.class) != null
+ || type.getAnnotation(JsonbNumberFormat.class) != null
+ || type.getAnnotation(JsonbTypeAdapter.class) != null
+ || type.getAnnotation(JsonbTypeSerializer.class) != null
+ || type.getAnnotation(JsonbTypeDeserializer.class) != null) {
+ throw new JsonbException("Invalid configuration for " + type + "
property");
+ }
+ }
+
@Override
public Map<String, Writer> findWriters(final Class<?> clazz) {
final Map<String, Writer> writers = delegate.findWriters(clazz);
@@ -517,6 +533,7 @@ public class JsonbAccessMode implements AccessMode,
Closeable {
for (final Map.Entry<String, Writer> entry : writers.entrySet()) {
Writer initialWriter = entry.getValue();
if (isTransient(initialWriter, visibility)) {
+ validateAnnotationsOnTransientField(initialWriter);
continue;
}
@@ -691,7 +708,15 @@ public class JsonbAccessMode implements AccessMode,
Closeable {
}
private boolean isTransient(final DecoratedType t) {
- return t.getAnnotation(JsonbTransient.class) != null;
+ if (t.getAnnotation(JsonbTransient.class) != null) {
+ return true;
+ }
+ // TODO: spec requirement, this sounds wrong since you cant customize
2 kind of serializations on the same model
+ if (FieldAccessMode.FieldDecoratedType.class.isInstance(t)) {
+ final Field field =
FieldAccessMode.FieldDecoratedType.class.cast(t).getField();
+ return Modifier.isTransient(field.getModifiers());
+ }
+ return false;
}
private boolean isNotVisible(PropertyVisibilityStrategy visibility,
DecoratedType t) {
diff --git
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbTransientTest.java
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbTransientTest.java
index 29edfdd..417244f 100644
---
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbTransientTest.java
+++
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbTransientTest.java
@@ -18,9 +18,13 @@
*/
package org.apache.johnzon.jsonb;
+import org.apache.johnzon.jsonb.model.Holder;
+import org.apache.johnzon.jsonb.test.JsonbRule;
+import org.junit.Rule;
import org.junit.Test;
import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbException;
import javax.json.bind.annotation.JsonbProperty;
import javax.json.bind.annotation.JsonbTransient;
import javax.json.bind.spi.JsonbProvider;
@@ -28,6 +32,9 @@ import javax.json.bind.spi.JsonbProvider;
import static org.junit.Assert.assertEquals;
public class JsonbTransientTest {
+ @Rule
+ public final JsonbRule jsonb = new JsonbRule();
+
@Test
public void roundtrip() {
final Jsonb jsonb = JsonbProvider.provider().create().build();
@@ -39,6 +46,27 @@ public class JsonbTransientTest {
assertEquals("{\"_name\":\"test\"}", jsonb.toJson(book));
}
+ @Test(expected = JsonbException.class)
+ public void illegalConfig() {
+ jsonb.toJson(new TransientGetterWithFieldProperty());
+ }
+
+ public class TransientGetterWithFieldProperty implements Holder<String> {
+ @JsonbProperty("instance")
+ private String instance;
+
+ @Override
+ @JsonbTransient
+ public String getInstance() {
+ return instance;
+ }
+
+ @Override
+ public void setInstance(String instance) {
+ this.instance = instance;
+ }
+ }
+
public static class Book {
@JsonbTransient
private long id;
diff --git
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/TransientTest.java
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/TransientTest.java
new file mode 100644
index 0000000..8ee35e4
--- /dev/null
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/TransientTest.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.johnzon.jsonb;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.apache.johnzon.jsonb.model.Holder;
+import org.apache.johnzon.jsonb.test.JsonbRule;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class TransientTest {
+ @Rule
+ public final JsonbRule jsonb = new JsonbRule();
+
+ @Test
+ public void transientFieldIsIgnored() {
+ final String json = jsonb.toJson(new TransientHolder() {{
setInstance("String Value"); }});
+ assertEquals("{}", json);
+
+ final TransientHolder value = jsonb.fromJson("{ \"instance\" :
\"whatever\" }", TransientHolder.class);
+ assertNull(value.getInstance());
+ }
+
+ public static class TransientHolder implements Holder<String> {
+ private transient String instance;
+
+ @Override
+ public String getInstance() {
+ return instance;
+ }
+
+ @Override
+ public void setInstance(String instance) {
+ this.instance = instance;
+ }
+ }
+}
diff --git
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
index e1de549..42bc13f 100644
---
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
+++
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAccessMode.java
@@ -135,6 +135,13 @@ public class FieldAccessMode extends BaseAccessMode {
public boolean isNillable(final boolean global) {
return global;
}
+
+ @Override
+ public String toString() {
+ return "FieldDecoratedType{" +
+ "field=" + field +
+ '}';
+ }
}
public static class FieldWriter extends FieldDecoratedType implements
Writer {
diff --git
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java
index ea5a651..d1e1211 100644
---
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java
+++
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java
@@ -95,7 +95,12 @@ public class FieldAndMethodAccessMode extends BaseAccessMode
{
final Reader existing = readers.get(entry.getKey());
if (existing == null) {
- readers.put(entry.getKey(), entry.getValue());
+ if (f != null) { // useful to hold the Field and transient
state for example, just as fallback
+ readers.put(entry.getKey(), new CompositeReader(
+ entry.getValue(), new
FieldAccessMode.FieldReader(f, f.getType())));
+ } else {
+ readers.put(entry.getKey(), entry.getValue());
+ }
} else {
readers.put(entry.getKey(), new
CompositeReader(entry.getValue(), existing));
}
@@ -173,7 +178,12 @@ public class FieldAndMethodAccessMode extends
BaseAccessMode {
final Writer existing = writers.get(entry.getKey());
if (existing == null) {
- writers.put(entry.getKey(), entry.getValue());
+ if (f != null) { // useful to hold the Field and transient
state for example, just as fallback
+ writers.put(entry.getKey(), new CompositeWriter(
+ entry.getValue(), new
FieldAccessMode.FieldWriter(f, f.getType())));
+ } else {
+ writers.put(entry.getKey(), entry.getValue());
+ }
} else {
writers.put(entry.getKey(), new
CompositeWriter(entry.getValue(), existing));
}
@@ -231,6 +241,14 @@ public class FieldAndMethodAccessMode extends
BaseAccessMode {
public DecoratedType getType2() {
return type2;
}
+
+ @Override
+ public String toString() {
+ return "CompositeDecoratedType{" +
+ "type1=" + type1 +
+ ", type2=" + type2 +
+ '}';
+ }
}
public static final class CompositeReader extends
CompositeDecoratedType<Reader> implements Reader {
diff --git
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
index fbaf167..e35c425 100644
---
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
+++
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
@@ -142,6 +142,13 @@ public class MethodAccessMode extends BaseAccessMode {
public boolean isNillable(final boolean global) {
return global;
}
+
+ @Override
+ public String toString() {
+ return "MethodDecoratedType{" +
+ "method=" + method +
+ '}';
+ }
}
public static class MethodWriter extends MethodDecoratedType implements
Writer {