[MGNLUI-3428] Using the move action in config app doesn't work (and can crash the JVM) Created: 15/May/15  Updated: 19/May/15  Resolved: 18/May/15

Status: Closed
Project: Magnolia UI
Component/s: None
Affects Version/s: 5.4
Fix Version/s: 5.4

Type: Bug Priority: Critical
Reporter: Mikaël Geljić Assignee: Magnolia International
Resolution: Fixed Votes: 0
Labels: move-dialog
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Template:
Acceptance criteria:
Empty
Task DoD:
[ ]* Doc/release notes changes? Comment present?
[ ]* Downstream builds green?
[ ]* Solution information and context easily available?
[ ]* Tests
[ ]* FixVersion filled and not yet released
[ ]  Architecture Decision Record (ADR)
Bug DoR:
[ ]* Steps to reproduce, expected, and actual results filled
[ ]* Affected version filled
Date of First Response:

 Description   

Apparently tries to do recursive cloning and ends up in a loop, see trace below

2015-05-15 14:35:47,577 ERROR fo.magnolia.ui.contentapp.browser.BrowserPresenter: An error occurred while executing action [move]
info.magnolia.ui.api.action.ActionExecutionException: Action execution failed for action: move
	at info.magnolia.ui.api.action.AbstractActionExecutor.execute(AbstractActionExecutor.java:64)
	at info.magnolia.ui.contentapp.browser.BrowserPresenter.executeAction(BrowserPresenter.java:333)
	at info.magnolia.ui.contentapp.browser.BrowserPresenter.onActionbarItemClicked(BrowserPresenter.java:292)
	at info.magnolia.ui.actionbar.ActionbarPresenter.onActionbarItemClicked(ActionbarPresenter.java:205)
	at info.magnolia.ui.actionbar.ActionbarViewImpl$1.actionTrigger(ActionbarViewImpl.java:67)
[...]
Caused by: java.lang.NullPointerException
	at org.apache.derby.impl.sql.GenericStatement.hashCode(Unknown Source)
	at java.util.concurrent.ConcurrentHashMap.hash(ConcurrentHashMap.java:333)
	at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1125)
	at com.rits.cloning.FastClonerConcurrentHashMap.clone(FastClonerConcurrentHashMap.java:22)
	at com.rits.cloning.Cloner.fastClone(Cloner.java:114)
[Here comes an infinite pile of clone calls...]
	at com.rits.cloning.Cloner.deepClone(Cloner.java:301)
	at info.magnolia.ui.contentapp.movedialog.MoveDialogPresenterImpl.prepareWorkbenchDefinition(MoveDialogPresenterImpl.java:199)
	at info.magnolia.ui.contentapp.movedialog.MoveDialogPresenterImpl.start(MoveDialogPresenterImpl.java:149)
	at info.magnolia.ui.contentapp.movedialog.action.OpenMoveDialogAction.execute(OpenMoveDialogAction.java:97)
	at info.magnolia.ui.api.action.AbstractActionExecutor.execute(AbstractActionExecutor.java:62)
	... 109 more
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x000000010b7fc75b, pid=777, tid=15107
#
# JRE version: Java(TM) SE Runtime Environment (7.0_67-b01) (build 1.7.0_67-b01)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.65-b04 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.dylib+0x3fc75b]  Monitor::IUnlock(bool)+0xcd
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /Users/mika/Applications/eclipse/Eclipse.app/Contents/MacOS/hs_err_pid777.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#


 Comments   
Comment by Magnolia International [ 18/May/15 ]

Fix proposed in fix/MGNLUI-3428-cloner branch. Should be followed-up by MGNLUI-3431 in 5.5.

Patch for personalization:

diff --git a/magnolia-personalization-integration/src/main/java/info/magnolia/personalization/ui/TraitValueCompositeField.java b/magnolia-personalization-integration/src/main/java/info/magnolia/personalization/ui/TraitValueCompositeField.java
index 07c4f4f..f83f363 100644
--- a/magnolia-personalization-integration/src/main/java/info/magnolia/personalization/ui/TraitValueCompositeField.java
+++ b/magnolia-personalization-integration/src/main/java/info/magnolia/personalization/ui/TraitValueCompositeField.java
@@ -16,6 +16,7 @@ package info.magnolia.personalization.ui;
 
 import info.magnolia.cms.i18n.I18nContentSupport;
 import info.magnolia.objectfactory.ComponentProvider;
+import info.magnolia.ui.contentapp.DefinitionCloner;
 import info.magnolia.ui.form.field.CompositeField;
 import info.magnolia.ui.form.field.definition.ConfiguredFieldDefinition;
 import info.magnolia.ui.form.field.definition.FieldDefinition;
@@ -27,7 +28,6 @@ import java.util.Map;
 
 import javax.inject.Inject;
 
-import com.rits.cloning.Cloner;
 import com.vaadin.annotations.StyleSheet;
 import com.vaadin.data.Item;
 import com.vaadin.data.Property;
@@ -47,6 +47,8 @@ import com.vaadin.ui.NativeButton;
 @StyleSheet("vaadin://traitaggregatorfield.css")
 public class TraitValueCompositeField extends CompositeField {
 
+    private final DefinitionCloner cloner = new DefinitionCloner();
+
     /**
      * Trait choose delegate interface.
      */
@@ -96,7 +98,7 @@ public class TraitValueCompositeField extends CompositeField {
         PropertysetItem fieldValues = getValue();
         Property<?> property = new ObjectProperty<Item>(relatedFieldItem);
 
-        definition = new Cloner().deepClone(definition);
+        definition = cloner.deepClone(definition);
         ((ConfiguredFieldDefinition) definition).setName(name);
 
         Field<?> newField = createLocalField(definition, property, false);
@@ -126,7 +128,7 @@ public class TraitValueCompositeField extends CompositeField {
             String propertyId = String.valueOf(entry.getKey());
             Property<?> property = fieldValues.getItemProperty(propertyId);
 
-            FieldDefinition definition = new Cloner().deepClone(entry.getValue());
+            FieldDefinition definition = cloner.deepClone(entry.getValue());
             ((ConfiguredFieldDefinition) definition).setName(propertyId);
 
             Field<?> field = createLocalField(definition, property, false);
diff --git a/magnolia-personalization-preview-app/src/main/java/info/magnolia/personalization/preview/ui/parameters/PreviewParametersPresenter.java b/magnolia-personalization-preview-app/src/main/java/info/magnolia/personalization/preview/ui/parameters/PreviewParametersPresenter.java
index 6f32b98..06c653a 100644
--- a/magnolia-personalization-preview-app/src/main/java/info/magnolia/personalization/preview/ui/parameters/PreviewParametersPresenter.java
+++ b/magnolia-personalization-preview-app/src/main/java/info/magnolia/personalization/preview/ui/parameters/PreviewParametersPresenter.java
@@ -31,6 +31,7 @@ import info.magnolia.ui.api.app.AppController;
 import info.magnolia.ui.api.app.ChooseDialogCallback;
 import info.magnolia.ui.api.app.SubAppEventBus;
 import info.magnolia.ui.api.shell.Shell;
+import info.magnolia.ui.contentapp.DefinitionCloner;
 import info.magnolia.ui.form.field.definition.ConfiguredFieldDefinition;
 import info.magnolia.ui.form.field.definition.FieldDefinition;
 import info.magnolia.ui.form.field.factory.FieldFactory;
@@ -48,7 +49,6 @@ import javax.jcr.RepositoryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.rits.cloning.Cloner;
 import com.vaadin.data.Item;
 import com.vaadin.data.Property;
 import com.vaadin.ui.AbstractField;
@@ -64,6 +64,7 @@ public class PreviewParametersPresenter implements PreviewParametersView.Listene
     public static final String PERSONA_PROPERTY_NAME = "persona";
 
     private final TraitChooserHelper helper;
+    private final DefinitionCloner cloner = new DefinitionCloner();
 
     private AppController appController;
 
@@ -208,7 +209,7 @@ public class PreviewParametersPresenter implements PreviewParametersView.Listene
          * caption and error messages before switching the definition name and enforce them to the resulting field.
          */
         if (fieldDefinition instanceof ConfiguredFieldDefinition) {
-            ConfiguredFieldDefinition fieldDefinitionClone = new Cloner().deepClone((ConfiguredFieldDefinition) fieldDefinition);
+            ConfiguredFieldDefinition fieldDefinitionClone = cloner.deepClone((ConfiguredFieldDefinition) fieldDefinition);
             String caption = fieldDefinition.getLabel();
             String requiredErrorMessage = fieldDefinition.getRequiredErrorMessage();
             fieldDefinitionClone.setName(fieldName);
diff --git a/pom.xml b/pom.xml
index bbe4859..226f339 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,8 +26,8 @@
 
   <properties>
     <javaVersion>1.7</javaVersion>
-    <magnoliaVersion>5.4-m3</magnoliaVersion>
-    <magnoliaUIVersion>5.4-m2</magnoliaUIVersion>
+    <magnoliaVersion>5.4-SNAPSHOT</magnoliaVersion>
+    <magnoliaUIVersion>5.4-SNAPSHOT</magnoliaUIVersion>
     <damVersion>2.0</damVersion>
     <scmTagPrefix>magnolia-personalization</scmTagPrefix>
   </properties>
Generated at Mon Feb 12 09:06:31 CET 2024 using Jira 9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b.