You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2021/09/30 15:02:07 UTC

[brooklyn-server] branch master updated (c1f5b0d -> 90844d2)

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

heneveld pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git.


    from c1f5b0d  tidy name and visibility of policies
     new 3c71dce  convenience to MutableMap for transforming an existing map
     new c898720  logic for looking at merger of typetokens
     new 90844d2  allow REST endpoints to be extended by tests and/or statics

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/brooklyn/rest/BrooklynRestApi.java  | 20 +++++++++++-
 .../org/apache/brooklyn/rest/BrooklynRestApp.java  |  2 +-
 .../brooklyn/util/collections/MutableMap.java      | 12 +++++++-
 .../org/apache/brooklyn/util/guava/TypeTokens.java | 36 ++++++++++++++++++++++
 .../apache/brooklyn/util/guava/TypeTokensTest.java |  7 +++++
 5 files changed, 74 insertions(+), 3 deletions(-)

[brooklyn-server] 02/03: logic for looking at merger of typetokens

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit c8987208d507681b67c5d4323b87407fb67893b8
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Thu Sep 30 16:01:40 2021 +0100

    logic for looking at merger of typetokens
---
 .../org/apache/brooklyn/util/guava/TypeTokens.java | 36 ++++++++++++++++++++++
 .../apache/brooklyn/util/guava/TypeTokensTest.java |  7 +++++
 2 files changed, 43 insertions(+)

diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/guava/TypeTokens.java b/utils/common/src/main/java/org/apache/brooklyn/util/guava/TypeTokens.java
index 28c1f1c..19ff464 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/guava/TypeTokens.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/guava/TypeTokens.java
@@ -19,6 +19,7 @@
 package org.apache.brooklyn.util.guava;
 
 import com.fasterxml.jackson.databind.type.ArrayType;
+import com.google.common.annotations.Beta;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
@@ -185,4 +186,39 @@ public class TypeTokens {
         return getGenericParameterTypeTokensWhenUpcastToClass(t, (Class)clazz);
     }
 
+    /** find the lowest common ancestor of the two types, filling in generics info, and ignoring Object; but that's hard so this does some heuristics for common cases */
+    @Beta
+    public static TypeToken<?> union(TypeToken<?> t1, TypeToken<?> t2, boolean ignoreObject) {
+        if (t1.equals(t2)) return t1;
+
+        if (ignoreObject) {
+            if (t1.getRawType().equals(Object.class)) return t2;
+            if (t2.getRawType().equals(Object.class)) return t1;
+        }
+
+        if (t1.getRawType().equals(t2.getRawType())) {
+            // if equal, prefer one whose generics are more specific
+            TypeToken<?>[] tokens1 = getGenericParameterTypeTokens(t1);
+            TypeToken<?>[] tokens2 = getGenericParameterTypeTokens(t1);
+            if (tokens1.length>0 && tokens2.length>0) {
+                // just look at first one to see who wins
+                TypeToken<?> union0 = union(tokens1[0], tokens2[0], true);
+                if (union0==tokens2[0]) return t2;
+                return t1;
+            } else if (tokens2.length>0) {
+                return t2;
+            }
+            return t1;
+        }
+
+        // prefer an ancestor (ideally we'd infer generics if needed at the parent, but skip for now)
+        if (t1.isAssignableFrom(t2)) return t1;
+        if (t2.isAssignableFrom(t1)) return t2;
+        if (t1.getRawType().isAssignableFrom(t2.getRawType())) return t1;
+        if (t2.getRawType().isAssignableFrom(t1.getRawType())) return t2;
+
+        // can't figure anything out, just pick one
+        return t1;
+    }
+
 }
diff --git a/utils/common/src/test/java/org/apache/brooklyn/util/guava/TypeTokensTest.java b/utils/common/src/test/java/org/apache/brooklyn/util/guava/TypeTokensTest.java
index edcf55d..ab63e51 100644
--- a/utils/common/src/test/java/org/apache/brooklyn/util/guava/TypeTokensTest.java
+++ b/utils/common/src/test/java/org/apache/brooklyn/util/guava/TypeTokensTest.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.MutableList;
+import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.exceptions.UserFacingException;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -37,4 +38,10 @@ public class TypeTokensTest {
         Assert.assertEquals(genericArguments, MutableList.of(TypeToken.of(String.class), TypeToken.of(Integer.class)));
     }
 
+    @Test
+    public void testLowestCommonAncestor() {
+        TypeToken<?> map1 = new TypeToken<Map<String,Integer>>() {};
+        Assert.assertEquals( TypeTokens.union(TypeToken.of(MutableMap.class), map1, true), map1);
+    }
+
 }

[brooklyn-server] 03/03: allow REST endpoints to be extended by tests and/or statics

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit 90844d209f6edd87531925b965a4661f8ff0d000
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Thu Sep 30 16:01:54 2021 +0100

    allow REST endpoints to be extended by tests and/or statics
---
 .../org/apache/brooklyn/rest/BrooklynRestApi.java    | 20 +++++++++++++++++++-
 .../org/apache/brooklyn/rest/BrooklynRestApp.java    |  2 +-
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynRestApi.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynRestApi.java
index e9de19b..46fd54b 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynRestApi.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynRestApi.java
@@ -18,9 +18,11 @@
  */
 package org.apache.brooklyn.rest;
 
+import com.google.common.annotations.VisibleForTesting;
 import java.util.ArrayList;
 import java.util.List;
 
+import java.util.Set;
 import org.apache.brooklyn.rest.resources.*;
 import org.apache.brooklyn.rest.util.DefaultExceptionMapper;
 import org.apache.brooklyn.rest.util.FormMapProvider;
@@ -29,6 +31,7 @@ import org.apache.brooklyn.rest.util.json.BrooklynJacksonJsonProvider;
 import com.google.common.collect.Iterables;
 
 import io.swagger.jaxrs.listing.SwaggerSerializers;
+import org.apache.brooklyn.util.collections.MutableSet;
 
 public class BrooklynRestApi {
 
@@ -71,7 +74,22 @@ public class BrooklynRestApi {
         return resources;
     }
 
+    static Set<Object> extraResources = MutableSet.of();
+
+    @VisibleForTesting
+    public static void addExtraResource(Object resource) {
+        extraResources.add(resource);
+    }
+    @VisibleForTesting
+    public static Set<Object> getExtraResourcesMutable() {
+        return extraResources;
+    }
+
+    public static Set<Object> getExtraResources() {
+        return MutableSet.copyOf(extraResources);
+    }
+
     public static Iterable<Object> getAllResources() {
-        return Iterables.concat(getBrooklynRestResources(), getApidocResources(), getMiscResources());
+        return Iterables.concat(getBrooklynRestResources(), getApidocResources(), getMiscResources(), getExtraResources());
     }
 }
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynRestApp.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynRestApp.java
index 05b9092..41e7120 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynRestApp.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynRestApp.java
@@ -30,7 +30,7 @@ public class BrooklynRestApp extends Application {
     private Set<Object> singletons;
 
     public BrooklynRestApp() {
-        singletons = Sets.newHashSet(BrooklynRestApi.getAllResources());
+        singletons = Sets.newLinkedHashSet(BrooklynRestApi.getAllResources());
     }
 
     public BrooklynRestApp singleton(Object singleton) {

[brooklyn-server] 01/03: convenience to MutableMap for transforming an existing map

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit 3c71dcee8210d47f37da4e223037f92d046f4f7c
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Thu Sep 30 16:01:28 2021 +0100

    convenience to MutableMap for transforming an existing map
---
 .../org/apache/brooklyn/util/collections/MutableMap.java     | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/collections/MutableMap.java b/utils/common/src/main/java/org/apache/brooklyn/util/collections/MutableMap.java
index 41a9bd1..280caa2 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/collections/MutableMap.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/collections/MutableMap.java
@@ -24,6 +24,7 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import java.util.function.Function;
 import javax.annotation.Nullable;
 
 import org.apache.brooklyn.util.exceptions.Exceptions;
@@ -114,7 +115,16 @@ public class MutableMap<K,V> extends LinkedHashMap<K,V> {
             result.putAll(orig);
         return result;
     }
-    
+
+    /** creates a copy of a map, transforming the values */
+    public static <K,V1,V2> MutableMap<K,V2> copyOf(@Nullable Map<? extends K, ? extends V1> orig, Function<V1,V2> transform) {
+        MutableMap<K,V2> result = new MutableMap<>();
+        if (orig!=null) {
+            orig.forEach( (k,v) -> result.put(k, transform.apply(v)) );
+        }
+        return result;
+    }
+
     public MutableMap() {}
     @SuppressWarnings("unchecked")
     public MutableMap(@SuppressWarnings("rawtypes") Map source) { super(source); }