1 package org.weda.tapestry.component;
2
3 import java.util.List;
4 import java.util.Map;
5 import org.apache.commons.logging.Log;
6 import org.apache.commons.logging.LogFactory;
7 import org.apache.hivemind.ApplicationRuntimeException;
8 import org.apache.tapestry.BaseComponent;
9 import org.apache.tapestry.IRequestCycle;
10 import org.apache.tapestry.annotations.Bean;
11 import org.apache.tapestry.annotations.ComponentClass;
12 import org.apache.tapestry.annotations.InitialValue;
13 import org.apache.tapestry.annotations.InjectObject;
14 import org.apache.tapestry.annotations.Parameter;
15 import org.apache.tapestry.annotations.Persist;
16 import org.weda.action.ActionContainer;
17 import org.weda.action.ActionContainerProvider;
18 import org.weda.action.ActionEvent;
19 import org.weda.action.ActionExecutionContext;
20 import org.weda.action.ActionListener;
21 import org.weda.action.ActionPreprocessor;
22 import org.weda.message.Messages;
23 import org.weda.model.EditorModel;
24 import org.weda.model.EditorModelGroup;
25 import org.weda.model.EditorModelGroupException;
26 import org.weda.store.actions.ObjectSourceApplyAction;
27 import org.weda.store.actions.ObjectSourceCancelEditAction;
28 import org.weda.store.actions.ObjectSourceRefreshAction;
29 import org.weda.store.actions.ObjectSourceResetSearchPatternsAction;
30 import org.weda.store.actions.ObjectSourceSaveAction;
31 import org.weda.tapestry.Utils;
32
33 /**Цель: Компонент группирующий редакторы.
34 *
35 * @author Mikhail Titov
36 */
37 @ComponentClass(allowBody=true, allowInformalParameters=true)
38 public abstract class EditorGroup
39 extends AbstractComponent
40 implements ActionContainerProvider, ActionListener
41 {
42 private final static Log log = LogFactory.getLog(EditorGroup.class);
43
44 public final static String EDITOR_GROUP_ATTRIBUTE_NAME =
45 EditorGroup.class.getName();
46
47 @Parameter(required=true)
48 public abstract EditorModelGroup getModelGroup();
49 @Parameter(required=false, defaultValue="ognl:false")
50 public abstract boolean isExceptionOnEditorError();
51 @Bean(java.util.ArrayList.class)
52 public abstract List<EditorGroupComponent> getEditorGroupComponents();
53 @Bean(java.util.ArrayList.class)
54 public abstract List<Map> getEditorComponentsStates();
55
56 @Persist("client") @InitialValue("new java.util.HashMap()")
57 public abstract Map<String, Exception> getErrorMessages();
58
59 public EditorModel getModel(String modelName){
60 try{
61 return getModelGroup().getEditorModel(modelName);
62 }catch(EditorModelGroupException e){
63 throw new ApplicationRuntimeException(e);
64 }
65 }
66
67 public void addEditorGroupComponent(EditorGroupComponent component){
68 getEditorGroupComponents().add(component);
69 getEditorComponentsStates().add(component.getState());
70 }
71
72 protected void prepareForRender(IRequestCycle cycle) {
73 super.prepareForRender(cycle);
74 cycle.setAttribute(EDITOR_GROUP_ATTRIBUTE_NAME, this);
75
76 ActionPanelHelper.addActionContainerProvider(cycle, this);
77 ActionPanelHelper.addActionListener(cycle, this);
78
79 getEditorGroupComponents().clear();
80 getEditorComponentsStates().clear();
81 }
82
83 protected void cleanupAfterRender(IRequestCycle cycle) {
84 super.cleanupAfterRender(cycle);
85 cycle.removeAttribute(EditorGroup.class.getName());
86 }
87
88 public List<ActionContainer> getActionContainers() throws Exception {
89 return getModelGroup().getActionContainers();
90 }
91
92 public void beforeExecute(ActionEvent event) throws Exception
93 {
94 ActionExecutionContext context = event.getExecutionContext();
95 Class actionClass = context.getActionDescriptor().getActionClass();
96 if ( ObjectSourceCancelEditAction.class.equals(actionClass)
97 || ObjectSourceResetSearchPatternsAction.class.equals(
98 actionClass))
99 {
100 getModelGroup().clearModelValues();
101 }else if ( ObjectSourceSaveAction.class.equals(actionClass)
102 || ObjectSourceApplyAction.class.equals(actionClass)
103 || ObjectSourceRefreshAction.class.equals(actionClass))
104 {
105 getErrorMessages().clear();
106 boolean exceptionOnEditorError = isExceptionOnEditorError();
107 List<EditorGroupComponent> components = getEditorGroupComponents();
108 for (int i=0; i<components.size(); i++){
109 EditorGroupComponent component = components.get(i);
110 if (component instanceof AbstractEditor){
111 Map state = getEditorComponentsStates().get(i);
112 component.restoreState(state);
113 try{
114 try{
115 ((AbstractEditor)component).makeUpdate();
116 }catch(Exception e){
117 log.error("Error updating editor value", e);
118 if (!exceptionOnEditorError)
119 getErrorMessages().put(
120 component.getModelName(), e);
121 else
122 throw new EditorGroupException(
123 getComponentMessages().getMessage(
124 "objectUpdateError")
125 , e);
126
127 }
128 }finally{
129 component.resetState(state);
130 }
131 }
132 }
133 if (getErrorMessages().size()>0)
134 throw new EditorGroupException(
135 getComponentMessages().getMessage("objectUpdateError"));
136 else
137 getModelGroup().clearModelValues();
138 }
139 }
140
141 public void afterExecute(ActionEvent event) throws Exception {
142 }
143
144 }