KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > module > gui > html > FieldEditor


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10 package org.mmbase.module.gui.html;
11
12 import java.util.*;
13 import java.io.*;
14
15 import org.mmbase.module.ParseException;
16 import org.mmbase.module.core.*;
17 import org.mmbase.module.corebuilders.*;
18
19 import org.mmbase.util.*;
20 import org.mmbase.util.logging.*;
21
22 /**
23  * The FieldEditor class is a frontend for the different TypeEditors (hitlisted).
24  * @javadoc
25  *
26  * @application SCAN
27  * @author Daniel Ockeloen
28  * @author Hans Speijer
29  * @author Arjan Houtman
30  * @version $Id: FieldEditor.java,v 1.17 2005/09/27 14:52:36 michiel Exp $
31  */

32 public class FieldEditor implements CommandHandlerInterface {
33     // Logger
34
private static Logger log = Logging.getLoggerInstance(FieldEditor.class.getName());
35
36     StateManager stateMngr;
37
38     /**
39      * Constructor
40      * @javadoc
41      */

42     public FieldEditor(StateManager manager) {
43         stateMngr = manager;
44     }
45
46     /**
47      * List commands
48      * @javadoc
49      */

50     public Vector getList(scanpage sp, StringTagger args, StringTokenizer command) throws ParseException {
51         String JavaDoc token;
52         String JavaDoc userName=HttpAuth.getRemoteUser(sp);
53
54         EditState state = stateMngr.getEditState(userName);
55         Vector result = new Vector();
56
57         if (command.hasMoreTokens()) {
58             token = command.nextToken();
59             if (token.equals("DUMMY")) {
60             } else if (token.equals("DUMMY")) {
61             }
62         }
63         result.addElement("No List command defined (FieldEditor)");
64         return result;
65     }
66
67     /**
68      * Replace/Trigger commands
69      * @javadoc
70      */

71     public String JavaDoc replace(scanpage sp, StringTokenizer command) {
72         String JavaDoc token;
73         String JavaDoc userName=HttpAuth.getRemoteUser(sp);
74         EditState state = stateMngr.getEditState(userName);
75         Vector result = new Vector();
76
77         if (command.hasMoreTokens()) {
78             token = command.nextToken();
79             if (token.equals("GETFIELDVALUE")) {
80                 return getEditField(state,command.nextToken());
81             } else
82             if (token.equals("SETFIELDVALUE")) {
83                 return setEditField(state,command.nextToken(),command.nextToken());
84             }
85             else if (token.equals("GETFIELDDATE")) {
86                 return getEditDateField (state, command.nextToken (), command.nextToken ());
87             } else if (token.equals("COMMIT")) {
88                 return ""+doCommit(state,userName);
89             } else if (token.equals("SETINSSAVE")) {
90                 state.setInsSave(true);
91             }
92         }
93         return "Command not defined (FieldEditor)";
94     }
95
96     /**
97      * The hook that passes all form related pages to the correct handler
98      * @javadoc
99      */

100     public boolean process(scanpage sp, StringTokenizer command,Hashtable cmds, Hashtable vars) {
101         String JavaDoc token;
102         String JavaDoc userName=HttpAuth.getRemoteUser(sp);
103         EditState state = stateMngr.getEditState(userName);
104         Vector result = new Vector();
105
106         if (command.hasMoreTokens()) {
107             token = command.nextToken();
108             if (token.equals("SETFIELDVALUE")) {
109                 return setEditField(state,command.nextToken(),cmds);
110             }
111             else if (token.equals ("SETFIELDDATE")) {
112                 return setEditDateField (state, command.nextToken (), cmds);
113             } else if (token.equals("SETFIELDFILE_IMG")) {
114                 log.info("FieldEditor -> FILE UPLOAD DETECTED");
115                 setEditIMGField(state,command.nextToken(),cmds,sp);
116                 return true;
117             } else if (token.equals("SETFIELDFILE_DISK")) {
118                 log.info("FieldEditor -> FILE DISK DETECTED");
119                 setEditDISKField(state,command.nextToken(),cmds,sp);
120                 return true;
121             } else if (token.equals("DUMMY")) {
122             }
123         }
124         return false;
125     }
126
127     /**
128      * @javadoc
129      */

130     String JavaDoc getEditField(EditState ed, String JavaDoc fieldname) {
131         MMObjectNode node=ed.getEditNode();
132         if (node == null) return "";
133         return Encode.encode("ESCAPE_HTML",node.getStringValue( fieldname ));
134     }
135
136     /**
137      * @javadoc
138      */

139     boolean setEditField(EditState ed, String JavaDoc fieldname,Hashtable cmds) {
140         MMObjectBuilder obj=ed.getBuilder();
141         FieldDefs def=obj.getField(fieldname);
142         String JavaDoc value=(String JavaDoc)cmds.get("EDIT-SETFIELDVALUE-"+fieldname);
143         MMObjectNode node=ed.getEditNode();
144         if (node!=null) {
145             node.setValue( fieldname, value );
146             replaceOwner(ed,node);
147         }
148         return true;
149     }
150
151     /**
152      * @javadoc
153      */

154     String JavaDoc setEditField(EditState ed, String JavaDoc fieldname,String JavaDoc value) {
155         MMObjectBuilder obj=ed.getBuilder();
156         FieldDefs def=obj.getField(fieldname);
157         MMObjectNode node=ed.getEditNode();
158         if (node!=null) {
159             node.setValue( fieldname, value );
160             replaceOwner(ed,node);
161         }
162         return "";
163     }
164
165     // Deprecated. use Locale
166
static private String JavaDoc monthNames[] =
167         { "januari", "februari", "maart", "april", "mei", "juni", "juli",
168           "augustus", "september", "oktober", "november", "december" };
169
170      /**
171       * @deprecated use Locale
172       */

173      static public String JavaDoc getMonthString (int m) {
174          return monthNames[m - 1];
175      }
176
177     // Deprecated. use Locale
178
private int getMonthNumber (String JavaDoc m) {
179         int r;
180         for (r = 0; r < 12; r++) if (m.equals (monthNames[r])) break;
181         return r+1;
182     }
183
184     private String JavaDoc leadZero (int m) {
185         if (m < 0 || m > 9) return ""+m;
186         return "0"+m;
187     }
188
189     /**
190      * @javadoc
191      */

192     String JavaDoc getEditDateField (EditState ed, String JavaDoc what, String JavaDoc fieldname) {
193         MMObjectNode node=ed.getEditNode();
194         String JavaDoc res = new String JavaDoc ();
195
196         if (node != null) {
197             int time = node.getIntValue(fieldname);
198             Date d;
199
200             if (time == -1) { // User current date and time
201
d = new Date ();
202             }
203             else {
204                 d = new Date (((long)time * 1000)+DateSupport.getMilliOffset());
205             }
206
207             if (what.equals ("DAYS")) res = leadZero (d.getDate ());
208             else if (what.equals ("MONTHS")) res = getMonthString (d.getMonth () + 1);
209             else if (what.equals ("YEARS")) res = "" + (1900 + d.getYear ());
210             else if (what.equals ("HOURS")) res = leadZero (d.getHours ());
211             else if (what.equals ("MINUTES")) res = leadZero (d.getMinutes ());
212             else if (what.equals ("SECONDS")) res = leadZero (d.getSeconds ());
213         }
214         return res;
215     }
216
217     /**
218      * @javadoc
219      */

220     boolean setEditDateField (EditState ed, String JavaDoc fieldname, Hashtable cmds) {
221         MMObjectNode node = ed.getEditNode();
222         String JavaDoc days = (String JavaDoc)cmds.get ("EDIT-DAY");
223         String JavaDoc months = new Integer JavaDoc (getMonthNumber ((String JavaDoc)cmds.get ("EDIT-MONTH"))).toString ();
224         String JavaDoc years = (String JavaDoc)cmds.get ("EDIT-YEAR");
225         String JavaDoc hours = (String JavaDoc)cmds.get ("EDIT-HOUR");
226         String JavaDoc minutes = (String JavaDoc)cmds.get ("EDIT-MINUTE");
227         String JavaDoc seconds = (String JavaDoc)cmds.get ("EDIT-SECOND");
228         String JavaDoc value = hours + ":" + minutes + ":" + seconds + " " + days + "/" + months + "/" + years;
229
230         try { // to use all separate data in create a complete date
231
int time = (int)(DateSupport.convertDateToLong (value) / 1000);
232             Date d = new Date ((long)time * 1000);
233             log.debug("FieldEdit -> Storing: " + d.toString () + " in field " + fieldname);
234             node.setValue (fieldname, new Integer JavaDoc (time));
235         } catch (Exception JavaDoc e) {
236             log.error(Logging.stackTrace(e));
237             return false;
238         }
239         return true;
240     }
241
242     /**
243      * @javadoc
244      */

245     boolean setEditIMGField(EditState ed, String JavaDoc fieldname,Hashtable cmds,scanpage sp) {
246         MMObjectBuilder obj=ed.getBuilder();
247         FieldDefs def=obj.getField(fieldname);
248         try {
249             MMObjectNode node=ed.getEditNode();
250             if (node!=null) {
251                 byte[] bytes=sp.poster.getPostParameterBytes("file");
252                 node.setValue(fieldname,bytes);
253             }
254         } catch (Exception JavaDoc e) {
255             log.error(e.getMessage() + ":" + Logging.stackTrace(e));
256         }
257         return true;
258     }
259
260     /**
261      * @javadoc
262      */

263     boolean setEditDISKField(EditState ed, String JavaDoc fieldname,Hashtable cmds,scanpage sp) {
264         MMObjectBuilder obj=ed.getBuilder();
265         FieldDefs def=obj.getField(fieldname);
266         try {
267             MMObjectNode node=ed.getEditNode();
268             if (node!=null) {
269                 String JavaDoc filename=(String JavaDoc)cmds.get("EDIT-SETFIELDFILE_DISK-"+fieldname);
270                 byte[] bytes=getFile(filename);
271                 if (bytes==null) {
272                     log.warn("FieldEditor-> Empty file !!");
273                 } else {
274                     node.setValue(fieldname,bytes);
275                 }
276             }
277         } catch (Exception JavaDoc e) {
278             log.error(Logging.stackTrace(e));
279         }
280         return true;
281     }
282
283     /**
284      * @javadoc
285      */

286     int doCommit(EditState ed,String JavaDoc userName) {
287         MMObjectNode node=ed.getEditNode();
288         if (node!=null) {
289             int id=node.getIntValue("number");
290             if (id==-1) {
291                 // methods preEdit and insertDone are no longer available
292
// node.preEdit(ed);
293
id=node.insert(userName);
294                 // node.insertDone(ed);
295
node.getChanged().clear();
296             } else {
297                 // node.preEdit(ed);
298
node.commit();
299             }
300             if (node.getIntValue("snumber")!=-1 && node.getIntValue("dnumber")!=-1) {
301                 EditStateNode prenode=ed.getEditStateNode(1);
302                 if (prenode!=null) {
303                     prenode.delRelationTable();
304                 }
305             }
306             return id;
307         }
308         return -1;
309     }
310
311     private void replaceOwner(EditState ed,MMObjectNode node) {
312         // fix pop name to overide to username
313
if (node!=null) {
314             String JavaDoc ow=node.getStringValue("owner");
315             String JavaDoc userName=ed.getUser();
316             if (ow.equals("pop")) {
317                 node.setValue("owner",userName);
318                 log.debug("FieldEditor -> replaceOwner("+node.getValue("number")+","+userName+"): Replaced owner 'pop' with owner '"+userName+"'");
319             }
320         }
321     }
322
323     /**
324      * getFile: This method creates a byte array using the specified filepath argument.
325      */

326     public byte[] getFile(String JavaDoc filepath){
327         try {
328             File file = new File(filepath);
329             FileInputStream fis = new FileInputStream(filepath);
330             byte[] ba = new byte[(int)file.length()]; //Create a bytearray with a length the size of the filelength.
331
fis.read(ba); //Read up to ba.length bytes of data from this inputstream into the bytearray ba.
332
fis.close();
333             return ba;
334         } catch (IOException ioe){
335             return null;
336         }
337     }
338
339 }
340
Popular Tags