You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by jt...@apache.org on 2017/10/10 15:36:42 UTC

[2/2] incubator-netbeans-html4j git commit: NETBEANS-83: On platforms that don't provide ClassValue class, fallback to simple linked list based implementation

NETBEANS-83: On platforms that don't provide ClassValue class, fallback to simple linked list based implementation


Project: http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/commit/eed653ae
Tree: http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/tree/eed653ae
Diff: http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/diff/eed653ae

Branch: refs/heads/master
Commit: eed653ae32ca73e0393eb133bdda5146e7769686
Parents: b3e3468
Author: Jaroslav Tulach <ja...@oracle.com>
Authored: Tue Oct 10 17:36:27 2017 +0200
Committer: Jaroslav Tulach <ja...@oracle.com>
Committed: Tue Oct 10 17:36:27 2017 +0200

----------------------------------------------------------------------
 .../java/org/netbeans/html/json/impl/JSON.java  | 52 ++++++++++++++++++--
 1 file changed, 49 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/eed653ae/json/src/main/java/org/netbeans/html/json/impl/JSON.java
----------------------------------------------------------------------
diff --git a/json/src/main/java/org/netbeans/html/json/impl/JSON.java b/json/src/main/java/org/netbeans/html/json/impl/JSON.java
index f9cc31b..1745c0c 100644
--- a/json/src/main/java/org/netbeans/html/json/impl/JSON.java
+++ b/json/src/main/java/org/netbeans/html/json/impl/JSON.java
@@ -342,8 +342,26 @@ public final class JSON {
 
     }
 
-    private static final class ModelTypes extends ClassValue<Proto.Type[]> {
-        static final ModelTypes MODELS = new ModelTypes();
+    private static interface ModelTypes {
+        public Proto.Type[] get(Class<?> type);
+
+        static final ModelTypes MODELS = initModelTypes();
+    }
+
+    static ModelTypes initModelTypes() {
+        try {
+            return initClassValueTypes();
+        } catch (LinkageError err) {
+            return new LinkedListTypes();
+        }
+    }
+
+    private static ModelTypes initClassValueTypes() {
+        return new ClassValueTypes();
+    }
+
+    private static final class ClassValueTypes extends ClassValue<Proto.Type[]>
+    implements ModelTypes {
 
         @Override
         protected Proto.Type[] computeValue(Class<?> type) {
@@ -351,8 +369,36 @@ public final class JSON {
         }
     }
 
+    private static final class LinkedListTypes implements ModelTypes {
+        private Item items;
+        private static final class Item {
+            final Item next;
+            final Class<?> clazz;
+            final Proto.Type<?>[] type = { null };
+
+            Item(Item next, Class<?> clazz) {
+                this.next = next;
+                this.clazz = clazz;
+            }
+        }
+
+        @Override
+        public synchronized Proto.Type[] get(Class<?> clazz) {
+            Item it = items;
+            while (it != null) {
+                if (it.clazz == clazz) {
+                    return it.type;
+                }
+                it = it.next;
+            }
+            it = new Item(items, clazz);
+            items = it;
+            return it.type;
+        }
+    }
+
     public static void register(Class c, Proto.Type<?> type) {
-        ModelTypes.MODELS.get(c)[0]= type;
+        ModelTypes.MODELS.get(c)[0] = type;
     }
 
     public static boolean isModel(Class<?> clazz) {