View Javadoc

1   /* ===================================================================
2    * Copyright 2002-05 SRI International.
3    * Released under the MOZILLA PUBLIC LICENSE Version 1.1
4    * which can be obtained at http://www.mozilla.org/MPL/MPL-1.1.html
5    * This software is distributed on an "AS IS"
6    * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
7    * See the License for the specific language governing rights and
8    * limitations under the License.
9    * =================================================================== */
10  package com.sri.emo.wizard.creation.management;
11  
12  import com.jcorporate.expresso.core.controller.Controller;
13  import com.jcorporate.expresso.core.controller.ControllerException;
14  import com.jcorporate.expresso.core.controller.ErrorCollection;
15  import com.jcorporate.expresso.core.controller.ExpressoRequest;
16  import com.jcorporate.expresso.core.controller.ExpressoResponse;
17  import com.jcorporate.expresso.core.controller.Transition;
18  import com.jcorporate.expresso.core.db.DBException;
19  import com.sri.common.controller.StateHandler;
20  import com.sri.common.dbobj.ObjectNotFoundException;
21  import com.sri.emo.dbobj.Node;
22  import com.sri.emo.wizard.creation.CreationRepository;
23  import com.sri.emo.wizard.creation.model.CreationBean;
24  import com.sri.emo.wizard.creation.model.CreationPartsBean;
25  import com.sri.emo.wizard.creation.model.FieldCompletion;
26  import com.sri.emo.wizard.wizardgateway.ListWizards;
27  import com.sri.emo.wizard.wizardgateway.WizardGatewayController;
28  import org.apache.log4j.Logger;
29  
30  import java.util.Iterator;
31  import com.sri.emo.wizard.creation.model.*;
32  import com.sri.emo.dbobj.*;
33  
34  /***
35   * @author Michael Rimov
36   */
37  public class DoChooseCriteria implements StateHandler {
38  
39  
40      public static final String STATE_NAME = "doChooseCriteria";
41  
42      public static final String STATE_DESCRIPTION = "Save Criteria Choices";
43  
44      /***
45       * Parent controller backreference.
46       */
47      private final Controller parent;
48  
49      /***
50       * The completion session manager.
51       */
52      private final ICreationBeanManager beanManager;
53  
54  //    private final String FREETEXT_SUFFIX = "_freeText";
55      /***
56       * added by rich
57       */
58      private final String CREATE_SUFFIX = "_create";
59      private final String BROWSE_SUFFIX = "_browse";
60      private final String SEARCH_SUFFIX = "_search";
61      private final String REQUIRED_SUFFIX = "_required";
62  
63      private final String CREATE_TEXT_SUFFIX = "_createText";
64      private final String BROWSE_TEXT_SUFFIX = "_browseText";
65      private final String SEARCH_TEXT_SUFFIX = "_searchText";
66  
67  
68      private final String MINALLOWED_SUFFIX = "_minEntries";
69  
70      private final String MAXALLOWED_SUFFIX = "_maxEntries";
71  
72      private final String DIRECTIVE_SUFFIX = "_directive";
73  
74      private final String HELPTEXT_SUFFIX = "_helpText";
75  
76  
77      /***
78       * Interface to the internal repository.
79       */
80      private final CreationRepository completionRepository;
81  
82      /***
83       * Constructor that takes the owner controller as a paramter.
84       *
85       * @param owner            Controller the owning controller.
86       * @param respository      The Completion Repository bean.
87       * @param stateBeanManager The CompletionBean Manager.
88       */
89      public DoChooseCriteria(final Controller owner,
90                              final CreationRepository respository,
91                              final ICreationBeanManager stateBeanManager) {
92          parent = owner;
93          beanManager = stateBeanManager;
94          completionRepository = respository;
95      }
96  
97  
98      /***
99       * Called to handle the request.
100      *
101      * @param request  ControllerRequest The Function's ControllerRequest
102      *                 object.
103      * @param response ControllerResponse The Function's ControllerResponse
104      *                 object.
105      * @throws DBException         upon underlying database exception error.
106      * @throws ControllerException upon underlying ControllerException error.
107      * @todo Clean up validation logic to clear out
108      */
109     public void handleRequest(final ExpressoRequest request, final ExpressoResponse response) throws DBException,
110             ControllerException {
111         //Check for session timeout.
112         if (beanManager.handleSessionTimeout(request, response)) {
113             return;
114         }
115 
116 
117         ErrorCollection ec = new ErrorCollection();
118 
119         CreationBeans wizardBeans = beanManager.getActionForm(request);
120         CreationBean wizardBean = wizardBeans.getCurrentBean();
121         for (Iterator i = wizardBean.getCompletionParts().iterator(); i.hasNext();) {
122 
123             CreationPartsBean partsBean = (CreationPartsBean) i.next();
124 
125             //
126             //Do not process fields for which the wizard has no control over.
127             //
128             if (partsBean.getFieldCompletion() == FieldCompletion.NOT_INCLUDED) {
129                 continue;
130             }
131 
132             String partNum = partsBean.getPart().getPartNum();
133 
134             String minEntries = request.getParameter(partNum + MINALLOWED_SUFFIX);
135             String maxEntries = request.getParameter(partNum + MAXALLOWED_SUFFIX);
136 //            String isFreeText = request.getParameter(partNum + FREETEXT_SUFFIX);
137             String directive = request.getParameter(partNum + DIRECTIVE_SUFFIX);
138             String helptext = request.getParameter(partNum + HELPTEXT_SUFFIX);
139 
140             String create = request.getParameter(partNum+CREATE_SUFFIX);
141             String browse = request.getParameter(partNum+BROWSE_SUFFIX);
142             String search = request.getParameter(partNum+SEARCH_SUFFIX);
143             String required = request.getParameter(partNum+REQUIRED_SUFFIX);
144 
145             String createText = request.getParameter(partNum+CREATE_TEXT_SUFFIX);
146             String browseText = request.getParameter(partNum+BROWSE_TEXT_SUFFIX);
147             String searchText = request.getParameter(partNum+SEARCH_TEXT_SUFFIX);
148 
149             if (partsBean.isSingleEntry()) {
150                 if (minEntries == null || minEntries.length() == 0) {
151                     partsBean.setMinEntries(1);
152                     partsBean.setMaxEntries(1);
153                 } else {
154                     boolean error = false;
155                     try {
156                         Integer minEntriesAsNumber = new Integer(minEntries);
157                         if (minEntriesAsNumber.intValue() > 1) {
158                             error = true;
159                         }
160                     } catch (NumberFormatException ex1) {
161                         error = true;
162                     }
163 
164                     if (error) {
165                         ec.addError(
166                                 "Min Entries for: " + partsBean.getPart().getPartLabel() + " must be a valid whole number and either 0 or 1");
167                     } else {
168                         partsBean.setMinEntries(Integer.parseInt(minEntries));
169                         partsBean.setMaxEntries(1);
170                     }
171 
172                     //Reset flag for potential next round of errors.
173                     error = false;
174 
175                     if (maxEntries != null) {
176                         try {
177                             Integer maxEntriesAsNumber = new Integer(maxEntries);
178                             if (maxEntriesAsNumber.intValue() > 1) {
179                                 error = true;
180                             }
181                         } catch (NumberFormatException ex1) {
182                             error = true;
183                         }
184                     }
185 
186                     if (error) {
187                         ec.addError(
188                                 "Max Entries for: " + partsBean.getPart().getPartLabel() + " must be a valid whole number and either 0 or 1");
189                     } else {
190                         partsBean.setMinEntries(Integer.parseInt(minEntries));
191                         partsBean.setMaxEntries(1);
192                     }
193 
194 
195                 }
196 
197             } else if (partsBean.isMinMaxAllowed()) {
198                 if (minEntries == null || minEntries.length() == 0) {
199                     partsBean.setMinEntries(1);
200                 } else {
201                     try {
202                         Integer minEntriesAsNumber = new Integer(minEntries);
203                         if (minEntriesAsNumber.intValue() < 0) {
204                             ec.addError(
205                                     "Min Entries for: " + partsBean.getPart().getPartLabel() + " must be a valid number >= 0");
206                         }
207                     } catch (NumberFormatException ex1) {
208                         ec.addError(
209                                 "Min Entries for: " + partsBean.getPart().getPartLabel() + " must be a valid number >= 0");
210                     }
211                     partsBean.setMinEntries(Integer.parseInt(minEntries));
212                 }
213 
214                 if (maxEntries == null || maxEntries.length() == 0) {
215                     partsBean.setMaxEntries(1);
216                 } else {
217                     Integer maxEntriesAsNumber = partsBean.getMaxEntries();
218                     try {
219                         maxEntriesAsNumber = new Integer(maxEntries);
220                         if (maxEntriesAsNumber.intValue() < 0) {
221                             ec.addError("The Maximum for '" + partsBean.getPart().getPartLabel()
222                                     + "' must be a valid number >= 0");
223                         } else if (partsBean.getMinEntries().intValue() > maxEntriesAsNumber.intValue()) {
224                             ec.addError("The Maximum for '" + partsBean.getPart().getPartLabel()
225                                     + "' must be greater than or equal to the Minimum value ("
226                                     + partsBean.getMinEntries().intValue() + ")");
227                         }
228 
229                     } catch (NumberFormatException ex1) {
230                         ec.addError("Max Entries for: " + partsBean.getPart().getPartLabel()
231                                 + " must be a valid number >= 0)");
232                     }
233                     partsBean.setMaxEntries(maxEntriesAsNumber.intValue());
234                 }
235             }
236 
237             //Validate Relations Count.
238             //changed by rich
239             /***
240              * @todo RICHARD: validate that we still need to check for
241              * shared node attributes
242              */
243 //            if (partsBean.getPart().isSharedNodeAttrib()) {
244 //                Node targetNode = wizardBean.getCurrentNode();
245 //                final Node[] relatedNodes = targetNode.getRelatedNodes(partsBean.getPart().getNodeRelation(),
246 //                        partsBean.getPart().getPartType());
247 //                if (maxEntries == null || minEntries == null) {
248 //                    ec.addError(
249 //                            "Please enter a value for minimum and maximum entries for : " + partsBean.getPart().getPartLabel());
250 //                } else {
251 //
252 //                    final int maxEntriesAsInt = Integer.parseInt(maxEntries);
253 //                    final int minEntriesAsInt = Integer.parseInt(minEntries);
254 //
255 //                    if (minEntriesAsInt > relatedNodes.length) {
256 //                        final String errorMessage = "The Minimum for '" + partsBean.getPart().getPartLabel()
257 //                                + "' cannot be greater than the number already found in '"
258 //                                + wizardBean.getCurrentNode().getDisplayName()
259 //                                + "' (" + relatedNodes.length + ")";
260 //                        ec.addError(errorMessage);
261 //                    }
262 //
263 //                    if (maxEntriesAsInt > relatedNodes.length) {
264 //                        final String errorMessage = "The Maximum for '" + partsBean.getPart().getPartLabel()
265 //                                + "' cannot be greater than the number already found in '"
266 //                                + wizardBean.getCurrentNode().getDisplayName()
267 //                                + "' (" + relatedNodes.length + ")";
268 //
269 //                        ec.addError(errorMessage);
270 //                    }
271 //                }
272 //            }
273 
274             //added by rich
275 //            System.out.println("Part Num: " + partNum);
276 //            System.out.println("create = " + create);
277 //            System.out.println("browse = " + browse);
278 //            System.out.println("search = " + search);
279 //            System.out.println("required = " + required);
280 
281             partsBean.setCreate(create != null);
282             partsBean.setBrowse(browse != null);
283             partsBean.setSearch(search != null);
284             partsBean.setRequired(required != null);
285 
286             partsBean.setCreateText(createText);
287             partsBean.setBrowseText(browseText);
288             partsBean.setSearchText(searchText);
289 
290             partsBean.setDirective(directive);
291             partsBean.setHelpText(helptext);
292             //if part exists within the wizardbeans but was removed by the user
293             //remove that bean from within the wizardbeans
294             if(!partsBean.isCreate() && wizardBeans.hasCreationBeanByPartId(partsBean.getPart().getId())){
295                 wizardBeans.removeBeanByPart(partsBean.getPart().getId());
296             }
297 
298             if(partsBean.isCreate() && !wizardBeans.hasCreationBeanByPartId(partsBean.getPart().getId())){
299                 CreationBean newCreation = new CreationBean();
300                 wizardBeans.add(newCreation);
301                 newCreation.setPartId(new Integer(partsBean.getPart().getId()).intValue());
302                 if(partsBean.getPart().isSharedNodeAttrib()){
303                     NodeType n = new NodeType();
304 //                    n.setField(NodeType.NODE_TYPE_NAME, );
305                     n.setEntityName(partsBean.getPart().getPartType());
306 
307                     System.out.println("parts type is " +  partsBean.getPart().getPartType());
308                     if (!n.find()) {
309 //                        if (errorMessages != null) {
310 //                            errorMessages.addError("Unable to find node type with id of : " + getTargetId());
311 //                        } else {
312                         throw new IllegalArgumentException("Unable to find node type with id of : " + partsBean.getPart().getPartType());
313 //                        }
314                     }else{
315                         n.retrieve();
316                         System.out.println("target id retrieved as " + n.getId());
317                         System.out.println("display title retr as " + n.getDisplayName());
318                         newCreation.setTargetId(n.getId());
319                     }
320                 }
321                 System.out.println("created new creation bean with partId: " + newCreation.getPartId() + " and targetId: " + newCreation.getTargetId());
322                 newCreation.initializeFromNodeId(ec);
323                 if(ec.size() > 0){
324                     break;
325                 }
326             }
327         }
328 
329         if(wizardBeans.incrementCurrentCreationBean()){
330             Transition redirect = new Transition(PromptChooseParts.STATE_NAME, parent);
331             redirect.redirectTransition(request, response);
332             return;
333         }
334 
335         //if any of the creation beans are not filled out, take the user back
336 //        System.out.println("wizardBeans = " + wizardBeans.toShortString());
337 //        Iterator iter = wizardBeans.iterator();
338 //        while(iter.hasNext()){
339 //            CreationBean bean = (CreationBean)iter.next();
340 //            if(bean.getCompletionParts() == null){
341 //            }
342 //        }
343 
344         //Validate
345         if (ec.size() == 0) {
346             wizardBean.validate(ec);
347         }
348 
349         //If error, go back to choose parts
350         if (ec.size() > 0) {
351             response.saveErrors(ec);
352             Transition toTransitionTo = new Transition(PromptChooseCriteria.STATE_NAME, parent);
353             toTransitionTo.executeTransition(request, response);
354             return;
355         }
356 
357         //Persist data
358 
359 
360         if (wizardBeans.getWizardId() == null) {
361             completionRepository.add(wizardBeans);
362         } else {
363             try {
364                 completionRepository.update(wizardBeans);
365             } catch (ObjectNotFoundException ex) {
366                 Logger.getLogger(DoChooseCriteria.class).warn(
367                         "Error updating wizard bean: Bean not found.  Adding instead", ex);
368                 completionRepository.add(wizardBeans);
369             }
370         }
371 
372         //Clear the session
373         beanManager.destroyActionForm(request);
374 
375         //Redirect to Wizard Manager List
376         new Transition("aftersave", "after save", WizardGatewayController.class,
377                 ListWizards.STATE_NAME).redirectTransition(
378                 request, response);
379     }
380 }