1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.mediaeditor.registry;
35
36 import info.magnolia.cms.util.ModuleConfigurationObservingManager;
37 import info.magnolia.jcr.node2bean.Node2BeanException;
38 import info.magnolia.jcr.node2bean.Node2BeanProcessor;
39 import info.magnolia.jcr.predicate.NodeTypePredicate;
40 import info.magnolia.jcr.util.NodeTypes;
41 import info.magnolia.jcr.util.NodeUtil;
42 import info.magnolia.jcr.util.NodeVisitor;
43 import info.magnolia.module.ModuleRegistry;
44 import info.magnolia.objectfactory.Components;
45 import info.magnolia.ui.mediaeditor.definition.ConfiguredMediaEditorDefinition;
46 import info.magnolia.ui.mediaeditor.definition.MediaEditorDefinition;
47
48 import java.util.ArrayList;
49 import java.util.HashSet;
50 import java.util.List;
51 import java.util.Set;
52
53 import javax.inject.Inject;
54 import javax.inject.Singleton;
55 import javax.jcr.Node;
56 import javax.jcr.RepositoryException;
57
58 import org.apache.commons.lang3.StringUtils;
59 import org.slf4j.Logger;
60 import org.slf4j.LoggerFactory;
61
62
63
64
65 @Singleton
66 public class ConfiguredMediaEditorDefinitionManager extends ModuleConfigurationObservingManager {
67
68 private final Logger log = LoggerFactory.getLogger(getClass());
69
70 public static final String MEDIA_EDITORS_CONFIG_NODE_NAME = "mediaEditors";
71
72 private Set<String> registeredIds = new HashSet<String>();
73
74 private final MediaEditorRegistry registry;
75
76 @Inject
77 protected ConfiguredMediaEditorDefinitionManager(ModuleRegistry moduleRegistry, MediaEditorRegistry registry) {
78 super(MEDIA_EDITORS_CONFIG_NODE_NAME, moduleRegistry);
79 this.registry = registry;
80 }
81
82 @Override
83 protected void reload(List<Node> nodes) throws RepositoryException {
84 final List<MediaEditorDefinition> definitions = new ArrayList<MediaEditorDefinition>();
85 for (Node node : nodes) {
86 NodeUtil.visit(node, new NodeVisitor() {
87 @Override
88 public void visit(Node current) throws RepositoryException {
89 for (Node editorNode : NodeUtil.getNodes(current, NodeTypes.ContentNode.NAME)) {
90 if (isMediaEditor(editorNode)) {
91
92
93 MediaEditorDefinition definition = createMediaEditorDefinition(editorNode);
94 if (definition != null) {
95 definitions.add(definition);
96 }
97 } else {
98 log.warn("node " + editorNode.getName() + " will not be handled as Dialog.");
99 }
100 }
101 }
102 }, new NodeTypePredicate(NodeTypes.Content.NAME));
103 }
104 this.registeredIds = registry.unregisterAndRegister(registeredIds, definitions);
105 }
106
107 protected MediaEditorDefinition createMediaEditorDefinition(Node editorNode) throws RepositoryException {
108 String id = createId(editorNode);
109 try {
110 ConfiguredMediaEditorDefinition def = (ConfiguredMediaEditorDefinition) Components.getComponent(Node2BeanProcessor.class).toBean(editorNode, MediaEditorDefinition.class);
111 if (def != null) {
112 def.setId(id);
113 }
114 return def;
115 } catch (Node2BeanException e) {
116 log.error("Unable to create a definition for editor [" + id + "]: " + e);
117 } catch (RepositoryException e) {
118 log.error("Unable to create a definition for editor [" + id + "]: " + e);
119 }
120 return null;
121 }
122
123 protected String createId(Node configNode) throws RepositoryException {
124 final String path = configNode.getPath();
125 final String[] pathElements = path.split("/");
126 final String moduleName = pathElements[2];
127 return moduleName + ":" + StringUtils.removeStart(path, "/modules/" + moduleName + "/" + MEDIA_EDITORS_CONFIG_NODE_NAME + "/");
128 }
129
130 private boolean isMediaEditor(Node mediaEditorNode) {
131 return true;
132 }
133 }