Github user neykov commented on a diff in the pull request:

    https://github.com/apache/brooklyn-server/pull/173#discussion_r65534125
  
    --- Diff: 
camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
 ---
    @@ -257,37 +261,63 @@ private void configureEntityConfig(EntitySpec<?> 
spec, Set<String> encounteredRe
             // attrs will contain only brooklyn.xxx properties when coming 
from BrooklynEntityMatcher.
             // Any top-level flags will go into "brooklyn.flags". When 
resolving a spec from $brooklyn:entitySpec
             // top level flags remain in place. Have to support both cases.
    -
    +        //
    +        // For config values inherited from the super-type (be that the 
Java type or another catalog item
    +        // being extended), we lookup the config key to find out if the 
values should be merged, overridden or 
    +        // cleared.
    +        
             ConfigBag bag = ConfigBag.newInstance((Map<Object, Object>) 
attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_CONFIG));
             ConfigBag bagFlags = ConfigBag.newInstanceCopying(attrs);
             if (attrs.containsKey(BrooklynCampReservedKeys.BROOKLYN_FLAGS)) {
                 bagFlags.putAll((Map<String, Object>) 
attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_FLAGS));
             }
     
    -        Collection<FlagConfigKeyAndValueRecord> topLevelApparentConfig = 
findAllFlagsAndConfigKeys(spec, bagFlags);
    +        Collection<FlagConfigKeyAndValueRecord> topLevelApparentConfig = 
findAllFlagsAndConfigKeyValues(spec, bagFlags);
             for (FlagConfigKeyAndValueRecord r: topLevelApparentConfig) {
                 if (r.getConfigKeyMaybeValue().isPresent())
                     bag.putIfAbsent((ConfigKey)r.getConfigKey(), 
r.getConfigKeyMaybeValue().get());
                 if (r.getFlagMaybeValue().isPresent())
                     bag.putAsStringKeyIfAbsent(r.getFlagName(), 
r.getFlagMaybeValue().get());
             }
     
    +        
             // now set configuration for all the items in the bag
    -        Collection<FlagConfigKeyAndValueRecord> records = 
findAllFlagsAndConfigKeys(spec, bag);
    +        Map<String, ConfigKey<?>> entityConfigKeys = 
findAllConfigKeys(spec);
    +        
    +        Collection<FlagConfigKeyAndValueRecord> records = 
findAllFlagsAndConfigKeyValues(spec, bag);
             Set<String> keyNamesUsed = new LinkedHashSet<String>();
             for (FlagConfigKeyAndValueRecord r: records) {
                 if (r.getFlagMaybeValue().isPresent()) {
    -                Object transformed = new SpecialFlagsTransformer(loader, 
encounteredRegisteredTypeIds).apply(r.getFlagMaybeValue().get());
    -                spec.configure(r.getFlagName(), transformed);
    -                keyNamesUsed.add(r.getFlagName());
    +                String flag = r.getFlagName();
    +                Object ownVal = new SpecialFlagsTransformer(loader, 
encounteredRegisteredTypeIds).apply(r.getFlagMaybeValue().get());
    +                Maybe<?> superVal = spec.getFlags().containsKey(flag) ? 
Maybe.of(spec.getFlags().get(flag)) : Maybe.absent();
    +                Object combinedVal = 
combineValues(entityConfigKeys.get(flag), spec, Maybe.of(ownVal), 
superVal).get();
    +                spec.configure(flag, combinedVal);
    +                keyNamesUsed.add(flag);
                 }
                 if (r.getConfigKeyMaybeValue().isPresent()) {
    -                Object transformed = new SpecialFlagsTransformer(loader, 
encounteredRegisteredTypeIds).apply(r.getConfigKeyMaybeValue().get());
    -                spec.configure((ConfigKey<Object>)r.getConfigKey(), 
transformed);
    -                keyNamesUsed.add(r.getConfigKey().getName());
    +                ConfigKey<Object> key = (ConfigKey<Object>) 
r.getConfigKey();
    +                Object ownVal = new SpecialFlagsTransformer(loader, 
encounteredRegisteredTypeIds).apply(r.getConfigKeyMaybeValue().get());
    +                Maybe<?> superVal = spec.getConfig().containsKey(key) ? 
Maybe.of(spec.getConfig().get(key)) : Maybe.absent();
    +                Object combinedVal = 
combineValues(entityConfigKeys.get(key.getName()), spec, Maybe.of(ownVal), 
superVal).get();
    +                spec.configure(key, combinedVal);
    +                keyNamesUsed.add(key.getName());
                 }
             }
     
    +        // For anything that should not be inherited, clear if from the 
spec
    +        for (Map.Entry<String, ConfigKey<?>> entry : 
entityConfigKeys.entrySet()) {
    +            if (keyNamesUsed.contains(entry.getKey())) {
    +                continue;
    +            }
    +            ConfigKey<?> key = entry.getValue();
    +            InheritanceMode mode = getInheritanceMode(key, spec);
    +            if (mode == InheritanceMode.NONE) {
    +                spec.removeConfig(key);
    +                spec.removeFlag(key.getName());
    +            }
    +        }
    +        
    --- End diff --
    
    Should do analogous merging for locations?


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to