You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2017/05/11 16:15:16 UTC

johnzon git commit: JOHNZON-118 fixing JsonbPropertyOrder handling

Repository: johnzon
Updated Branches:
  refs/heads/master 3cb484c17 -> 12b25ba79


JOHNZON-118 fixing JsonbPropertyOrder handling


Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/12b25ba7
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/12b25ba7
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/12b25ba7

Branch: refs/heads/master
Commit: 12b25ba79bd7113099d79aa0a102879d46f3a34f
Parents: 3cb484c
Author: rmannibucau <rm...@apache.org>
Authored: Thu May 11 18:15:10 2017 +0200
Committer: rmannibucau <rm...@apache.org>
Committed: Thu May 11 18:15:10 2017 +0200

----------------------------------------------------------------------
 .../apache/johnzon/jsonb/JsonbAccessMode.java   | 20 ++++-
 .../johnzon/jsonb/AnnotationOrderTest.java      | 77 ++++++++++++++++++++
 2 files changed, 96 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/12b25ba7/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
----------------------------------------------------------------------
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 28c7211..c785f03 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
@@ -612,10 +612,28 @@ public class JsonbAccessMode implements AccessMode, Closeable {
         final JsonbPropertyOrder orderAnnotation = Meta.getAnnotation(clazz, JsonbPropertyOrder.class);
         if (orderAnnotation != null) {
             final List<String> indexed = new ArrayList<>(asList(orderAnnotation.value()));
+            if (naming != null) { // JsonbPropertyOrder applies on java names
+                for (int i = 0; i < indexed.size(); i++) {
+                    indexed.set(i, naming.translateName(indexed.get(i)));
+                }
+            }
             keyComparator = (o1, o2) -> {
                 final int i1 = indexed.indexOf(o1);
                 final int i2 = indexed.indexOf(o2);
                 if (i1 < 0) {
+                    if (i2 < 0) {
+                        if (order != null) {
+                            switch (order) {
+                                case PropertyOrderStrategy.LEXICOGRAPHICAL:
+                                    return o1.compareTo(o2);
+                                case PropertyOrderStrategy.REVERSE:
+                                    return o2.compareTo(o1);
+                                case PropertyOrderStrategy.ANY:
+                                default:
+                                    return 1;
+                            }
+                        }
+                    }
                     return 1;
                 }
                 return i1 - i2;
@@ -629,7 +647,7 @@ public class JsonbAccessMode implements AccessMode, Closeable {
                     keyComparator = String::compareTo;
                     break;
                 case PropertyOrderStrategy.REVERSE:
-                    keyComparator = (o1, o2) -> o2.compareTo(o1);
+                    keyComparator = Comparator.reverseOrder();
                     break;
                 default:
                     keyComparator = null;

http://git-wip-us.apache.org/repos/asf/johnzon/blob/12b25ba7/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AnnotationOrderTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AnnotationOrderTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AnnotationOrderTest.java
new file mode 100644
index 0000000..3c75869
--- /dev/null
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AnnotationOrderTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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 org.junit.Test;
+
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+import javax.json.bind.annotation.JsonbPropertyOrder;
+import javax.json.bind.config.PropertyNamingStrategy;
+
+import static org.junit.Assert.assertEquals;
+
+public class AnnotationOrderTest {
+    /**
+     * Test that @JsonbPropertyOrder takes java names and pushes at the end not mentionned properties.
+     */
+    @Test
+    public void run() {
+        final Person p = new Person();
+        p.setPersonAge(12);
+        p.setPersonName("David");
+        p.setPersonGender("Male");
+        assertEquals(
+                "{\"person_gender\":\"Male\",\"person_name\":\"David\",\"person_age\":12}",
+                JsonbBuilder.create(new JsonbConfig().withPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES))
+                        .toJson(p));
+    }
+
+    @JsonbPropertyOrder({"personGender", "personName"})
+    public class Person {
+        private String personName;
+        private int personAge;
+        private String personGender;
+
+        public String getPersonName() {
+            return personName;
+        }
+
+        public void setPersonName(String name) {
+            this.personName = name;
+        }
+
+        public int getPersonAge() {
+            return personAge;
+        }
+
+        public void setPersonAge(int age) {
+            this.personAge = age;
+        }
+
+        public String getPersonGender() {
+            return personGender;
+        }
+
+        public void setPersonGender(String personGender) {
+            this.personGender = personGender;
+        }
+    }
+
+}