1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.efaps.update.schema.ui;
22
23 import java.net.URL;
24 import java.util.ArrayList;
25 import java.util.HashSet;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.Set;
29
30 import org.apache.commons.lang3.builder.ToStringBuilder;
31 import org.efaps.admin.event.EventType;
32 import org.efaps.ci.CIAdminCommon;
33 import org.efaps.ci.CIAdminEvent;
34 import org.efaps.ci.CIAdminUserInterface;
35 import org.efaps.db.Delete;
36 import org.efaps.db.Insert;
37 import org.efaps.db.Instance;
38 import org.efaps.db.InstanceQuery;
39 import org.efaps.db.QueryBuilder;
40 import org.efaps.update.AbstractUpdate;
41 import org.efaps.update.LinkInstance;
42 import org.efaps.update.UpdateLifecycle;
43 import org.efaps.update.event.Event;
44 import org.efaps.update.util.InstallationException;
45 import org.efaps.util.EFapsException;
46
47
48
49
50
51
52
53
54
55
56 public abstract class AbstractCollectionUpdate
57 extends AbstractUpdate
58 {
59
60
61 private static final Link LINKFIELD2ICON = new Link("Admin_UI_LinkIcon", "From", "Admin_UI_Image", "To");
62
63
64 private static final Link LINK2TARGETTABLE = new Link("Admin_UI_LinkTargetTable", "From", "Admin_UI_Table", "To");
65
66
67 private static final Link LINK2PICKER = new Link("Admin_UI_LinkField2Command", "FromLink",
68 "Admin_UI_Command", "ToLink");
69
70
71
72
73
74 protected AbstractCollectionUpdate(final URL _url,
75 final String _typeName)
76 {
77 super(_url, _typeName);
78 }
79
80
81
82
83
84
85 protected AbstractCollectionUpdate(final URL _url,
86 final String _typeName,
87 final Set<Link> _allLinkTypes)
88 {
89 super(_url, _typeName, _allLinkTypes);
90 }
91
92
93
94
95
96
97
98 @Override
99 protected AbstractDefinition newDefinition()
100 {
101 return new Definition();
102 }
103
104
105
106
107 private final class FieldDefinition
108 extends AbstractDefinition
109 {
110
111
112 private final String name;
113
114
115 private String icon = null;
116
117
118 private final String character;
119
120
121
122
123
124
125 private FieldDefinition(final String _name,
126 final String _character)
127 {
128 this.name = _name;
129 this.character = _character;
130 }
131
132
133
134
135
136 @Override
137 protected void readXML(final List<String> _tags,
138 final Map<String, String> _attributes,
139 final String _text)
140 throws EFapsException
141 {
142 final String value = _tags.get(0);
143 if ("evaluate".equals(value)) {
144 if (_tags.size() == 1) {
145 addEvent(new Event(_attributes.get("name"), EventType.UI_TABLE_EVALUATE, _attributes
146 .get("program"), _attributes.get("method"), _attributes.get("index")));
147 } else if ((_tags.size() == 2) && "property".equals(_tags.get(1))) {
148 getEvents().get(getEvents().size() - 1).addProperty(_attributes.get("name"), _text);
149 } else {
150 super.readXML(_tags, _attributes, _text);
151 }
152 } else if ("icon".equals(value)) {
153 this.icon = _text;
154 } else if ("table".equals(value)) {
155
156 addLink(AbstractCollectionUpdate.LINK2TARGETTABLE, new LinkInstance(_text));
157 } else if ("picker".equals(value)) {
158
159 addLink(AbstractCollectionUpdate.LINK2PICKER, new LinkInstance(_attributes.get("name")));
160 } else if ("trigger".equals(value)) {
161 if (_tags.size() == 1) {
162 getEvents().add(new Event(_attributes.get("name"), EventType.valueOf(_attributes.get("event")),
163 _attributes.get("program"), _attributes.get("method"), _attributes.get("index")));
164 } else if ((_tags.size() == 2) && "property".equals(_tags.get(1))) {
165 getEvents().get(getEvents().size() - 1).addProperty(_attributes.get("name"), _text);
166 } else {
167 super.readXML(_tags, _attributes, _text);
168 }
169 } else {
170 super.readXML(_tags, _attributes, _text);
171 }
172 }
173
174
175
176
177
178
179
180 @Override
181 public String toString()
182 {
183 return new ToStringBuilder(this).append("name", this.name).append("properties", getProperties()).toString();
184 }
185 }
186
187
188
189
190
191 protected class Definition
192 extends AbstractDefinition
193 {
194
195 private final List<AbstractCollectionUpdate.FieldDefinition> fields
196 = new ArrayList<AbstractCollectionUpdate.FieldDefinition>();
197
198
199
200
201 private FieldDefinition curField = null;
202
203
204
205
206
207
208
209
210
211 @Override
212 protected void readXML(final List<String> _tags,
213 final Map<String, String> _attributes,
214 final String _text)
215 throws EFapsException
216 {
217 final String value = _tags.get(0);
218 if ("field".equals(value)) {
219 if (_tags.size() == 1) {
220 this.curField = new FieldDefinition(_attributes.get("name"), _attributes.get("character"));
221 this.fields.add(this.curField);
222 } else {
223 this.curField.readXML(_tags.subList(1, _tags.size()), _attributes, _text);
224 }
225 } else {
226 super.readXML(_tags, _attributes, _text);
227 }
228 }
229
230
231
232
233
234
235
236
237
238
239 @Override
240 public void updateInDB(final UpdateLifecycle _step,
241 final Set<Link> _allLinkTypes)
242 throws InstallationException
243 {
244 super.updateInDB(_step, _allLinkTypes);
245 if (_step == UpdateLifecycle.EFAPS_UPDATE) {
246 try {
247 setFieldsInDB();
248 } catch (final EFapsException e) {
249 throw new InstallationException("error in setFieldsInDB", e);
250 }
251 }
252 }
253
254
255
256
257
258
259
260
261
262 protected void setFieldsInDB()
263 throws EFapsException
264 {
265
266 final QueryBuilder queryBldr = new QueryBuilder(CIAdminUserInterface.Field);
267 queryBldr.addWhereAttrEqValue(CIAdminUserInterface.Field.Collection, getInstance().getId());
268 final InstanceQuery query = queryBldr.getQuery();
269 query.executeWithoutAccessCheck();
270 while (query.next()) {
271 final Instance instField = query.getCurrentValue();
272 setPropertiesInDb(instField, null);
273 removeLinksInDB(instField, AbstractCollectionUpdate.LINKFIELD2ICON);
274 removeLinksInDB(instField, AbstractCollectionUpdate.LINK2TARGETTABLE);
275 removeLinksInDB(instField, AbstractCollectionUpdate.LINK2PICKER);
276
277 final QueryBuilder eventQueryBldr = new QueryBuilder(CIAdminEvent.Definition);
278 eventQueryBldr.addWhereAttrEqValue(CIAdminEvent.Definition.Abstract, instField.getId());
279 final InstanceQuery eventQuery = eventQueryBldr.getQuery();
280 eventQuery.execute();
281 while (eventQuery.next()) {
282 final Instance event = eventQuery.getCurrentValue();
283 final QueryBuilder propQueryBldr = new QueryBuilder(CIAdminCommon.Property);
284 propQueryBldr.addWhereAttrEqValue(CIAdminCommon.Property.Abstract, event.getId());
285 final InstanceQuery propQuery = propQueryBldr.getQuery();
286 propQuery.execute();
287 while (propQuery.next()) {
288 new Delete(propQuery.getCurrentValue()).executeWithoutAccessCheck();
289 }
290 new Delete(event).executeWithoutAccessCheck();
291 }
292 new Delete(instField).executeWithoutAccessCheck();
293 }
294
295
296 for (final FieldDefinition field : this.fields) {
297 Insert insert;
298 if ("Command".equals(field.character)) {
299 insert = new Insert(CIAdminUserInterface.FieldCommand);
300 } else if ("Target".equals(field.character)) {
301 insert = new Insert(CIAdminUserInterface.FieldTable);
302 } else if ("Heading".equals(field.character)) {
303 insert = new Insert(CIAdminUserInterface.FieldHeading);
304 } else if ("Group".equals(field.character)) {
305 insert = new Insert(CIAdminUserInterface.FieldGroup);
306 } else if ("Set".equals(field.character)) {
307 insert = new Insert(CIAdminUserInterface.FieldSet);
308 } else if ("Classification".equals(field.character)) {
309 insert = new Insert(CIAdminUserInterface.FieldClassification);
310 } else if ("Picker".equals(field.character)) {
311 insert = new Insert(CIAdminUserInterface.FieldPicker);
312 } else if ("Chart".equals(field.character)) {
313 insert = new Insert(CIAdminUserInterface.FieldChart);
314 } else {
315 insert = new Insert(CIAdminUserInterface.Field);
316 }
317
318 insert.add("Collection", getInstance().getId());
319 insert.add("Name", field.name);
320 insert.executeWithoutAccessCheck();
321 setPropertiesInDb(insert.getInstance(), field.getProperties());
322
323 if (field.icon != null) {
324 final Set<LinkInstance> iconset = new HashSet<LinkInstance>();
325 iconset.add(new LinkInstance(field.icon));
326 setLinksInDB(insert.getInstance(), AbstractCollectionUpdate.LINKFIELD2ICON, iconset);
327 }
328
329
330 setLinksInDB(insert.getInstance(), AbstractCollectionUpdate.LINK2TARGETTABLE,
331 field.getLinks(AbstractCollectionUpdate.LINK2TARGETTABLE));
332
333
334 setLinksInDB(insert.getInstance(), AbstractCollectionUpdate.LINK2PICKER,
335 field.getLinks(AbstractCollectionUpdate.LINK2PICKER));
336
337
338 for (final Event event : field.getEvents()) {
339 final Instance newInstance = event.updateInDB(insert.getInstance(), field.name);
340 setPropertiesInDb(newInstance, event.getProperties());
341 }
342 }
343 }
344
345
346
347
348
349
350
351 public void addField(final FieldDefinition _field)
352 {
353 this.fields.add(_field);
354 }
355
356
357
358
359
360
361
362 @Override
363 public String toString()
364 {
365 return new ToStringBuilder(this).appendSuper(super.toString()).append("fields", this.fields).toString();
366 }
367 }
368 }