### Eclipse Workspace Patch 1.0 #P magnolia-module-blossom Index: src/main/java/info/magnolia/module/blossom/dialog/DefaultBlossomDialogRegistry.java =================================================================== --- src/main/java/info/magnolia/module/blossom/dialog/DefaultBlossomDialogRegistry.java (revision 37330) +++ src/main/java/info/magnolia/module/blossom/dialog/DefaultBlossomDialogRegistry.java (working copy) @@ -39,14 +39,17 @@ import info.magnolia.context.MgnlContext; import info.magnolia.module.blossom.gui.BlossomConfiguredDialog; import info.magnolia.module.blossom.support.RepositoryUtils; -import org.apache.jackrabbit.value.StringValue; -import org.springframework.beans.factory.InitializingBean; -import javax.jcr.RepositoryException; import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.jcr.RepositoryException; + +import org.apache.commons.lang.StringUtils; +import org.apache.jackrabbit.value.StringValue; +import org.springframework.beans.factory.InitializingBean; + /** * Default implementation of {@link info.magnolia.module.blossom.dialog.BlossomDialogRegistry}. */ @@ -85,6 +88,8 @@ HierarchyManager hierarchyManager = MgnlContext.getSystemContext().getHierarchyManager(ContentRepository.CONFIG); Content configNode = RepositoryUtils.createContentNode(hierarchyManager, DIALOGS_PATH, dialogDescription.getName()); configNode.createNodeData("class", new StringValue(BlossomConfiguredDialog.class.getName())); + if (StringUtils.isNotBlank(dialogDescription.getFactoryMetaData().getSaveHandler())) + configNode.createNodeData("saveHandler", dialogDescription.getFactoryMetaData().getSaveHandler()); configNode.getParent().save(); } Index: src/main/java/info/magnolia/module/blossom/annotation/SaveHandler.java =================================================================== --- src/main/java/info/magnolia/module/blossom/annotation/SaveHandler.java (revision 0) +++ src/main/java/info/magnolia/module/blossom/annotation/SaveHandler.java (revision 0) @@ -0,0 +1,21 @@ +package info.magnolia.module.blossom.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +/** + * Used on paragraphs and dialog factories. Combined with {@link Paragraph} and {@link DialogFactory}, states the + * saveHandler that will be used for the dialog. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE, ElementType.METHOD }) +public @interface SaveHandler { + + /** + * The class that will be used as saveHandler for the dialog. + */ + Class< ? extends info.magnolia.module.admininterface.SaveHandler> value(); +} Property changes on: src\main\java\info\magnolia\module\blossom\annotation\SaveHandler.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Index: src/main/java/info/magnolia/module/blossom/dialog/DialogFactoryMetaData.java =================================================================== --- src/main/java/info/magnolia/module/blossom/dialog/DialogFactoryMetaData.java (revision 37330) +++ src/main/java/info/magnolia/module/blossom/dialog/DialogFactoryMetaData.java (working copy) @@ -45,6 +45,7 @@ private Object factoryObject; private Method factoryMethod; private String i18nBasename; + private String saveHandler; public String getI18nBasename() { return i18nBasename; @@ -53,7 +54,15 @@ public void setI18nBasename(String i18nBasename) { this.i18nBasename = i18nBasename; } + + public String getSaveHandler() { + return saveHandler; + } + public void setSaveHandler(String saveHandler) { + this.saveHandler = saveHandler; + } + public String getLabel() { return label; } Index: src/main/java/info/magnolia/module/blossom/paragraph/ParagraphDescriptionBuilder.java =================================================================== --- src/main/java/info/magnolia/module/blossom/paragraph/ParagraphDescriptionBuilder.java (revision 37330) +++ src/main/java/info/magnolia/module/blossom/paragraph/ParagraphDescriptionBuilder.java (working copy) @@ -36,9 +36,11 @@ import info.magnolia.module.blossom.annotation.I18nBasename; import info.magnolia.module.blossom.annotation.Paragraph; import info.magnolia.module.blossom.annotation.ParagraphDescription; +import info.magnolia.module.blossom.annotation.SaveHandler; import info.magnolia.module.blossom.annotation.TabOrder; import info.magnolia.module.blossom.dialog.DialogFactoryMetaData; import info.magnolia.module.blossom.dispatcher.BlossomDispatcher; + import org.apache.commons.lang.StringUtils; /** @@ -50,13 +52,15 @@ Paragraph annotation = handler.getClass().getAnnotation(Paragraph.class); I18nBasename i18nBasename = handler.getClass().getAnnotation(I18nBasename.class); - + SaveHandler saveHandler = handler.getClass().getAnnotation(SaveHandler.class); + BlossomParagraphDescription description = new BlossomParagraphDescription(); description.setName(resolveName(handlerPath, handler, annotation)); description.setTitle(resolveTitle(handlerPath, handler, annotation)); description.setDescription(resolveDescription(handlerPath, handler, annotation)); description.setHandlerPath(handlerPath); description.setI18nBasename(i18nBasename != null ? i18nBasename.value() : null); + description.setSaveHandler(saveHandler != null ? saveHandler.value().getName() : null); description.setHandler(handler); description.setDispatcher(dispatcher); description.setDialogName(StringUtils.trimToNull(annotation.dialog())); @@ -68,6 +72,7 @@ factoryMetaData.setI18nBasename(description.getI18nBasename()); factoryMetaData.setFactoryObject(handler); factoryMetaData.setTabOrder(tabOrder != null ? tabOrder.value() : null); + factoryMetaData.setSaveHandler(saveHandler != null ? saveHandler.value().getName() : null); description.setDialogFactoryMetaData(factoryMetaData); } Index: src/main/java/info/magnolia/module/blossom/paragraph/BlossomParagraphDescription.java =================================================================== --- src/main/java/info/magnolia/module/blossom/paragraph/BlossomParagraphDescription.java (revision 37330) +++ src/main/java/info/magnolia/module/blossom/paragraph/BlossomParagraphDescription.java (working copy) @@ -48,6 +48,7 @@ private String handlerPath; private Object handler; private String dialogName; + private String saveHandler; private BlossomDispatcher dispatcher; private DialogFactoryMetaData dialogFactoryMetaData; @@ -82,6 +83,14 @@ public void setDialogName(String dialogName) { this.dialogName = dialogName; } + + public String getSaveHandler() { + return saveHandler; + } + + public void setSaveHandler(String saveHandler) { + this.saveHandler = saveHandler; + } public BlossomDispatcher getDispatcher() { return dispatcher; Index: src/main/java/info/magnolia/module/blossom/dialog/DialogDescriptionBuilder.java =================================================================== --- src/main/java/info/magnolia/module/blossom/dialog/DialogDescriptionBuilder.java (revision 37330) +++ src/main/java/info/magnolia/module/blossom/dialog/DialogDescriptionBuilder.java (working copy) @@ -35,6 +35,7 @@ import info.magnolia.module.blossom.annotation.DialogFactory; import info.magnolia.module.blossom.annotation.I18nBasename; +import info.magnolia.module.blossom.annotation.SaveHandler; import info.magnolia.module.blossom.annotation.TabOrder; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -84,10 +85,12 @@ DialogFactory annotation = findAnnotation(DialogFactory.class, factoryObject, factoryMethod); TabOrder tabOrder = findAnnotation(TabOrder.class, factoryObject, factoryMethod); I18nBasename i18nBasename = findAnnotation(I18nBasename.class, factoryObject, factoryMethod); + SaveHandler saveHandler = findAnnotation(SaveHandler.class, factoryObject, factoryMethod); DialogFactoryMetaData factoryMetaData = new DialogFactoryMetaData(); factoryMetaData.setLabel(annotation.label()); factoryMetaData.setI18nBasename(i18nBasename != null ? i18nBasename.value() : null); + factoryMetaData.setSaveHandler(saveHandler != null ? saveHandler.value().getName() : null); factoryMetaData.setFactoryObject(factoryObject); factoryMetaData.setFactoryMethod(factoryMethod); factoryMetaData.setTabOrder(tabOrder != null ? tabOrder.value() : null); Index: src/main/java/info/magnolia/module/blossom/gui/BlossomParagraphEditDialog.java =================================================================== --- src/main/java/info/magnolia/module/blossom/gui/BlossomParagraphEditDialog.java (revision 37330) +++ src/main/java/info/magnolia/module/blossom/gui/BlossomParagraphEditDialog.java (working copy) @@ -35,8 +35,10 @@ import info.magnolia.cms.core.Content; import info.magnolia.cms.gui.dialog.Dialog; +import info.magnolia.cms.util.ClassUtil; import info.magnolia.module.admininterface.DialogHandlerManager; import info.magnolia.module.admininterface.DialogMVCHandler; +import info.magnolia.module.admininterface.SaveHandler; import info.magnolia.module.admininterface.dialogs.ConfiguredDialog; import info.magnolia.module.blossom.BlossomModule; import info.magnolia.module.blossom.dialog.BlossomDialogDescription; @@ -49,24 +51,30 @@ import info.magnolia.module.blossom.paragraph.BlossomParagraphRegistry; import info.magnolia.module.templating.Paragraph; import info.magnolia.module.templating.ParagraphManager; -import org.apache.commons.lang.StringUtils; -import org.springframework.util.ReflectionUtils; -import javax.jcr.RepositoryException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -/** - * Extension hook that creates dialogs for Blossom managed paragraphs. - */ +import javax.jcr.RepositoryException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.ReflectionUtils; + public class BlossomParagraphEditDialog extends ConfiguredDialog { + + private static Logger log = LoggerFactory.getLogger(BlossomParagraphEditDialog.class); private final String paragraph; private DialogFactoryMetaData factoryMetaData; private DialogMVCHandler dialogHandler; + // This is needed until MAGNOLIA-3299 is released, after it can be removed. + private SaveHandler saveHandler; public BlossomParagraphEditDialog(String name, HttpServletRequest request, HttpServletResponse response, Content configNode) throws RepositoryException { super(name, request, response, configNode); @@ -171,6 +179,37 @@ throw new IllegalStateException("Invalid state attempting to invoke getDialog on DialogMVCHandler"); } + + /** + * Returns the save handler used by this dialog handler. + * @return the handler + */ + @Override + protected SaveHandler getSaveHandler() { + // This method must be overridden like this until MAGNOLIA-3299 is released, after it will be easier. + if (saveHandler == null) { + if (StringUtils.isNotBlank(factoryMetaData.getSaveHandler())) { + try { + // Reflections must be used until MAGNOLIA-3299 is released, after it will be easier. + this.saveHandler = (SaveHandler) ClassUtil.newInstance(factoryMetaData.getSaveHandler()); + Class c = DialogMVCHandler.class; + Field f = c.getDeclaredField("saveHandler"); + f.setAccessible(true); + f.set(this, this.saveHandler); + configureSaveHandler(this.saveHandler); + } catch (Exception e) { + log.error("can't create save handler", e); + // Fallback to the original method + this.saveHandler = super.getSaveHandler(); + } + } else { + // Fallback to the original method + this.saveHandler = super.getSaveHandler(); + } + } + return this.saveHandler; + } + // Snippet taken from ParagraphEditDialog private String getDialogUsedByParagraph(String paragraphName) { Index: src/main/java/info/magnolia/module/blossom/paragraph/DefaultBlossomParagraphRegistry.java =================================================================== --- src/main/java/info/magnolia/module/blossom/paragraph/DefaultBlossomParagraphRegistry.java (revision 37330) +++ src/main/java/info/magnolia/module/blossom/paragraph/DefaultBlossomParagraphRegistry.java (working copy) @@ -39,14 +39,16 @@ import info.magnolia.context.MgnlContext; import info.magnolia.module.blossom.dispatcher.BlossomDispatcher; import info.magnolia.module.blossom.support.RepositoryUtils; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import javax.jcr.RepositoryException; + import org.apache.commons.lang.StringUtils; import org.apache.jackrabbit.value.StringValue; import org.springframework.beans.factory.InitializingBean; -import javax.jcr.RepositoryException; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - /** * Default implementation of {@link info.magnolia.module.blossom.paragraph.BlossomParagraphRegistry}. */ @@ -119,12 +121,14 @@ protected void writeParagraphDefinition(BlossomParagraphDescription description) throws RepositoryException { HierarchyManager hierarchyManager = MgnlContext.getSystemContext().getHierarchyManager(ContentRepository.CONFIG); Content configNode = RepositoryUtils.createContentNode(hierarchyManager, PARAGRAPHS_PATH, description.getName()); - configNode.createNodeData("name", new StringValue(description.getName())); - configNode.createNodeData("title", new StringValue(description.getTitle())); - configNode.createNodeData("description", new StringValue(description.getDescription())); - configNode.createNodeData("type", new StringValue("blossom")); + configNode.setNodeData("name", new StringValue(description.getName())); + configNode.setNodeData("title", new StringValue(description.getTitle())); + configNode.setNodeData("description", new StringValue(description.getDescription())); + configNode.setNodeData("type", new StringValue("blossom")); if (StringUtils.isNotBlank(description.getI18nBasename())) - configNode.createNodeData("i18nBasename", new StringValue(description.getI18nBasename())); + configNode.setNodeData("i18nBasename", new StringValue(description.getI18nBasename())); + if (StringUtils.isNotBlank(description.getSaveHandler())) + configNode.setNodeData("saveHandler", new StringValue(description.getSaveHandler())); configNode.getParent().save(); }