* anti-abuse upgrade: filters now stored in the database (experimental)
[mir.git] / source / mir / servlet / ServletModule.java
index d2d89e8..02d4761 100755 (executable)
  */
 package mir.servlet;
 
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
+import java.util.*;
+
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
@@ -48,18 +45,11 @@ import mir.storage.StorageObject;
 import mir.util.HTTPRequestParser;
 import mir.util.URLBuilder;
 import mircoders.global.MirGlobal;
-import mircoders.servlet.ServletHelper;
 import mircoders.localizer.MirLocalizerExc;
-import multex.Failure;
+import mircoders.servlet.ServletHelper;
 
 /**
  *
- * <p>Title: </p>
- * <p>Description: </p>
- * <p>Copyright: Copyright (c) 2003</p>
- * <p>Company: </p>
- * @author not attributable
- * @version 1.0
  */
 
 public abstract class ServletModule {
@@ -77,8 +67,16 @@ public abstract class ServletModule {
   protected String deleteConfirmationGenerator;
   protected int nrEntitiesPerListPage;
 
+  /** the list of parameters that need to be propagated in the list */
+  protected List propagatedParameters = new ArrayList();
 
   public ServletModule(){
+    propagatedParameters.add("searchfield");
+    propagatedParameters.add("searchtext");
+    propagatedParameters.add("searchispublished");
+    propagatedParameters.add("searchstatus");
+    propagatedParameters.add("searchorder");
+
     definition = null;
     try {
       model = MirGlobal.localizer().dataModel().adapterModel();
@@ -88,8 +86,6 @@ public abstract class ServletModule {
       throw new ServletModuleFailure("Can't retrieve model", e);
     }
 
-
-
     listGenerator = configuration.getString("ServletModule."+getOperationModuleName()+".ListTemplate");
     editGenerator = configuration.getString("ServletModule."+getOperationModuleName()+".EditTemplate");
     deleteConfirmationGenerator = configuration.getString("ServletModule."+getOperationModuleName()+".DeleteConfirmationTemplate");
@@ -129,17 +125,17 @@ public abstract class ServletModule {
    * this supersedes getLanguage for the new i18n
    */
   public static Locale getLocale(HttpServletRequest aRequest) {
-    Locale loc = null;
+    Locale locale = null;
     HttpSession session = aRequest.getSession(false);
     if (session != null) {
       // session can be null in case of logout
-      loc = (Locale) session.getAttribute("locale");
+      locale = (Locale) session.getAttribute("locale");
     }
     // if there is nothing in the session get it fron the accept-language
-    if (loc == null) {
-      loc = aRequest.getLocale();
+    if (locale == null) {
+      locale = aRequest.getLocale();
     }
-    return loc;
+    return locale;
   }
 
   /**
@@ -158,7 +154,7 @@ public abstract class ServletModule {
    */
   public String getDefaultListOrdering() {
 
-    if (mainModule!=null && mainModule.getStorageObject()!=null){
+    if (mainModule!=null && mainModule.getStorageObject()!=null) {
       if (mainModule.getStorageObject().getFieldNames().contains("webdb_create"))
         return "webdb_create desc";
     }
@@ -170,8 +166,7 @@ public abstract class ServletModule {
    * Generic list servlet method
    */
 
-  public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
-  {
+  public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
 
     String where = requestParser.getParameter("where");
@@ -184,10 +179,13 @@ public abstract class ServletModule {
 
   public void returnList(HttpServletRequest aRequest, HttpServletResponse aResponse,
      String aWhereClause, String anOrderByClause, int anOffset) throws ServletModuleExc {
+    returnList(aRequest, aResponse, aWhereClause, anOrderByClause, anOffset, Collections.EMPTY_MAP);
+  }
 
-    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
+  public void returnList(HttpServletRequest aRequest, HttpServletResponse aResponse,
+     String aWhereClause, String anOrderByClause, int anOffset, Map anOverridingRequestParameters) throws ServletModuleExc {
+    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest, anOverridingRequestParameters);
     URLBuilder urlBuilder = new URLBuilder();
-    int count;
 
     try {
       Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, getLocales(aRequest));
@@ -199,30 +197,19 @@ public abstract class ServletModule {
       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) {
+      propagateFields(requestParser, urlBuilder, responseData);
+
+      if (list.size()>=nrEntitiesPerListPage) {
         urlBuilder.setValue("offset", anOffset + nrEntitiesPerListPage);
         responseData.put("nexturl" , urlBuilder.getQuery());
       }
@@ -234,8 +221,8 @@ public abstract class ServletModule {
 
       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)));
+      responseData.put("count", "?");
+      responseData.put("to", Integer.toString(anOffset+list.size()-1));
 
       ServletHelper.generateResponse(aResponse.getWriter(), responseData, listGenerator);
     }
@@ -471,4 +458,14 @@ public abstract class ServletModule {
     }
     return withValues;
   }
+
+  private void propagateFields(HTTPRequestParser aRequest, URLBuilder aUrlBuilder, Map aResponseData) {
+    Iterator i = propagatedParameters.iterator();
+    while (i.hasNext()) {
+      String parameter = (String) i.next();
+      String value = aRequest.getParameter(parameter);
+      aUrlBuilder.setValue(parameter, value);
+      aResponseData.put(parameter, value);
+    }
+  }
 }
\ No newline at end of file