X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmir%2Fservlet%2FServletModule.java;h=5ddb42da27fd01ee00ed9095afe16dc830203eb6;hb=20c802e7f2f30c5cac3ece603586af684a8b6ab0;hp=c49a08781d752372e5ede10b700d0b25f5c43067;hpb=b5dfdb12e72c15762c6a9d21a3d37db9ba97c92a;p=mir.git diff --git a/source/mir/servlet/ServletModule.java b/source/mir/servlet/ServletModule.java index c49a0878..5ddb42da 100755 --- a/source/mir/servlet/ServletModule.java +++ b/source/mir/servlet/ServletModule.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001, 2002 The Mir-coders group + * Copyright (C) 2001, 2002 The Mir-coders group * * This file is part of Mir. * @@ -18,412 +18,471 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * In addition, as a special exception, The Mir-coders gives permission to link - * the code of this program with the com.oreilly.servlet library, any library - * licensed under the Apache Software License, The Sun (tm) Java Advanced - * Imaging library (JAI), The Sun JIMI library (or with modified versions of - * the above that use the same license as the above), and distribute linked - * combinations including the two. You must obey the GNU General Public - * License in all respects for all of the code used other than the above - * mentioned libraries. If you modify this file, you may extend this exception - * to your version of the file, but you are not obligated to do so. If you do - * not wish to do so, delete this exception statement from your version. + * the code of this program with any library licensed under the Apache Software License, + * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library + * (or with modified versions of the above that use the same license as the above), + * and distribute linked combinations including the two. You must obey the + * GNU General Public License in all respects for all of the code used other than + * the above mentioned libraries. If you modify this file, you may extend this + * exception to your version of the file, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your version. */ - package mir.servlet; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.List; import java.util.HashMap; +import java.util.Iterator; +import java.util.List; import java.util.Locale; - +import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; -import freemarker.template.SimpleHash; -import freemarker.template.TemplateModelRoot; - import mir.config.MirPropertiesConfiguration; import mir.config.MirPropertiesConfiguration.PropertiesConfigExc; -import mir.entity.EntityList; +import mir.entity.adapter.EntityAdapterDefinition; +import mir.entity.adapter.EntityAdapterEngine; +import mir.entity.adapter.EntityAdapterModel; import mir.log.LoggerWrapper; -import mir.misc.HTMLParseException; -import mir.misc.HTMLTemplateProcessor; -import mir.misc.LineFilterWriter; import mir.module.AbstractModule; -import mir.module.ModuleException; import mir.storage.StorageObject; -import mir.storage.StorageObjectFailure; - -import mir.util.*; - - - +import mir.util.HTTPRequestParser; +import mir.util.URLBuilder; +import mircoders.servlet.ServletHelper; /** - * Abstract class ServletModule provides the base functionality for servlets. - * Deriving a class from ServletModule enables class to insert/edit/update/delete - * and list Entity from a Database via mainModule. * - * - * Abstrakte Klasse ServletModule stellt die Basisfunktionalitaet der - * abgeleiteten ServletModule zur Verf?gung. - * - * @version 28.6.1999 - * @author RK + *

Title:

+ *

Description:

+ *

Copyright: Copyright (c) 2003

+ *

Company:

+ * @author not attributable + * @version 1.0 */ public abstract class ServletModule { - public String defaultAction; protected LoggerWrapper logger; - protected MirPropertiesConfiguration configuration; + protected MirPropertiesConfiguration configuration; + protected Locale fallbackLocale; + protected AbstractModule mainModule; - protected String templateListString; - protected String templateObjektString; - protected String templateConfirmString; + protected String definition; + protected EntityAdapterModel model; + + protected String listGenerator; + protected String editGenerator; + protected String deleteConfirmationGenerator; + protected int nrEntitiesPerListPage; public ServletModule(){ + definition = null; + model = null; + try { configuration = MirPropertiesConfiguration.instance(); - } catch (PropertiesConfigExc e) { - e.printStackTrace(System.err); } + catch (PropertiesConfigExc e) { + throw new RuntimeException("Can't get configuration: " + e.getMessage()); + } + + listGenerator = configuration.getString("ServletModule."+getOperationModuleName()+".ListTemplate"); + editGenerator = configuration.getString("ServletModule."+getOperationModuleName()+".EditTemplate"); + deleteConfirmationGenerator = configuration.getString("ServletModule."+getOperationModuleName()+".DeleteConfirmationTemplate"); + nrEntitiesPerListPage = + configuration.getInt("ServletModule."+getOperationModuleName()+".ListSize", + configuration.getInt("ServletModule.Default.ListSize", 20)); + + fallbackLocale = new Locale(configuration.getString("Mir.Admin.FallbackLanguage", "en"), ""); } /** - * Singelton - Methode muss in den abgeleiteten Klassen ueberschrieben werden. - * @return ServletModule + * Singleton instance retrievel method. MUST be overridden in subclasses. + * + * @return ServletModule the single instance of the servletmodule class */ public static ServletModule getInstance() { return null; } /** - * get the module name to be used for generic operations like delete. + * Get the module name + * + * @return */ protected String getOperationModuleName() { return getClass().getName().substring((new String("mircoders.servlet.ServletModule")).length()); } /** - * get the session binded language - */ - public String getLanguage(HttpServletRequest req) { - HttpSession session = req.getSession(false); - String language = (String) session.getAttribute("Language"); - if (language == null) { - language = configuration.getString("StandardLanguage"); - } - return language; - } - - /** * get the locale either from the session or the accept-language header ot the request * this supersedes getLanguage for the new i18n */ - public Locale getLocale(HttpServletRequest req) { + public Locale getLocale(HttpServletRequest aRequest) { Locale loc = null; - HttpSession session = req.getSession(false); + HttpSession session = aRequest.getSession(false); if (session != null) { // session can be null in case of logout - loc = (Locale) session.getAttribute("Locale"); + loc = (Locale) session.getAttribute("locale"); } // if there is nothing in the session get it fron the accept-language if (loc == null) { - loc = req.getLocale(); + loc = aRequest.getLocale(); } return loc; } - public void redirect(HttpServletResponse aResponse, String aQuery) throws ServletModuleException { + /** + * get the locale either from the session or the accept-language header ot the request + * this supersedes getLanguage for the new i18n + */ + public Locale getFallbackLocale(HttpServletRequest aRequest) { + return fallbackLocale; + } + + /** + * Function to specify the default ordering for lists. May be overridden. + * + * + * @return + */ + public String getDefaultListOrdering() { + + if (mainModule!=null && mainModule.getStorageObject()!=null){ + if (mainModule.getStorageObject().getFields().contains("webdb_create")) + return "webdb_create desc"; + } + + return "id asc"; + } + + /** + * + * @param aResponse + * @param aQuery + * @throws ServletModuleExc + * @throws ServletModuleFailure + */ + public void redirect(HttpServletResponse aResponse, String aQuery) throws ServletModuleExc, ServletModuleFailure { try { - aResponse.sendRedirect(MirPropertiesConfiguration.instance().getString("RootUri") + "/Mir?"+aQuery); + aResponse.sendRedirect(aResponse.encodeRedirectURL(MirPropertiesConfiguration.instance().getString("RootUri") + "/Mir?"+aQuery)); } catch (Throwable t) { - throw new ServletModuleException(t.getMessage()); + throw new ServletModuleFailure("ServletModule.redirect: " +t.getMessage(), t); } } /** - * list(req,res) - generische Listmethode. Wennn die Funktionalitaet - * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse - * ueberschreiben werden. + * Generic list method * - * @param req Http-Request, das vom Dispatcher durchgereicht wird - * @param res Http-Response, die vom Dispatcher durchgereicht wird + * @param aRequest + * @param aResponse + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure */ - public void list(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException { + + public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc + { + HTTPRequestParser requestParser = new HTTPRequestParser(aRequest); + + String where = requestParser.getParameter("where"); + String order = requestParser.getParameterWithDefault("order", getDefaultListOrdering()); + int offset = requestParser.getIntegerWithDefault("offset", 0); + + returnList(aRequest, aResponse, where, order, offset); + } + + + public void returnList(HttpServletRequest aRequest, HttpServletResponse aResponse, + String aWhereClause, String anOrderByClause, int anOffset) throws ServletModuleExc { + + HTTPRequestParser requestParser = new HTTPRequestParser(aRequest); + URLBuilder urlBuilder = new URLBuilder(); + int count; + try { - EntityList theList; - String offsetParam = req.getParameter("offset"); - int offset = 0; - PrintWriter out = res.getWriter(); - - // hier offsetcode bearbeiten - if (offsetParam != null && !offsetParam.equals("")) { - offset = Integer.parseInt(offsetParam); - } - if (req.getParameter("next") != null) { - offset = Integer.parseInt(req.getParameter("nextoffset")); + Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}); + + List list = + EntityAdapterEngine.retrieveAdapterList(model, definition, aWhereClause, anOrderByClause, nrEntitiesPerListPage, anOffset); + + responseData.put("nexturl", null); + responseData.put("prevurl", null); + responseData.put("module", getOperationModuleName()); + + count=mainModule.getSize(aWhereClause); + + urlBuilder.setValue("module", getOperationModuleName()); + urlBuilder.setValue("do", "list"); + urlBuilder.setValue("where", aWhereClause); + urlBuilder.setValue("order", anOrderByClause); + + urlBuilder.setValue("searchfield", requestParser.getParameter("searchfield")); + urlBuilder.setValue("searchtext", requestParser.getParameter("searchtext")); + urlBuilder.setValue("searchispublished", requestParser.getParameter("searchispublished")); + urlBuilder.setValue("searchstatus", requestParser.getParameter("searchstatus")); + urlBuilder.setValue("searchorder", requestParser.getParameter("searchorder")); + + responseData.put("searchfield", requestParser.getParameter("searchfield")); + responseData.put("searchtext", requestParser.getParameter("searchtext")); + responseData.put("searchispublished", requestParser.getParameter("searchispublished")); + responseData.put("searchstatus", requestParser.getParameter("searchstatus")); + responseData.put("searchorder", requestParser.getParameter("searchorder")); + + urlBuilder.setValue("offset", anOffset); + responseData.put("offset" , new Integer(anOffset).toString()); + responseData.put("thisurl" , urlBuilder.getQuery()); + + if (count>anOffset+nrEntitiesPerListPage) { + urlBuilder.setValue("offset", anOffset + nrEntitiesPerListPage); + responseData.put("nexturl" , urlBuilder.getQuery()); } - else { - if (req.getParameter("prev") != null) { - offset = Integer.parseInt(req.getParameter("prevoffset")); - } + + if (anOffset>0) { + urlBuilder.setValue("offset", Math.max(anOffset - nrEntitiesPerListPage, 0)); + responseData.put("prevurl" , urlBuilder.getQuery()); } - theList = mainModule.getByWhereClause(null, offset); - HTMLTemplateProcessor.process(res, templateListString, theList, out, getLocale(req)); + responseData.put("entities", list); + responseData.put("from" , Integer.toString(anOffset+1)); + responseData.put("count", Integer.toString(count)); + responseData.put("to", Integer.toString(Math.min(anOffset+nrEntitiesPerListPage, count))); + + ServletHelper.generateResponse(aResponse.getWriter(), responseData, listGenerator); } - catch (Exception e) { - throw new ServletModuleException(e.getMessage()); + catch (Throwable e) { + throw new ServletModuleFailure(e); } } - /** - * add(req,res) - generische Addmethode. Wennn die Funktionalitaet - * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse - * ueberschreiben werden. - * @param req Http-Request, das vom Dispatcher durchgereicht wird - * @param res Http-Response, die vom Dispatcher durchgereicht wird - */ - public void add(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException { - + public void editObject(HttpServletRequest aRequest, HttpServletResponse aResponse, String anId) throws ServletModuleExc { try { - SimpleHash mergeData = new SimpleHash(); - mergeData.put("new", "1"); - deliver(req, res, mergeData, templateObjektString); + editObject(aRequest, aResponse, model.makeEntityAdapter(definition, mainModule.getById(anId)), false, anId); } - catch (Exception e) { - throw new ServletModuleException(e.getMessage()); + catch (Throwable t) { + throw new ServletModuleFailure(t); } } - /** - * insert(req,res) - generische Insertmethode, folgt auf add. - * Wennn die Funktionalitaet - * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse - * ueberschreiben werden. - * - * @param req Http-Request, das vom Dispatcher durchgereicht wird - * @param res Http-Response, die vom Dispatcher durchgereicht wird - */ - public void insert(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException, ServletModuleUserException { + public void editObject(HttpServletRequest aRequest, HttpServletResponse aResponse, Object anObject, boolean anIsNew, String anId) throws ServletModuleExc { + HTTPRequestParser requestParser = new HTTPRequestParser(aRequest); + URLBuilder urlBuilder = new URLBuilder(); + EntityAdapterModel model; + try { - HashMap withValues = getIntersectingValues(req, mainModule.getStorageObject()); - logger.debug("--trying to add..."); - String id = mainModule.add(withValues); - logger.debug("--trying to deliver..." + id); - list(req, res); + Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}); + + responseData.put("module", getOperationModuleName()); + responseData.put("entity", anObject); + responseData.put("new", new Boolean(anIsNew)); + + + urlBuilder.setValue("module", getOperationModuleName()); + urlBuilder.setValue("returnurl", requestParser.getParameter("returnurl")); + if (anIsNew) + urlBuilder.setValue("do", "add"); + else { + urlBuilder.setValue("id", anId); + urlBuilder.setValue("do", "edit"); + } + responseData.put("returnurl", requestParser.getParameter("returnurl")); + responseData.put("thisurl", urlBuilder.getQuery()); + + ServletHelper.generateResponse(aResponse.getWriter(), responseData, editGenerator); } - catch (Exception e) { - throw new ServletModuleException(e.getMessage()); + catch (Throwable e) { + throw new ServletModuleFailure(e); } } + /** - * delete(req,res) - generic delete method. Can be overridden in subclasses. + * Generic add method * + * @param aRequest + * @param aResponse + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure */ + public void add(HttpServletRequest aRequest, HttpServletResponse aResponse) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { - public void delete(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException { - try { - String idParam = req.getParameter("id"); + Map object = new HashMap(); - if (idParam == null) - throw new ServletModuleException("Invalid call to delete: no id supplied"); - - String confirmParam = req.getParameter("confirm"); - String cancelParam = req.getParameter("cancel"); - if (confirmParam == null && cancelParam == null) { - SimpleHash mergeData = new SimpleHash(); - - mergeData.put("module", getOperationModuleName()); - mergeData.put("infoString", getOperationModuleName() + ": " + idParam); - mergeData.put("id", idParam); - mergeData.put("where", req.getParameter("where")); - mergeData.put("order", req.getParameter("order")); - mergeData.put("offset", req.getParameter("offset")); - // this stuff is to be compatible with the other more advanced - // search method used for media and comments - mergeData.put("query_media_folder", req.getParameter("query_media_folder")); - mergeData.put("query_is_published", req.getParameter("query_is_published")); - mergeData.put("query_text", req.getParameter("query_text")); - mergeData.put("query_field", req.getParameter("query_field")); - - deliver(req, res, mergeData, templateConfirmString); - } - else { - if (confirmParam != null && !confirmParam.equals("")) { - //theLog.printInfo("delete confirmed!"); - mainModule.deleteById(idParam); - list(req, res); // back to list - } - else { - if (req.getParameter("where") != null) - list(req, res); - else - edit(req, res); - } - } - } - catch (Exception e) { - throw new ServletModuleException(e.getMessage()); - } + Iterator i = mainModule.getStorageObject().getFields().iterator(); + + while (i.hasNext()) + object.put(i.next(), ""); + + initializeNewObject(object, aRequest, aResponse); + + editObject(aRequest, aResponse, object, true, null); + } + + protected void initializeNewObject(Map aNewObject, HttpServletRequest aRequest, HttpServletResponse aResponse) { } /** - * edit(req,res) - generische Editmethode. Wennn die Funktionalitaet - * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse - * ueberschreiben werden. + * Method called when the user edits an object. * - * @param req Http-Request, das vom Dispatcher durchgereicht wird - * @param res Http-Response, die vom Dispatcher durchgereicht wird + * @param aRequest + * @param aResponse + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure */ - public void edit(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException { + public void edit(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + edit(aRequest, aResponse, aRequest.getParameter("id")); + } + + /** + * Generic edit method + * + * @param aRequest + * @param aResponse + * @param anIdentifier + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure + */ + public void edit(HttpServletRequest aRequest, HttpServletResponse aResponse, String anIdentifier) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { try { - String idParam = req.getParameter("id"); - deliver(req, res, mainModule.getById(idParam), templateObjektString); + editObject(aRequest, aResponse, model.makeEntityAdapter(definition, mainModule.getById(anIdentifier)), false, anIdentifier); } - catch (ModuleException e) { - throw new ServletModuleException(e.getMessage()); + catch (Throwable e) { + throw new ServletModuleFailure(e); } } /** - * update(req,res) - generische Updatemethode. Wennn die Funktionalitaet - * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse - * ueberschreiben werden. + * Generic update method * - * @param req Http-Request, das vom Dispatcher durchgereicht wird - * @param res Http-Response, die vom Dispatcher durchgereicht wird + * @param aRequest + * @param aResponse + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure */ - - public void update(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException { + public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { try { - String idParam = req.getParameter("id"); - HashMap withValues = getIntersectingValues(req, mainModule.getStorageObject()); + HTTPRequestParser requestParser = new HTTPRequestParser(aRequest); + + String id = aRequest.getParameter("id"); + Map withValues = getIntersectingValues(aRequest, mainModule.getStorageObject()); + mainModule.set(withValues); - String id = mainModule.set(withValues); - String whereParam = req.getParameter("where"); - String orderParam = req.getParameter("order"); + String returnUrl = requestParser.getParameter("returnurl"); - if ((whereParam != null && !whereParam.equals("")) || (orderParam != null && !orderParam.equals(""))) { - list(req, res); + if (returnUrl!=null) { + redirect(aResponse, returnUrl); } else { - edit(req, res); + edit(aRequest, aResponse, id); } } - catch (Exception e) { - throw new ServletModuleException(e.getMessage()); + catch (Throwable e) { + throw new ServletModuleFailure(e); } } /** - * deliver liefert das Template mit dem Filenamen templateFilename - * an den HttpServletResponse res aus, nachdem es mit den Daten aus - * TemplateModelRoot rtm gemischt wurde + * Generic insert method * - * @param res Http-Response, die vom Dispatcher durchgereicht wird - * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den - * Daten, die ins Template gemerged werden sollen. - * @param tmpl Name des Templates - * @exception ServletModuleException + * @param aRequest + * @param aResponse + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure */ - public void deliver(HttpServletRequest req, HttpServletResponse res, - TemplateModelRoot rtm, TemplateModelRoot popups, - String templateFilename) - throws ServletModuleException { - if (rtm == null) rtm = new SimpleHash(); + public void insert(HttpServletRequest aRequest, HttpServletResponse aResponse) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { try { - PrintWriter out = res.getWriter(); - HTMLTemplateProcessor.process(res, templateFilename, rtm, popups, out, getLocale(req)); - - // we default to admin bundles here, which is not exactly beautiful... - // but this whole producer stuff is going to be rewritten soon. - // ServletModuleOpenIndy overwrites deliver() to use open bundles - // (br1) - out.close(); + HTTPRequestParser requestParser = new HTTPRequestParser(aRequest); + + Map object = getIntersectingValues(aRequest, mainModule.getStorageObject()); + + String id = processInstertedObject(object, aRequest, aResponse); + + String returnUrl = requestParser.getParameter("returnurl"); + + if (returnUrl!=null) { + redirect(aResponse, returnUrl); + } + else { + edit(aRequest, aResponse, id); + } } - catch (HTMLParseException e) { - throw new ServletModuleException(e.getMessage()); - } catch (IOException e) { - throw new ServletModuleException(e.getMessage()); + catch (Throwable e) { + throw new ServletModuleFailure(e); } } + public String processInstertedObject(Map anObject, HttpServletRequest aRequest, HttpServletResponse aResponse) { + try { + return mainModule.add(anObject); + } + catch (Throwable t) { + throw new ServletModuleFailure(t); + } + }; /** - * deliver liefert das Template mit dem Filenamen templateFilename - * an den HttpServletResponse res aus, nachdem es mit den Daten aus - * TemplateModelRoot rtm gemischt wurde - * - * @param res Http-Response, die vom Dispatcher durchgereicht wird - * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den - * Daten, die ins Template gemerged werden sollen. - * @param tmpl Name des Templates - * @exception ServletModuleException - */ - public void deliver(HttpServletRequest req, HttpServletResponse res, - TemplateModelRoot rtm, String templateFilename) - throws ServletModuleException { - deliver(req, res, rtm, null, templateFilename); - } - - /** - * deliver liefert das Template mit dem Filenamen templateFilename - * an den HttpServletResponse res aus, nachdem es mit den Daten aus - * TemplateModelRoot rtm gemischt wurde * - * @param res Http-Response, die vom Dispatcher durchgereicht wird - * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den - * Daten, die ins Template gemerged werden sollen. - * @param tmpl Name des Templates - * @exception ServletModuleException + * @param aRequest + * @param aResponse */ - public void deliver_compressed(HttpServletRequest req, HttpServletResponse res, - TemplateModelRoot rtm, String templateFilename) - throws ServletModuleException { - if (rtm == null) rtm = new SimpleHash(); + public void confirmdelete(HttpServletRequest aRequest, HttpServletResponse aResponse) { try { - PrintWriter out = new LineFilterWriter(res.getWriter()); - //PrintWriter out = res.getWriter(); - HTMLTemplateProcessor.process(res, templateFilename, rtm, out, getLocale(req)); - out.close(); - } - catch (HTMLParseException e) { - throw new ServletModuleException(e.getMessage()); + String idParam = aRequest.getParameter("id"); + String confirmParam = aRequest.getParameter("confirm"); + String cancelParam = aRequest.getParameter("cancel"); + + if (confirmParam != null && !confirmParam.equals("")) { + mainModule.deleteById(idParam); + redirect(aResponse, aRequest.getParameter("okurl")); + } + else + redirect(aResponse, aRequest.getParameter("cancelurl")); } - catch (IOException e) { - throw new ServletModuleException(e.getMessage()); + catch (Throwable t) { + throw new ServletModuleFailure(t); } } /** - * deliver liefert das Template mit dem Filenamen templateFilename - * an den HttpServletResponse res aus, nachdem es mit den Daten aus - * TemplateModelRoot rtm gemischt wurde * - * @param out ist der OutputStream, in den die gergten Daten geschickt werden sollen. - * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den - * Daten, die ins Template gemerged werden sollen. - * @param tmpl Name des Templates - * @exception ServletModuleException + * @param aRequest + * @param aResponse + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure */ - private void deliver(HttpServletResponse res, HttpServletRequest req, PrintWriter out, - TemplateModelRoot rtm, String templateFilename) - throws HTMLParseException { - HTMLTemplateProcessor.process(res, templateFilename, rtm, out, getLocale(req)); + public void delete(HttpServletRequest aRequest, HttpServletResponse aResponse) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + try { + String idParam = aRequest.getParameter("id"); + + if (idParam == null) + throw new ServletModuleExc("Invalid call to delete: no id supplied"); + + Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}); + + responseData.put("module", getOperationModuleName()); + responseData.put("id", idParam); + responseData.put("cancelurl", aRequest.getParameter("cancelurl")); + responseData.put("okurl", aRequest.getParameter("okurl")); + + ServletHelper.generateResponse(aResponse.getWriter(), responseData, deleteConfirmationGenerator); + } + catch (Throwable e) { + throw new ServletModuleFailure(e); + } } /** @@ -438,48 +497,28 @@ public abstract class ServletModule { } /** - * Hier kann vor der Datenaufbereitung schon mal ein response geschickt - * werden (um das subjektive Antwortverhalten bei langsamen Verbindungen - * zu verbessern). - */ - public void predeliver(HttpServletRequest req, HttpServletResponse res) { - ; - } - - /** - * Holt die Felder aus der Metadatenfelderliste des StorageObjects, die - * im HttpRequest vorkommen und liefert sie als HashMap zurueck + * Gets the fields from a httprequest and matches them with the metadata from + * the storage object. Returns the keys that match, with their values. * - * @return HashMap mit den Werten + * @return Map with the values */ - public HashMap getIntersectingValues(HttpServletRequest req, StorageObject theStorage) - throws ServletModuleException { + public Map getIntersectingValues(HttpServletRequest aRequest, StorageObject theStorage) + throws ServletModuleExc, ServletModuleFailure { try { HTTPRequestParser parser; List theFieldList; - logger.debug("using charset: " + req.getParameter("charset")); - logger.debug("using method: " + req.getParameter("do")); - if (req.getParameter("charset") != null) { - parser = new HTTPRequestParser(req, req.getParameter("charset")); - logger.debug("using charset: " + req.getParameter("charset")); - logger.debug("original charset: " + req.getCharacterEncoding()); - } - else { - parser = new HTTPRequestParser(req); - } + parser = new HTTPRequestParser(aRequest); theFieldList = theStorage.getFields(); - HashMap withValues = new HashMap(); + Map withValues = new HashMap(); String aField, aValue; for (int i = 0; i < theFieldList.size(); i++) { aField = (String) theFieldList.get(i); - System.out.println("field " + aField + " = " + parser.getParameter(aField)); - aValue = parser.getParameter(aField); if (aValue != null) withValues.put(aField, aValue); @@ -487,10 +526,9 @@ public abstract class ServletModule { return withValues; } catch (Throwable e) { - e.printStackTrace(System.out); - throw new ServletModuleException( - "ServletModule.getIntersectingValues: " + e.getMessage()); + e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE)); + + throw new ServletModuleFailure( "ServletModule.getIntersectingValues: " + e.getMessage(), e); } } - -} +} \ No newline at end of file