KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jcorporate > expresso > services > controller > dbmaint > UpdateBase


1 /* ====================================================================
2  * The Jcorporate Apache Style Software License, Version 1.2 05-07-2002
3  *
4  * Copyright (c) 1995-2002 Jcorporate Ltd. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in
15  * the documentation and/or other materials provided with the
16  * distribution.
17  *
18  * 3. The end-user documentation included with the redistribution,
19  * if any, must include the following acknowledgment:
20  * "This product includes software developed by Jcorporate Ltd.
21  * (http://www.jcorporate.com/)."
22  * Alternately, this acknowledgment may appear in the software itself,
23  * if and wherever such third-party acknowledgments normally appear.
24  *
25  * 4. "Jcorporate" and product names such as "Expresso" must
26  * not be used to endorse or promote products derived from this
27  * software without prior written permission. For written permission,
28  * please contact info@jcorporate.com.
29  *
30  * 5. Products derived from this software may not be called "Expresso",
31  * or other Jcorporate product names; nor may "Expresso" or other
32  * Jcorporate product names appear in their name, without prior
33  * written permission of Jcorporate Ltd.
34  *
35  * 6. No product derived from this software may compete in the same
36  * market space, i.e. framework, without prior written permission
37  * of Jcorporate Ltd. For written permission, please contact
38  * partners@jcorporate.com.
39  *
40  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
41  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
42  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
43  * DISCLAIMED. IN NO EVENT SHALL JCORPORATE LTD OR ITS CONTRIBUTORS
44  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
45  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
46  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
47  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
48  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
49  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
50  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  * ====================================================================
53  *
54  * This software consists of voluntary contributions made by many
55  * individuals on behalf of the Jcorporate Ltd. Contributions back
56  * to the project(s) are encouraged when you make modifications.
57  * Please send them to support@jcorporate.com. For more information
58  * on Jcorporate Ltd. and its products, please see
59  * <http://www.jcorporate.com/>.
60  *
61  * Portions of this software are based upon other open source
62  * products and are subject to their respective licenses.
63  */

64
65 package com.jcorporate.expresso.services.controller.dbmaint;
66
67 import com.jcorporate.expresso.core.controller.Block;
68 import com.jcorporate.expresso.core.controller.ControllerException;
69 import com.jcorporate.expresso.core.controller.Output;
70 import com.jcorporate.expresso.core.dataobjects.DataField;
71 import com.jcorporate.expresso.core.dataobjects.DataFieldMetaData;
72 import com.jcorporate.expresso.core.dataobjects.DataObject;
73 import com.jcorporate.expresso.core.dataobjects.DataObjectMetaData;
74 import com.jcorporate.expresso.core.dataobjects.NestableDataObject;
75 import com.jcorporate.expresso.core.dataobjects.jdbc.JDBCDataObject;
76 import com.jcorporate.expresso.core.dataobjects.jdbc.LobField;
77 import com.jcorporate.expresso.core.db.DBException;
78 import com.jcorporate.expresso.core.dbobj.ValidValue;
79 import com.jcorporate.expresso.services.dbobj.MediaDBObject;
80 import org.apache.log4j.Logger;
81
82 import java.util.Iterator JavaDoc;
83
84
85 /**
86  * Base Class for posting add, delete and updating operations. This
87  * functionality was previously carried out in the DBMaint.doPost().
88  * Now extended by ADDsave, UPDATEsave and UPDATEdelete
89  * method.
90  *
91  * @author Michael Nash, contributions by Kevin King
92  * @version $Revision: 1.16 $ $Date: 2004/11/17 20:48:18 $
93  */

94 public abstract class UpdateBase
95         extends DynamicCmd {
96
97     private static Logger log = Logger.getLogger(UpdateBase.class);
98
99     public UpdateBase() {
100     }
101
102     /**
103      * Constructor
104      *
105      * @param code The name of the state.
106      * @param descrip The friendly name of the state
107      */

108     public UpdateBase(String JavaDoc code, String JavaDoc descrip) {
109         super(code, descrip);
110     } /* UpdateBase(String, String) */
111
112     /**
113      * Display a table showing the key fields of this object and their
114      * values. Used to confirm add/delete/update operations to the user
115      *
116      * @param withEditLink true if you want the edit link displayed for the key
117      * @throws DBException If it is not possible to determine the keys
118      * or their values
119      */

120     protected void showKey(boolean withEditLink)
121             throws DBException, ControllerException {
122         DataObject myDBObj = this.getDataObject();
123         DataObjectMetaData metadata = myDBObj.getMetaData();
124         String JavaDoc controller = getControllerName();
125
126         Block keyTable = new Block("key");
127         addBlock(keyTable);
128         keyTable.setAttribute("table", "Y");
129
130         String JavaDoc oneKeyFieldName = null;
131
132         for (Iterator JavaDoc e = myDBObj.getMetaData().getKeyFieldListArray().iterator(); e.hasNext();) {
133             oneKeyFieldName = (String JavaDoc) e.next();
134             DataFieldMetaData fieldMetadata = myDBObj.getFieldMetaData(oneKeyFieldName);
135
136             Block oneRow = new Block("oneRow");
137             oneRow.setAttribute("row", "Y");
138             keyTable.add(oneRow);
139             oneRow.add(new Output("FieldDescrip", metadata.getDescription(this
140                     .getControllerRequest().getLocale(), oneKeyFieldName)));
141 // fieldMetadata.getDescription()));
142

143             if (fieldMetadata.isMultiValued()) {
144                 java.util.List JavaDoc values = myDBObj.getValidValuesList(oneKeyFieldName);
145
146                 if (values == null) {
147                     throw new DBException("Valid values for field " +
148                             oneKeyFieldName + " from object " +
149                             fieldMetadata.getName() + " were null");
150                 }
151
152                 String JavaDoc fieldValue = null;
153                 ValidValue oneVV = null;
154
155                 for (Iterator JavaDoc ve = values.iterator(); ve.hasNext();) {
156                     oneVV = (ValidValue) ve.next();
157
158                     if (oneVV.getValue().equals(myDBObj.getDataField(oneKeyFieldName).asString())) {
159                         fieldValue = oneVV.getDescription();
160                     }
161                 }
162                 if (fieldValue == null) {
163                     Output fieldOutput = new Output("FieldValue",
164                             myDBObj.getDataField(oneKeyFieldName).asString());
165
166                     if (withEditLink) {
167                         showEditLink(oneKeyFieldName,
168                                 myDBObj.getDataField(oneKeyFieldName).asString(),
169                                 myDBObj, fieldOutput, controller);
170                     }
171
172                     oneRow.add(fieldOutput);
173                 } else {
174                     Output fieldOutput = new Output("FieldValue", fieldValue);
175
176                     if (withEditLink) {
177                         showEditLink(oneKeyFieldName, fieldValue, myDBObj,
178                                 fieldOutput, controller);
179                     }
180
181                     oneRow.add(fieldOutput);
182                 }
183             } else { /* if field is multi_valued */
184                 Output fieldOutput = new Output("FieldValue",
185                         myDBObj.getDataField(oneKeyFieldName).asString());
186
187                 if (withEditLink) {
188                     showEditLink(oneKeyFieldName,
189                             myDBObj.getDataField(oneKeyFieldName).asString(), myDBObj,
190                             fieldOutput, controller);
191                 }
192
193                 oneRow.add(fieldOutput);
194             }
195         } /* each key field */
196
197     } /* showKey() */
198
199     /**
200      * Saves updated BLOB fields to the database table if there are any. The
201      * way to tell if the field needs updating is that the BLOB field attribute
202      * fileName equals something, which points to a new file that has been uploaded
203      * [As parsed and set by DefaultAutoElement]
204      *
205      * @param myDBObj The current DBObject to update/add For adding records, the
206      * DBObject should already be added by the time this method is called.
207      * @see com.jcorporate.expresso.services.controller.ui.DefaultAutoElement#parseSingleInput
208      */

209     protected void saveBlobFields(DataObject myDBObj) throws DBException {
210
211
212         //We can't deal with anything but JDBC data objects
213
if (!(myDBObj instanceof JDBCDataObject || myDBObj instanceof NestableDataObject)) {
214             return;
215         }
216
217
218
219         //
220
//Check for BLOB fields. If they have a 'fileName' attribute set
221
//for any of the fields that are Binary types, then separately save
222
//that data to the database
223
//
224
for (Iterator JavaDoc i = myDBObj.getMetaData().getFieldListArray().iterator(); i.hasNext();) {
225             String JavaDoc nextField = (String JavaDoc) i.next();
226             DataFieldMetaData metadata = myDBObj.getFieldMetaData(nextField);
227
228             if (metadata.isBinaryObjectType()) {
229                 DataField field = myDBObj.getDataField(nextField);
230                 String JavaDoc uploadedFileName = (String JavaDoc) field.getAttribute("fileName");
231
232                 if (uploadedFileName != null && uploadedFileName.length() > 0) {
233                     DataObject daoToUse = myDBObj;
234                     if (daoToUse instanceof NestableDataObject) {
235                         daoToUse = ((NestableDataObject) myDBObj).getNestedFromFieldName(nextField);
236                         if (!(daoToUse instanceof JDBCDataObject)) {
237                             log.warn("Nested DataObject is not of type JDBCDataObject. Skipping update of file name");
238                             continue;
239                         }
240
241                         nextField = ((NestableDataObject) myDBObj).getFieldFromNestedName(nextField);
242                         field = daoToUse.getDataField(nextField);
243                     }
244
245
246                     if (daoToUse instanceof MediaDBObject) {
247                         MediaDBObject mediaObj = (MediaDBObject) daoToUse;
248                         mediaObj.saveBlob(nextField);
249                     } else {
250                         java.io.File JavaDoc f = new java.io.File JavaDoc(uploadedFileName);
251                         if (f == null) {
252                             log.error("File: " + uploadedFileName + " doesn't appear to exist.");
253                             throw new DBException("Unable to retrieve uploaded file!");
254                         }
255
256                         saveBlob(nextField, f, (JDBCDataObject) daoToUse);
257
258                     }
259                 }
260             }
261         } /* End For Iterator */
262     }
263
264     /**
265      * Saves a BLOB field to the database
266      *
267      * @param fieldName the field Name to save
268      * @param value A java.io.File object representing the file to send to the
269      * database.
270      * @param criteria The current DBObject we are operating on.
271      */

272     protected void saveBlob(String JavaDoc fieldName,
273                             java.io.File JavaDoc value,
274                             JDBCDataObject criteria) throws DBException {
275
276         int fileSize = (int) value.length();
277         java.io.InputStream JavaDoc is;
278         try {
279             is = new java.io.FileInputStream JavaDoc(value);
280         } catch (java.io.FileNotFoundException JavaDoc ex) {
281             log.error("File: " + value.getName() + " doesn't appear to exist.", ex);
282             throw new DBException("Unable to retrieve uploaded file!", ex);
283         }
284
285         LobField lf = new LobField();
286
287         lf.setCriteria(criteria);
288         try {
289             lf.saveBlob(fieldName, is, fileSize);
290         } finally {
291             lf.close();
292         }
293     }
294
295
296 }
297
298 /* UpdateBase */
Popular Tags