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;