View Javadoc

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      //@Bean(java.util.HashMap.class)
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 }