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
37 import info.magnolia.commands.chain.Catalog;
38 import info.magnolia.commands.chain.Chain;
39 import info.magnolia.commands.chain.ChainBase;
40 import info.magnolia.commands.chain.Command;
41 import info.magnolia.jcr.node2bean.Node2BeanException;
42 import info.magnolia.jcr.node2bean.PropertyTypeDescriptor;
43 import info.magnolia.jcr.node2bean.TransformationState;
44 import info.magnolia.jcr.node2bean.TypeDescriptor;
45 import info.magnolia.jcr.node2bean.TypeMapping;
46 import info.magnolia.jcr.node2bean.impl.Node2BeanTransformerImpl;
47 import info.magnolia.objectfactory.Classes;
48 import info.magnolia.objectfactory.ComponentProvider;
49
50 import java.util.Iterator;
51 import java.util.Map;
52
53 import javax.jcr.Node;
54 import javax.jcr.RepositoryException;
55
56 import org.apache.commons.lang3.StringUtils;
57
58
59
60
61 public class CommandTransformer extends Node2BeanTransformerImpl {
62 private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(CommandTransformer.class);
63
64 private static final String DEPRECATED_CATALOG_NAME_NODE_DATA = "catalogName";
65
66 private static final String DEPRECATED_IMPL_NODE_DATA = "impl";
67
68 @Override
69 protected TypeDescriptorcriptor">TypeDescriptor onResolveType(TypeMapping typeMapping, TransformationState state, TypeDescriptor resolvedType, ComponentProvider componentProvider) {
70 if (resolvedType != null) {
71 return resolvedType;
72 }
73 Class klass = null;
74
75 if (state.getLevel() == 1) {
76 klass = MgnlCatalog.class;
77 } else {
78 Node node = state.getCurrentNode();
79 try {
80 if (node.hasProperty(DEPRECATED_IMPL_NODE_DATA)) {
81 log.warn("Rename '" + DEPRECATED_IMPL_NODE_DATA + "' to 'class' [{}]!", node);
82 try {
83 final String className = node.getProperty(DEPRECATED_IMPL_NODE_DATA).getString();
84 klass = Classes.getClassFactory().forName(className);
85 } catch (ClassNotFoundException e) {
86 klass = DelegateCommand.class;
87 }
88 } else {
89
90
91 boolean buildingCommand = false;
92 for (int i = 0; i < state.getLevel() - 1; i++) {
93 TypeDescriptor td = state.peekType(i);
94 if (isCommandClass(td.getType()) && !isChainClass(td.getType())) {
95 buildingCommand = true;
96 }
97 }
98 if (!buildingCommand) {
99 klass = ChainBase.class;
100 }
101 }
102 } catch (RepositoryException e) {
103 log.error("Can't check " + DEPRECATED_IMPL_NODE_DATA + " nodedata [{}]", node, e);
104 }
105 }
106 if (klass != null) {
107 return typeMapping.getTypeDescriptor(klass);
108 }
109 return resolvedType;
110 }
111
112 @Override
113 public void initBean(TransformationState state, Map values) throws Node2BeanException {
114
115 if (state.getCurrentBean() instanceof Catalog) {
116 Catalog/../../info/magnolia/commands/chain/Catalog.html#Catalog">Catalog catalog = (Catalog) state.getCurrentBean();
117 for (Iterator iter = values.keySet().iterator(); iter.hasNext(); ) {
118 String name = (String) iter.next();
119 if (values.get(name) instanceof Command) {
120 Command/../../info/magnolia/commands/chain/Command.html#Command">Command command = (Command) values.get(name);
121 if (!(command instanceof MgnlCommand./../../info/magnolia/commands/MgnlCommand.html#MgnlCommand">MgnlCommand) || ((MgnlCommand) command).isEnabled()) {
122 catalog.addCommand(name, command);
123 }
124 }
125 }
126 }
127
128
129 if (state.getCurrentBean() instanceof Chain) {
130 Chain="../../../info/magnolia/commands/chain/Chain.html#Chain">Chain chain = (Chain) state.getCurrentBean();
131 for (Iterator iter = values.values().iterator(); iter.hasNext(); ) {
132 Object value = iter.next();
133 if (value instanceof Command) {
134 Command/../../info/magnolia/commands/chain/Command.html#Command">Command command = (Command) value;
135 if (!(command instanceof MgnlCommand./../../info/magnolia/commands/MgnlCommand.html#MgnlCommand">MgnlCommand) || ((MgnlCommand) command).isEnabled()) {
136 chain.addCommand(command);
137 }
138 }
139 }
140 }
141
142
143 if (state.getCurrentBean() instanceof DelegateCommand) {
144 DelegateCommandolia/commands/DelegateCommand.html#DelegateCommand">DelegateCommand delegateCommand = (DelegateCommand) state.getCurrentBean();
145 if (StringUtils.isEmpty(delegateCommand.getCommandName())) {
146 log.warn("You should define the commandName property on [{}]", state.getCurrentNode());
147 delegateCommand.setCommandName((String) values.get(DEPRECATED_IMPL_NODE_DATA));
148 }
149 }
150 super.initBean(state, values);
151 }
152
153 @Override
154 public void setProperty(TypeMapping typeMapping, TransformationState state, PropertyTypeDescriptor descriptor, Map values) throws RepositoryException {
155 Object bean = state.getCurrentBean();
156 if (bean instanceof MgnlCatalog) {
157 MgnlCatalog../info/magnolia/commands/MgnlCatalog.html#MgnlCatalog">MgnlCatalog catalog = (MgnlCatalog) bean;
158 if (values.containsKey(DEPRECATED_CATALOG_NAME_NODE_DATA)) {
159 log.warn("Rename the 'catalogName' nodedata to 'name' [{}]", state.getCurrentNode());
160 catalog.setName((String) values.get(DEPRECATED_CATALOG_NAME_NODE_DATA));
161 }
162
163 if (!values.containsKey("name") && state.getCurrentNode().getName().equals("commands")) {
164 try {
165 catalog.setName(state.getCurrentNode().getParent().getName());
166 } catch (RepositoryException e) {
167 log.error("Can't resolve catalog name by using parent node [{}]", state.getCurrentNode(), e);
168 }
169 }
170 }
171
172 super.setProperty(typeMapping, state, descriptor, values);
173 }
174
175 protected boolean isCommandClass(Class<?> type) {
176 return Command.class.isAssignableFrom(type);
177 }
178
179 protected boolean isChainClass(Class<?> type) {
180 return Chain.class.isAssignableFrom(type);
181 }
182 }