(no commit message)
[simdecs.git] / src / java / org / ufcspa / simdecs / diagram / mb / EditNode.java
CommitLineData
d076ae96 1/*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5package org.ufcspa.simdecs.diagram.mb;
6
7import java.io.IOException;
8import java.lang.reflect.Constructor;
9import java.lang.reflect.Field;
10import java.lang.reflect.InvocationTargetException;
11import java.lang.reflect.Method;
12import java.util.ArrayList;
13import java.util.LinkedList;
14import java.util.List;
15import java.util.Locale;
16import javax.el.MethodExpression;
17import javax.faces.event.ActionEvent;
18import javax.faces.event.MethodExpressionActionListener;
19import org.primefaces.component.menu.Menu;
20import org.primefaces.component.menuitem.MenuItem;
21import org.primefaces.model.DefaultMenuModel;
22import org.primefaces.model.MenuModel;
23import org.ufcspa.simdecs.diagram.elements.Node;
24import org.ufcspa.simdecs.diagram.elements.NodeElement;
25import org.ufcspa.simdecs.diagram.elements.NodeTextProperty;
26import org.ufcspa.simdecs.diagram.elements.SwimLane;
27import org.ufcspa.simdecs.diagram.mb.beans.PropertyEditorBean;
28import org.ufcspa.simdecs.diagram.util.ReflectionUtils;
29
30/**
31 *
32 * @author maroni
33 */
34public class EditNode extends DefaultManagedBean {
35
36 private final String BASE_ELEMENT_PACKAGE = "org.ufcspa.simdecs.diagram.elements";
37 private MenuModel menuActionList;
38 private EditDiagram editDiagram;
39 private Class currentNodeClass;
40 private List<PropertyEditorBean> properties;
41 private SwimLane currentSwimLane;
42
43 public EditNode() {
44 menuActionList = new DefaultMenuModel();
45 properties = new ArrayList<PropertyEditorBean>();
46 }
47
48 public EditDiagram getEditDiagram() {
49 return editDiagram;
50 }
51
52 public void setEditDiagram(EditDiagram editDiagram) {
53 this.editDiagram = editDiagram;
54 }
55
56 public MenuModel getMenuActionList() {
57 return menuActionList;
58 }
59
60 public void setMenuActionList(MenuModel menuActionList) {
61 this.menuActionList = menuActionList;
62 }
63
64 public void prepareActionMenu() throws ClassNotFoundException, IOException, NoSuchMethodException, IllegalAccessException, InstantiationException, IllegalArgumentException, InvocationTargetException {
65 String pActorID = getTextParameter("pActorID");
66 currentSwimLane = editDiagram.getDiagramManager().getSwimLane(pActorID);
67
68 menuActionList = new DefaultMenuModel();
69
70 for(Class cclass: ReflectionUtils.getClasses(BASE_ELEMENT_PACKAGE)) {
71 if (cclass.getAnnotation(NodeElement.class) != null) {
72 Constructor nodeConstructor = cclass.getConstructor(new Class[]{String.class, Locale.class});
73 Node node = (Node) nodeConstructor.newInstance(getMessageBundle(), getLocale());
74
75 if (currentSwimLane.getNodes().isEmpty() && !node.isFirst())
76 continue;
77
78 if (!node.isGrantedOnThisSwimLane(currentSwimLane))
79 continue;
80 LinkedList nodes = currentSwimLane.getNodes();
81 if (nodes != null && !nodes.isEmpty() && !node.isGrantedAfterThisNode((Node)nodes.getLast()))
82 continue;
83
84 MenuItem item = new MenuItem();
85 item.setValue(node.getName());
86 item.setId("menuItem-" + node.getId());
87 item.setOnstart("dialogAddNodeMenu.hide();");
88 item.setOncomplete("dialogEditNodeMenu.show();");
89 item.setUpdate("fEditNodeMenu");
90
91 MethodExpression actionExpression = getFacesContext().getApplication().getExpressionFactory().createMethodExpression(getFacesContext().getELContext(),
92 "#{editNode.processAddNode}",
93 null,
94 new Class[]{ActionEvent.class});
95
96 item.addActionListener(new MethodExpressionActionListener(actionExpression));
97 menuActionList.addMenuItem(item);
98 }
99 }
100
101 Menu menu = (Menu) getComponentById("fAddNodeMenu:dinamycAddNodeMenu");
102 menu.getChildren().clear();
103 menu.clearInitialState();
104 menu.setModel(menuActionList);
105 menu.buildMenuFromModel();
106 }
107
108 public void processAddNode(ActionEvent event) throws ClassNotFoundException {
109 String callerID = event.getComponent().getClientId();
110 String callerClassStrName = callerID.substring(callerID.indexOf("-") + 1, callerID.indexOf("-", callerID.indexOf("-") + 1));
111 currentNodeClass = Class.forName(BASE_ELEMENT_PACKAGE + '.' + callerClassStrName);
112
113 properties = new ArrayList<PropertyEditorBean>();
114 for (Field field : currentNodeClass.getDeclaredFields()) {
115 NodeTextProperty textAnnotation = field.getAnnotation(NodeTextProperty.class);
116
117 if (textAnnotation != null) {
118 PropertyEditorBean property = new PropertyEditorBean();
119 property.setReflectionField(field);
120 property.setName(getResourceMessage(textAnnotation.namei18n()));
121 property.setMinLength(textAnnotation.minLength());
122 property.setMaxLength(textAnnotation.maxLength());
123 property.setRequired(textAnnotation.required());
124 properties.add(property);
125 }
126 }
127
128 Menu menu = (Menu) getComponentById("fAddNodeMenu:dinamycAddNodeMenu");
129 }
130
131 public void addNode() throws NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
132 Constructor nodeConstructor = currentNodeClass.getConstructor(new Class[]{String.class, Locale.class});
133 Node node = (Node) nodeConstructor.newInstance(getMessageBundle(), getLocale());
134
135 for (PropertyEditorBean property : properties) {
136 Method acessor = ReflectionUtils.getSetterMethod(currentNodeClass, property.getReflectionField());
137 acessor.invoke(node, property.getValue());
138 }
139
140 currentSwimLane.addNode(node);
141
142 }
143
144 public List<PropertyEditorBean> getProperties() {
145 return properties;
146 }
147
148 public void setProperties(List<PropertyEditorBean> properties) {
149 this.properties = properties;
150 }
151
152
153}