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.commands;
35
36 import info.magnolia.cms.beans.config.ObservedManager;
37 import info.magnolia.cms.core.Content;
38 import info.magnolia.cms.core.ItemType;
39 import info.magnolia.jcr.node2bean.Node2BeanException;
40 import info.magnolia.jcr.node2bean.Node2BeanProcessor;
41 import info.magnolia.objectfactory.Components;
42
43 import java.util.Iterator;
44
45 import javax.inject.Inject;
46 import javax.inject.Singleton;
47 import javax.jcr.RepositoryException;
48
49 import org.apache.commons.chain.Catalog;
50 import org.apache.commons.chain.CatalogFactory;
51 import org.apache.commons.chain.Command;
52 import org.apache.commons.lang.StringUtils;
53
54
55
56
57
58
59
60
61 @Singleton
62 public class CommandsManager extends ObservedManager {
63
64 public static final String DEFAULT_CATALOG = "default";
65
66 public static final String COMMAND_DELIM = "-";
67
68 private final CommandTransformer commandTransformer;
69
70 private final Node2BeanProcessor nodeToBean;
71
72 @Inject
73 public CommandsManager(Node2BeanProcessor nodeToBean) {
74 this.nodeToBean = nodeToBean;
75 this.commandTransformer = new CommandTransformer();
76 }
77
78
79
80
81 @Override
82 protected void onRegister(Content node) {
83
84 if(node.getChildren(ItemType.CONTENT).size() == 0){
85 registerCatalog(node);
86 }
87 else{
88 for (Iterator iter = node.getChildren(ItemType.CONTENT).iterator(); iter.hasNext();) {
89 onRegister((Content) iter.next());
90 }
91 }
92 }
93
94 protected void registerCatalog(Content node) {
95 try {
96 MgnlCatalog catalog = (MgnlCatalog) nodeToBean.toBean(node.getJCRNode(), true, commandTransformer, Components.getComponentProvider());
97 CatalogFactory factory = CatalogFactory.getInstance();
98 if (factory.getCatalog(catalog.getName()) == null) {
99 factory.addCatalog(catalog.getName(), catalog);
100 } else {
101
102 throw new RuntimeException("Catalog [" + catalog.getName() + "] is already registered. Please run: select * from nt:base where jcr:path like '/modules/%/commands/"+ catalog.getName()+"' on config repository to find out the duplicate.");
103 }
104
105 log.debug("Catalog {} registered: {}", new Object[]{catalog.getName(), catalog});
106 }
107 catch (RepositoryException e) {
108 log.error("Can't read catalog [" + node + "]", e);
109 }
110 catch (Node2BeanException e) {
111 log.error("Can't create catalog [" + node + "]", e);
112 }
113 }
114
115
116
117
118 @Override
119 protected void onClear() {
120 CatalogFactory.clear();
121 }
122
123
124
125
126
127
128
129 public Command getCommand(String catalogName, String commandName) {
130 Catalog catalog = CatalogFactory.getInstance().getCatalog(catalogName);
131 if (catalog != null) {
132 return catalog.getCommand(commandName);
133 }
134
135 return null;
136 }
137
138
139
140
141
142
143 public Command getCommand(String commandName) {
144 String catalogName = DEFAULT_CATALOG;
145 if (StringUtils.contains(commandName, COMMAND_DELIM)) {
146 catalogName = StringUtils.substringBefore(commandName, COMMAND_DELIM);
147 commandName = StringUtils.substringAfter(commandName, COMMAND_DELIM);
148 }
149
150 Command command = getCommand(catalogName, commandName);
151 if (command == null) {
152 command = getCommand(DEFAULT_CATALOG, commandName);
153 }
154 return command;
155 }
156
157
158
159
160
161 @Deprecated
162 public static CommandsManager getInstance() {
163 return Components.getSingleton(CommandsManager.class);
164 }
165
166 }