1 package org.weda.action.impl;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.HashSet;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.Map.Entry;
9 import java.util.Set;
10 import org.apache.commons.lang.ObjectUtils;
11 import org.weda.action.ActionDescriptor;
12 import org.weda.action.ActionDescriptorException;
13 import org.weda.action.ActionParameter;
14 import org.weda.action.ActionParameterValue;
15 import org.weda.action.ActionTargetClass;
16 import org.weda.action.LinkedAction;
17 import org.weda.action.Parameter.Direction;
18 import org.weda.converter.ValueTypeConverter;
19 import org.weda.enhance.InjectHivemindObject;
20 import org.weda.message.Messages;
21 import org.weda.message.impl.InplaceMessage;
22 import org.weda.property.ObjectDescriptorRegistry;
23 import org.weda.property.PropertyDescriptor;
24 import org.weda.property.PropertyValue;
25 import org.weda.property.PropertyValueException;
26
27 /**
28 *
29 * @author tim
30 */
31 public class ActionDescriptorImpl
32 implements ActionDescriptor, java.io.Serializable
33 {
34 @InjectHivemindObject()
35 private static PropertyValue propertyValue;
36 @InjectHivemindObject()
37 private static ObjectDescriptorRegistry objectDescriptorRegistry;
38 @InjectHivemindObject()
39 private static ValueTypeConverter converter;
40
41 private String name;
42 private String description;
43 private Class actionClass;
44 private String accessKey;
45 private String targetFrame;
46 private Set<ActionTargetClass> targetClasses =
47 new HashSet<ActionTargetClass>();
48 private List<ActionParameter> actionParameters =
49 new ArrayList<ActionParameter>();
50 private List<ActionParameterValue> parametersValues;
51 private Map<Integer, Object> compiledParameterValues;
52 private Map<String, ActionParameter> actionParametersMap =
53 new HashMap<String, ActionParameter>();
54 private List<LinkedAction> linkedActions = new ArrayList<LinkedAction>(2);
55 private Messages messages;
56
57 public void init() throws ActionDescriptorException {
58 if (parametersValues != null){
59 try{
60 compiledParameterValues = new HashMap<Integer, Object>();
61 for (ActionParameterValue parameterValue: parametersValues){
62 String propertyName = parameterValue.getName();
63 ActionParameter actionParameter =
64 getActionParameter(propertyName);
65 if (actionParameter.getDirection()==Direction.READ)
66 throw new ActionDescriptorException(
67 String.format(
68 "Can't use action (%s) parameter (%s) " +
69 "for set value operation because " +
70 "of it's read only parameter"
71 , actionClass.getName(), propertyName));
72 Integer id =
73 propertyValue.compileSetter(
74 actionClass, propertyName);
75 PropertyDescriptor paramDesc =
76 objectDescriptorRegistry.getPropertyDescriptor(
77 actionClass, propertyName);
78 Object value = converter.convert(
79 paramDesc.getPropertyClass()
80 , parameterValue.getValue()
81 , parameterValue.getPattern());
82 compiledParameterValues.put(id, value);
83 }
84 }catch(Exception e){
85 throw new ActionDescriptorException(
86 String.format(
87 "Error while initializgin parameter " +
88 "values for action (%s)"
89 , actionClass.getName())
90 , e);
91 }
92 }
93 }
94
95 public Set<ActionTargetClass> getTargetClasses() {
96 return targetClasses;
97 }
98
99 public void addTargetClass(ActionTargetClass targetClass){
100 targetClasses.add(targetClass);
101 }
102
103 public void addLinkedAction(LinkedAction linkedAction){
104 linkedActions.add(linkedAction);
105 }
106
107 public String getName() {
108 return messages.replaceInPlace(name);
109 }
110
111 public void setName(String name){
112 this.name=name;
113 }
114
115 public String getDescription() {
116 return messages.replaceInPlace(description)
117 +(accessKey==null? "":" ["+getAccessKey()+"]");
118 }
119
120 public void setDescription(String description){
121 this.description=description;
122 }
123
124 public List<ActionParameter> getActionParameters() {
125 return actionParameters;
126 }
127
128 public void addActionParameter(ActionParameter actionParameter) {
129 actionParameters.add(actionParameter);
130 actionParametersMap.put(actionParameter.getName(), actionParameter);
131 }
132
133 public Class getActionClass() {
134 return actionClass;
135 }
136
137 public void setActionClass(Class actionClass){
138 this.actionClass=actionClass;
139 }
140
141 public ActionParameter getActionParameter(String name)
142 throws ActionDescriptorException
143 {
144 ActionParameter parameter = actionParametersMap.get(name);
145 if (parameter==null)
146 throw new ActionDescriptorException(
147 String.format(
148 "Parameter (%s) not defined for action " +
149 "(name: %s, class: %s)"
150 , name, getName(), getActionClass().getName()));
151 return parameter;
152 }
153
154 public Messages getMessages() {
155 return messages;
156 }
157
158 public void setMessages(Messages messages) {
159 this.messages = messages;
160 }
161
162 public List<LinkedAction> getLinkedActions() {
163 return linkedActions;
164 }
165
166 public boolean equals(Object o){
167 if (o instanceof ActionDescriptor){
168 ActionDescriptor desc = (ActionDescriptor)o;
169 return ObjectUtils.equals(name, desc.getName())
170 && actionClass.equals(desc.getActionClass());
171 }
172 return false;
173 }
174
175 public String getTargetFrame() {
176 return targetFrame;
177 }
178
179 public void setTargetFrame(String targetFrame) {
180 this.targetFrame = targetFrame;
181 }
182
183 public void setActionParametersValues(Object action)
184 throws ActionDescriptorException
185 {
186 if (compiledParameterValues!=null){
187 try {
188 for (Entry<Integer, Object> entry:
189 compiledParameterValues.entrySet())
190 {
191 propertyValue.setValue(
192 action, entry.getKey(), entry.getValue());
193 }
194 } catch (PropertyValueException ex) {
195 throw new ActionDescriptorException(
196 String.format(
197 "Error while setting parameters values " +
198 "for action (%s)"
199 , actionClass.getName())
200 , ex);
201 }
202 }
203 }
204
205 public void addActionParameterValue(ActionParameterValue parameterValue) {
206 if (parametersValues==null)
207 parametersValues = new ArrayList<ActionParameterValue>(5);
208 parametersValues.add(parameterValue);
209 }
210
211 public String getAccessKey() {
212 return messages.replaceInPlace(accessKey);
213 }
214
215 public void setAccessKey(String accessKey) {
216 this.accessKey = accessKey;
217 }
218
219
220 }