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 492e34f4dbc51cb29f937edd1365b238a8dbc4b3
Author: Alex Heneveld <[email protected]>
AuthorDate: Fri Aug 6 13:32:07 2021 +0100

    more thorough way to replace scopeRoot with self
    
    but with some gaps, described by a TODO
---
 .../camp/brooklyn/spi/creation/CampResolver.java   | 46 +++++++++++++++-------
 1 file changed, 32 insertions(+), 14 deletions(-)

diff --git 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
index 9d809d9..548bc1e 100644
--- 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
+++ 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
@@ -38,8 +38,11 @@ import 
org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext;
 import org.apache.brooklyn.camp.BasicCampPlatform;
 import org.apache.brooklyn.camp.CampPlatform;
 import org.apache.brooklyn.camp.brooklyn.api.AssemblyTemplateSpecInstantiator;
+import org.apache.brooklyn.camp.brooklyn.spi.dsl.BrooklynDslDeferredSupplier;
+import org.apache.brooklyn.camp.brooklyn.spi.dsl.DslUtils;
 import org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent;
 import org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent.Scope;
+import org.apache.brooklyn.camp.brooklyn.spi.dsl.parse.DslParser;
 import org.apache.brooklyn.camp.spi.AssemblyTemplate;
 import org.apache.brooklyn.camp.spi.instantiate.AssemblyTemplateInstantiator;
 import org.apache.brooklyn.config.ConfigKey;
@@ -129,9 +132,9 @@ class CampResolver {
             } else if (RegisteredTypes.isAnyTypeSubtypeOf(supers, 
Location.class)) {
                 spec = CampInternalUtils.createLocationSpec(planYaml, loader, 
encounteredTypes);
             } else if (RegisteredTypes.isAnyTypeSubtypeOf(supers, 
Application.class)) {
-                spec = createEntitySpecFromServicesBlock(planYaml, loader, 
encounteredTypes, true);
+                spec = createEntitySpecFromServicesBlock(mgmt, planYaml, 
loader, encounteredTypes, true);
             } else if (RegisteredTypes.isAnyTypeSubtypeOf(supers, 
Entity.class)) {
-                spec = createEntitySpecFromServicesBlock(planYaml, loader, 
encounteredTypes, false);
+                spec = createEntitySpecFromServicesBlock(mgmt, planYaml, 
loader, encounteredTypes, false);
             } else {
                 String msg = (item.getSuperTypes()==null || 
item.getSuperTypes().isEmpty()) ? "no supertypes declared" : "incompatible 
supertypes "+item.getSuperTypes();
                 String itemName = 
Strings.firstNonBlank(item.getSymbolicName(), 
BasicBrooklynCatalog.currentlyResolvingType.get(), "<unidentified>");
@@ -168,7 +171,7 @@ class CampResolver {
         }
     }
  
-    private static EntitySpec<?> createEntitySpecFromServicesBlock(String 
plan, BrooklynClassLoadingContext loader, Set<String> encounteredTypes, boolean 
isApplication) {
+    private static EntitySpec<?> 
createEntitySpecFromServicesBlock(ManagementContext mgmt, String plan, 
BrooklynClassLoadingContext loader, Set<String> encounteredTypes, boolean 
isApplication) {
         CampPlatform camp = 
CampInternalUtils.getCampPlatform(loader.getManagementContext());
 
         // TODO instead of BasicBrooklynCatalog.attemptLegacySpecTransformers 
where candidate yaml has 'services:' prepended, try that in this method
@@ -186,7 +189,7 @@ class CampResolver {
             // the instantiator will have done that, and it knows if the plan
             // specified a wrapped app explicitly (whereas we don't easily 
know that here!)
 
-            fixScopeRootAtRoot(result);
+            fixScopeRootAtRoot(mgmt, result);
 
             return result;
             
@@ -199,26 +202,41 @@ class CampResolver {
 
     }
 
-    private static void fixScopeRootAtRoot(EntitySpec<?> node) {
+    private static void fixScopeRootAtRoot(ManagementContext mgmt, 
EntitySpec<?> node) {
         node.getConfig().entrySet().forEach(entry -> {
-            fixScopeRoot(entry.getValue(), newValue -> node.configure( 
(ConfigKey) entry.getKey(), newValue));
+            fixScopeRoot(mgmt, entry.getValue(), newValue -> node.configure( 
(ConfigKey) entry.getKey(), newValue));
         });
         node.getFlags().entrySet().forEach(entry -> {
-            fixScopeRoot(entry.getValue(), newValue -> node.configure( 
entry.getKey(), newValue));
+            fixScopeRoot(mgmt, entry.getValue(), newValue -> node.configure( 
entry.getKey(), newValue));
         });
     }
 
-    private static void fixScopeRoot(Object value, Consumer<Object> updater) {
+    private static void fixScopeRoot(ManagementContext mgmt, Object value, 
Consumer<Object> updater) {
         Function<String,String> fixString = v -> "$brooklyn:self()" + 
Strings.removeFromStart((String)v, "$brooklyn:scopeRoot()");
-        if (value instanceof String && 
((String)value).startsWith("$brooklyn:scopeRoot()")) {
-            value = fixString.apply((String)value);
-            updater.accept(value);
-        } else if (value instanceof DslComponent) {
+        if (value instanceof String) {
+            if (((String)value).startsWith("$brooklyn:scopeRoot()")) {
+                updater.accept( fixString.apply((String)value) );
+            }
+            return;
+        }
+        if (value instanceof BrooklynDslDeferredSupplier) {
+            if (value.toString().startsWith("$brooklyn:scopeRoot()")) {
+                updater.accept(DslUtils.parseBrooklynDsl(mgmt, 
fixString.apply(value.toString())));
+                return;
+            }
+        }
+
+        if (value instanceof DslComponent) {
+            // superseded by above - no longer used?
             if ( ((DslComponent)value).getScope() == Scope.SCOPE_ROOT ) {
-                value = DslComponent.newInstanceChangingScope(Scope.THIS, 
(DslComponent) value, fixString);
-                updater.accept(value);
+                updater.accept( 
DslComponent.newInstanceChangingScope(Scope.THIS, (DslComponent) value, 
fixString) );
             }
+            return;
         }
+
+        // TODO replace within maps and strings; currently only supported at 
root of config or flags
+        // or have some way to gather the scope root components created and 
convert them all; easy enough for outer, but harder for nested DSL items,
+        // we need to update the dsl string as well as the items themselves
     }
 
 }
\ No newline at end of file

Reply via email to