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