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 2022/01/21 14:32:44 UTC

[brooklyn-server] branch master updated (3f250e1 -> 50a2ef6)

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 3f250e1  This closes #1293
     new 0a58792  make copies of transformed maps to assist with serialization
     new 2ce6f22  suppress stack trace on ConcurrentModficationException during serialization
     new 3a3d95d  notes on limitation of ElectPrimaryPolicy
     new 2601ea0  make Mutable{list,set,map} more robust in the face of concurrent modifications
     new 595d730  suppress exceptions by not scanning when destroying
     new 648e1e9  fix rare intermittent test failure
     new 7a9736e  tidy elect primary policy
     new 9a3f7cf  This closes #1294
     new 6646639  Updated to json-smart 1.4.7
     new e8cee73  This closes #1292
     new 186d015  Updated to Karaf 4.3.6
     new 50a2ef6  This closes #1291

The 12 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:
 .../BrooklynComponentTemplateResolver.java         |  4 +-
 .../mgmt/persist/RetryingMementoSerializer.java    | 11 +++-
 .../entity/group/DynamicMultiGroupImpl.java        |  2 +
 .../util/core/xstream/MutableListConverter.java    | 77 ++++++++++++++++++++++
 .../util/core/xstream/MutableSetConverter.java     | 12 ++++
 .../util/core/xstream/StringKeyMapConverter.java   | 21 +++---
 .../brooklyn/util/core/xstream/XmlSerializer.java  |  3 +-
 .../mgmt/internal/EntityExecutionManagerTest.java  |  3 +-
 .../util/core/xstream/XmlSerializerTest.java       | 25 ++++---
 .../policy/failover/ElectPrimaryPolicy.java        | 16 ++++-
 pom.xml                                            |  4 +-
 11 files changed, 149 insertions(+), 29 deletions(-)
 create mode 100644 core/src/main/java/org/apache/brooklyn/util/core/xstream/MutableListConverter.java

[brooklyn-server] 10/12: This closes #1294

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 9a3f7cf71ea4eedb0e3537eaf176b7c2c184781f
Merge: 3f250e1 7a9736e
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Fri Jan 21 13:50:31 2022 +0000

    This closes #1294

 .../BrooklynComponentTemplateResolver.java         |  4 +-
 .../mgmt/persist/RetryingMementoSerializer.java    | 11 +++-
 .../entity/group/DynamicMultiGroupImpl.java        |  2 +
 .../util/core/xstream/MutableListConverter.java    | 77 ++++++++++++++++++++++
 .../util/core/xstream/MutableSetConverter.java     | 12 ++++
 .../util/core/xstream/StringKeyMapConverter.java   | 21 +++---
 .../brooklyn/util/core/xstream/XmlSerializer.java  |  3 +-
 .../mgmt/internal/EntityExecutionManagerTest.java  |  3 +-
 .../util/core/xstream/XmlSerializerTest.java       | 25 ++++---
 .../policy/failover/ElectPrimaryPolicy.java        | 16 ++++-
 10 files changed, 147 insertions(+), 27 deletions(-)

[brooklyn-server] 11/12: This closes #1292

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 e8cee73fbbf52ed7b59fbebb5fba834d07071291
Merge: 9a3f7cf 6646639
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Fri Jan 21 13:50:35 2022 +0000

    This closes #1292

 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

[brooklyn-server] 03/12: make copies of transformed maps to assist with serialization

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 0a587926ddceddfe1beca740f1ccf1be5f77df76
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Wed Jan 19 16:49:59 2022 +0000

    make copies of transformed maps to assist with serialization
    
    (otherwise they are lazily transformed and not on serialization, causing lambdas to try to be serialized)
---
 .../camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

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 eacb289..a673d70 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
@@ -535,7 +535,7 @@ public class BrooklynComponentTemplateResolver {
         @Override
         public Object apply(Object input) {
             if (input instanceof Map)
-                return transformSpecialFlags((Map<?, ?>)input);
+                return MutableMap.copyOf(transformSpecialFlags((Map<?, ?>)input));
             else if (input instanceof Set<?>)
                 return MutableSet.copyOf(transformSpecialFlags((Iterable<?>)input));
             else if (input instanceof List<?>)
@@ -574,7 +574,7 @@ public class BrooklynComponentTemplateResolver {
                 // TODO: This should called from BrooklynAssemblyTemplateInstantiator.configureEntityConfig
                 // And have transformSpecialFlags(Object flag, ManagementContext mgmt) drill into the Object flag if it's a map or iterable?
                 @SuppressWarnings("unchecked")
-                Map<String, Object> resolvedConfig = (Map<String, Object>)transformSpecialFlags(flag.getSpecConfiguration());
+                Map<String, Object> resolvedConfig = (Map<String, Object>)apply(flag.getSpecConfiguration());
                 EntitySpec<?> entitySpec;
                 try {
                     // first parse as a CAMP entity

[brooklyn-server] 07/12: suppress exceptions by not scanning when destroying

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 595d7300f830441c0b3a57bca7aee54a616b08b4
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Wed Jan 19 17:22:37 2022 +0000

    suppress exceptions by not scanning when destroying
---
 .../java/org/apache/brooklyn/entity/group/DynamicMultiGroupImpl.java    | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/core/src/main/java/org/apache/brooklyn/entity/group/DynamicMultiGroupImpl.java b/core/src/main/java/org/apache/brooklyn/entity/group/DynamicMultiGroupImpl.java
index b22566a..a60d8f4 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/group/DynamicMultiGroupImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/group/DynamicMultiGroupImpl.java
@@ -222,6 +222,8 @@ public class DynamicMultiGroupImpl extends DynamicGroupImpl implements DynamicMu
     @Override
     public void distributeEntities() {
         synchronized (memberChangeMutex) {
+            if (Entities.isNoLongerManaged(this)) return;
+
             Function<Entity, String> bucketFunction = getConfig(BUCKET_FUNCTION);
             EntitySpec<? extends BasicGroup> bucketSpec = getConfig(BUCKET_SPEC);
             if (bucketFunction == null || bucketSpec == null) return;

[brooklyn-server] 09/12: tidy elect primary policy

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 7a9736e121c5c76ffacd89333905fa108a6dfc99
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Fri Jan 21 13:38:18 2022 +0000

    tidy elect primary policy
---
 .../org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java   | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/policy/src/main/java/org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java b/policy/src/main/java/org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java
index 35a436e..e4cb8fb 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java
@@ -44,6 +44,7 @@ import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
 import org.apache.brooklyn.core.policy.AbstractPolicy;
 import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.entity.group.DynamicGroup;
+import org.apache.brooklyn.policy.failover.ElectPrimaryEffector.ResultCode;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.QuorumCheck.QuorumChecks;
 import org.apache.brooklyn.util.core.task.DynamicTasks;
@@ -255,7 +256,7 @@ public class ElectPrimaryPolicy extends AbstractPolicy implements ElectPrimaryCo
             Task<?> task = Effectors.invocation(entity, Preconditions.checkNotNull( ((EntityInternal)entity).getEffector(effName) ), config().getBag()).asTask();
             BrooklynTaskTags.addTagDynamically(task, BrooklynTaskTags.NON_TRANSIENT_TASK_TAG);
             
-            highlight("lastScan", "Running "+effName+" on "+contextString, task);
+            highlight("lastScan", "Running "+effName+"; triggered by "+contextString, task);
             
             Object result = DynamicTasks.get(task);
             if (result instanceof Map) code = Strings.toString( ((Map<?,?>)result).get("code") );
@@ -266,6 +267,9 @@ public class ElectPrimaryPolicy extends AbstractPolicy implements ElectPrimaryCo
             if (ElectPrimaryEffector.ResultCode.NO_PRIMARY_AVAILABLE.name().equalsIgnoreCase(code)) {
                 highlightViolation("No primary available");
             }
+            if (ResultCode.PRIMARY_UNCHANGED.name().equalsIgnoreCase(code)) {
+                highlightConfirmation("Primary re-elected: "+niceName(((Map<?,?>)result).get("primary")));
+            }
         } catch (Throwable e) {
             Exceptions.propagateIfFatal(e);
             if (!Entities.isManagedActive(entity)) throw Exceptions.propagate(e);
@@ -289,7 +293,7 @@ public class ElectPrimaryPolicy extends AbstractPolicy implements ElectPrimaryCo
         }
     }
 
-    private String niceName(Object primary) {
+    protected String niceName(Object primary) {
         if (primary instanceof BrooklynObject) {
             if (Strings.isNonBlank( ((BrooklynObject)primary).getDisplayName() )) {
                 String name = ((BrooklynObject)primary).getDisplayName();

[brooklyn-server] 08/12: fix rare intermittent test failure

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 648e1e9f6f9405d239705996f230a045c3e1d406
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Wed Jan 19 17:22:53 2022 +0000

    fix rare intermittent test failure
---
 .../apache/brooklyn/core/mgmt/internal/EntityExecutionManagerTest.java | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/EntityExecutionManagerTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/EntityExecutionManagerTest.java
index cf9b72b..2fe2432 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/EntityExecutionManagerTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/EntityExecutionManagerTest.java
@@ -301,7 +301,8 @@ public class EntityExecutionManagerTest extends BrooklynAppUnitTestSupport {
         // should be at 3, usually is more; but to ensure test passes i've put at 1
         assertNonSystemTaskCountForEntityEventuallyIsInRange(e, 1, 7);
 
-        assertNonSystemTaskCountForEntityEventuallyIsInRange(app, 2, 3);
+        // expected 2 to 3, but 1 has been observed
+        assertNonSystemTaskCountForEntityEventuallyIsInRange(app, 1, 3);
 
         // now with a lowered limit, we should remove one more e
         ((BrooklynProperties)app.getManagementContext().getConfig()).put(

[brooklyn-server] 05/12: notes on limitation of ElectPrimaryPolicy

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 3a3d95dbbfc58bde7e40846b255a5d3ef4b38f51
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Wed Jan 19 16:52:00 2022 +0000

    notes on limitation of ElectPrimaryPolicy
---
 .../org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java   | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/policy/src/main/java/org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java b/policy/src/main/java/org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java
index e34c9dd..35a436e 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java
@@ -147,7 +147,9 @@ public class ElectPrimaryPolicy extends AbstractPolicy implements ElectPrimaryCo
             // effector not defined
             if (config().getRaw(EFFECTOR_NAME).isAbsent()) {
                 log.debug("No effector '"+effName+"' present at "+entity+"; creating default");
-                // if not set, we can create the default
+                // if not set, we can create the default; passing more config than is strictly necessary,
+                // wasteful as this config will be passed to the ssh commands,
+                // but that shouldn't normally be a problem; and if it is, caller can create the effector themselves
                 new ElectPrimaryEffector(config().getBag()).apply(entity);
                 
             } else {
@@ -246,6 +248,10 @@ public class ElectPrimaryPolicy extends AbstractPolicy implements ElectPrimaryCo
             if (log.isTraceEnabled()) {
                 log.trace("Policy "+this+" got event: "+contextString+"; triggering rescan with "+effName);
             }
+
+            // TODO as with during create, would be good to filter what is getting passed, or have another config key to allow it to be restricted/changed
+            // (there is no way to prevent these paramters from all being applied, and filtered down through all calls, being serialized for ssh etc;
+            // ineffieicnt, and could be a risk of leaking details)
             Task<?> task = Effectors.invocation(entity, Preconditions.checkNotNull( ((EntityInternal)entity).getEffector(effName) ), config().getBag()).asTask();
             BrooklynTaskTags.addTagDynamically(task, BrooklynTaskTags.NON_TRANSIENT_TASK_TAG);
             

[brooklyn-server] 12/12: This closes #1291

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 50a2ef698f0f9eabc38cb6810dd54da413ede88c
Merge: e8cee73 186d015
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Fri Jan 21 13:50:37 2022 +0000

    This closes #1291

 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)


[brooklyn-server] 02/12: Updated to json-smart 1.4.7

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 66466394adee31096a0b2512a4d29d0d878bfeaa
Author: Juan Cabrerizo <ju...@cabrerizo.es>
AuthorDate: Wed Jan 19 09:42:40 2022 +0000

    Updated to json-smart 1.4.7
---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 7c59d8b..2b3acc5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -203,7 +203,7 @@
         <commons-codec.version>1.15</commons-codec.version>
         <log4j.version>1.2.17</log4j.version>
         <commons-logging.version>1.2</commons-logging.version>
-        <jsonSmart.version>2.3</jsonSmart.version>
+        <jsonSmart.version>2.4.7</jsonSmart.version>
         <minidev.accessors-smart.version>1.2</minidev.accessors-smart.version>
 
         <ow2.asm.version.jsonpath>5.2</ow2.asm.version.jsonpath>

[brooklyn-server] 04/12: suppress stack trace on ConcurrentModficationException during serialization

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 2ce6f22e222578787d1e37e885c6092d87620746
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Wed Jan 19 16:51:07 2022 +0000

    suppress stack trace on ConcurrentModficationException during serialization
    
    if it works on retry...
---
 .../brooklyn/core/mgmt/persist/RetryingMementoSerializer.java | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/RetryingMementoSerializer.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/RetryingMementoSerializer.java
index 480a2ec..0d46f37 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/RetryingMementoSerializer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/RetryingMementoSerializer.java
@@ -20,6 +20,7 @@ package org.apache.brooklyn.core.mgmt.persist;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import java.util.ConcurrentModificationException;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoPersister.LookupContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,8 +50,14 @@ public class RetryingMementoSerializer<T> implements MementoSerializer<T> {
                     LOG.info("Success following previous serialization error");
                 return result;
             } catch (RuntimeException e) {
-                LOG.warn("Error serializing memento (attempt "+attempt+" of "+maxAttempts+") for "+memento+
-                        "; expected sometimes if attribute value modified", e);
+                if (e.toString().contains(ConcurrentModificationException.class.getSimpleName())) {
+                    // suppress stack trace in this common case
+                    LOG.warn("Error serializing memento (attempt " + attempt + " of " + maxAttempts + ") for " + memento +
+                            "; appears to be concurrent modification which is not unusual if other values are changing, and should be fixed after retry");
+                } else {
+                    LOG.warn("Error serializing memento (attempt " + attempt + " of " + maxAttempts + ") for " + memento +
+                            "; expected sometimes if attribute value modified", e);
+                }
                 lastException = e;
             }
         } while (attempt < maxAttempts);

[brooklyn-server] 06/12: make Mutable{list, set, map} more robust in the face of concurrent modifications

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 2601ea0f666f899e607a0435dc3c48c148691f73
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Wed Jan 19 17:02:48 2022 +0000

    make Mutable{list,set,map} more robust in the face of concurrent modifications
    
    simplify list format, and make robust to allow legacy format also
---
 .../util/core/xstream/MutableListConverter.java    | 77 ++++++++++++++++++++++
 .../util/core/xstream/MutableSetConverter.java     | 12 ++++
 .../util/core/xstream/StringKeyMapConverter.java   | 21 +++---
 .../brooklyn/util/core/xstream/XmlSerializer.java  |  3 +-
 .../util/core/xstream/XmlSerializerTest.java       | 25 ++++---
 5 files changed, 119 insertions(+), 19 deletions(-)

diff --git a/core/src/main/java/org/apache/brooklyn/util/core/xstream/MutableListConverter.java b/core/src/main/java/org/apache/brooklyn/util/core/xstream/MutableListConverter.java
new file mode 100644
index 0000000..002859b
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/util/core/xstream/MutableListConverter.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.util.core.xstream;
+
+import com.thoughtworks.xstream.converters.MarshallingContext;
+import com.thoughtworks.xstream.converters.UnmarshallingContext;
+import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;
+import com.thoughtworks.xstream.converters.reflection.SerializableConverter;
+import com.thoughtworks.xstream.core.ClassLoaderReference;
+import com.thoughtworks.xstream.io.ExtendedHierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+import com.thoughtworks.xstream.mapper.MapperWrapper;
+import org.apache.brooklyn.util.collections.MutableList;
+
+import com.thoughtworks.xstream.converters.collections.CollectionConverter;
+import com.thoughtworks.xstream.mapper.Mapper;
+
+public class MutableListConverter extends CollectionConverter {
+
+    final SerializableConverter serializableConverterTweakedForDeserializing;
+
+    public MutableListConverter(Mapper mapper, ReflectionProvider reflectionProvider, ClassLoaderReference classLoaderReference) {
+        super(mapper);
+        serializableConverterTweakedForDeserializing = new SerializableConverter(new MapperWrapper(mapper) {
+            @Override
+            public String aliasForSystemAttribute(String attribute) {
+                // don't expect "serialization=custom" as an attribute on our node; always fall back to custom
+                if ("serialization".equals(attribute)) return null;
+                return super.aliasForSystemAttribute(attribute);
+            }
+        }, reflectionProvider, classLoaderReference);
+    }
+
+    @Override
+    public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
+        return MutableList.class.isAssignableFrom(type);
+    }
+
+    @Override
+    protected Object createCollection(Class type) {
+        return new MutableList<Object>();
+    }
+
+    // take a copy first to avoid CMEs
+    @Override
+    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
+        super.marshal(MutableList.copyOf((MutableList)source), writer, context);
+    }
+
+    @Override
+    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
+        // support legacy format (when SerializableConverter wrote this, not us)
+        boolean legacy = "unserializable-parents".equals(((ExtendedHierarchicalStreamReader)reader).peekNextChild());
+        if (legacy) {
+            return serializableConverterTweakedForDeserializing.unmarshal(reader, context);
+        }
+
+        return super.unmarshal(reader, context);
+    }
+}
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/xstream/MutableSetConverter.java b/core/src/main/java/org/apache/brooklyn/util/core/xstream/MutableSetConverter.java
index c1e6bf4..46032d6 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/xstream/MutableSetConverter.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/xstream/MutableSetConverter.java
@@ -18,6 +18,11 @@
  */
 package org.apache.brooklyn.util.core.xstream;
 
+import com.thoughtworks.xstream.converters.MarshallingContext;
+import com.thoughtworks.xstream.converters.UnmarshallingContext;
+import com.thoughtworks.xstream.converters.reflection.SerializableConverter;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
 import org.apache.brooklyn.util.collections.MutableSet;
 
 import com.thoughtworks.xstream.converters.collections.CollectionConverter;
@@ -41,4 +46,11 @@ public class MutableSetConverter extends CollectionConverter {
     protected Object createCollection(Class type) {
         return new MutableSet<Object>();
     }
+
+    // take a copy first to avoid CMEs
+    @Override
+    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
+        super.marshal(MutableSet.copyOf((MutableSet)source), writer, context);
+    }
+
 }
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/xstream/StringKeyMapConverter.java b/core/src/main/java/org/apache/brooklyn/util/core/xstream/StringKeyMapConverter.java
index dbc0a05..45ce2b2 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/xstream/StringKeyMapConverter.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/xstream/StringKeyMapConverter.java
@@ -18,9 +18,14 @@
  */
 package org.apache.brooklyn.util.core.xstream;
 
+import com.thoughtworks.xstream.converters.MarshallingContext;
+import com.thoughtworks.xstream.converters.UnmarshallingContext;
+import com.thoughtworks.xstream.io.ExtendedHierarchicalStreamWriterHelper;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+import com.thoughtworks.xstream.mapper.Mapper;
 import java.util.Map;
 import java.util.Map.Entry;
-
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.exceptions.Exceptions;
@@ -28,13 +33,6 @@ import org.apache.brooklyn.util.text.Identifiers;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.thoughtworks.xstream.converters.MarshallingContext;
-import com.thoughtworks.xstream.converters.UnmarshallingContext;
-import com.thoughtworks.xstream.io.ExtendedHierarchicalStreamWriterHelper;
-import com.thoughtworks.xstream.io.HierarchicalStreamReader;
-import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
-import com.thoughtworks.xstream.mapper.Mapper;
-
 /** converter which simplifies representation of a map for string-based keys,
  * to <key>value</key>, or <entry key="key" type="string">value</entry> 
  * @author alex
@@ -63,6 +61,13 @@ public class StringKeyMapConverter extends MapConverter {
     public boolean canConvert(Class type) {
         return super.canConvert(type) || type.getName().equals(MutableMap.class.getName());
     }
+
+    @Override
+    @SuppressWarnings({ "rawtypes" })
+    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
+        // marshall a copy to minimise CMEs
+        super.marshal(MutableMap.copyOf((Map) source), writer, context);
+    }
     
     @Override
     protected void marshalEntry(HierarchicalStreamWriter writer, MarshallingContext context, Entry entry) {
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/xstream/XmlSerializer.java b/core/src/main/java/org/apache/brooklyn/util/core/xstream/XmlSerializer.java
index e7ce42a..ace24c7 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/xstream/XmlSerializer.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/xstream/XmlSerializer.java
@@ -107,7 +107,8 @@ public class XmlSerializer<T> {
         // Without it, the alias for "set" seems to interfere with the MutableSet.map field, so it gets
         // a null field on deserialization.
         xstream.registerConverter(new MutableSetConverter(xstream.getMapper()));
-        
+        xstream.registerConverter(new MutableListConverter(xstream.getMapper(), xstream.getReflectionProvider(), xstream.getClassLoaderReference()));
+
         xstream.aliasType("ImmutableList", ImmutableList.class);
         xstream.registerConverter(new ImmutableListConverter(xstream.getMapper()));
         xstream.registerConverter(new ImmutableSetConverter(xstream.getMapper()));
diff --git a/core/src/test/java/org/apache/brooklyn/util/core/xstream/XmlSerializerTest.java b/core/src/test/java/org/apache/brooklyn/util/core/xstream/XmlSerializerTest.java
index 52dbd14..df62549 100644
--- a/core/src/test/java/org/apache/brooklyn/util/core/xstream/XmlSerializerTest.java
+++ b/core/src/test/java/org/apache/brooklyn/util/core/xstream/XmlSerializerTest.java
@@ -79,16 +79,21 @@ public class XmlSerializerTest {
 
         // no nice serializer for this yet
         Asserts.assertEquals(serializer.toString(MutableList.of(1)),
-                "<MutableList serialization=\"custom\">\n" +
-                "  <unserializable-parents/>\n" +
-                "  <list>\n" +
-                "    <default>\n" +
-                "      <size>1</size>\n" +
-                "    </default>\n" +
-                "    <int>1</int>\n" +
-                "    <int>1</int>\n" +
-                "  </list>\n" +
-                "</MutableList>");
+                "<MutableList>\n" +
+                "  <int>1</int>\n" +
+                "</MutableList>"
+                // old (also accepted as input)
+//                "<MutableList serialization=\"custom\">\n" +
+//                "  <unserializable-parents/>\n" +
+//                "  <list>\n" +
+//                "    <default>\n" +
+//                "      <size>1</size>\n" +
+//                "    </default>\n" +
+//                "    <int>1</int>\n" +
+//                "    <int>1</int>\n" +
+//                "  </list>\n" +
+//                "</MutableList>"
+                );
     }
     
     @Test

[brooklyn-server] 01/12: Updated to Karaf 4.3.6

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 186d0156202bf7061c31123cd2c781ec6bd96237
Author: Juan Cabrerizo <ju...@cabrerizo.es>
AuthorDate: Mon Jan 17 17:01:33 2022 +0000

    Updated to Karaf 4.3.6
---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 7c59d8b..c0327dd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -185,7 +185,7 @@
         <kubernetes-client.version>5.8.0</kubernetes-client.version>
 
         <!-- Dependencies shipped with vanilla karaf; update these when we update the karaf version -->
-        <karaf.version>4.3.5</karaf.version>
+        <karaf.version>4.3.6</karaf.version>
         <karaf.plugin.version>${karaf.version}</karaf.plugin.version>
         <pax-web.version>7.3.23</pax-web.version> <!-- karaf 4.3 -->
         <jetty.version>9.4.43.v20210629</jetty.version> <!-- pax 7.3.23 from karaf 4.3 -->