Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id B6CE2200B17 for ; Mon, 6 Jun 2016 16:45:58 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id B57D3160A1E; Mon, 6 Jun 2016 14:45:58 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 7F4BE160A5A for ; Mon, 6 Jun 2016 16:45:57 +0200 (CEST) Received: (qmail 69904 invoked by uid 500); 6 Jun 2016 14:45:56 -0000 Mailing-List: contact commits-help@brooklyn.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@brooklyn.apache.org Delivered-To: mailing list commits@brooklyn.apache.org Received: (qmail 69722 invoked by uid 99); 6 Jun 2016 14:45:56 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 06 Jun 2016 14:45:56 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 04ECAE0B2A; Mon, 6 Jun 2016 14:45:56 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: svet@apache.org To: commits@brooklyn.apache.org Date: Mon, 06 Jun 2016 14:46:02 -0000 Message-Id: <72fb53f8e3db475b9c1000dbeced645b@git.apache.org> In-Reply-To: <9ed7a8c430c04542a42c5ea02eaa3f5b@git.apache.org> References: <9ed7a8c430c04542a42c5ea02eaa3f5b@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: =?utf-8?q?=5B8/9=5D_brooklyn-server_git_commit=3A_Rename_=E2=80=9C?= =?utf-8?b?bWVyZ2XigJ0gdG8g4oCcZGVlcF9tZXJnZeKAnSwgYW5kIFBSIDE3MyBjb21tZW50?= =?utf-8?q?s?= archived-at: Mon, 06 Jun 2016 14:45:58 -0000 Rename “merge” to “deep_merge”, and PR 173 comments Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/6dad5de0 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/6dad5de0 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/6dad5de0 Branch: refs/heads/master Commit: 6dad5de0663076fb0c44fde1fc69df9eb7cd0be6 Parents: 7a7f759 Author: Aled Sage Authored: Mon Jun 6 15:09:27 2016 +0100 Committer: Aled Sage Committed: Mon Jun 6 15:31:10 2016 +0100 ---------------------------------------------------------------------- .../BrooklynComponentTemplateResolver.java | 2 +- .../brooklyn/ConfigInheritanceYamlTest.java | 147 ++++++++++++++++++- .../ConfigLocationInheritanceYamlTest.java | 2 +- .../camp/brooklyn/ConfigParametersYamlTest.java | 2 +- .../core/entity/BrooklynConfigKeys.java | 2 +- .../core/entity/internal/EntityConfigMap.java | 4 +- .../entity/software/base/SoftwareProcess.java | 14 +- .../brooklyn/config/ConfigInheritance.java | 12 +- 8 files changed, 163 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6dad5de0/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java index ad5ca74..1654e5c 100644 --- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java +++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java @@ -337,7 +337,7 @@ public class BrooklynComponentTemplateResolver { switch (mode) { case IF_NO_EXPLICIT_VALUE: return ownVal.isPresent() ? ownVal : superVal; - case MERGE: + case DEEP_MERGE: return deepMerge(ownVal, superVal, key); case NONE: return ownVal; http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6dad5de0/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigInheritanceYamlTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigInheritanceYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigInheritanceYamlTest.java index 9f52ded..36cd02b 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigInheritanceYamlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigInheritanceYamlTest.java @@ -31,10 +31,13 @@ import java.util.concurrent.Executors; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.core.config.MapConfigKey; +import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.entity.EntityAsserts; +import org.apache.brooklyn.core.entity.internal.EntityConfigMap; import org.apache.brooklyn.core.sensor.Sensors; import org.apache.brooklyn.core.test.entity.TestEntity; import org.apache.brooklyn.entity.software.base.EmptySoftwareProcess; +import org.apache.brooklyn.entity.stock.BasicApplication; import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.core.internal.ssh.RecordingSshTool; import org.slf4j.Logger; @@ -44,6 +47,7 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.google.api.client.repackaged.com.google.common.base.Joiner; +import com.google.common.base.Predicates; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; @@ -396,7 +400,7 @@ public class ConfigInheritanceYamlTest extends AbstractYamlTest { " brooklyn.parameters:", " - name: map.type-merged", " type: java.util.Map", - " inheritance.type: merge", + " inheritance.type: deep_merge", " default: {myDefaultKey: myDefaultVal}", " - name: map.type-always", " type: java.util.Map", @@ -501,7 +505,7 @@ public class ConfigInheritanceYamlTest extends AbstractYamlTest { " brooklyn.parameters:", " - name: map.type-merged", " type: java.util.Map", - " inheritance.parent: merge", + " inheritance.parent: deep_merge", " default: {myDefaultKey: myDefaultVal}", " - name: map.type-always", " type: java.util.Map", @@ -636,9 +640,9 @@ public class ConfigInheritanceYamlTest extends AbstractYamlTest { EntityAsserts.assertConfigEquals(entity, EmptySoftwareProcess.SHELL_ENVIRONMENT, expectedEnv); } - // TODO Does not work, and probably hard to fix?! We need to figure out that "env" corresponds to the + // TODO Has never worked, and probably hard to fix?! We need to figure out that "env" corresponds to the // config key. Maybe FlagUtils could respect SetFromFlags when returning Map? - @Test(groups="WIP") + @Test(groups={"WIP", "Broken"}) public void testExtendsSuperTypeConfigMixingShortOverridingShortName() throws Exception { ImmutableMap expectedEnv = ImmutableMap.of("ENV1", "myEnv1", "ENV2", "myEnv2"); @@ -656,6 +660,141 @@ public class ConfigInheritanceYamlTest extends AbstractYamlTest { EntityAsserts.assertConfigEquals(entity, EmptySoftwareProcess.SHELL_ENVIRONMENT, expectedEnv); } + @Test + public void testExtendsSuperTypeMultipleLevels() throws Exception { + addCatalogItems( + "brooklyn.catalog:", + " id: EmptySoftwareProcess-level1", + " itemType: entity", + " item:", + " type: org.apache.brooklyn.entity.software.base.EmptySoftwareProcess", + " brooklyn.config:", + " shell.env:", + " ENV1: myEnv1"); + + addCatalogItems( + "brooklyn.catalog:", + " id: EmptySoftwareProcess-level2", + " itemType: entity", + " item:", + " type: EmptySoftwareProcess-level1", + " brooklyn.config:", + " shell.env:", + " ENV2: myEnv2"); + + addCatalogItems( + "brooklyn.catalog:", + " id: EmptySoftwareProcess-level3", + " itemType: entity", + " item:", + " type: EmptySoftwareProcess-level2", + " brooklyn.config:", + " shell.env:", + " ENV3: myEnv3"); + + String yaml = Joiner.on("\n").join( + "location: localhost-stub", + "services:", + "- type: EmptySoftwareProcess-level3"); + + Entity app = createStartWaitAndLogApplication(new StringReader(yaml)); + Entity entity = Iterables.getOnlyElement(app.getChildren()); + EntityAsserts.assertConfigEquals(entity, EmptySoftwareProcess.SHELL_ENVIRONMENT, + ImmutableMap.of("ENV1", "myEnv1", "ENV2", "myEnv2", "ENV3", "myEnv3")); + } + + @Test + public void testExtendsSuperTypeMultipleLevelsInheritanceOptions() throws Exception { + addCatalogItems( + "brooklyn.catalog:", + " itemType: entity", + " items:", + " - id: TestEntity-level1", + " item:", + " type: org.apache.brooklyn.core.test.entity.TestEntity", + " brooklyn.parameters:", + " - name: map.type-merged", + " type: java.util.Map", + " inheritance.type: deep_merge", + " brooklyn.config:", + " map.type-merged:", + " mykey1: myval1"); + + addCatalogItems( + "brooklyn.catalog:", + " id: TestEntity-level2", + " itemType: entity", + " item:", + " type: TestEntity-level1", + " brooklyn.config:", + " map.type-merged:", + " mykey2: myval2"); + + addCatalogItems( + "brooklyn.catalog:", + " id: TestEntity-level3", + " itemType: entity", + " item:", + " type: TestEntity-level2", + " brooklyn.config:", + " map.type-merged:", + " mykey3: myval3"); + + String yaml = Joiner.on("\n").join( + "services:", + "- type: TestEntity-level3"); + + Entity app = createStartWaitAndLogApplication(new StringReader(yaml)); + TestEntity entity = (TestEntity) Iterables.getOnlyElement(app.getChildren()); + + assertEquals(entity.config().get(entity.getEntityType().getConfigKey("map.type-merged")), + ImmutableMap.of("mykey1", "myval1", "mykey2", "myval2", "mykey3", "myval3")); + } + + /** + * TODO Has always failed, and probably hard to fix?! This is due to the way + * {@link EntityConfigMap#setInheritedConfig(Map, org.apache.brooklyn.util.core.config.ConfigBag)} works: + * the parent overrides the grandparent's config. So we only get mykey2+mykey3. + */ + @Test(groups={"Broken", "WIP"}) + public void testExtendsParentMultipleLevels() throws Exception { + addCatalogItems( + "brooklyn.catalog:", + " itemType: entity", + " items:", + " - id: TestEntity-with-conf", + " item:", + " type: org.apache.brooklyn.core.test.entity.TestEntity", + " brooklyn.parameters:", + " - name: map.type-merged", + " type: java.util.Map", + " inheritance.parent: deep_merge"); + + String yaml = Joiner.on("\n").join( + "location: localhost-stub", + "services:", + "- type: "+BasicApplication.class.getName(), + " brooklyn.config:", + " map.type-merged:", + " mykey1: myval1", + " brooklyn.children:", + " - type: "+BasicApplication.class.getName(), + " brooklyn.config:", + " map.type-merged:", + " mykey2: myval2", + " brooklyn.children:", + " - type: TestEntity-with-conf", + " brooklyn.config:", + " map.type-merged:", + " mykey3: myval3"); + + Entity app = createStartWaitAndLogApplication(new StringReader(yaml)); + Entity entity = Iterables.find(Entities.descendants(app), Predicates.instanceOf(TestEntity.class)); + + assertEquals(entity.config().get(entity.getEntityType().getConfigKey("map.type-merged")), + ImmutableMap.of("mykey1", "myval1", "mykey2", "myval2", "mykey3", "myval3")); + } + protected void assertEmptySoftwareProcessConfig(Entity entity, Map expectedEnv, Map expectedFiles, Map expectedProvisioningProps) { EntityAsserts.assertConfigEquals(entity, EmptySoftwareProcess.SHELL_ENVIRONMENT, MutableMap.copyOf(expectedEnv)); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6dad5de0/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigLocationInheritanceYamlTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigLocationInheritanceYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigLocationInheritanceYamlTest.java index 0a40275..eaf0d22 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigLocationInheritanceYamlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigLocationInheritanceYamlTest.java @@ -322,7 +322,7 @@ public class ConfigLocationInheritanceYamlTest extends AbstractYamlTest { // TODO This doesn't work yet. Unfortunately the YAML parsing for entity and location items // is different (e.g. BrooklynComponentTemplateResolver.decorateSpec only deals with entities). // That is too big to deal with in this pull request that targets entity config! - @Test(groups="Live", enabled=false) + @Test(groups={"Live", "WIP", "Broken"}, enabled=false) public void testMergesCatalogLocationProperties() throws Exception { addCatalogItems( "brooklyn.catalog:", http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6dad5de0/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java index 0dce749..869558b 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java @@ -52,7 +52,7 @@ public class ConfigParametersYamlTest extends AbstractYamlTest { " - name: testConfigParametersListedInType.mykey", " description: myDescription", " type: java.util.Map", - " inheritance.type: merge", + " inheritance.type: deep_merge", " default: {myDefaultKey: myDefaultVal}"); String yaml = Joiner.on("\n").join( http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6dad5de0/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java b/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java index 1526df0..d9cb7ad 100644 --- a/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java +++ b/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java @@ -115,7 +115,7 @@ public class BrooklynConfigKeys { public static final MapConfigKey SHELL_ENVIRONMENT = new MapConfigKey.Builder(Object.class, "shell.env") .description("Map of environment variables to pass to the runtime shell") .defaultValue(ImmutableMap.of()) - .typeInheritance(ConfigInheritance.MERGE) + .typeInheritance(ConfigInheritance.DEEP_MERGE) .build(); public static final AttributeSensorAndConfigKey INSTALL_DIR = new TemplatedStringAttributeSensorAndConfigKey("install.dir", "Directory for this software to be installed in", http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6dad5de0/core/src/main/java/org/apache/brooklyn/core/entity/internal/EntityConfigMap.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/internal/EntityConfigMap.java b/core/src/main/java/org/apache/brooklyn/core/entity/internal/EntityConfigMap.java index 7337bbf..97f61f7 100644 --- a/core/src/main/java/org/apache/brooklyn/core/entity/internal/EntityConfigMap.java +++ b/core/src/main/java/org/apache/brooklyn/core/entity/internal/EntityConfigMap.java @@ -157,7 +157,7 @@ public class EntityConfigMap extends AbstractConfigMapImpl { parentValue = Maybe.absent(); } break; - case MERGE: + case DEEP_MERGE: if (((ConfigKeySelfExtracting)key).isSet(inheritedConfig)) { parentValue = Maybe.of(((ConfigKeySelfExtracting)key).extractValue(inheritedConfig, exec)); } else if (inheritedConfigBag.containsKey(key)) { @@ -177,7 +177,7 @@ public class EntityConfigMap extends AbstractConfigMapImpl { switch (parentInheritance) { case IF_NO_EXPLICIT_VALUE: return ownValue.isPresent() ? ownValue : parentValue; - case MERGE: + case DEEP_MERGE: return (Maybe) deepMerge(ownValue, parentValue, key); case NONE: return ownValue; http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6dad5de0/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java index 304b6c7..68a95ca 100644 --- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java +++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java @@ -175,7 +175,7 @@ public interface SoftwareProcess extends Entity, Startable { @SetFromFlag("preInstallFiles") MapConfigKey PRE_INSTALL_FILES = new MapConfigKey.Builder(String.class, "files.preinstall") .description("Mapping of files, to be copied before install, to destination name relative to installDir") - .typeInheritance(ConfigInheritance.MERGE) + .typeInheritance(ConfigInheritance.DEEP_MERGE) .build(); /** @@ -187,7 +187,7 @@ public interface SoftwareProcess extends Entity, Startable { @SetFromFlag("preInstallTemplates") MapConfigKey PRE_INSTALL_TEMPLATES = new MapConfigKey.Builder(String.class, "templates.preinstall") .description("Mapping of templates, to be filled in and copied before pre-install, to destination name relative to installDir") - .typeInheritance(ConfigInheritance.MERGE) + .typeInheritance(ConfigInheritance.DEEP_MERGE) .build(); /** @@ -202,7 +202,7 @@ public interface SoftwareProcess extends Entity, Startable { @SetFromFlag("installFiles") MapConfigKey INSTALL_FILES = new MapConfigKey.Builder(String.class, "files.install") .description("Mapping of files, to be copied before install, to destination name relative to installDir") - .typeInheritance(ConfigInheritance.MERGE) + .typeInheritance(ConfigInheritance.DEEP_MERGE) .build(); /** @@ -214,7 +214,7 @@ public interface SoftwareProcess extends Entity, Startable { @SetFromFlag("installTemplates") MapConfigKey INSTALL_TEMPLATES = new MapConfigKey.Builder(String.class, "templates.install") .description("Mapping of templates, to be filled in and copied before install, to destination name relative to installDir") - .typeInheritance(ConfigInheritance.MERGE) + .typeInheritance(ConfigInheritance.DEEP_MERGE) .build(); /** @@ -229,7 +229,7 @@ public interface SoftwareProcess extends Entity, Startable { @SetFromFlag("runtimeFiles") MapConfigKey RUNTIME_FILES = new MapConfigKey.Builder(String.class, "files.runtime") .description("Mapping of files, to be copied before customisation, to destination name relative to runDir") - .typeInheritance(ConfigInheritance.MERGE) + .typeInheritance(ConfigInheritance.DEEP_MERGE) .build(); /** @@ -241,14 +241,14 @@ public interface SoftwareProcess extends Entity, Startable { @SetFromFlag("runtimeTemplates") MapConfigKey RUNTIME_TEMPLATES = new MapConfigKey.Builder(String.class, "templates.runtime") .description("Mapping of templates, to be filled in and copied before customisation, to destination name relative to runDir") - .typeInheritance(ConfigInheritance.MERGE) + .typeInheritance(ConfigInheritance.DEEP_MERGE) .build(); @SetFromFlag("provisioningProperties") MapConfigKey PROVISIONING_PROPERTIES = new MapConfigKey.Builder(Object.class, "provisioning.properties") .description("Custom properties to be passed in when provisioning a new machine") .defaultValue(ImmutableMap.of()) - .typeInheritance(ConfigInheritance.MERGE) + .typeInheritance(ConfigInheritance.DEEP_MERGE) .build(); @SetFromFlag("maxRebindSensorsDelay") http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6dad5de0/utils/common/src/main/java/org/apache/brooklyn/config/ConfigInheritance.java ---------------------------------------------------------------------- diff --git a/utils/common/src/main/java/org/apache/brooklyn/config/ConfigInheritance.java b/utils/common/src/main/java/org/apache/brooklyn/config/ConfigInheritance.java index 81db3cc..3ff163f 100644 --- a/utils/common/src/main/java/org/apache/brooklyn/config/ConfigInheritance.java +++ b/utils/common/src/main/java/org/apache/brooklyn/config/ConfigInheritance.java @@ -27,15 +27,16 @@ import com.google.common.annotations.Beta; @SuppressWarnings("serial") public abstract class ConfigInheritance implements Serializable { + @Beta public enum InheritanceMode { NONE, IF_NO_EXPLICIT_VALUE, - MERGE + DEEP_MERGE } public static final ConfigInheritance NONE = new None(); public static final ConfigInheritance ALWAYS = new Always(); - public static final ConfigInheritance MERGE = new Merged(); + public static final ConfigInheritance DEEP_MERGE = new Merged(); public static ConfigInheritance fromString(String val) { if (Strings.isBlank(val)) return null; @@ -44,8 +45,9 @@ public abstract class ConfigInheritance implements Serializable { return NONE; case "always": return ALWAYS; - case "merge" : - return MERGE; + case "deepmerge" : + case "deep_merge" : + return DEEP_MERGE; default: throw new IllegalArgumentException("Invalid config-inheritance '"+val+"' (legal values are none, always or merge)"); } @@ -73,7 +75,7 @@ public abstract class ConfigInheritance implements Serializable { private static class Merged extends ConfigInheritance { @Override public InheritanceMode isInherited(ConfigKey key, Object from, Object to) { - return InheritanceMode.MERGE; + return InheritanceMode.DEEP_MERGE; } } }