You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by bu...@apache.org on 2020/03/05 12:45:52 UTC

[cxf] 02/02: cxf-rt-rs-json-basic: update JsonMapObject

This is an automated email from the ASF dual-hosted git repository.

buhhunyx pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit 44a930752c799a6e784ad598079b80bd99efa362
Author: Alexey Markevich <bu...@gmail.com>
AuthorDate: Sun Mar 1 14:16:01 2020 +0300

    cxf-rt-rs-json-basic: update JsonMapObject
---
 .../apache/cxf/jaxrs/json/basic/JsonMapObject.java | 44 ++++++++++--------
 .../cxf/jaxrs/json/basic/JsonMapObjectTest.java    | 54 ++++++++++++++++++++++
 2 files changed, 79 insertions(+), 19 deletions(-)

diff --git a/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObject.java b/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObject.java
index 859ed0a..5ee3ec2 100644
--- a/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObject.java
+++ b/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObject.java
@@ -21,18 +21,22 @@ package org.apache.cxf.jaxrs.json.basic;
 
 import java.io.Serializable;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import org.apache.cxf.helpers.CastUtils;
 
 public class JsonMapObject implements Serializable {
     private static final long serialVersionUID = 2620765136328623790L;
-    Map<String, Integer> updateCount;
-    Map<String, Object> values = new LinkedHashMap<>();
-    public JsonMapObject() {
 
+    private final Map<String, Object> values;
+    private Map<String, Integer> updateCount;
+
+    public JsonMapObject() {
+        this(new LinkedHashMap<>());
     }
 
     public JsonMapObject(Map<String, Object> values) {
@@ -40,17 +44,12 @@ public class JsonMapObject implements Serializable {
     }
 
     public void setProperty(String name, Object value) {
-        if (values.containsKey(name)) {
+        if (null != values.put(name, value instanceof JsonMapObject ? ((JsonMapObject)value).asMap() : value)) {
             if (updateCount == null) {
-                updateCount = new LinkedHashMap<>();
+                updateCount = new HashMap<>();
             }
-            final Integer count = updateCount.getOrDefault(name, 1) + 1;
-            updateCount.put(name, count);
+            updateCount.compute(name, (k, v) -> (v == null) ? 2 : v + 1);
         }
-        if (value instanceof JsonMapObject) {
-            value = ((JsonMapObject)value).asMap();
-        }
-        values.put(name, value);
     }
 
     public boolean containsProperty(String name) {
@@ -81,23 +80,30 @@ public class JsonMapObject implements Serializable {
         return values;
     }
     public Integer getIntegerProperty(String name) {
-        Object value = getProperty(name);
-        if (value != null) {
-            return value instanceof Integer ? (Integer)value : Integer.parseInt(value.toString());
+        Number number = getNumberProperty(name, Integer::valueOf);
+        if (number != null) {
+            return number instanceof Integer ? (Integer) number : Integer.valueOf(number.intValue());
         }
         return null;
     }
     public Long getLongProperty(String name) {
+        Number number = getNumberProperty(name, Long::valueOf);
+        if (number != null) {
+            return number instanceof Long ? (Long) number : Long.valueOf(number.longValue());
+        }
+        return null;
+    }
+    private Number getNumberProperty(String name, Function<String, Number> converter) {
         Object value = getProperty(name);
         if (value != null) {
-            return value instanceof Long ? (Long)value : Long.parseLong(value.toString());
+            return value instanceof Number ? (Number) value : converter.apply(value.toString());
         }
         return null;
     }
     public Boolean getBooleanProperty(String name) {
         Object value = getProperty(name);
         if (value != null) {
-            return value instanceof Boolean ? (Boolean)value : Boolean.parseBoolean(value.toString());
+            return value instanceof Boolean ? (Boolean)value : Boolean.valueOf(value.toString());
         }
         return null;
     }
@@ -128,15 +134,15 @@ public class JsonMapObject implements Serializable {
     }
 
     public boolean equals(Object obj) {
-        return obj instanceof JsonMapObject && ((JsonMapObject)obj).values.equals(this.values);
+        return this == obj || obj instanceof JsonMapObject && ((JsonMapObject)obj).values.equals(this.values);
     }
-    
+
     public int size() {
         return values.size();
     }
     
     public Map<String, Object> getUpdateCount() {
-        return updateCount == null ? null : Collections.<String, Object>unmodifiableMap(updateCount);
+        return updateCount == null ? null : Collections.unmodifiableMap(updateCount);
     }
     
     public Object removeProperty(String name) {
diff --git a/rt/rs/extensions/json-basic/src/test/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectTest.java b/rt/rs/extensions/json-basic/src/test/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectTest.java
new file mode 100644
index 0000000..33fc6c1
--- /dev/null
+++ b/rt/rs/extensions/json-basic/src/test/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectTest.java
@@ -0,0 +1,54 @@
+/**
+ * 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.cxf.jaxrs.json.basic;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+public class JsonMapObjectTest {
+
+    @Test
+    public void testGetIntegerProperty() throws Exception {
+        final String json = "{\"a\":123,\"b\":\"456\"}";
+        final JsonMapObject obj = new JsonMapObject();
+        new JsonMapObjectReaderWriter().fromJson(obj, json);
+
+        assertEquals(Integer.valueOf(123), obj.getIntegerProperty("a"));
+        assertEquals(Integer.valueOf(456), obj.getIntegerProperty("b"));
+    }
+
+    @Test
+    public void testGetUpdateCount() throws Exception {
+        final JsonMapObject obj = new JsonMapObject();
+        final String key = "key";
+        obj.setProperty(key, 1);
+        assertNull(obj.getUpdateCount());
+
+        obj.setProperty(key, 2);
+        assertEquals(2, obj.getUpdateCount().get(key));
+        assertEquals(Integer.valueOf(2), obj.getIntegerProperty(key));
+
+        obj.setProperty(key, 3);
+        assertEquals(3, obj.getUpdateCount().get(key));
+        assertEquals(Integer.valueOf(3), obj.getIntegerProperty(key));
+    }
+}
\ No newline at end of file