e684af8e8075d5132f7e1c5a6bd92875403b0bc7
[mir.git] / source / mircoders / servlet / ServletModuleUploadedMedia.java
1 /*\r
2  * Copyright (C) 2001, 2002 The Mir-coders group\r
3  *\r
4  * This file is part of Mir.\r
5  *\r
6  * Mir is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 2 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * Mir is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with Mir; if not, write to the Free Software\r
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
19  *\r
20  * In addition, as a special exception, The Mir-coders gives permission to link\r
21  * the code of this program with  any library licensed under the Apache Software License,\r
22  * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library\r
23  * (or with modified versions of the above that use the same license as the above),\r
24  * and distribute linked combinations including the two.  You must obey the\r
25  * GNU General Public License in all respects for all of the code used other than\r
26  * the above mentioned libraries.  If you modify this file, you may extend this\r
27  * exception to your version of the file, but you are not obligated to do so.\r
28  * If you do not wish to do so, delete this exception statement from your version.\r
29  */\r
30 \r
31 package mircoders.servlet;\r
32 \r
33 import java.io.InputStream;\r
34 import java.util.HashMap;\r
35 import java.util.Iterator;\r
36 import java.util.List;\r
37 import java.util.Locale;\r
38 import java.util.Map;\r
39 import java.util.Vector;\r
40 import javax.servlet.ServletContext;\r
41 import javax.servlet.ServletOutputStream;\r
42 import javax.servlet.http.HttpServletRequest;\r
43 import javax.servlet.http.HttpServletResponse;\r
44 \r
45 import org.apache.commons.fileupload.FileItem;\r
46 import mir.config.MirPropertiesConfiguration;\r
47 import mir.entity.Entity;\r
48 import mir.entity.adapter.EntityAdapter;\r
49 import mir.entity.adapter.EntityAdapterModel;\r
50 import mir.entity.adapter.EntityIteratorAdapter;\r
51 import mir.log.LoggerWrapper;\r
52 import mir.media.MediaHelper;\r
53 import mir.media.MirMedia;\r
54 import mir.servlet.ServletModule;\r
55 import mir.servlet.ServletModuleExc;\r
56 import mir.servlet.ServletModuleFailure;\r
57 import mir.servlet.ServletModuleUserExc;\r
58 import mir.session.UploadedFile;\r
59 import mir.util.CachingRewindableIterator;\r
60 import mir.util.ExceptionFunctions;\r
61 import mir.util.HTTPParsedRequest;\r
62 import mir.util.HTTPRequestParser;\r
63 import mir.util.JDBCStringRoutines;\r
64 import mir.util.SQLQueryBuilder;\r
65 import mir.util.URLBuilder;\r
66 import mircoders.entity.EntityComment;\r
67 import mircoders.entity.EntityContent;\r
68 import mircoders.entity.EntityUploadedMedia;\r
69 import mircoders.global.MirGlobal;\r
70 import mircoders.media.MediaUploadProcessor;\r
71 import mircoders.module.ModuleMediaType;\r
72 import mircoders.storage.DatabaseComment;\r
73 import mircoders.storage.DatabaseContent;\r
74 \r
75 /**\r
76  *\r
77  * <p>Title: </p>\r
78  * <p>Description: </p>\r
79  * <p>Copyright: Copyright (c) 2003</p>\r
80  * <p>Company: </p>\r
81  * @author the mir coders\r
82  * @version 1.0\r
83  */\r
84 \r
85 public abstract class ServletModuleUploadedMedia extends ServletModule {\r
86   protected String moduleName = "UploadedMedia";\r
87 \r
88   public static ServletModule getInstance() {\r
89     return null;\r
90   }\r
91 \r
92   public ServletModuleUploadedMedia() {\r
93     super();\r
94 \r
95     definition = "uploadedMedia";\r
96     logger = new LoggerWrapper("ServletModule.UploadedMedia");\r
97     try {\r
98       model = MirGlobal.localizer().dataModel().adapterModel();\r
99     }\r
100     catch (Throwable t) {\r
101       throw new ServletModuleFailure(t);\r
102     }\r
103   }\r
104 \r
105   public void insert(HttpServletRequest aRequest, HttpServletResponse aResponse)\r
106           throws ServletModuleExc, ServletModuleUserExc {\r
107     try {\r
108       HTTPParsedRequest parsedRequest = new HTTPParsedRequest(aRequest,\r
109           configuration.getString("Mir.DefaultEncoding"),\r
110           configuration.getInt("MaxMediaUploadSize")*1024,\r
111           configuration.getString("TempDir"));\r
112 \r
113       Map mediaValues = new HashMap();\r
114 \r
115       mediaValues.put("to_publisher", ServletHelper.getUser(aRequest).getId());\r
116 \r
117       Iterator i = mainModule.getStorageObject().getFields().iterator();\r
118       while (i.hasNext()) {\r
119         String field = (String) i.next();\r
120         String value = parsedRequest.getParameter(field);\r
121         if (value!=null)\r
122           mediaValues.put(field, value);\r
123       }\r
124 \r
125       List mediaList = new Vector();\r
126 \r
127       i = parsedRequest.getFiles().iterator();\r
128       while (i.hasNext()) {\r
129         UploadedFile file = new mir.session.CommonsUploadedFileAdapter((FileItem) i.next());\r
130 \r
131         String suffix = file.getFieldName().substring(5);\r
132         mediaValues.put("title", parsedRequest.getParameter("media_title" + suffix));\r
133 \r
134         mediaList.add(MediaUploadProcessor.processMediaUpload(file, mediaValues));\r
135       }\r
136 \r
137       String articleid = parsedRequest.getParameter("articleid");\r
138       String commentid = parsedRequest.getParameter("commentid");\r
139 \r
140       if (articleid!=null) {\r
141         EntityContent entContent = (EntityContent) DatabaseContent.getInstance().selectById(articleid);\r
142 \r
143         i=mediaList.iterator();\r
144 \r
145         while (i.hasNext()) {\r
146           entContent.attach(((EntityUploadedMedia) i.next()).getId());\r
147         }\r
148 \r
149         ((ServletModuleContent) ServletModuleContent.getInstance()).editObject(aRequest, aResponse, articleid);\r
150 \r
151         return;\r
152       }\r
153 \r
154       if (commentid!=null) {\r
155         EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(commentid);\r
156 \r
157         i=mediaList.iterator();\r
158 \r
159         while (i.hasNext()) {\r
160           comment.attach( ( (EntityUploadedMedia) i.next()).getId());\r
161         }\r
162 \r
163         ((ServletModuleComment) ServletModuleComment.getInstance()).editObject(aRequest, aResponse, commentid);\r
164 \r
165         return;\r
166       }\r
167 \r
168       returnUploadedMediaList(aRequest, aResponse, mediaList, 1, mediaList.size(), mediaList.size(), "", null, null);\r
169     }\r
170     catch (Throwable t) {\r
171       Throwable cause = ExceptionFunctions.traceCauseException(t);\r
172 \r
173       if (cause instanceof ModuleMediaType.UnsupportedMimeTypeExc) {\r
174         throw new ServletModuleUserExc("media.error.unsupportedformat", new String[] {});\r
175       }\r
176       throw new ServletModuleFailure("ServletModuleUploadedMedia.insert: " + t.toString(), t);\r
177     }\r
178   }\r
179 \r
180   public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
181 \r
182     try {\r
183       HTTPParsedRequest parsedRequest = new HTTPParsedRequest(aRequest,\r
184           configuration.getString("Mir.DefaultEncoding"),\r
185           configuration.getInt("MaxMediaUploadSize")*1024,\r
186           configuration.getString("TempDir"));\r
187       Map mediaValues = new HashMap();\r
188 \r
189       Iterator i = mainModule.getStorageObject().getFields().iterator();\r
190       while (i.hasNext()) {\r
191         String field = (String) i.next();\r
192         String value = parsedRequest.getParameter(field);\r
193         if (value!=null)\r
194           mediaValues.put(field, value);\r
195       }\r
196 \r
197       mediaValues.put("to_publisher", ServletHelper.getUser(aRequest).getId());\r
198       mediaValues.put("is_produced", "0");\r
199       if (!mediaValues.containsKey("is_published"))\r
200         mediaValues.put("is_published", "0");\r
201 \r
202       String id = mainModule.set(mediaValues);\r
203       logger.debug("update: media ID = " + id);\r
204 \r
205       editUploadedMediaObject(id, aRequest, aResponse);\r
206     }\r
207     catch (Throwable e) {\r
208       throw new ServletModuleFailure("upload -- exception " + e.toString(), e);\r
209     }\r
210 \r
211   }\r
212 \r
213   public void returnUploadedMediaList(HttpServletRequest aRequest, HttpServletResponse aResponse,\r
214                                       Object aList, int aFrom, int aTo, int aCount,\r
215                                       String aThisUrl, String aNextUrl, String aPreviousUrl) throws ServletModuleExc {\r
216 \r
217     try {\r
218       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
219       Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] {getLocale(aRequest), getFallbackLocale(aRequest)});\r
220 \r
221       responseData.put("searchfield", requestParser.getParameterWithDefault("searchfield", ""));\r
222       responseData.put("searchtext", requestParser.getParameterWithDefault("searchtext", ""));\r
223       responseData.put("searchispublished", requestParser.getParameterWithDefault("searchispublished", ""));\r
224       responseData.put("searchmediafolder", requestParser.getParameterWithDefault("searchmediafolder", ""));\r
225       responseData.put("articleid", requestParser.getParameter("articleid"));\r
226       responseData.put("commentid", requestParser.getParameter("commentid"));\r
227 \r
228       responseData.put("thisurl", aThisUrl);\r
229       responseData.put("nexturl", aNextUrl);\r
230       responseData.put("prevurl", aPreviousUrl);\r
231 \r
232       responseData.put("from", Integer.toString(aFrom));\r
233       responseData.put("count", Integer.toString(aCount));\r
234       responseData.put("to", Integer.toString(aTo));\r
235 \r
236       responseData.put("medialist", aList);\r
237 \r
238       addExtraData(responseData);\r
239       ServletHelper.generateResponse(aResponse.getWriter(), responseData, listGenerator);\r
240     }\r
241     catch (Throwable t) {\r
242       throw new ServletModuleFailure(t);\r
243     }\r
244   }\r
245 \r
246   public void returnUploadedMediaList(HttpServletRequest aRequest, HttpServletResponse aResponse,\r
247                                       String aWhereClause, String anOrderByClause, int anOffset) throws ServletModuleExc {\r
248 \r
249     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
250     URLBuilder urlBuilder = new URLBuilder();\r
251     EntityAdapterModel model;\r
252     String nextPageUrl = null;\r
253     String previousPageUrl = null;\r
254     String thisUrl = null;\r
255 \r
256     int count;\r
257 \r
258     try {\r
259       model = MirGlobal.localizer().dataModel().adapterModel();\r
260 \r
261       Object mediaList =\r
262           new CachingRewindableIterator(\r
263           new EntityIteratorAdapter(aWhereClause, anOrderByClause, nrEntitiesPerListPage,\r
264                    model, definition, nrEntitiesPerListPage, anOffset)\r
265           );\r
266 \r
267       count = mainModule.getSize(aWhereClause);\r
268 \r
269       urlBuilder.setValue("module", moduleName);\r
270       urlBuilder.setValue("do", "list");\r
271       urlBuilder.setValue("where", aWhereClause);\r
272       urlBuilder.setValue("order", anOrderByClause);\r
273 \r
274       urlBuilder.setValue("articleid", requestParser.getParameter("articleid"));\r
275       urlBuilder.setValue("commentid", requestParser.getParameter("commentid"));\r
276       urlBuilder.setValue("searchfield", requestParser.getParameter("searchfield"));\r
277       urlBuilder.setValue("searchtext", requestParser.getParameter("searchtext"));\r
278       urlBuilder.setValue("searchispublished", requestParser.getParameter("searchispublished"));\r
279       urlBuilder.setValue("searchmediafolder", requestParser.getParameter("searchmediafolder"));\r
280       urlBuilder.setValue("where", aWhereClause);\r
281       urlBuilder.setValue("order", anOrderByClause);\r
282 \r
283       urlBuilder.setValue("offset", anOffset);\r
284       thisUrl = urlBuilder.getQuery();\r
285 \r
286       if (count >= anOffset + nrEntitiesPerListPage) {\r
287         urlBuilder.setValue("offset", anOffset + nrEntitiesPerListPage);\r
288         nextPageUrl = urlBuilder.getQuery();\r
289       }\r
290 \r
291       if (anOffset > 0) {\r
292         urlBuilder.setValue("offset", Math.max(anOffset - nrEntitiesPerListPage, 0));\r
293         previousPageUrl = urlBuilder.getQuery();\r
294       }\r
295 \r
296       returnUploadedMediaList(aRequest, aResponse, mediaList,\r
297               anOffset+1, anOffset+nrEntitiesPerListPage, count, thisUrl,\r
298               nextPageUrl, previousPageUrl);\r
299     }\r
300     catch (Throwable e) {\r
301       throw new ServletModuleFailure(e);\r
302     }\r
303   }\r
304 \r
305   public void search(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
306     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
307 \r
308     SQLQueryBuilder queryBuilder = new SQLQueryBuilder();\r
309 \r
310     String queryField = "";\r
311     String searchField = requestParser.getParameter("searchfield");\r
312     String searchText = requestParser.getParameter("searchtext");\r
313     String searchIsPublished = requestParser.getParameter("searchispublished");\r
314     String searchMediaFolder = requestParser.getParameter("searchmediafolder");\r
315 \r
316     queryBuilder.appendDescendingOrder("webdb_create");\r
317 \r
318     if (searchIsPublished!=null)\r
319       if (searchIsPublished.equals("0")) {\r
320         queryBuilder.appendAndCondition("is_published='f'");\r
321       }\r
322       else if (searchIsPublished.equals("1")) {\r
323         queryBuilder.appendAndCondition("is_published='t'");\r
324       }\r
325 \r
326     if (searchField!=null && searchText!=null && searchText.length()>0) {\r
327         queryBuilder.appendAndCondition(\r
328           "lower(" + searchField + ") like " +\r
329           "'%" + JDBCStringRoutines.escapeStringLiteral(searchText.toLowerCase()) + "%'");\r
330     }\r
331 \r
332     if (searchMediaFolder!=null && searchMediaFolder.length()>0) {\r
333       queryBuilder.appendAndCondition("to_media_folder="+Integer.parseInt(searchMediaFolder));\r
334     }\r
335 \r
336     returnUploadedMediaList(aRequest, aResponse,\r
337             queryBuilder.getWhereClause(), queryBuilder.getOrderByClause(), requestParser.getIntegerWithDefault("offset", 0));\r
338   }\r
339 \r
340   public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
341     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
342 \r
343     returnUploadedMediaList(aRequest, aResponse,\r
344        requestParser.getParameterWithDefault("where", ""),\r
345        requestParser.getParameterWithDefault("order", "webdb_create desc"),\r
346        requestParser.getIntegerWithDefault("offset", 0));\r
347   }\r
348 \r
349 \r
350   public void add(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
351     try {\r
352       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
353       Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] {getLocale(aRequest), getFallbackLocale(aRequest)});\r
354 \r
355       int nrMedia = requestParser.getIntegerWithDefault("nrmedia", 1);\r
356       int maxNrMedia=configuration.getInt("ServletModule.OpenIndy.MaxMediaUploadItems", 20);\r
357 \r
358       List fields = mainModule.getStorageObject().getFields();\r
359       Map media = new HashMap();\r
360       Iterator i = fields.iterator();\r
361       while (i.hasNext()) {\r
362         media.put(i.next(), null);\r
363       }\r
364       media.put("to_media_folder", new Integer(7));\r
365       responseData.put("uploadedmedia", media);\r
366 \r
367       responseData.put("new", Boolean.TRUE);\r
368       responseData.put("articleid", requestParser.getParameter("articleid"));\r
369       responseData.put("commentid", requestParser.getParameter("commentid"));\r
370       responseData.put("returnurl", null);\r
371 \r
372       if (nrMedia<=0)\r
373         nrMedia=1;\r
374       if (nrMedia>maxNrMedia)\r
375         nrMedia=maxNrMedia;\r
376 \r
377       List mediaFields = new Vector();\r
378       for (int j=0; j<nrMedia; j++)\r
379         mediaFields.add(new Integer(j));\r
380 \r
381       responseData.put("nrmedia", new Integer(nrMedia));\r
382       responseData.put("mediafields", mediaFields);\r
383 \r
384       responseData.put("edittemplate", editGenerator);\r
385       responseData.put("module", moduleName);\r
386 \r
387       addExtraData(responseData);\r
388 \r
389       ServletHelper.generateResponse(aResponse.getWriter(), responseData, "uploadedmedia.template");\r
390     }\r
391     catch (Exception e) {\r
392       throw new ServletModuleFailure(e);\r
393     }\r
394   }\r
395 \r
396   public void edit(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
397     editUploadedMediaObject(aRequest.getParameter("id"), aRequest, aResponse);\r
398   }\r
399 \r
400   private void editUploadedMediaObject(String idParam, HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
401     if (idParam != null && !idParam.equals("")) {\r
402       try {\r
403         Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] {getLocale(aRequest), getFallbackLocale(aRequest)});\r
404         EntityAdapter object =\r
405             model.makeEntityAdapter(definition, mainModule.getById(idParam));\r
406         responseData.put("uploadedmedia", object);\r
407         responseData.put("new", Boolean.FALSE);\r
408         responseData.put("articleid", null);\r
409         responseData.put("commentid", null);\r
410         responseData.put("returnurl", null);\r
411         responseData.put("thisurl", null);\r
412 \r
413         responseData.put("edittemplate", editGenerator);\r
414         responseData.put("module", moduleName);\r
415 \r
416         addExtraData(responseData);\r
417 \r
418         ServletHelper.generateResponse(aResponse.getWriter(), responseData, "uploadedmedia.template");\r
419       }\r
420       catch (Throwable e) {\r
421         throw new ServletModuleFailure(e);\r
422       }\r
423     }\r
424     else {\r
425       throw new ServletModuleExc("ServletmoduleUploadedMedia :: editUploadedMediaObject without id");\r
426     }\r
427   }\r
428 \r
429   public void getMedia(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
430     String idParam = aRequest.getParameter("id");\r
431     if (idParam!=null && !idParam.equals("")) {\r
432       try {\r
433         EntityUploadedMedia ent = (EntityUploadedMedia)mainModule.getById(idParam);\r
434         Entity mediaType = ent.getMediaType();\r
435         MirMedia mediaHandler;\r
436 \r
437         ServletContext ctx = MirPropertiesConfiguration.getContext();\r
438         String fName = ent.getId()+"."+mediaType.getValue("name");\r
439 \r
440         mediaHandler = MediaHelper.getHandler(mediaType);\r
441         InputStream in = mediaHandler.getMedia(ent, mediaType);\r
442 \r
443         aResponse.setContentType(ctx.getMimeType(fName));\r
444         //important that before calling this aResponse.getWriter was not called first\r
445         ServletOutputStream out = aResponse.getOutputStream();\r
446 \r
447         int read ;\r
448         byte[] buf = new byte[8 * 1024];\r
449         while((read = in.read(buf)) != -1) {\r
450           out.write(buf, 0, read);\r
451         }\r
452         in.close();\r
453         out.close();\r
454       }\r
455       catch (Throwable e) {\r
456         throw new ServletModuleFailure(e);\r
457       }\r
458     }\r
459     else logger.error("id not specified.");\r
460     // no exception allowed\r
461   }\r
462 \r
463   public void getIcon(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
464   {\r
465     String idParam = aRequest.getParameter("id");\r
466     if (idParam!=null && !idParam.equals("")) {\r
467       try {\r
468         EntityUploadedMedia ent = (EntityUploadedMedia) mainModule.getById(idParam);\r
469         Entity mediaType = ent.getMediaType();\r
470         MirMedia mediaHandler;\r
471 \r
472         mediaHandler = MediaHelper.getHandler(mediaType);\r
473         InputStream in = mediaHandler.getIcon(ent);\r
474 \r
475         if (in==null)\r
476           throw new ServletModuleExc("no icon available");\r
477 \r
478         aResponse.setContentType(mediaHandler.getIconMimeType(ent, mediaType));\r
479         //important that before calling this aResponse.getWriter was not called first\r
480         ServletOutputStream out = aResponse.getOutputStream();\r
481 \r
482         int read ;\r
483         byte[] buf = new byte[8 * 1024];\r
484         while((read = in.read(buf)) != -1) {\r
485           out.write(buf, 0, read);\r
486         }\r
487         in.close();\r
488         out.close();\r
489       }\r
490 \r
491       catch (Throwable e) {\r
492         logger.error("getIcon: " + e.toString());\r
493       }\r
494     }\r
495     else logger.error("getIcon: id not specified.");\r
496     // no exception allowed\r
497   }\r
498 \r
499   protected void addExtraData(Map aTarget) throws ServletModuleExc, ServletModuleFailure {\r
500     try {\r
501       aTarget.put("mediafolders",\r
502                   new EntityIteratorAdapter("", "", 20, MirGlobal.localizer().dataModel().adapterModel(), "mediaFolder"));\r
503     }\r
504     catch (Throwable t) {\r
505       throw new ServletModuleFailure(t);\r
506     }\r
507   }\r
508 \r
509   public void showarticles(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
510   {\r
511     String idParam = aRequest.getParameter("id");\r
512     if (idParam!=null && !idParam.equals("")) {\r
513       try {\r
514         EntityUploadedMedia entity = (EntityUploadedMedia) mainModule.getById(idParam);\r
515 \r
516         ServletModuleContent.getInstance().returnList(\r
517             aRequest,\r
518             aResponse,\r
519             "exists (select * from content_x_media where content_id=content.id and media_id=" + JDBCStringRoutines.escapeStringLiteral( idParam ) + ")", "", 0);\r
520       }\r
521       catch (Throwable t) {\r
522         throw new ServletModuleFailure(t);\r
523       }\r
524     }\r
525     else logger.error("showarticles: id not specified.");\r
526   }\r
527 \r
528   public void showcomments(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
529   {\r
530     String idParam = aRequest.getParameter("id");\r
531     if (idParam!=null && !idParam.equals("")) {\r
532       try {\r
533         EntityUploadedMedia entity = (EntityUploadedMedia) mainModule.getById(idParam);\r
534 \r
535         ServletModuleComment.getInstance().returnList(\r
536             aRequest,\r
537             aResponse,\r
538             "exists (select * from comment_x_media where comment_id=comment.id and media_id=" + JDBCStringRoutines.escapeStringLiteral( idParam ) + ")", "", 0);\r
539       }\r
540       catch (Throwable t) {\r
541         throw new ServletModuleFailure(t);\r
542       }\r
543     }\r
544     else logger.error("editObjects: id not specified.");\r
545   }\r
546 \r
547 }