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 83fa7a5  JOHNZON-250 private accessors hide public fields
83fa7a5 is described below

commit 83fa7a512e3cd3e55eb42b98c8350475f5496afa
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Tue Aug 13 19:55:22 2019 +0200

    JOHNZON-250 private accessors hide public fields
---
 .../org/apache/johnzon/jsonb/JohnzonBuilder.java   |  2 +-
 .../johnzon/jsonb/HiddingPublicFieldTest.java      | 49 ++++++++++++++++++++++
 .../org/apache/johnzon/mapper/MapperBuilder.java   |  2 +-
 .../mapper/access/FieldAndMethodAccessMode.java    | 23 ++++++++--
 4 files changed, 71 insertions(+), 5 deletions(-)

diff --git 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
index 3c78f3e..a54281b 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
@@ -226,7 +226,7 @@ public class JohnzonBuilder implements JsonbBuilder {
                         factory, jsonp, builderFactorySupplier, 
parserFactoryProvider,
                         config.getProperty("johnzon.accessModeDelegate")
                                 .map(this::toAccessMode)
-                                .orElseGet(() -> new 
FieldAndMethodAccessMode(true, true, false)),
+                                .orElseGet(() -> new 
FieldAndMethodAccessMode(true, true, false, true)),
                         
config.getProperty("johnzon.failOnMissingCreatorValues")
                               .map(it -> String.class.isInstance(it) ? 
Boolean.parseBoolean(it.toString()) : Boolean.class.cast(it))
                               .orElse(true) /*spec 1.0 requirement*/,
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/HiddingPublicFieldTest.java
 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/HiddingPublicFieldTest.java
new file mode 100644
index 0000000..2f6a314
--- /dev/null
+++ 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/HiddingPublicFieldTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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 org.apache.johnzon.jsonb.test.JsonbRule;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class HiddingPublicFieldTest {
+    @Rule
+    public final JsonbRule jsonb = new JsonbRule();
+
+    @Test
+    public void hidden() {
+        final Model model = new Model();
+        model.value = "something";
+        assertEquals("{}", jsonb.toJson(model));
+    }
+
+    public static class Model {
+        public String value;
+
+        private String getValue() {
+            return value;
+        }
+
+        private void setValue(final String value) {
+            this.value = value;
+        }
+    }
+}
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
index 4c286d6..a13655e 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
@@ -195,7 +195,7 @@ public class MapperBuilder {
             } else if ("strict-method".equalsIgnoreCase(accessModeName)) {
                 accessMode = new MethodAccessMode(supportConstructors, 
supportHiddenAccess, false);
             } else if ("both".equalsIgnoreCase(accessModeName) || 
accessModeName == null) {
-                accessMode = new FieldAndMethodAccessMode(supportConstructors, 
supportHiddenAccess, useGetterForCollections);
+                accessMode = new FieldAndMethodAccessMode(supportConstructors, 
supportHiddenAccess, useGetterForCollections, false);
             } else {
                 throw new IllegalArgumentException("Unsupported access mode: " 
+ accessModeName);
             }
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 d1e1211..1ae5425 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
@@ -27,6 +27,7 @@ import java.beans.Introspector;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.HashMap;
@@ -36,12 +37,14 @@ import java.util.Map;
 public class FieldAndMethodAccessMode extends BaseAccessMode {
     private final FieldAccessMode fields;
     private final MethodAccessMode methods;
+    private final boolean alwaysPreferMethodVisibility;
 
     public FieldAndMethodAccessMode(final boolean useConstructor, final 
boolean acceptHiddenConstructor,
-                                    final boolean useGettersAsWriter) {
+                                    final boolean useGettersAsWriter, final 
boolean alwaysPreferMethodVisibility) {
         super(useConstructor, acceptHiddenConstructor);
         this.fields = new FieldAccessMode(useConstructor, 
acceptHiddenConstructor);
         this.methods = new MethodAccessMode(useConstructor, 
acceptHiddenConstructor, useGettersAsWriter);
+        this.alwaysPreferMethodVisibility = alwaysPreferMethodVisibility;
     }
 
     @Override
@@ -58,7 +61,7 @@ public class FieldAndMethodAccessMode extends BaseAccessMode {
                 m = getMethod("is" + Character.toUpperCase(key.charAt(0)) + 
(key.length() > 1 ? key.substring(1) : ""), clazz);
             }
             boolean skip = false;
-            if (m != null) {
+            if (m != null && Modifier.isPublic(m.getModifiers())) {
                 for (final Reader w : methodReaders.values()) {
                     if 
(MethodAccessMode.MethodDecoratedType.class.cast(w).getMethod().equals(m)) {
                         if (w.getAnnotation(JohnzonProperty.class) != null || 
w.getAnnotation(JohnzonIgnore.class) != null) {
@@ -67,6 +70,8 @@ public class FieldAndMethodAccessMode extends BaseAccessMode {
                         break;
                     }
                 }
+            } else if (m != null) { // skip even field
+                continue;
             }
             if (skip) {
                 continue;
@@ -111,8 +116,18 @@ public class FieldAndMethodAccessMode extends 
BaseAccessMode {
 
     private Method getMethod(final String methodName, final Class<?> type, 
final Class<?>... args) {
         try {
+            if (alwaysPreferMethodVisibility) {
+                return type.getDeclaredMethod(methodName, args);
+            }
             return type.getMethod(methodName, args);
         } catch (final NoSuchMethodException e) {
+            if (alwaysPreferMethodVisibility) {
+                try {
+                    return type.getMethod(methodName, args);
+                } catch (final NoSuchMethodException e2) {
+                    // no-op
+                }
+            }
             return null;
         }
     }
@@ -141,7 +156,7 @@ public class FieldAndMethodAccessMode extends 
BaseAccessMode {
             final String key = entry.getKey();
             final Method m = getMethod("set" + 
Character.toUpperCase(key.charAt(0)) + (key.length() > 1 ? key.substring(1) : 
""), clazz, toType(entry.getValue().getType()));
             boolean skip = false;
-            if (m != null) {
+            if (m != null && Modifier.isPublic(m.getModifiers())) {
                 for (final Writer w : metodWriters.values()) {
                     if 
(MethodAccessMode.MethodDecoratedType.class.cast(w).getMethod().equals(m)) {
                         if (w.getAnnotation(JohnzonProperty.class) != null) {
@@ -150,6 +165,8 @@ public class FieldAndMethodAccessMode extends 
BaseAccessMode {
                         break;
                     }
                 }
+            } else if (m != null) {
+                continue;
             }
             if (skip) {
                 continue;

Reply via email to