KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > de > webman > form > eventhandler > CTSaveHandler


1 package de.webman.form.eventhandler;
2
3 import com.teamkonzept.web.*;
4 import com.teamkonzept.webman.*;
5 import com.teamkonzept.webman.db.TKWebmanDBManager;
6 import com.teamkonzept.webman.mainint.*;
7 import com.teamkonzept.webman.mainint.db.*;
8 import com.teamkonzept.webman.mainint.db.queries.*;
9 import com.teamkonzept.webman.mainint.events.*;
10 import com.teamkonzept.lib.*;
11 import com.teamkonzept.field.*;
12 import com.teamkonzept.field.db.*;
13 import com.teamkonzept.db.*;
14 import com.teamkonzept.publishing.markups.*;
15 import de.webman.form.Form;
16 import de.webman.form.FormDependencies;
17
18 /**
19  * Stores either a new or an existing form.
20  *
21  * @author $Author: uli $
22  * @version $Revision: 1.11.2.2 $
23  */

24 public class CTSaveHandler
25     extends DefaultEventHandler
26     implements ParameterTypes,
27                FrameConstants,
28                DatabaseDefaults
29 {
30
31     /**
32      * The singleton instance.
33      */

34     private static final CTSaveHandler INSTANCE = new CTSaveHandler();
35
36     /**
37      * Avoids outside instantiation.
38      */

39     private CTSaveHandler ()
40     {
41         // NOP
42
}
43
44     /**
45      * Returns the singleton instance.
46      *
47      * @return the singleton instance.
48      */

49     public static CTSaveHandler getInstance ()
50     {
51         return INSTANCE;
52     }
53
54     /**
55      * Handles the specified event.
56      *
57      * @param event the event to be handled.
58      * @throws TKException if any error occurred during event handling.
59      */

60     public void handleEvent (TKEvent event)
61         throws TKException
62     {
63         try
64         {
65             // Check event.
66
WebManEvent.checkEvent(event.getRemoteUser(), event.getName(), ContextConstants.CONTENT_TREE);
67
68             // Get event parameters.
69
String JavaDoc id = event.getParameter(PARAMETER, "FORM_ID");
70             Integer JavaDoc formId = (id != null && id.trim().length() > 0) ? Integer.valueOf(id) : (Integer JavaDoc) null;
71             Integer JavaDoc formType = Integer.valueOf(event.getParameter(PARAMETER, "FORM_TYPE"));
72
73             // Get form prototype from submitted form data.
74
TKBaseField field = CTUtils.getStructure(formType.intValue());
75             TKHashtable realData = (TKHashtable) field.compileData("", event.getParams().getClass(PARAMETER), new TKHashtable());
76             TKBaseField saveField = null;
77
78             if (formType.intValue() == FRAGMENT_FORM_TYPE)
79             {
80                 // Build fragment specific structure.
81
TKFieldSwitchData data = (TKFieldSwitchData) realData.get(TKBaseField.SUB_TYPE_KEY);
82                 saveField = TKFieldRegistry.getFieldFromData(data.alternative, data.data);
83
84                 // Prepare error information.
85
String JavaDoc errorPath = TKFieldGroup.CLASS_ID + "." + TKBaseField.SUB_TYPE_KEY + "." + data.alternative + ".";
86
87                 if (CTUtils.isAmbiguousFormName(formId, saveField.getName().toUpperCase()))
88                 {
89                     // Refuse ambiguous fragment name and terminate.
90
refuse(event, "FORM_NAME#" + errorPath + saveField.getType() + "." + TKBaseField.NAME_KEY);
91                     return;
92                 }
93
94                 if (CTUtils.isAmbiguousFormDescription(formId, saveField.getShowName()))
95                 {
96                     // Refuse ambiguous fragment description and terminate.
97
refuse(event, "FORM_DESCRIPTION#" + errorPath + saveField.getType() + "." + TKBaseField.SHOW_NAME_KEY);
98                     return;
99                 }
100             }
101             else
102             {
103                 // Get form name.
104
String JavaDoc name = (String JavaDoc) realData.get(TKBaseField.NAME_KEY);
105
106                 if (name == null || name.trim().length() == 0)
107                 {
108                     // Generate form name from description.
109
realData.put(TKBaseField.NAME_KEY, CTUtils.generateFieldName(realData.get(TKBaseField.SHOW_NAME_KEY).toString(), TKInputField.SMALL_DEFAULT_LENGTH));
110                 }
111
112                 // Build form structure.
113
saveField = TKFieldRegistry.getFieldFromData(realData);
114
115                 if (CTUtils.isAmbiguousFormDescription(formId, saveField.getShowName()))
116                 {
117                     // Refuse ambiguous form description and terminate.
118
refuse(event, "FORM_DESCRIPTION#" + saveField.getType() + "." + TKBaseField.SHOW_NAME_KEY);
119                     return;
120                 }
121             }
122
123             if (CTUtils.isUnsafeFormModification(event))
124             {
125                 // Load form definition.
126
TKFormDBData data = new TKFormDBData(formId.intValue(), formType.intValue());
127                 TKFormDBInterface.Get(data);
128
129                 if (! TKFieldRegistry.getFieldFromDB(data).equals(saveField))
130                 {
131                     // Get form.
132
Form form = new Form(formId);
133
134                     // Get depending contents.
135
TKVector contents = FormDependencies.getDependingContents(form, new TKVector(), false);
136
137                     if (contents.size() > 0)
138                     {
139                         // Forward unsafe form modification and terminate.
140
forward(event, form, contents);
141                         return;
142                     }
143                 }
144             }
145
146             TKFormDBData formDB = null;
147
148             if (formId == null)
149             {
150                 // Create form definition.
151
formDB = new TKFormDBData(0, formType.intValue());
152                 TKFormDBInterface.New(formDB);
153                 formId = new Integer JavaDoc(formDB.form_id);
154             }
155             else
156             {
157                 // Load form definition.
158
formDB = new TKFormDBData(formId.intValue(), formType.intValue());
159             }
160
161             // Store form definition.
162
saveField.insertIntoDB(formDB);
163             TKFormDBInterface.Put(formDB);
164
165             // Finish event.
166
TKHTMLTemplate t = event.getPrepHTMLTemplate("ct_aftersave.tmpl");
167             t.set("FORM_ID", formId);
168             t.set("FORM_TYPE", event.getParameter(PARAMETER, "FORM_TYPE"));
169             t.set("UPBASE", event.getParameter(PARAMETER, "UPBASE"));
170             WebManEvent.fillEventsIntoTemplate(event.getRemoteUser(), t, CONTENT_TREE);
171             event.finishTemplate(t);
172         }
173         catch (NumberFormatException JavaDoc ne)
174         {
175             throw new TKUserException("Eine Ihrer Eingaben war im falschen Format " + ne.getMessage(), INPUT, USER_SEVERITY, true,ne);
176         }
177         catch (Throwable JavaDoc e)
178         {
179             // hier können Fehleingaben des Users (falsche Formate) abgefangen werden
180
// TO DO : Analyze Exception !
181
throw WebmanExceptionHandler.getException(e);
182         }
183     }
184
185     /**
186      * Checks wether this handler is capable to handle the specified event.
187      *
188      * @param event the event to be handled.
189      * @return <CODE>true</CODE> if this handler is capable to handle the
190      * specified event, otherwise <CODE>false</CODE>.
191      */

192     public boolean isHandler (TKEvent event)
193     {
194         return event.getName().equalsIgnoreCase("CT_SAVE");
195     }
196
197     /**
198      * Refuses the specified event.
199      *
200      * @param event the event to be refused.
201      * @param error the cause of the refusal.
202      * @throws Throwable if any error occurred during event refusal.
203      */

204     private void refuse (TKEvent event, String JavaDoc error)
205         throws Throwable JavaDoc
206     {
207         TKHTMLTemplate t = event.getPrepHTMLTemplate("ct_fields.tmpl");
208
209         TKBaseField field = CTUtils.getStructure(Integer.valueOf(event.getParameter(PARAMETER, "FORM_TYPE")).intValue());
210         field.fillIntoTemplate(t, field.compileData("", event.getParams().getClass(PARAMETER), new TKHashtable()), "");
211
212         if (event.getParameter(PARAMETER, "FORM_ID") != null)
213         {
214             t.set("FORM_ID", event.getParameter(PARAMETER, "FORM_ID"));
215         }
216
217         t.set("FORM_TYPE", event.getParameter(PARAMETER, "FORM_TYPE"));
218         t.set("UPBASE", event.getParameter(PARAMETER, "UPBASE"));
219         t.set("ERROR", error);
220
221         WebManEvent.fillEventsIntoTemplate(event.getRemoteUser(), t, CONTENT_TREE);
222         event.finishTemplate(t);
223     }
224
225     /**
226      * Forwards the specified event.
227      *
228      * @param event the event to be forwarded.
229      * @param form the form to be saved.
230      * @param dependencies the objects depending on the form.
231      * @throws Throwable if any error occurred during event forwarding.
232      */

233     private void forward (TKEvent event,
234                           Form form,
235                           TKVector dependencies)
236         throws Throwable JavaDoc
237     {
238         TKHTMLTemplate t = event.getPrepHTMLTemplate("ct_dependency.tmpl");
239
240         t.set("NEXT_EVENT", event.getName());
241         t.set("FORCE_MODIFICATION", "1");
242         t.set("FORM_DESCRIPTION", form.getDescription());
243         t.setListIterator(new TKStandardPluginIterator("REFERENCES", null, dependencies, false, t.getListIterator()));
244         t.setListIterator(new TKStandardPluginIterator("PARAMETERS", null, CTUtils.getParameterList(event.getParams().getClass(PARAMETER)), false, t.getListIterator()));
245
246         WebManEvent.fillEventsIntoTemplate(event.getRemoteUser(), t, CONTENT_TREE);
247         event.finishTemplate(t);
248     }
249
250 }
251
Popular Tags