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 {

Reply via email to