brooklyn-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From henev...@apache.org
Subject [05/28] brooklyn-server git commit: implement inheritance of config default values
Date Wed, 15 Feb 2017 18:30:58 GMT
implement inheritance of config default values

test and code changes to respect the additional inheritance argument added in the previous
request:
resolves https://issues.apache.org/jira/browse/BROOKLYN-267


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/667c3dff
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/667c3dff
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/667c3dff

Branch: refs/heads/master
Commit: 667c3dffbe654dfb409a64ab7e2675784c7d7433
Parents: aef2c7c
Author: Alex Heneveld <alex.heneveld@cloudsoftcorp.com>
Authored: Thu Nov 17 15:12:09 2016 +0000
Committer: Alex Heneveld <alex@Alexs-MacBook-Pro.local>
Committed: Tue Dec 6 10:05:21 2016 +0000

----------------------------------------------------------------------
 .../core/config/BasicConfigInheritance.java     | 15 +++++-----
 .../brooklyn/core/entity/EntityConfigTest.java  | 10 +++++++
 .../brooklyn/config/ConfigInheritances.java     | 30 ++++++++++++++------
 .../org/apache/brooklyn/util/guava/Maybe.java   |  2 ++
 4 files changed, 40 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/667c3dff/core/src/main/java/org/apache/brooklyn/core/config/BasicConfigInheritance.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/config/BasicConfigInheritance.java
b/core/src/main/java/org/apache/brooklyn/core/config/BasicConfigInheritance.java
index dd3b336..54336a0 100644
--- a/core/src/main/java/org/apache/brooklyn/core/config/BasicConfigInheritance.java
+++ b/core/src/main/java/org/apache/brooklyn/core/config/BasicConfigInheritance.java
@@ -184,12 +184,6 @@ public class BasicConfigInheritance implements ConfigInheritance {
     @Nonnull
     protected final Boolean ancestorDefaultInheritable;
     
-    /* TODO
-     * - document key definition inference vs explicitness (conflict resolution is inferred
from nearest descendant explicit key; whereas other values don't apply if no explicit key)
-     * - ancestor default value inheritance -- https://issues.apache.org/jira/browse/BROOKLYN-267
-     * - immediate config evaluation
-     */
-
     @Deprecated /** @deprecated since 0.10.0 use four-arg constructor */
     protected BasicConfigInheritance(boolean isReinherited, @Nullable String conflictResolutionStrategy,
boolean localDefaultResolvesWithAncestorValue) {
         this(isReinherited, conflictResolutionStrategy, localDefaultResolvesWithAncestorValue,
true);
@@ -252,8 +246,12 @@ public class BasicConfigInheritance implements ConfigInheritance {
         
         checkInheritanceContext(local, context);
         
-        if (!parent.isValueExplicitlySet() && !getLocalDefaultResolvesWithAncestorValue())

+        if (!parent.isValueExplicitlySet() && !getLocalDefaultResolvesWithAncestorValue())
{
+            if (getAncestorDefaultInheritable() && !local.isValueExplicitlySet()
&& local.getDefaultValue().isAbsentOrNull() && parent.getDefaultValue().isPresentAndNonNull())
{
+                return ReferenceWithError.newInstanceWithoutError(new BasicConfigValueAtContainer<TContainer,TValue>(parent));
+            }
             return ReferenceWithError.newInstanceWithoutError(new BasicConfigValueAtContainer<TContainer,TValue>(local));
+        }
         
         // parent explicitly set (or we might have to merge defaults), 
         // and by the contract of this method we can assume reinheritable
@@ -266,7 +264,8 @@ public class BasicConfigInheritance implements ConfigInheritance {
             BasicConfigValueAtContainer<TContainer, TValue> result = new BasicConfigValueAtContainer<TContainer,TValue>(local);
             ReferenceWithError<Maybe<? extends TValue>> resolvedValue = deepMerge(
                 local.isValueExplicitlySet() ? local.asMaybe() : local.getDefaultValue(),

-                    parent.isValueExplicitlySet() ? parent.asMaybe() : parent.getDefaultValue());
+                    parent.isValueExplicitlySet() ? parent.asMaybe() : 
+                        getAncestorDefaultInheritable() ? parent.getDefaultValue() : Maybe.<TValue>absent());
             result.setValue(resolvedValue.getWithoutError());
             return ReferenceWithError.newInstanceThrowingError(result, resolvedValue.getError());
         }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/667c3dff/core/src/test/java/org/apache/brooklyn/core/entity/EntityConfigTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/EntityConfigTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/EntityConfigTest.java
index c25e6d2..a16548b 100644
--- a/core/src/test/java/org/apache/brooklyn/core/entity/EntityConfigTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/EntityConfigTest.java
@@ -42,6 +42,7 @@ import org.apache.brooklyn.core.config.ConfigPredicates;
 import org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey.IntegerAttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestEntity;
+import org.apache.brooklyn.entity.stock.BasicEntity;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
 import org.apache.brooklyn.util.core.task.BasicTask;
 import org.apache.brooklyn.util.core.task.DeferredSupplier;
@@ -533,4 +534,13 @@ public class EntityConfigTest extends BrooklynAppUnitTestSupport {
         @SetFromFlag("mychildconfigflagname")
         public static final ConfigKey<String> MY_CHILD_CONFIG_WITH_FLAGNAME = ConfigKeys.newStringConfigKey("mychildentity.myconfigwithflagname");
     }
+    
+    @Test
+    public void testInheritedDefault() {
+        final Entity e1 = app.addChild(EntitySpec.create(MyBaseEntity.class));
+        final Entity e2 = e1.addChild(EntitySpec.create(BasicEntity.class));
+        Assert.assertEquals(e2.config().get(MyBaseEntity.SUPER_KEY_1), MyBaseEntity.SUPER_KEY_1.getDefaultValue());
+        Assert.assertEquals(e2.config().get(ConfigKeys.newStringConfigKey(MyBaseEntity.SUPER_KEY_1.getName())),
MyBaseEntity.SUPER_KEY_1.getDefaultValue());
+    }
+    
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/667c3dff/utils/common/src/main/java/org/apache/brooklyn/config/ConfigInheritances.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/org/apache/brooklyn/config/ConfigInheritances.java
b/utils/common/src/main/java/org/apache/brooklyn/config/ConfigInheritances.java
index bac207d..02e9ef0 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/config/ConfigInheritances.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/config/ConfigInheritances.java
@@ -69,7 +69,7 @@ public class ConfigInheritances {
             ancestorContainerKeyValues, key, context, defaultInheritance);
     }
     
-    /** as {@link #resolveInheriting(Object, ConfigKey, Maybe, Iterator, ConfigInheritanceContext,
ConfigInheritance)}
+    /** as {@link #resolveInheriting(Object, ConfigKey, Maybe, Maybe, Iterator, ConfigInheritanceContext,
ConfigInheritance)}
      * but convenient when the local info is already in a {@link ConfigValueAtContainer}
*/
     public static <TContainer,TValue> ReferenceWithError<ConfigValueAtContainer<TContainer,TValue>>
resolveInheriting(
         ConfigValueAtContainer<TContainer,TValue> local,
@@ -77,7 +77,9 @@ public class ConfigInheritances {
         ConfigKey<TValue> queryKey,
         ConfigInheritanceContext context,
         ConfigInheritance defaultInheritance) {
-                    
+
+        BasicConfigValueAtContainer<TContainer, TValue> result = null;
+        
         if (ancestorContainerKeyValues.hasNext()) {
             ConfigValueAtContainer<TContainer, TValue> parent = ancestorContainerKeyValues.next();
             ConfigInheritance parentInheritance = findInheritance(parent, context, null);
@@ -86,18 +88,28 @@ public class ConfigInheritances {
                 if (currentInheritance.considerParent(local, parent, context)) {
                     ReferenceWithError<ConfigValueAtContainer<TContainer, TValue>>
parentResult = resolveInheriting(parent, ancestorContainerKeyValues, queryKey, context, currentInheritance);
                     ReferenceWithError<ConfigValueAtContainer<TContainer,TValue>>
resultWithParent = currentInheritance.resolveWithParent(local, parentResult.getWithoutError(),
context);
-                    if (resultWithParent!=null && resultWithParent.getWithoutError()!=null
&& resultWithParent.getWithoutError().isValueExplicitlySet()) {
-                        if (!resultWithParent.hasError() && parentResult!=null &&
parentResult.hasError()) {
-                            return ReferenceWithError.newInstanceThrowingError(resultWithParent.getWithoutError(),
parentResult.getError());
+                    if (resultWithParent!=null) {
+                        if (resultWithParent.getWithoutError()!=null && resultWithParent.getWithoutError().isValueExplicitlySet())
{
+                            if (!resultWithParent.hasError() && parentResult!=null
&& parentResult.hasError()) {
+                                return ReferenceWithError.newInstanceThrowingError(resultWithParent.getWithoutError(),
parentResult.getError());
+                            }
+                            return resultWithParent;
+                        } else {
+                            result = new BasicConfigValueAtContainer<TContainer, TValue>(
resultWithParent.getWithoutError() );
                         }
-                        return resultWithParent;
                     }
                 }
             }
         }
-        BasicConfigValueAtContainer<TContainer, TValue> result = new BasicConfigValueAtContainer<TContainer,
TValue>(local);
-        if (!local.isValueExplicitlySet() && local.getDefaultValue().isPresent())
{
-            result.value = local.getDefaultValue();
+        if (result==null) {
+            result = new BasicConfigValueAtContainer<TContainer, TValue>(local);
+            if (!local.isValueExplicitlySet() && local.getDefaultValue().isPresent())
{
+                result.value = local.getDefaultValue();
+            }
+        } else {
+            if (!result.isValueExplicitlySet()) {
+                result.value = result.getDefaultValue();
+            }
         }
         return ReferenceWithError.newInstanceWithoutError(result);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/667c3dff/utils/common/src/main/java/org/apache/brooklyn/util/guava/Maybe.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/guava/Maybe.java b/utils/common/src/main/java/org/apache/brooklyn/util/guava/Maybe.java
index 5270595..37fade3 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/guava/Maybe.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/guava/Maybe.java
@@ -457,6 +457,8 @@ public abstract class Maybe<T> implements Serializable, Supplier<T>
{
         Maybe<?> other = (Maybe<?>)obj;
         if (!isPresent()) 
             return !other.isPresent();
+        if (!other.isPresent())
+            return false;
         return Objects.equal(get(), other.get());
     }
 


Mime
View raw message