From: zapata Date: Mon, 21 Apr 2003 00:24:05 +0000 (+0000) Subject: cos removed from the open posting system + misc. updates here and there X-Git-Tag: BEFORE_MERGE_1_1~151 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=5f5f4f42baee0c4dce93a3ad63bb6bb5a1ea9850;p=mir.git cos removed from the open posting system + misc. updates here and there --- diff --git a/source/OpenMir.java b/source/OpenMir.java index 791e3457..ccda9818 100755 --- a/source/OpenMir.java +++ b/source/OpenMir.java @@ -29,25 +29,25 @@ * not wish to do so, delete this exception statement from your version. */ -import java.io.IOException; -import java.io.PrintWriter; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import mir.servlet.AbstractServlet; -import mir.servlet.ServletModuleDispatch; -import mir.servlet.ServletModuleUserExc; -import mir.util.ExceptionFunctions; -import mircoders.global.MirGlobal; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import mir.servlet.AbstractServlet; +import mir.servlet.ServletModuleDispatch; +import mir.servlet.ServletModuleUserExc; +import mir.util.ExceptionFunctions; +import mircoders.global.MirGlobal; import mircoders.servlet.ServletModuleOpenIndy; /** * OpenMir.java - main servlet for open posting and comment feature to articles * * @author RK 1999-2001, the mir-coders group - * @version $Id: OpenMir.java,v 1.32 2003/04/16 03:26:44 zapata Exp $ + * @version $Id: OpenMir.java,v 1.33 2003/04/21 00:24:05 zapata Exp $ * */ diff --git a/source/mir/generator/CompositeGeneratorLibrary.java b/source/mir/generator/CompositeGeneratorLibrary.java index 3f177644..a338ca82 100755 --- a/source/mir/generator/CompositeGeneratorLibrary.java +++ b/source/mir/generator/CompositeGeneratorLibrary.java @@ -31,7 +31,7 @@ package mir.generator; -import java.util.HashMap; +import java.util.HashMap; import java.util.Map; public class CompositeGeneratorLibrary implements Generator.GeneratorLibrary { diff --git a/source/mir/generator/FreemarkerGenerator.java b/source/mir/generator/FreemarkerGenerator.java index ea0c69dd..da2fe3c3 100755 --- a/source/mir/generator/FreemarkerGenerator.java +++ b/source/mir/generator/FreemarkerGenerator.java @@ -31,30 +31,26 @@ package mir.generator; -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Vector; - -import org.apache.struts.util.MessageResources; -import org.apache.commons.beanutils.PropertyUtils; - - -import freemarker.template.FileTemplateCache; -import freemarker.template.SimpleScalar; -import freemarker.template.Template; -import freemarker.template.TemplateHashModel; -import freemarker.template.TemplateListModel; -import freemarker.template.TemplateMethodModel; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateModelRoot; -import freemarker.template.TemplateScalarModel; - +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +import org.apache.commons.beanutils.PropertyUtils; +import freemarker.template.FileTemplateCache; +import freemarker.template.SimpleScalar; +import freemarker.template.Template; +import freemarker.template.TemplateHashModel; +import freemarker.template.TemplateListModel; +import freemarker.template.TemplateMethodModel; +import freemarker.template.TemplateModel; +import freemarker.template.TemplateModelException; +import freemarker.template.TemplateModelRoot; +import freemarker.template.TemplateScalarModel; +import mir.log.LoggerWrapper; import mir.util.RewindableIterator; -import mir.util.*; public class FreemarkerGenerator implements Generator { @@ -64,7 +60,7 @@ public class FreemarkerGenerator implements Generator { template = aTemplate; } - public void generate(Object anOutputWriter, Map aValues, PrintWriter aLogger) throws GeneratorExc, GeneratorFailure { + public void generate(Object anOutputWriter, Map aValues, LoggerWrapper aLogger) throws GeneratorExc, GeneratorFailure { if (!(anOutputWriter instanceof PrintWriter)) throw new GeneratorExc("Writer for a FreemarkerGenerator must be a PrintWriter"); @@ -73,8 +69,8 @@ public class FreemarkerGenerator implements Generator { } catch (Throwable t) { t.printStackTrace(); - aLogger.println("Exception occurred: "+t.getMessage()); - t.printStackTrace(aLogger); + aLogger.error("Exception occurred: "+t.getMessage()); + t.printStackTrace(aLogger.asPrintWriter(aLogger.DEBUG_MESSAGE)); throw new GeneratorFailure( t ); } } diff --git a/source/mir/generator/Generator.java b/source/mir/generator/Generator.java index 245dd3a2..011c1c2e 100755 --- a/source/mir/generator/Generator.java +++ b/source/mir/generator/Generator.java @@ -31,12 +31,13 @@ package mir.generator; -import java.io.PrintWriter; -import java.util.List; -import java.util.Map; +import java.util.List; +import java.util.Map; + +import mir.log.LoggerWrapper; public interface Generator { - public void generate(Object anOutputWriter, Map aValues, PrintWriter aLogger) throws GeneratorExc, GeneratorFailure; + public void generate(Object anOutputWriter, Map aValues, LoggerWrapper aLogger) throws GeneratorExc, GeneratorFailure; public static interface GeneratorLibrary { public Generator makeGenerator(String anIdentifier) throws GeneratorExc, GeneratorFailure; diff --git a/source/mir/generator/GeneratorLibraryRepository.java b/source/mir/generator/GeneratorLibraryRepository.java index 639c9c19..a7116cfb 100755 --- a/source/mir/generator/GeneratorLibraryRepository.java +++ b/source/mir/generator/GeneratorLibraryRepository.java @@ -43,7 +43,7 @@ public class GeneratorLibraryRepository { public GeneratorLibraryRepository() { factories = new HashMap(); - logger = new LoggerWrapper("TemplateEngine"); + logger = new LoggerWrapper("Generator"); } public void registerLibraryFactory(String aName, Generator.GeneratorLibraryFactory aFactory) { diff --git a/source/mir/producer/GeneratingProducerNode.java b/source/mir/producer/GeneratingProducerNode.java index 6ad421d8..8787ea22 100755 --- a/source/mir/producer/GeneratingProducerNode.java +++ b/source/mir/producer/GeneratingProducerNode.java @@ -77,7 +77,7 @@ public class GeneratingProducerNode implements ProducerNode { writer = writerEngine.openWriter( destinationIdentifier, parameters ); generator = generatorLibrary.makeGenerator( generatorIdentifier ); - generator.generate(writer, aValueMap, new PrintWriter(new LoggerToWriterAdapter(aLogger, LoggerWrapper.INFO_MESSAGE))); + generator.generate(writer, aValueMap, aLogger); writerEngine.closeWriter( writer ); endTime = System.currentTimeMillis(); diff --git a/source/mir/servlet/ServletModule.java b/source/mir/servlet/ServletModule.java index c0444d73..88c44dc1 100755 --- a/source/mir/servlet/ServletModule.java +++ b/source/mir/servlet/ServletModule.java @@ -456,16 +456,7 @@ public abstract class ServletModule { 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(req); theFieldList = theStorage.getFields(); @@ -487,5 +478,4 @@ public abstract class ServletModule { throw new ServletModuleFailure( "ServletModule.getIntersectingValues: " + e.getMessage(), e); } } - } diff --git a/source/mir/servlet/ServletModuleDispatch.java b/source/mir/servlet/ServletModuleDispatch.java index 1c58dd99..f8ee7fe7 100755 --- a/source/mir/servlet/ServletModuleDispatch.java +++ b/source/mir/servlet/ServletModuleDispatch.java @@ -44,7 +44,7 @@ import mir.log.LoggerWrapper; * Dispatcher, calls the method passed to ServletModule Class, through the "do" * Parameter (via POST or GET) * - * @version $Id: ServletModuleDispatch.java,v 1.13 2003/03/06 05:40:39 zapata Exp $ + * @version $Id: ServletModuleDispatch.java,v 1.14 2003/04/21 00:24:05 zapata Exp $ * * @Author rk * @@ -61,25 +61,23 @@ public final class ServletModuleDispatch { private ServletModuleDispatch () { } - /** - * Die Dispatch-Routine ruft das von dem Hauptservlet kommende ServletModule - * mit dem per HttpServletRequest angegebenen Paramter do auf. - * Ist kein Parameter angegeben, so wird versucht, in die defaultAction - * des ServletModules zu springen. - * - * @param req Http-Request, das vom Dispatcher an die Methode des - * ServletModules durchgereicht wird - * @param res Http-Response, die vom Dispatcher an die Methode des - * ServletModules durchgereicht wird - * @param sMod ServletModule, an das dispatched wird. - * @param mod Name des Modules als String (f?r Logfile) - */ + /** + * Die Dispatch-Routine ruft das von dem Hauptservlet kommende ServletModule + * mit dem per HttpServletRequest angegebenen Paramter do auf. + * Ist kein Parameter angegeben, so wird versucht, in die defaultAction + * des ServletModules zu springen. + * + * @param req Http-Request, das vom Dispatcher an die Methode des + * ServletModules durchgereicht wird + * @param res Http-Response, die vom Dispatcher an die Methode des + * ServletModules durchgereicht wird + * @param sMod ServletModule, an das dispatched wird. + * @param mod Name des Modules als String (f?r Logfile) + */ public static void dispatch(ServletModule sMod, HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { - //sMod.predeliver(req,res); - String doParam = req.getParameter("do"); logger.info("ServletModuleDispatch: " + sMod.toString() + " with method " + doParam); if (doParam == null) { @@ -97,21 +95,15 @@ public final class ServletModuleDispatch { } else logger.debug("method lookup unsuccesful"); } - catch ( NoSuchMethodException e) { - throw new ServletModuleFailure("no such method '"+doParam+"' (" + e.getMessage() + ")", e); - } - catch ( SecurityException e) { - throw new ServletModuleFailure("method not allowed!" + e.getMessage(), e); - } catch ( InvocationTargetException e) { - logger.debug( "invocation target exception: " + e.getMessage()); + logger.error( "invocation target exception: " + e.getMessage()); + e.getTargetException().printStackTrace(logger.asPrintWriter(logger.DEBUG_MESSAGE)); throw new ServletModuleFailure(e.getTargetException().getMessage(), e.getTargetException()); } - catch ( IllegalAccessException e) { - throw new ServletModuleFailure("illegal method not allowed!" + e.getMessage(), e); - } catch (Throwable t) { + logger.error( "ServletModuleDispatch: " + t.getMessage()); + t.printStackTrace(logger.asPrintWriter(logger.DEBUG_MESSAGE)); throw new ServletModuleFailure(t); } } diff --git a/source/mir/session/CommonsUploadedFileAdapter.java b/source/mir/session/CommonsUploadedFileAdapter.java index 42b2d915..869f7b3d 100755 --- a/source/mir/session/CommonsUploadedFileAdapter.java +++ b/source/mir/session/CommonsUploadedFileAdapter.java @@ -1,27 +1,64 @@ -package mir.session; - -import org.apache.commons.fileupload.*; -import java.io.*; - -public class CommonsUploadedFileAdapter implements UploadedFile { - private FileItem fileItem; - private Object container; - - public CommonsUploadedFileAdapter(Object aContainer, FileItem aFileItem) { - container = aContainer; - fileItem = aFileItem; - } - - public InputStream getInputStream() throws SessionExc, SessionFailure{ - try { - return fileItem.getInputStream(); - } - catch (Throwable t) { - throw new SessionFailure(t); - } - }; - - public String getContentType() { - return fileItem.getContentType(); - }; +/* + * Copyright (C) 2001, 2002 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * 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. + */ + +package mir.session; + +import org.apache.commons.fileupload.*; +import java.io.*; + +public class CommonsUploadedFileAdapter implements UploadedFile { + private FileItem fileItem; + + public CommonsUploadedFileAdapter(FileItem aFileItem) { + fileItem = aFileItem; + } + + public InputStream getInputStream() throws SessionExc, SessionFailure{ + try { + return fileItem.getInputStream(); + } + catch (Throwable t) { + throw new SessionFailure(t); + } + }; + + public String getFileName() { + return fileItem.getName(); + } + + public String getFieldName() { + return fileItem.getFieldName(); + } + + public String getContentType() { + return fileItem.getContentType(); + }; } \ No newline at end of file diff --git a/source/mir/session/HTTPAdapters.java b/source/mir/session/HTTPAdapters.java index b8d4181e..cfb444fb 100755 --- a/source/mir/session/HTTPAdapters.java +++ b/source/mir/session/HTTPAdapters.java @@ -1,91 +1,121 @@ -package mir.session; - -import java.util.Arrays; -import java.util.List; -import java.util.Vector; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; - -import org.apache.commons.fileupload.FileItem; - -import mir.util.HTTPParsedRequest; - -public class HTTPAdapters { - public static class HTTPRequestAdapter implements Request { - private HttpServletRequest request; - - public HTTPRequestAdapter(HttpServletRequest aRequest) { - request = aRequest; - } - - public String getParameter(String aName) { - return request.getParameter(aName); - }; - - public List getUploadedFiles() { - return new Vector(); - }; - - public List getParameters(String aName) { - return Arrays.asList(request.getParameterValues(aName)); - }; - - public HttpServletRequest getRequest() { - return request; - } - } - - public static class HTTPParsedRequestAdapter implements Request { - private HTTPParsedRequest request; - - public HTTPParsedRequestAdapter(HTTPParsedRequest aRequest) { - request = aRequest; - } - - public String getParameter(String aName) { - return request.getParameter(aName); - }; - - public List getParameters(String aName) { - return request.getParameterList(aName); - }; - - public List getUploadedFiles() { - List result = new Vector(); - List files = request.getFiles(); - - for (int i=0; i0 && ((String) parts.get(0)).trim().toLowerCase().equals(MULTIPART_FORMDATA_CONTENTTYPE)) { - parseMultipartRequest(); - } - } - catch (Throwable t) { - t.printStackTrace(); - - throw new UtilFailure(t); - } - } - - protected void parseMultipartRequest() throws UtilExc, UtilFailure { - try { - FileUpload upload = new FileUpload(); - - upload.setSizeMax(maxUploadSize); - upload.setSizeThreshold(4096); - upload.setRepositoryPath(tempDir); - - List items = upload.parseRequest(request); - - Iterator i = items.iterator(); - while (i.hasNext()) { - FileItem item = (FileItem) i.next(); - - if (item.isFormField()) { - if (!stringValues.containsKey(item.getName())) { - stringValues.put(item.getFieldName(), item.getString()); - } - - List listValue = (List) listValues.get(item.getFieldName()); - if (listValue == null) { - listValue = new Vector(); - listValues.put(item.getFieldName(), listValue); - } - listValue.add(item.getString()); - } - else { - if (item.getSize()>0) - files.add(item); - } - } - } - catch (Throwable t) { - throw new UtilFailure(t); - } - } -} +/* + * Copyright (C) 2001, 2002 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * 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. + */ + +package mir.util; + +import java.util.Arrays; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Vector; +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUpload; +import mir.log.LoggerWrapper; + +public class HTTPParsedRequest { + static final String MULTIPART_FORMDATA_CONTENTTYPE = "multipart/form-data"; + + private HttpServletRequest request; + private String encoding; + private int maxUploadSize; + private String tempDir; + + private Map stringValues; + private Map listValues; + private List files; + + private LoggerWrapper logger; + + public HTTPParsedRequest(HttpServletRequest aRequest, String anEncoding, int aMaxUploadSize, String aTempDir) throws UtilExc, UtilFailure { + logger = new LoggerWrapper("Utility,HTTPParsedRequest"); + + request = aRequest; + encoding = anEncoding; + maxUploadSize = aMaxUploadSize; + tempDir = aTempDir; + + stringValues = new HashMap(); + listValues = new HashMap(); + files = new Vector(); + + parseRequest(aRequest); + } + + public HTTPParsedRequest(HttpServletRequest aRequest, int aMaxUploadSize, String aTempDir) throws UtilExc, UtilFailure { + this(aRequest, aRequest.getCharacterEncoding(), aMaxUploadSize, aTempDir); + } + + public HttpServletRequest getRequest() { + return request; + } + + public String getParameter(String aName) { + return (String) stringValues.get(aName); + } + + public List getFiles() { + return files; + } + + public List getParameterList(String aName) { + if (listValues.containsKey(aName)) + return (List) listValues.get(aName); + else + return new Vector(); + } + + protected void parseRequest(HttpServletRequest aRequest) throws UtilExc, UtilFailure { + + try { + String contentType = aRequest.getContentType(); + List parts = StringRoutines.splitString(contentType, ";"); + + Enumeration e = aRequest.getParameterNames(); + + while (e.hasMoreElements()) { + String name = (String) e.nextElement(); + + stringValues.put(name, aRequest.getParameter(name)); + List listValue = new Vector(Arrays.asList(aRequest.getParameterValues(name))); + listValues.put(name, listValue); + } + + if (parts.size()>0 && ((String) parts.get(0)).trim().toLowerCase().equals(MULTIPART_FORMDATA_CONTENTTYPE)) { + parseMultipartRequest(); + } + } + catch (Throwable t) { + t.printStackTrace(); + + throw new UtilFailure(t); + } + } + + protected void parseMultipartRequest() throws UtilExc, UtilFailure { + try { + FileUpload upload = new FileUpload(); + + upload.setSizeMax(maxUploadSize); + upload.setSizeThreshold(4096); + upload.setRepositoryPath(tempDir); + + List items = upload.parseRequest(request); + + Iterator i = items.iterator(); + while (i.hasNext()) { + FileItem item = (FileItem) i.next(); + + if (item.isFormField()) { + if (!stringValues.containsKey(item.getName())) { + stringValues.put(item.getFieldName(), item.getString(encoding)); + } + + List listValue = (List) listValues.get(item.getFieldName()); + if (listValue == null) { + listValue = new Vector(); + listValues.put(item.getFieldName(), listValue); + } + listValue.add(item.getString(encoding)); + } + else { + if (item.getSize()>0) + files.add(item); + } + } + } + catch (Throwable t) { + throw new UtilFailure(t); + } + } +} diff --git a/source/mircoders/localizer/basic/MirBasicCommentPostingSessionHandler.java b/source/mircoders/localizer/basic/MirBasicCommentPostingSessionHandler.java index bf219f84..522f1165 100755 --- a/source/mircoders/localizer/basic/MirBasicCommentPostingSessionHandler.java +++ b/source/mircoders/localizer/basic/MirBasicCommentPostingSessionHandler.java @@ -1,3 +1,34 @@ +/* + * Copyright (C) 2001, 2002 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * 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. + */ + package mircoders.localizer.basic; import java.util.*; @@ -23,24 +54,13 @@ import mircoders.media.*; * @version 1.0 */ -public class MirBasicCommentPostingSessionHandler implements SessionHandler { - protected LoggerWrapper logger; - protected MirPropertiesConfiguration configuration; - protected boolean initialRequest; +public class MirBasicCommentPostingSessionHandler extends MirBasicPostingSessionHandler { protected ModuleComment commentModule; protected DatabaseCommentToMedia commentToMedia = DatabaseCommentToMedia.getInstance(); public MirBasicCommentPostingSessionHandler() { - logger = new LoggerWrapper("Localizer.OpenPosting.Comment"); - try { - configuration = MirPropertiesConfiguration.instance(); - } - catch (Throwable t) { - logger.fatal("Cannont load configuration: " + t.toString()); + super(); - throw new RuntimeException("Cannont load configuration: " + t.toString()); - } - initialRequest= true; commentModule= new ModuleComment(DatabaseComment.getInstance()); } @@ -54,113 +74,40 @@ public class MirBasicCommentPostingSessionHandler implements SessionHandler { } }; - public String generateOnetimePassword() { - Random r = new Random(); - int random = r.nextInt(); - - long l = System.currentTimeMillis(); + protected void initializeResponseData(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure { + super.initializeResponseData(aRequest, aSession, aResponse); - l = (l*l*l*l)/random; - if (l<0) - l = l * -1; - - String returnString = ""+l; - - return returnString.substring(5); - } - - public void initializeResponseData(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure { - if (MirGlobal.abuse().getOpenPostingPassword()) { - String password = (String) aSession.getAttribute("password"); - if (password==null) { - password = generateOnetimePassword(); - aSession.setAttribute("password", password); - } - aResponse.setResponseValue("password", password); - } - else { - aResponse.setResponseValue("password", null); - aSession.deleteAttribute("password"); + Iterator i = DatabaseComment.getInstance().getFields().iterator(); + while (i.hasNext()) { + String field = (String) i.next(); + aResponse.setResponseValue(field, aRequest.getParameter(field)); } - aResponse.setResponseValue("errors", null); }; public void initialRequest(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure{ - Iterator i = DatabaseContent.getInstance().getFields().iterator(); - while (i.hasNext()) { - aResponse.setResponseValue( (String) i.next(), null); - } + super.initialRequest(aRequest, aSession, aResponse); String articleId = aRequest.getParameter("to_media"); - if (articleId == null) throw new SessionExc("MirBasicCommentPostingSessionHandler.initialRequest: article id not set!"); - aSession.setAttribute("to_media", articleId); - initializeResponseData(aRequest, aSession, aResponse); - - try { - aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.EditTemplate")); - } - catch (Throwable e) { - throw new SessionFailure("Can't get configuration: " + e.getMessage(), e); - } - - } - - public boolean testFieldExists(Request aRequest, String aFieldName, String anErrorMessageResource, List aValidationResults) { - Object value = aRequest.getParameter(aFieldName); - if (value==null || !(value instanceof String) || ((String) value).trim().length()==0) { - logger.debug(" missing field " + aFieldName + " value = " + value); - aValidationResults.add(new ValidationError(aFieldName, anErrorMessageResource)); - return false; - } - else - return true; - } - - public boolean testFieldIsNumeric(Request aRequest, String aFieldName, String anErrorMessageResource, List aValidationResults) { - Object value = aRequest.getParameter(aFieldName); - if (value!=null) { - try { - Integer.parseInt((String) value); - return true; - } - catch (Throwable t) { - logger.debug(" field not numeric: " + aFieldName + " value = " + value); - aValidationResults.add(new ValidationError(aFieldName, anErrorMessageResource)); - return false; - } - } - return true; + aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.EditTemplate")); } - public List validate(Request aRequest, Session aSession) throws SessionExc, SessionFailure { List result = new Vector(); - testFieldExists(aRequest, "title", "validationerror.missing", result); - testFieldExists(aRequest, "description", "validationerror.missing", result); - testFieldExists(aRequest, "creator", "validationerror.missing", result); + testFieldEntered(aRequest, "title", "validationerror.missing", result); + testFieldEntered(aRequest, "description", "validationerror.missing", result); + testFieldEntered(aRequest, "creator", "validationerror.missing", result); return result; } public void subsequentRequest(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure { try { - Map commentFields = new HashMap(); - - Iterator i = DatabaseContent.getInstance().getFields().iterator(); - while (i.hasNext()) { - String field = (String) i.next(); - aResponse.setResponseValue(field, aRequest.getParameter(field)); - if (aRequest.getParameter(field)!=null) { - commentFields.put(field, aRequest.getParameter(field)); - } - } - initializeResponseData(aRequest, aSession, aResponse); List validationErrors = validate(aRequest, aSession); @@ -170,7 +117,8 @@ public class MirBasicCommentPostingSessionHandler implements SessionHandler { } else { EntityComment comment = (EntityComment) commentModule.createNew (); - comment.setValues(commentFields); + Iterator i = DatabaseComment.getInstance().getFields().iterator(); +// comment.setValues(commentFields); finishComment(aRequest, aSession, comment); @@ -235,7 +183,7 @@ public class MirBasicCommentPostingSessionHandler implements SessionHandler { public void processMediaFile(Request aRequest, Session aSession, EntityComment aComment, UploadedFile aFile) throws SessionExc, SessionFailure { try { - Entity mediaItem = MediaUploadProcessor.processMediaUpload(aFile); + Entity mediaItem = MediaUploadProcessor.processMediaUpload(aFile, new HashMap()); finishMedia(aRequest, aSession, aFile, mediaItem); mediaItem.update(); commentToMedia.addMedia(aComment.getId(), mediaItem.getId()); diff --git a/source/mircoders/localizer/basic/MirBasicGeneratorLocalizer.java b/source/mircoders/localizer/basic/MirBasicGeneratorLocalizer.java index 10995ba4..67d5ca95 100755 --- a/source/mircoders/localizer/basic/MirBasicGeneratorLocalizer.java +++ b/source/mircoders/localizer/basic/MirBasicGeneratorLocalizer.java @@ -34,7 +34,7 @@ package mircoders.localizer.basic; import mir.generator.FreemarkerGenerator; import mir.generator.Generator; import mir.generator.GeneratorLibraryRepository; -import mir.generator.WriterEngine; +import mir.generator.*; import mir.log.LoggerWrapper; import mircoders.global.MirGlobal; import mircoders.localizer.MirGeneratorLocalizer; @@ -54,9 +54,9 @@ public class MirBasicGeneratorLocalizer implements MirGeneratorLocalizer { } protected void buildRepository(GeneratorLibraryRepository aRepository) { - aRepository.registerLibraryFactory("freemarker", - new FreemarkerGenerator.FreemarkerGeneratorLibraryFactory( - MirGlobal.config().getString("Home") ) ); + aRepository.registerLibraryFactory( + "freemarker", + new FreemarkerGenerator.FreemarkerGeneratorLibraryFactory(MirGlobal.config().getString("Home") ) ); } public Generator.GeneratorLibrary makeProducerGeneratorLibrary() throws MirLocalizerExc, MirLocalizerFailure { diff --git a/source/mircoders/localizer/basic/MirBasicLocalizer.java b/source/mircoders/localizer/basic/MirBasicLocalizer.java index 06823a1a..50922c48 100755 --- a/source/mircoders/localizer/basic/MirBasicLocalizer.java +++ b/source/mircoders/localizer/basic/MirBasicLocalizer.java @@ -67,5 +67,4 @@ public class MirBasicLocalizer implements MirLocalizer { return new MirBasicAdminInterfaceLocalizer(); }; - } \ No newline at end of file diff --git a/source/mircoders/localizer/basic/MirBasicOpenPostingLocalizer.java b/source/mircoders/localizer/basic/MirBasicOpenPostingLocalizer.java index f4b5d5c7..919678ca 100755 --- a/source/mircoders/localizer/basic/MirBasicOpenPostingLocalizer.java +++ b/source/mircoders/localizer/basic/MirBasicOpenPostingLocalizer.java @@ -32,22 +32,20 @@ package mircoders.localizer.basic; import java.util.List; -import java.util.Locale; -import java.util.*; -import javax.servlet.http.HttpServletRequest; +import java.util.Random; +import mir.config.MirPropertiesConfiguration; import mir.log.LoggerWrapper; -import mir.servlet.*; -import mir.config.*; import mir.session.Request; -import mir.session.Response; -import mir.session.*; - +import mir.session.Session; +import mir.session.SessionHandler; import mircoders.entity.EntityComment; import mircoders.entity.EntityContent; import mircoders.global.MirGlobal; import mircoders.global.ProducerEngine; -import mircoders.localizer.*; +import mircoders.localizer.MirLocalizerExc; +import mircoders.localizer.MirLocalizerFailure; +import mircoders.localizer.MirOpenPostingLocalizer; public class MirBasicOpenPostingLocalizer implements MirOpenPostingLocalizer { private List afterContentProducerTasks; diff --git a/source/mircoders/localizer/basic/MirBasicProducerAssistantLocalizer.java b/source/mircoders/localizer/basic/MirBasicProducerAssistantLocalizer.java index 625eae24..0f9144ec 100755 --- a/source/mircoders/localizer/basic/MirBasicProducerAssistantLocalizer.java +++ b/source/mircoders/localizer/basic/MirBasicProducerAssistantLocalizer.java @@ -31,22 +31,23 @@ package mircoders.localizer.basic; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import mir.config.MirPropertiesConfiguration; -import mir.entity.adapter.EntityAdapter; -import mir.entity.adapter.EntityIteratorAdapter; -import mir.log.LoggerWrapper; -import mir.misc.StringUtil; -import mir.util.DateToMapAdapter; -import mir.util.GeneratorHTMLFunctions; -import mir.util.GeneratorIntegerFunctions; -import mir.util.GeneratorListFunctions; -import mir.util.GeneratorStringFunctions; -import mircoders.global.MirGlobal; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import mir.config.MirPropertiesConfiguration; +import mir.entity.adapter.EntityAdapter; +import mir.entity.adapter.EntityIteratorAdapter; +import mir.log.LoggerWrapper; +import mir.misc.StringUtil; +import mir.util.DateToMapAdapter; +import mir.util.GeneratorExpressionFunctions; +import mir.util.GeneratorHTMLFunctions; +import mir.util.GeneratorIntegerFunctions; +import mir.util.GeneratorListFunctions; +import mir.util.GeneratorStringFunctions; +import mircoders.global.MirGlobal; import mircoders.localizer.MirProducerAssistantLocalizer; public class MirBasicProducerAssistantLocalizer implements MirProducerAssistantLocalizer { @@ -87,6 +88,7 @@ public class MirBasicProducerAssistantLocalizer implements MirProducerAssistantL utilityMap.put("subList", new GeneratorListFunctions.subListFunction()); utilityMap.put("isOdd", new GeneratorIntegerFunctions.isOddFunction()); utilityMap.put("increment", new GeneratorIntegerFunctions.incrementFunction()); + utilityMap.put("evaluate", new GeneratorExpressionFunctions.evaluateExpressionFunction()); aValueSet.put("config", configMap); aValueSet.put("utility", utilityMap); diff --git a/source/mircoders/media/MediaUploadProcessor.java b/source/mircoders/media/MediaUploadProcessor.java index a23be012..bfe1782e 100755 --- a/source/mircoders/media/MediaUploadProcessor.java +++ b/source/mircoders/media/MediaUploadProcessor.java @@ -47,7 +47,7 @@ import mir.storage.Database; import mircoders.module.ModuleMediaType; public class MediaUploadProcessor { - public static Entity processMediaUpload(UploadedFile aFile) throws MediaExc, MediaFailure { + public static Entity processMediaUpload(UploadedFile aFile, Map aValues) throws MediaExc, MediaFailure { String mediaId; MirMedia mediaHandler; Entity mediaType; @@ -67,12 +67,12 @@ public class MediaUploadProcessor { throw new MediaExc("Invalid content-type: " + contentType); } + values.putAll(aValues); values.put("date", StringUtil.date2webdbDate(new GregorianCalendar())); values.put("is_produced", "0"); values.put("is_published", "1"); values.put("to_publisher", "0"); values.put("to_media_folder", "7"); - values.put("title", ""); mediaTypeModule = new ModuleMediaType(); mediaType = mediaTypeModule.findMediaTypeForMimeType(contentType); diff --git a/source/mircoders/servlet/ServletHelper.java b/source/mircoders/servlet/ServletHelper.java index dbffa3ac..dd588607 100755 --- a/source/mircoders/servlet/ServletHelper.java +++ b/source/mircoders/servlet/ServletHelper.java @@ -44,11 +44,15 @@ import mir.servlet.ServletModuleFailure; import mir.util.CachingRewindableIterator; import mir.util.NullWriter; import mir.util.ResourceBundleGeneratorFunction; +import mir.log.*; import mircoders.global.MirGlobal; public class ServletHelper { + static LoggerWrapper logger = new LoggerWrapper("ServletModule.Helper"); + + public static Map makeGenerationData(Locale[] aLocales) throws ServletModuleExc { return makeGenerationData(aLocales, "bundles.adminlocal", "bundles.admin"); } @@ -108,7 +112,7 @@ public class ServletHelper { try { generator = MirGlobal.localizer().generators().makeAdminGeneratorLibrary().makeGenerator(aGenerator); - generator.generate(aWriter, aGenerationData, new PrintWriter(new NullWriter())); + generator.generate(aWriter, aGenerationData, logger); } catch (Throwable t) { throw new ServletModuleFailure(t); @@ -121,7 +125,7 @@ public class ServletHelper { try { generator = MirGlobal.localizer().generators().makeOpenPostingGeneratorLibrary().makeGenerator(aGenerator); - generator.generate(aWriter, aGenerationData, new PrintWriter(new NullWriter())); + generator.generate(aWriter, aGenerationData, logger); } catch (Throwable t) { throw new ServletModuleFailure(t); diff --git a/source/mircoders/servlet/ServletModuleContent.java b/source/mircoders/servlet/ServletModuleContent.java index 78b9ff06..272f0413 100755 --- a/source/mircoders/servlet/ServletModuleContent.java +++ b/source/mircoders/servlet/ServletModuleContent.java @@ -31,45 +31,47 @@ package mircoders.servlet; -import java.util.GregorianCalendar; -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 org.apache.lucene.index.IndexReader; -import freemarker.template.SimpleHash; -import mir.entity.adapter.EntityAdapterModel; -import mir.entity.adapter.EntityIteratorAdapter; -import mir.log.LoggerWrapper; -import mir.misc.StringUtil; -import mir.servlet.ServletModule; -import mir.servlet.ServletModuleExc; -import mir.servlet.ServletModuleFailure; -import mir.util.CachingRewindableIterator; -import mir.util.HTTPRequestParser; -import mir.util.JDBCStringRoutines; -import mir.util.SQLQueryBuilder; -import mir.util.URLBuilder; -import mircoders.entity.EntityContent; -import mircoders.entity.EntityUsers; -import mircoders.global.MirGlobal; -import mircoders.module.ModuleContent; -import mircoders.search.IndexUtil; -import mircoders.storage.DatabaseComment; -import mircoders.storage.DatabaseContent; -import mircoders.storage.DatabaseContentToMedia; +import java.util.Arrays; +import java.util.GregorianCalendar; +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 org.apache.lucene.index.IndexReader; +import freemarker.template.SimpleHash; + +import mir.entity.adapter.EntityAdapterModel; +import mir.entity.adapter.EntityIteratorAdapter; +import mir.log.LoggerWrapper; +import mir.misc.StringUtil; +import mir.servlet.ServletModule; +import mir.servlet.ServletModuleExc; +import mir.servlet.ServletModuleFailure; +import mir.util.CachingRewindableIterator; +import mir.util.HTTPRequestParser; +import mir.util.JDBCStringRoutines; +import mir.util.SQLQueryBuilder; +import mir.util.URLBuilder; +import mircoders.entity.EntityContent; +import mircoders.entity.EntityUsers; +import mircoders.global.MirGlobal; +import mircoders.module.ModuleContent; +import mircoders.search.IndexUtil; +import mircoders.storage.DatabaseComment; +import mircoders.storage.DatabaseContent; +import mircoders.storage.DatabaseContentToMedia; import mircoders.storage.DatabaseContentToTopics; /* * ServletModuleContent - * deliver html for the article admin form. * - * @version $Id: ServletModuleContent.java,v 1.48 2003/04/10 03:31:47 zapata Exp $ + * @version $Id: ServletModuleContent.java,v 1.49 2003/04/21 00:24:06 zapata Exp $ * @author rk, mir-coders * */ @@ -187,7 +189,9 @@ public class ServletModuleContent extends ServletModule withValues.put("is_html","0"); String id = mainModule.add(withValues); - DatabaseContentToTopics.getInstance().setTopics(id,req.getParameterValues("to_topic")); + List topics; + + DatabaseContentToTopics.getInstance().setTopics(id, req.getParameterValues("to_topic")); _showObject(id, req, res); } @@ -310,7 +314,7 @@ public class ServletModuleContent extends ServletModule throw new ServletModuleExc("Wrong call: (id) is missing"); Map withValues = getIntersectingValues(aRequest, DatabaseContent.getInstance()); - String[] topic_id = aRequest.getParameterValues("to_topic"); + String content_id = aRequest.getParameter("id"); withValues.put("is_produced", "0"); @@ -320,7 +324,7 @@ public class ServletModuleContent extends ServletModule withValues.put("is_html","0"); String id = mainModule.set(withValues); - DatabaseContentToTopics.getInstance().setTopics(aRequest.getParameter("id"),topic_id); + DatabaseContentToTopics.getInstance().setTopics(aRequest.getParameter("id"), aRequest.getParameterValues("to_topic")); String whereParam = aRequest.getParameter("where"); String orderParam = aRequest.getParameter("order"); @@ -336,12 +340,18 @@ public class ServletModuleContent extends ServletModule } } -/* - * HelperMethod shows the basic article editing form. - * - * if the "id" parameter is null, it means show an empty form to add a new - * article. -*/ + + /** + * HelperMethod shows the basic article editing form. + * + * if the "id" parameter is null, it means show an empty form to add a new + * article. + * + * @param id + * @param aRequest + * @param aResponse + * @throws ServletModuleExc + */ public void _showObject(String id, HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc { try { diff --git a/source/mircoders/servlet/ServletModuleOpenIndy.java b/source/mircoders/servlet/ServletModuleOpenIndy.java index e0e70d93..b1747db3 100755 --- a/source/mircoders/servlet/ServletModuleOpenIndy.java +++ b/source/mircoders/servlet/ServletModuleOpenIndy.java @@ -1,1248 +1,1125 @@ -/* - * Copyright (C) 2001, 2002 The Mir-coders group - * - * This file is part of Mir. - * - * Mir is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * Mir is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Mir; if not, write to the Free Software - * 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. - */ - -package mircoders.servlet; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.Enumeration; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; -import java.util.Set; -import java.util.Vector; -import java.util.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import javax.servlet.http.HttpUtils; - -import gnu.regexp.RE; -import gnu.regexp.REMatch; -import gnu.regexp.REMatchEnumeration; -import gnu.regexp.REException; - -import org.apache.commons.net.smtp.SMTPClient; -import org.apache.commons.net.smtp.SMTPReply; -import org.apache.log.Hierarchy; -import org.apache.log.Priority; -import org.apache.lucene.analysis.standard.StandardAnalyzer; -import org.apache.lucene.document.Document; -import org.apache.lucene.queryParser.QueryParser; -import org.apache.lucene.search.Hits; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.search.Query; -import org.apache.lucene.search.Searcher; -import org.apache.struts.util.MessageResources; - -import mir.entity.Entity; -import mir.entity.EntityList; -import mir.generator.Generator; -import mir.log.LoggerWrapper; -import mir.misc.FileHandler; -import mir.misc.StringUtil; -import mir.misc.WebdbMultipartRequest; -import mir.servlet.ServletModule; -import mir.servlet.ServletModuleExc; -import mir.servlet.ServletModuleFailure; -import mir.servlet.ServletModuleUserExc; -import mir.storage.StorageObjectFailure; -import mir.util.*; -import mircoders.pdf.PDFGenerator; -import mir.session.*; -import mir.util.HTTPRequestParser; -import mir.util.StringRoutines; -import mircoders.entity.EntityComment; -import mircoders.entity.EntityContent; -import mircoders.global.CacheKey; -import mircoders.global.MirGlobal; -import mircoders.media.*; -import mircoders.media.UnsupportedMediaFormatExc; -import mircoders.module.ModuleComment; -import mircoders.module.ModuleContent; -import mircoders.module.ModuleImages; -import mircoders.module.ModuleTopics; -import mircoders.search.AudioSearchTerm; -import mircoders.search.ContentSearchTerm; -import mircoders.search.ImagesSearchTerm; -import mircoders.search.KeywordSearchTerm; -import mircoders.search.MediaSearchTerm; -import mircoders.search.TextSearchTerm; -import mircoders.search.TopicSearchTerm; -import mircoders.search.UnIndexedSearchTerm; -import mircoders.search.VideoSearchTerm; -import mircoders.storage.DatabaseComment; -import mircoders.storage.DatabaseContent; -import mircoders.storage.DatabaseContentToMedia; -import mircoders.storage.DatabaseCommentToMedia; -import mircoders.storage.DatabaseContentToTopics; -import mircoders.storage.DatabaseImages; -import mircoders.storage.DatabaseLanguage; -import mircoders.storage.DatabaseTopics; - -/* - * ServletModuleOpenIndy - - * is the open-access-servlet, which is responsible for - * adding comments to articles & - * open-postings to the newswire - * - * @author mir-coders group - * @version $Id: ServletModuleOpenIndy.java,v 1.77 2003/04/18 15:37:29 john Exp $ - * - */ - -public class ServletModuleOpenIndy extends ServletModule -{ - - private String commentFormTemplate, commentFormDoneTemplate, commentFormDupeTemplate; - private String postingFormTemplate, postingFormDoneTemplate, postingFormDupeTemplate; - private String searchResultsTemplate; - private String prepareMailTemplate,sentMailTemplate; - private ModuleContent contentModule; - private ModuleComment commentModule; - private ModuleImages imageModule; - private ModuleTopics topicsModule; - private String directOp ="yes"; - // Singelton / Kontruktor - private static ServletModuleOpenIndy instance = new ServletModuleOpenIndy(); - public static ServletModule getInstance() { return instance; } - - private ServletModuleOpenIndy() { - super(); - try { - logger = new LoggerWrapper("ServletModule.OpenIndy"); - - commentFormTemplate = configuration.getString("ServletModule.OpenIndy.CommentTemplate"); - commentFormDoneTemplate = configuration.getString("ServletModule.OpenIndy.CommentDoneTemplate"); - commentFormDupeTemplate = configuration.getString("ServletModule.OpenIndy.CommentDupeTemplate"); - - postingFormTemplate = configuration.getString("ServletModule.OpenIndy.PostingTemplate"); - postingFormDoneTemplate = configuration.getString("ServletModule.OpenIndy.PostingDoneTemplate"); - postingFormDupeTemplate = configuration.getString("ServletModule.OpenIndy.PostingDupeTemplate"); - - searchResultsTemplate = configuration.getString("ServletModule.OpenIndy.SearchResultsTemplate"); - prepareMailTemplate = configuration.getString("ServletModule.OpenIndy.PrepareMailTemplate"); - sentMailTemplate = configuration.getString("ServletModule.OpenIndy.SentMailTemplate"); - directOp = configuration.getString("DirectOpenposting").toLowerCase(); - commentModule = new ModuleComment(DatabaseComment.getInstance()); - mainModule = commentModule; - contentModule = new ModuleContent(DatabaseContent.getInstance()); - topicsModule = new ModuleTopics(DatabaseTopics.getInstance()); - imageModule = new ModuleImages(DatabaseImages.getInstance()); - defaultAction="addposting"; - } - catch (StorageObjectFailure e) { - logger.error("servletmoduleopenindy could not be initialized: " + e.getMessage()); - } - } - - /** - * Method to return an "apology" when open postings are disabled - * - * @param aRequest - * @param aResponse - * @throws ServletModuleExc - * @throws ServletModuleUserExc - * @throws ServletModuleFailure - */ - public void openPostingDisabled(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { - deliver(aRequest, aResponse, (Map) null, null, - configuration.getString("ServletModule.OpenIndy.PostingDisabledTemplate")); - } - - /** - * Method for making a comment - */ - - public void addcomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { - if (MirGlobal.abuse().getOpenPostingDisabled()) { - openPostingDisabled(req, res); - - return; - } - - String aid = req.getParameter("aid"); // the article id the comment will belong to - - if (aid != null && !aid.equals("")) { - try { - Map mergeData = new HashMap(); - - // onetimepasswd - if (MirGlobal.abuse().getOpenPostingPassword()) { - String passwd = this.createOneTimePasswd(); - HttpSession session = req.getSession(false); - session.setAttribute("passwd", passwd); - mergeData.put("passwd", passwd); - } - else { - mergeData.put("passwd", (String)null); - } - mergeData.put("aid", aid); - - Map extraInfo = new HashMap(); - extraInfo.put("languagePopUpData", DatabaseLanguage.getInstance().getPopupData()); - - deliver(req, res, mergeData, extraInfo, commentFormTemplate); - } - catch (Throwable t) { - throw new ServletModuleFailure("ServletModuleOpenIndy.addcomment: " + t.getMessage(), t); - } - } - else - throw new ServletModuleExc("aid not set!"); - } - - /** - * Method for inserting a comment into the Database and delivering - * the commentDone Page - */ - - public void inscomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { - if (MirGlobal.abuse().getOpenPostingDisabled()) { - openPostingDisabled(req, res); - - return; - } - - String aid = req.getParameter("to_media"); // the article id the comment will belong to - if (aid != null && !aid.equals("")) { - // ok, collecting data from form - try { - Map withValues = getIntersectingValues(req, DatabaseComment.getInstance()); - - //no html in comments(for now) - for (Iterator i = withValues.keySet().iterator(); i.hasNext(); ) { - String k = (String) i.next(); - String v = (String) withValues.get(k); - - withValues.put(k, StringUtil.removeHTMLTags(v)); - } - withValues.put("is_published", "1"); - withValues.put("to_comment_status", "1"); - withValues.put("is_html", "0"); - - //checking the onetimepasswd - HttpSession session = req.getSession(false); - String sessionPasswd = (String) session.getAttribute("passwd"); - if (sessionPasswd != null) { - String passwd = req.getParameter("passwd"); - if (passwd == null || passwd.length() == 0) { - throw new ServletModuleUserExc("comment.error.missingpassword", new String[] {}); - } - if (!sessionPasswd.equals(passwd)) { - throw new ServletModuleUserExc("comment.error.invalidpassword", new String[] {}); - } - session.invalidate(); - } - - String id = mainModule.add(withValues); - - SimpleResponse response = new SimpleResponse(); - response.setResponseGenerator(commentFormDoneTemplate); - - if (id == null) { - deliver(req, res, (Map)null, null, commentFormDupeTemplate); - } - else { - DatabaseContent.getInstance().setUnproduced("id=" + aid); - - try { - EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(id); - MirGlobal.localizer().openPostings().afterCommentPosting(comment); - MirGlobal.abuse().checkComment( - comment, new HTTPAdapters.HTTPRequestAdapter(req), res); - } - catch (Throwable t) { - throw new ServletModuleExc(t.getMessage()); - } - } - - // redirecting to url - // should implement back to article - deliver(req, res, response.getResponseValues(), null, response.getResponseGenerator()); - } - catch (Throwable e) { - throw new ServletModuleFailure(e); - } - } - else - throw new ServletModuleExc("aid not set!"); - - } - - /** - * Method for delivering the form-Page for open posting - */ - - public void addposting(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure - { - try { - if (MirGlobal.abuse().getOpenPostingDisabled()) { - openPostingDisabled(req, res); - - return; - } - - Map mergeData = new HashMap(); - - // onetimepasswd - if (MirGlobal.abuse().getOpenPostingPassword()) { - String passwd = generateOnetimePassword(); - HttpSession session = req.getSession(false); - session.setAttribute("passwd", passwd); - mergeData.put("passwd", passwd); - } - else { - mergeData.put("passwd", (String)null); - } - - String maxMedia = configuration.getString("ServletModule.OpenIndy.MaxMediaUploadItems"); - String defaultMedia = configuration.getString("ServletModule.OpenIndy.DefaultMediaUploadItems"); - String numOfMedia = req.getParameter("medianum"); - - if (numOfMedia == null || numOfMedia.equals("")) { - numOfMedia = defaultMedia; - } - else if (Integer.parseInt(numOfMedia) > Integer.parseInt(maxMedia)) { - numOfMedia = maxMedia; - } - - int mediaNum = Integer.parseInt(numOfMedia); - List mediaFields = new Vector(); - for (int i = 0; i < mediaNum; i++) { - Integer mNum = new Integer(i + 1); - mediaFields.add(mNum.toString()); - } - mergeData.put("medianum", numOfMedia); - mergeData.put("mediafields", mediaFields); - mergeData.put("to_topic", null); - - Map extraInfo = new HashMap(); - extraInfo.put("languagePopUpData", DatabaseLanguage.getInstance().getPopupData()); - extraInfo.put("themenPopupData", topicsModule.getTopicsAsSimpleList()); - - extraInfo.put("topics", topicsModule.getTopicsList()); - deliver(req, res, mergeData, extraInfo, postingFormTemplate); - } - catch (Throwable t) { - throw new ServletModuleFailure(t); - } - } - - /** - * Method for inserting an open posting into the Database and delivering - * the postingDone Page - */ - - public void insposting(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure - { - if (MirGlobal.abuse().getOpenPostingDisabled()) { - openPostingDisabled(req, res); - - return; - } - - Map mergeData = new HashMap(); - boolean setMedia=false; - boolean setTopic = false; - - try { - - WebdbMultipartRequest mp = null; - EntityList mediaList = null; - try { - // new MediaRequest, "1" is the id for the openPosting user - MediaRequest mediaReq = new MediaRequest("1", true); - mp = new WebdbMultipartRequest(req, (FileHandler)mediaReq); - mediaList = mediaReq.getEntityList(); - } - catch (Throwable e) { - throw new ServletModuleFailure(e); - } - - Map withValues = mp.getParameters(); - - //checking the onetimepasswd - HttpSession session = req.getSession(false); - String sessionPasswd = (String) session.getAttribute("passwd"); - if (sessionPasswd != null){ - String passwd = (String) withValues.get("passwd"); - - if ( passwd == null || passwd.length()==0) { - throw new ServletModuleUserExc("posting.error.missingpassword", new String[] {}); - } - if (!sessionPasswd.equals(passwd)) { - throw new ServletModuleUserExc("posting.error.invalidpassword", new String[] {}); - } - session.invalidate(); - } - - if ((((String)withValues.get("title")).length() == 0) || - (((String)withValues.get("description")).length() == 0) || - (((String)withValues.get("content_data")).length() == 0)) - throw new ServletModuleUserExc("posting.error.missingfield", new String[] {}); - - // call the routines that escape html - - for (Iterator i=withValues.keySet().iterator(); i.hasNext(); ){ - String k=(String)i.next(); - String v=(String)withValues.get(k); - - if (k.equals("content_data")){ - //this doesn't quite work yet, so for now, all html goes - //withValues.put(k,StringUtil.approveHTMLTags(v)); - withValues.put(k,StringUtil.deleteForbiddenTags(v)); - } - else if (k.equals("description")) { - String tmp = StringUtil.deleteForbiddenTags(v); - withValues.put(k,StringUtil.deleteHTMLTableTags(tmp)); - } - else { - withValues.put(k,StringUtil.removeHTMLTags(v)); - } - - } - - withValues.put("date", StringUtil.date2webdbDate(new GregorianCalendar())); - withValues.put("publish_path", StringUtil.webdbDate2path((String)withValues.get("date"))); - withValues.put("is_produced", "0"); - withValues.put("is_published","1"); - if (directOp.equals("yes")) - withValues.put("to_article_type","1"); - - withValues.put("to_publisher","1"); - - // inserting content into database - String cid = contentModule.add(withValues); - logger.debug("id: "+cid); - //insert was not successfull - if(cid==null){ - - //How do we know that it was not succesful cause of a - //dupe, what if it failed cause of "No space left on device"? - //Or is there something I am missing? Wouldn't it be better - //to have an explicit dupe check and then insert? I have no - //idea what I am talking about. this comment is in case - //I forget to explicitely ask. -mh - deliver(req, res, mergeData, null, postingFormDupeTemplate); - return; - } - - String[] to_topicsArr = mp.getParameterValues("to_topic"); - - if (to_topicsArr != null && to_topicsArr.length > 0) { - try{ - DatabaseContentToTopics.getInstance().setTopics(cid,to_topicsArr); - setTopic = true; - } - catch (Throwable e) { - logger.error("setting content_x_topic failed"); - contentModule.deleteById(cid); - throw new ServletModuleFailure("smod - openindy :: insposting: setting content_x_topic failed: "+e.toString(), e); - } //end try - } //end if - - //if we're here all is ok... associate the media to the article - for(int i=0;i0) { - MirGlobal.localizer().openPostings().processCommentPosting(request, session, response); - - ServletHelper.generateOpenPostingResponse(aResponse.getWriter(), response.getResponseValues(), response.getResponseGenerator()); - } - else { - EntityComment comment = (EntityComment) commentModule.createNew (); - comment.setValues(commentFields); - MirGlobal.abuse().checkComment(comment, aRequest, aResponse); - MirGlobal.localizer().openPostings().finishCommentPosting(request, session, comment); - - String id = comment.insert(); - if(id==null){ - MirGlobal.localizer().openPostings().afterDuplicateCommentPosting(request, session, response, comment); - - logger.info("Dupe comment rejected"); - - ServletHelper.generateOpenPostingResponse(aResponse.getWriter(), response.getResponseValues(), response.getResponseGenerator()); - } - else { - // media - List mediaItems = new Vector(); - i = request.getUploadedFiles().iterator(); - while (i.hasNext()) { - UploadedFile file = (UploadedFile) i.next(); - Entity mediaItem = MediaUploadProcessor.processMediaUpload(file); - DatabaseCommentToMedia.getInstance().addMedia(comment.getId(), mediaItem.getId()); - } - - MirGlobal.localizer().openPostings().afterCommentPosting(request, session, response, comment); - - MirGlobal.abuse().logComment(aRequest.getRemoteAddr(), id, new Date(), (String) aRequest.getHeader("User-Agent")); - DatabaseContent.getInstance().setUnproduced("id=" + comment.getValue("to_media")); - logger.info("Comment posted"); - ServletHelper.generateOpenPostingResponse(aResponse.getWriter(), response.getResponseValues(), response.getResponseGenerator()); - } - } - } - catch (Throwable t) { - ExceptionFunctions.traceCauseException(t).printStackTrace(); - - throw new ServletModuleFailure("ServletModuleOpenIndy.addcomment: " + t.getMessage(), t); - } - } -*/ - - private static final String SESSION_REQUEST_KEY="sessionid"; - - public void opensession(HttpServletRequest aRequest, HttpServletResponse aResponse) - throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { - - try { - Request request = new HTTPAdapters.HTTPParsedRequestAdapter(new HTTPParsedRequest(aRequest, 1000000, "/tmp")); - - if (aRequest.isRequestedSessionIdValid() && !aRequest.isRequestedSessionIdFromURL() && - !aRequest.getRequestedSessionId().equals(aRequest.getParameter(SESSION_REQUEST_KEY))) - aRequest.getSession().invalidate(); - - Session session = new HTTPAdapters.HTTPSessionAdapter(aRequest.getSession()); - - SimpleResponse response = new SimpleResponse( - ServletHelper.makeGenerationData(new Locale[] {getLocale(aRequest), getFallbackLocale(aRequest)}, - "bundles.open")); - - response.setResponseValue("actionURL", aResponse.encodeURL(HttpUtils.getRequestURL(aRequest).toString())+"?"+SESSION_REQUEST_KEY+"="+aRequest.getSession().getId()); - - SessionHandler handler = MirGlobal.localizer().openPostings().getOpenSessionHandler(request, session); - - handler.processRequest(request, session, response); - ServletHelper.generateOpenPostingResponse(aResponse.getWriter(), response.getResponseValues(), response.getResponseGenerator()); - } - catch (Throwable t) { - logger.error(t.toString()); - t.printStackTrace(logger.asPrintWriter(logger.DEBUG_MESSAGE)); - - throw new ServletModuleFailure(t); - } - } - - /** - * Method for preparing and sending a content as an email message - */ - - public void mail(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure - { - String aid = req.getParameter("mail_aid"); - if (aid == null){ - throw new ServletModuleExc("An article id must be specified in requests to email an article. Something therefore went badly wrong...."); - } - - String to = req.getParameter("mail_to"); - String from = req.getParameter("mail_from"); - String from_name = req.getParameter("mail_from_name"); - String comment = req.getParameter("mail_comment"); - String mail_language = req.getParameter("mail_language"); - - Map mergeData = new HashMap(); - - if (to == null || from == null || from_name == null|| to.equals("") || from.equals("") || from_name.equals("") || mail_language == null || mail_language.equals("")){ - - for (Enumeration theParams = req.getParameterNames(); theParams.hasMoreElements() ;) { - String pName=(String)theParams.nextElement(); - if (pName.startsWith("mail_")){ - mergeData.put( pName,req.getParameter(pName) ); - } - } - - deliver(req, res, mergeData, null, prepareMailTemplate); - } - else { - //run checks on to and from and mail_language to make sure no monkey business occurring - if (mail_language.indexOf('.') != -1 || mail_language.indexOf('/') != -1 ) { - throw new ServletModuleExc("Invalid language"); - } - if (to.indexOf('\n') != -1 - || to.indexOf('\r') != -1 - || to.indexOf(',') != -1) { - throw new ServletModuleUserExc("email.error.invalidtoaddress", new String[] {to}); - } - if (from.indexOf('\n') != -1 || from.indexOf('\r') != -1 || from.indexOf(',') != -1 ) { - throw new ServletModuleUserExc("email.error.invalidfromaddress", new String[] {from}); - } - - - EntityContent contentEnt; - try{ - contentEnt = (EntityContent)contentModule.getById(aid); - } - catch (Throwable e){ - throw new ServletModuleFailure("Couldn't get content for article "+aid + ": " + e.getMessage(), e); - } - String producerStorageRoot=configuration.getString("Producer.StorageRoot"); - String producerDocRoot=configuration.getString("Producer.DocRoot"); - String publishPath = contentEnt.getValue("publish_path"); - String txtFilePath = producerStorageRoot + producerDocRoot + "/" + mail_language + - publishPath + "/" + aid + ".txt"; - - - File inputFile = new File(txtFilePath); - String content; - - try{ - FileReader in = new FileReader(inputFile); - StringWriter out = new StringWriter(); - int c; - while ((c = in.read()) != -1) - out.write(c); - in.close(); - content= out.toString(); - } - catch (FileNotFoundException e){ - throw new ServletModuleFailure("No text file found in " + txtFilePath, e); - } - catch (IOException e){ - throw new ServletModuleFailure("Problem reading file in " + txtFilePath, e); - } - // add some headers - content = "To: " + to + "\nReply-To: "+ from + "\n" + content; - // put in the comment where it should go - if (comment != null) { - String commentTextToInsert = "\n\nAttached comment from " + from_name + ":\n" + comment; - try { - content=StringRoutines.performRegularExpressionReplacement(content,"!COMMENT!",commentTextToInsert); - } - catch (Throwable e){ - throw new ServletModuleFailure("Problem doing regular expression replacement " + e.toString(), e); - } - } - else{ - try { - content=StringRoutines.performRegularExpressionReplacement(content,"!COMMENT!",""); - } - catch (Throwable e){ - throw new ServletModuleFailure("Problem doing regular expression replacement " + e.toString(), e); - } - } - - SMTPClient client=new SMTPClient(); - try { - int reply; - client.connect(configuration.getString("ServletModule.OpenIndy.SMTPServer")); - - reply = client.getReplyCode(); - - if (!SMTPReply.isPositiveCompletion(reply)) { - client.disconnect(); - throw new ServletModuleExc("SMTP server refused connection."); - } - - client.sendSimpleMessage(configuration.getString("ServletModule.OpenIndy.EmailIsFrom"), to, content); - - client.disconnect(); - //mission accomplished - deliver(req, res, mergeData, null, sentMailTemplate); - } - catch(IOException e) { - if(client.isConnected()) { - try { - client.disconnect(); - } catch(IOException f) { - // do nothing - } - } - throw new ServletModuleFailure(e); - } - } - } - - - - /** - * Method for querying a lucene index - * - * @param req - * @param res - * @throws ServletModuleExc - * @throws ServletModuleUserExc - * @throws ServletModuleFailure - */ - - public void search(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { - try { - final String[] search_variables = { "search_content", "search_boolean", "search_creator", - "search_topic", "search_hasImages", "search_hasAudio", "search_hasVideo", "search_sort", - "search_submit", "search_back", "search_forward" }; - HTTPRequestParser requestParser = new HTTPRequestParser(req); - - int increment=10; - - HttpSession session = req.getSession(false); - - String queryString=""; - - Map mergeData = new HashMap(); - - KeywordSearchTerm dateTerm = new KeywordSearchTerm("date_formatted","search_date","webdb_create_formatted","webdb_create_formatted","webdb_create_formatted"); - UnIndexedSearchTerm whereTerm = new UnIndexedSearchTerm("","","","where","where"); - TextSearchTerm creatorTerm = new TextSearchTerm("creator","search_creator","creator","creator","creator"); - TextSearchTerm titleTerm = new TextSearchTerm("title","search_content","title","title","title"); - TextSearchTerm descriptionTerm = new TextSearchTerm("description","search_content","description","description","description"); - ContentSearchTerm contentTerm = new ContentSearchTerm("content_data","search_content","content","",""); - TopicSearchTerm topicTerm = new TopicSearchTerm(); - ImagesSearchTerm imagesTerm = new ImagesSearchTerm(); - AudioSearchTerm audioTerm = new AudioSearchTerm(); - VideoSearchTerm videoTerm = new VideoSearchTerm(); - MediaSearchTerm mediaTerm = new MediaSearchTerm(); - - //make the query available to subsequent iterations - - Iterator j = Arrays.asList(search_variables).iterator(); - while (j.hasNext()) { - String variable = (String) j.next(); - - mergeData.put(variable, requestParser.getParameter(variable)); - } - - try{ - mergeData.put("topics", topicsModule.getTopicsAsSimpleList()); - } - catch(Throwable e) { - logger.debug("Can't get topics: " + e.toString()); - } - - String searchBackValue = req.getParameter("search_back"); - String searchForwardValue = req.getParameter("search_forward"); - - if (searchBackValue != null){ - int totalHits = ((Integer) session.getAttribute("numberOfHits")).intValue(); - int newPosition=((Integer)session.getAttribute("positionInResults")).intValue()-increment; - if (newPosition<0) - newPosition=0; - if (newPosition >= totalHits) - newPosition=totalHits-1; - session.setAttribute("positionInResults",new Integer(newPosition)); - } - else { - if (searchForwardValue != null){ - int totalHits = ((Integer) session.getAttribute("numberOfHits")).intValue(); - int newPosition=((Integer)session.getAttribute("positionInResults")).intValue()+increment; - if (newPosition<0) - newPosition=0; - if (newPosition >= totalHits) - newPosition=totalHits-1; - - session.setAttribute("positionInResults",new Integer(newPosition)); - } - else { - String indexPath=configuration.getString("IndexPath"); - - - String creatorFragment = creatorTerm.makeTerm(req); - if (creatorFragment != null){ - queryString = queryString + " +" + creatorFragment; - } - - // search title, description, and content for something - // the contentTerm uses param "search_boolean" to combine its terms - String contentFragment = contentTerm.makeTerm(req); - if (contentFragment != null){ - logger.debug("contentFragment: " + contentFragment); - queryString = queryString + " +" + contentFragment; - } - - String topicFragment = topicTerm.makeTerm(req); - if (topicFragment != null){ - queryString = queryString + " +" + topicFragment; - } - - String imagesFragment = imagesTerm.makeTerm(req); - if (imagesFragment != null){ - queryString = queryString + " +" + imagesFragment; - } - - String audioFragment = audioTerm.makeTerm(req); - if (audioFragment != null){ - queryString = queryString + " +" + audioFragment; - } - - String videoFragment = videoTerm.makeTerm(req); - if (videoFragment != null){ - queryString = queryString + " +" + videoFragment; - } - - String mediaFragment = mediaTerm.makeTerm(req); - if (mediaFragment != null){ - queryString = queryString + " +" + mediaFragment; - } - - if (queryString == null || queryString == ""){ - queryString = ""; - } - else{ - try{ - Searcher searcher = null; - try { - searcher = new IndexSearcher(indexPath); - } - catch(IOException e) { - logger.debug("Can't open indexPath: " + indexPath); - throw new ServletModuleExc("Problem with Search Index! : "+ e.toString()); - } - - Query query = null; - try { - query = QueryParser.parse(queryString, "content", new StandardAnalyzer()); - } - catch(Exception e) { - searcher.close(); - logger.debug("Query don't parse: " + queryString); - throw new ServletModuleExc("Problem with Query String! (was '"+queryString+"')"); - } - - Hits hits = null; - try { - hits = searcher.search(query); - } - catch(IOException e) { - searcher.close(); - logger.debug("Can't get hits: " + e.toString()); - throw new ServletModuleExc("Problem getting hits!"); - } - - int start = 0; - int end = hits.length(); - - String sortBy=req.getParameter("search_sort"); - if (sortBy == null || sortBy.equals("")){ - throw new ServletModuleExc("Please let me sort by something!(missing search_sort)"); - } - - // here is where the documents will go for storage across sessions - ArrayList theDocumentsSorted = new ArrayList(); - - if (sortBy.equals("score")){ - for(int i = start; i < end; i++) { - theDocumentsSorted.add(hits.doc(i)); - } - } - else{ - // then we'll sort by date! - Map dateToPosition = new HashMap(end,1.0F); //we know how big it will be - for(int i = start; i < end; i++) { - String creationDate=(hits.doc(i)).get("creationDate"); - // do a little dance in case two contents created at the same second! - if (dateToPosition.containsKey(creationDate)){ - ((ArrayList) (dateToPosition.get(creationDate))).add(new Integer(i)); - } - else{ - ArrayList thePositions = new ArrayList(); - thePositions.add(new Integer(i)); - dateToPosition.put(creationDate,thePositions); - } - } - Set keys = dateToPosition.keySet(); - ArrayList keyList= new ArrayList(keys); - Collections.sort(keyList); - if (sortBy.equals("date_desc")){ - Collections.reverse(keyList); - } - else{ - if (!sortBy.equals("date_asc")){ - throw new ServletModuleExc("don't know how to sort by: "+ sortBy); - } - } - ListIterator keyTraverser = keyList.listIterator(); - while (keyTraverser.hasNext()){ - ArrayList positions = (ArrayList)dateToPosition.get((keyTraverser.next())); - ListIterator positionsTraverser=positions.listIterator(); - while (positionsTraverser.hasNext()){ - theDocumentsSorted.add(hits.doc(((Integer)(positionsTraverser.next())).intValue())); - } - } - } - - try{ - searcher.close(); - } - catch (IOException e){ - logger.debug("Can't close searcher: " + e.toString()); - throw new ServletModuleFailure("Problem closing searcher(normal):" + e.getMessage(), e); - } - - - session.removeAttribute("numberOfHits"); - session.removeAttribute("theDocumentsSorted"); - session.removeAttribute("positionInResults"); - - session.setAttribute("numberOfHits",new Integer(end)); - session.setAttribute("theDocumentsSorted",theDocumentsSorted); - session.setAttribute("positionInResults",new Integer(0)); - - } - catch (IOException e){ - logger.debug("Can't close searcher: " + e.toString()); - throw new ServletModuleFailure("Problem closing searcher: " + e.getMessage(), e); - } - } - } - } - - try { - ArrayList theDocs = (ArrayList)session.getAttribute("theDocumentsSorted"); - if (theDocs != null){ - - mergeData.put("numberOfHits", ((Integer)session.getAttribute("numberOfHits")).toString()); - List theHits = new Vector(); - int pIR=((Integer)session.getAttribute("positionInResults")).intValue(); - int terminus; - int numHits=((Integer)session.getAttribute("numberOfHits")).intValue(); - - if (!(pIR+increment>=numHits)){ - mergeData.put("hasNext","y"); - } - else { - mergeData.put("hasNext", null); - } - if (pIR>0){ - mergeData.put("hasPrevious","y"); - } - else { - mergeData.put("hasPrevious", null); - } - - if ((pIR+increment)>numHits){ - terminus=numHits; - } - else { - terminus=pIR+increment; - } - for(int i = pIR; i < terminus; i++) { - Map h = new HashMap(); - Document theHit = (Document)theDocs.get(i); - whereTerm.returnMeta(h,theHit); - creatorTerm.returnMeta(h,theHit); - titleTerm.returnMeta(h,theHit); - descriptionTerm.returnMeta(h,theHit); - dateTerm.returnMeta(h,theHit); - imagesTerm.returnMeta(h,theHit); - audioTerm.returnMeta(h,theHit); - videoTerm.returnMeta(h,theHit); - theHits.add(h); - } - mergeData.put("hits",theHits); - } - } - catch (Throwable e) { - logger.error("Can't iterate over hits: " + e.toString()); - - throw new ServletModuleFailure("Problem getting hits: " + e.getMessage(), e); - } - - mergeData.put("queryString",queryString); - - deliver(req, res, mergeData, null, searchResultsTemplate); - } - catch (NullPointerException n){ - throw new ServletModuleFailure("Null Pointer: "+n.toString(), n); - } - } - - /* - * Method for dynamically generating a pdf using iText - */ - - - public void getpdf(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { - long starttime=System.currentTimeMillis(); - String ID_REQUEST_PARAM = "id"; - int maxArticlesInNewsleter = 15; // it is nice not to be dos'ed - try { - String idParam = req.getParameter(ID_REQUEST_PARAM); - if (idParam != null) { - - - RE re = new RE("[0-9]+"); - - - REMatch[] idMatches=re.getAllMatches(idParam); - - String cacheSelector=""; - - for (int i = 0; i < idMatches.length; i++){ - cacheSelector= cacheSelector + "," + idMatches[i].toString(); - } - - String cacheType="pdf"; - - CacheKey theCacheKey = new CacheKey(cacheType,cacheSelector); - - byte[] thePDF; - - if (MirGlobal.mruCache().hasObject(theCacheKey)){ - logger.info("fetching pdf from cache"); - thePDF = (byte[]) MirGlobal.mruCache().getObject(theCacheKey); - } - else { - logger.info("generating pdf and caching it"); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - PDFGenerator pdfMaker = new PDFGenerator(out); - - if (idMatches.length > 1){ - pdfMaker.addLine(); - for (int i = 0; i < idMatches.length && i < maxArticlesInNewsleter; i++){ - REMatch aMatch = idMatches[i]; - String id=aMatch.toString(); - EntityContent contentEnt = (EntityContent)contentModule.getById(id); - pdfMaker.addIndexItem(contentEnt); - } - } - - for (int i = 0; i < idMatches.length; i++){ - REMatch aMatch = idMatches[i]; - String id=aMatch.toString(); - EntityContent contentEnt = (EntityContent)contentModule.getById(id); - - pdfMaker.add(contentEnt); - } - - pdfMaker.stop(); - thePDF = out.toByteArray(); - - //and save all our hard work! - MirGlobal.mruCache().storeObject(theCacheKey,thePDF); - } - - res.setContentType("application/pdf"); - res.setContentLength(thePDF.length); - res.getOutputStream().write(thePDF); - res.getOutputStream().flush(); - String elapsedtime=(new Long(System.currentTimeMillis()-starttime)).toString(); - logger.info("pdf retireval took "+elapsedtime + " milliseconds" ); - - } - else { - throw new ServletModuleExc("Missing id."); - } - } - catch (Throwable t) { - logger.error(t.toString()); - throw new ServletModuleFailure(t); - } - - } - - - public String generateOnetimePassword() { - Random r = new Random(); - int random = r.nextInt(); - - long l = System.currentTimeMillis(); - - l = (l * l * l * l) / random; - if (l < 0) - l = l * -1; - - String returnString = "" + l; - - return returnString.substring(5); - } - - public void deliver(HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator) - throws ServletModuleFailure { - try { - deliver(aResponse.getWriter(), aRequest, aResponse, aData, anExtra, aGenerator); - } - catch (Throwable t) { - throw new ServletModuleFailure(t); - } - } - - public void deliver(PrintWriter anOutputWriter, HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator) - throws ServletModuleFailure { - try { - Map responseData = ServletHelper.makeGenerationData(new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}, "bundles.open"); - responseData.put("data", aData); - responseData.put("extra", anExtra); - - - Generator generator = MirGlobal.localizer().generators().makeOpenPostingGeneratorLibrary().makeGenerator(aGenerator); - generator.generate(anOutputWriter, responseData, logger.asPrintWriter(logger.INFO_MESSAGE)); - - anOutputWriter.close(); - } - catch (Throwable e) { - logger.error("Error while generating " + aGenerator + ": " + e.getMessage()); - - throw new ServletModuleFailure(e); - } - } - - public void handleError(HttpServletRequest aRequest, HttpServletResponse aResponse,PrintWriter out, Throwable anException) { - try { - logger.error("error: " + anException); - Map data = new HashMap(); - - data.put("errorstring", anException.getMessage()); - data.put("date", StringUtil.date2readableDateTime(new GregorianCalendar())); - - deliver(out, aRequest, aResponse, data, null, configuration.getString("ServletModule.OpenIndy.ErrorTemplate")); - } - catch (Throwable e) { - throw new ServletModuleFailure(e); - } - } - - public void handleUserError(HttpServletRequest aRequest, HttpServletResponse aResponse, - PrintWriter out, ServletModuleUserExc anException) { - try { - logger.warn("user error: " + anException.getMessage()); - Map data = new HashMap(); - - MessageResources messages = MessageResources.getMessageResources("bundles.open"); - data.put("errorstring", - messages.getMessage(getLocale(aRequest), anException.getMessage(), anException.getParameters()) - ); - data.put("date", StringUtil.date2readableDateTime(new GregorianCalendar())); - - deliver(out, aRequest, aResponse, data, null, configuration.getString("ServletModule.OpenIndy.UserErrorTemplate")); - } - catch (Throwable e) { - throw new ServletModuleFailure(e); - } - } - - private String createOneTimePasswd() { - return ""; - } -} +/* + * Copyright (C) 2001, 2002 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * 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. + */ + +package mircoders.servlet; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Locale; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.Vector; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpUtils; + +import org.apache.commons.net.smtp.SMTPClient; +import org.apache.commons.net.smtp.SMTPReply; +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.queryParser.QueryParser; +import org.apache.lucene.search.Hits; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.Searcher; +import org.apache.struts.util.MessageResources; +import org.apache.commons.fileupload.FileItem; +import gnu.regexp.RE; +import gnu.regexp.REMatch; +import mir.entity.Entity; +import mir.entity.EntityList; +import mir.generator.Generator; +import mir.log.LoggerWrapper; +import mir.misc.FileHandler; +import mir.misc.StringUtil; +import mir.misc.WebdbMultipartRequest; +import mir.servlet.ServletModule; +import mir.servlet.ServletModuleExc; +import mir.servlet.ServletModuleFailure; +import mir.servlet.ServletModuleUserExc; +import mir.session.*; +import mir.session.Request; +import mir.session.Session; +import mir.session.SessionHandler; +import mir.session.SimpleResponse; +import mir.storage.StorageObjectFailure; +import mir.util.ExceptionFunctions; +import mir.util.HTTPParsedRequest; +import mir.util.HTTPRequestParser; +import mir.util.*; +import mircoders.entity.EntityComment; +import mircoders.entity.EntityContent; +import mircoders.global.MirGlobal; +import mircoders.media.*; +import mircoders.media.UnsupportedMediaFormatExc; +import mircoders.module.ModuleComment; +import mircoders.module.ModuleContent; +import mircoders.module.ModuleImages; +import mircoders.module.ModuleTopics; +import mircoders.pdf.PDFGenerator; +import mircoders.search.AudioSearchTerm; +import mircoders.search.ContentSearchTerm; +import mircoders.search.ImagesSearchTerm; +import mircoders.search.KeywordSearchTerm; +import mircoders.search.TextSearchTerm; +import mircoders.search.TopicSearchTerm; +import mircoders.search.UnIndexedSearchTerm; +import mircoders.search.VideoSearchTerm; +import mircoders.storage.DatabaseComment; +import mircoders.storage.DatabaseContent; +import mircoders.storage.DatabaseContentToMedia; +import mircoders.storage.DatabaseContentToTopics; +import mircoders.storage.DatabaseImages; +import mircoders.storage.DatabaseLanguage; +import mircoders.storage.DatabaseTopics; + +/* + * ServletModuleOpenIndy - + * is the open-access-servlet, which is responsible for + * adding comments to articles & + * open-postings to the newswire + * + * @author mir-coders group + * @version $Id: ServletModuleOpenIndy.java,v 1.78 2003/04/21 00:24:06 zapata Exp $ + * + */ + +public class ServletModuleOpenIndy extends ServletModule +{ + + private String commentFormTemplate, commentFormDoneTemplate, commentFormDupeTemplate; + private String postingFormTemplate, postingFormDoneTemplate, postingFormDupeTemplate; + private String searchResultsTemplate; + private String prepareMailTemplate,sentMailTemplate; + private ModuleContent contentModule; + private ModuleComment commentModule; + private ModuleImages imageModule; + private ModuleTopics topicsModule; + private String directOp ="yes"; + // Singelton / Kontruktor + private static ServletModuleOpenIndy instance = new ServletModuleOpenIndy(); + public static ServletModule getInstance() { return instance; } + + private ServletModuleOpenIndy() { + super(); + try { + logger = new LoggerWrapper("ServletModule.OpenIndy"); + + commentFormTemplate = configuration.getString("ServletModule.OpenIndy.CommentTemplate"); + commentFormDoneTemplate = configuration.getString("ServletModule.OpenIndy.CommentDoneTemplate"); + commentFormDupeTemplate = configuration.getString("ServletModule.OpenIndy.CommentDupeTemplate"); + + postingFormTemplate = configuration.getString("ServletModule.OpenIndy.PostingTemplate"); + postingFormDoneTemplate = configuration.getString("ServletModule.OpenIndy.PostingDoneTemplate"); + postingFormDupeTemplate = configuration.getString("ServletModule.OpenIndy.PostingDupeTemplate"); + + searchResultsTemplate = configuration.getString("ServletModule.OpenIndy.SearchResultsTemplate"); + prepareMailTemplate = configuration.getString("ServletModule.OpenIndy.PrepareMailTemplate"); + sentMailTemplate = configuration.getString("ServletModule.OpenIndy.SentMailTemplate"); + directOp = configuration.getString("DirectOpenposting").toLowerCase(); + commentModule = new ModuleComment(DatabaseComment.getInstance()); + mainModule = commentModule; + contentModule = new ModuleContent(DatabaseContent.getInstance()); + topicsModule = new ModuleTopics(DatabaseTopics.getInstance()); + imageModule = new ModuleImages(DatabaseImages.getInstance()); + defaultAction="addposting"; + } + catch (StorageObjectFailure e) { + logger.error("servletmoduleopenindy could not be initialized: " + e.getMessage()); + } + } + + /** + * Method to return an "apology" when open postings are disabled + * + * @param aRequest + * @param aResponse + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure + */ + public void openPostingDisabled(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + deliver(aRequest, aResponse, (Map) null, null, + configuration.getString("ServletModule.OpenIndy.PostingDisabledTemplate")); + } + + /** + * Method for making a comment + */ + + public void addcomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + if (MirGlobal.abuse().getOpenPostingDisabled()) { + openPostingDisabled(req, res); + + return; + } + + String aid = req.getParameter("aid"); // the article id the comment will belong to + + if (aid != null && !aid.equals("")) { + try { + Map mergeData = new HashMap(); + + // onetimepasswd + if (MirGlobal.abuse().getOpenPostingPassword()) { + String passwd = this.createOneTimePasswd(); + HttpSession session = req.getSession(false); + session.setAttribute("passwd", passwd); + mergeData.put("passwd", passwd); + } + else { + mergeData.put("passwd", (String)null); + } + mergeData.put("aid", aid); + + Map extraInfo = new HashMap(); + extraInfo.put("languagePopUpData", DatabaseLanguage.getInstance().getPopupData()); + + deliver(req, res, mergeData, extraInfo, commentFormTemplate); + } + catch (Throwable t) { + throw new ServletModuleFailure("ServletModuleOpenIndy.addcomment: " + t.getMessage(), t); + } + } + else + throw new ServletModuleExc("aid not set!"); + } + + /** + * Method for inserting a comment into the Database and delivering + * the commentDone Page + */ + + public void inscomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + if (MirGlobal.abuse().getOpenPostingDisabled()) { + openPostingDisabled(req, res); + + return; + } + + String aid = req.getParameter("to_media"); // the article id the comment will belong to + if (aid != null && !aid.equals("")) { + // ok, collecting data from form + try { + Map withValues = getIntersectingValues(req, DatabaseComment.getInstance()); + + //no html in comments(for now) + for (Iterator i = withValues.keySet().iterator(); i.hasNext(); ) { + String k = (String) i.next(); + String v = (String) withValues.get(k); + + withValues.put(k, StringUtil.removeHTMLTags(v)); + } + withValues.put("is_published", "1"); + withValues.put("to_comment_status", "1"); + withValues.put("is_html", "0"); + + //checking the onetimepasswd + HttpSession session = req.getSession(false); + String sessionPasswd = (String) session.getAttribute("passwd"); + if (sessionPasswd != null) { + String passwd = req.getParameter("passwd"); + if (passwd == null || passwd.length() == 0) { + throw new ServletModuleUserExc("comment.error.missingpassword", new String[] {}); + } + if (!sessionPasswd.equals(passwd)) { + throw new ServletModuleUserExc("comment.error.invalidpassword", new String[] {}); + } + session.invalidate(); + } + + String id = mainModule.add(withValues); + + SimpleResponse response = new SimpleResponse(); + response.setResponseGenerator(commentFormDoneTemplate); + + if (id == null) { + deliver(req, res, (Map)null, null, commentFormDupeTemplate); + } + else { + DatabaseContent.getInstance().setUnproduced("id=" + aid); + + try { + EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(id); + MirGlobal.localizer().openPostings().afterCommentPosting(comment); + MirGlobal.abuse().checkComment( + comment, new HTTPAdapters.HTTPRequestAdapter(req), res); + } + catch (Throwable t) { + throw new ServletModuleExc(t.getMessage()); + } + } + + // redirecting to url + // should implement back to article + deliver(req, res, response.getResponseValues(), null, response.getResponseGenerator()); + } + catch (Throwable e) { + throw new ServletModuleFailure(e); + } + } + else + throw new ServletModuleExc("aid not set!"); + + } + + /** + * Method for delivering the form-Page for open posting + */ + + public void addposting(HttpServletRequest req, HttpServletResponse res) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure + { + try { + if (MirGlobal.abuse().getOpenPostingDisabled()) { + openPostingDisabled(req, res); + + return; + } + + Map mergeData = new HashMap(); + + // onetimepasswd + if (MirGlobal.abuse().getOpenPostingPassword()) { + String passwd = generateOnetimePassword(); + HttpSession session = req.getSession(false); + session.setAttribute("passwd", passwd); + mergeData.put("passwd", passwd); + } + else { + mergeData.put("passwd", (String)null); + } + + String maxMedia = configuration.getString("ServletModule.OpenIndy.MaxMediaUploadItems"); + String defaultMedia = configuration.getString("ServletModule.OpenIndy.DefaultMediaUploadItems"); + String numOfMedia = req.getParameter("medianum"); + + if (numOfMedia == null || numOfMedia.equals("")) { + numOfMedia = defaultMedia; + } + else if (Integer.parseInt(numOfMedia) > Integer.parseInt(maxMedia)) { + numOfMedia = maxMedia; + } + + int mediaNum = Integer.parseInt(numOfMedia); + List mediaFields = new Vector(); + for (int i = 0; i < mediaNum; i++) { + Integer mNum = new Integer(i + 1); + mediaFields.add(mNum.toString()); + } + mergeData.put("medianum", numOfMedia); + mergeData.put("mediafields", mediaFields); + mergeData.put("to_topic", null); + + Map extraInfo = new HashMap(); + extraInfo.put("languagePopUpData", DatabaseLanguage.getInstance().getPopupData()); + extraInfo.put("themenPopupData", topicsModule.getTopicsAsSimpleList()); + + extraInfo.put("topics", topicsModule.getTopicsList()); + deliver(req, res, mergeData, extraInfo, postingFormTemplate); + } + catch (Throwable t) { + throw new ServletModuleFailure(t); + } + } + + /** + * Method for inserting an open posting into the Database and delivering + * the postingDone Page + */ + + public void insposting(HttpServletRequest aRequest, HttpServletResponse aResponse) throws + ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + if (MirGlobal.abuse().getOpenPostingDisabled()) { + openPostingDisabled(aRequest, aResponse); + + return; + } + + try { + HTTPParsedRequest parsedRequest = new HTTPParsedRequest( + aRequest, + configuration.getString("Mir.DefaultEncoding"), + configuration.getInt("MaxMediaUploadSize"), + configuration.getString("TempDir")); + + Map mergeData = new HashMap(); + + HttpSession session = aRequest.getSession(false); + String sessionPasswd = (String) session.getAttribute("passwd"); + if (sessionPasswd != null) { + String passwd = (String) parsedRequest.getParameter("passwd"); + + if (passwd == null || passwd.length() == 0) { + throw new ServletModuleUserExc("posting.error.missingpassword", new String[] {}); + } + if (!sessionPasswd.equals(passwd)) { + throw new ServletModuleUserExc("posting.error.invalidpassword", new String[] {}); + } + session.invalidate(); + } + + if ((((String) parsedRequest.getParameter("title")).length() == 0) || + (((String) parsedRequest.getParameter("description")).length() == 0) || + (((String) parsedRequest.getParameter("content_data")).length() == 0)) + throw new ServletModuleUserExc("posting.error.missingfield", new String[] {}); + + List mediaList = new Vector(); + Iterator i = parsedRequest.getFiles().iterator(); + + while (i.hasNext()) { + UploadedFile file = new mir.session.CommonsUploadedFileAdapter((FileItem) i.next()); + Map mediaValues = new HashMap(); + + String suffix = file.getFieldName().substring(5); // media${m} + logger.debug("media_title" + suffix); + String title = parsedRequest.getParameter("media_title" + suffix); + + mediaValues.put("title", StringUtil.removeHTMLTags(title)); + mediaValues.put("creator", StringUtil.removeHTMLTags(parsedRequest.getParameter("creator"))); + + mediaList.add(MediaUploadProcessor.processMediaUpload(file, mediaValues)); + } + + Map withValues = new HashMap(); + i = DatabaseContent.getInstance().getFields().iterator(); + while (i.hasNext()) { + String field = (String) i.next(); + String value = parsedRequest.getParameter(field); + if (value!=null) + withValues.put(field, value); + } + + + for (i = withValues.keySet().iterator(); i.hasNext(); ) { + String k = (String) i.next(); + String v = (String) withValues.get(k); + + if (k.equals("content_data")) { + //this doesn't quite work yet, so for now, all html goes + //withValues.put(k,StringUtil.approveHTMLTags(v)); + withValues.put(k, StringUtil.deleteForbiddenTags(v)); + } + else if (k.equals("description")) { + String tmp = StringUtil.deleteForbiddenTags(v); + withValues.put(k, StringUtil.deleteHTMLTableTags(tmp)); + } + else { + withValues.put(k, StringUtil.removeHTMLTags(v)); + } + } + + withValues.put("date", StringUtil.date2webdbDate(new GregorianCalendar())); + withValues.put("publish_path", + StringUtil.webdbDate2path( (String) withValues.get("date"))); + withValues.put("is_produced", "0"); + withValues.put("is_published", "1"); + if (directOp.equals("yes")) + withValues.put("to_article_type", "1"); + + withValues.put("to_publisher", "1"); + + // inserting content into database + String cid = contentModule.add(withValues); + logger.debug("id: " + cid); + //insert was not successfull + if (cid == null) { + deliver(aRequest, aResponse, mergeData, null, postingFormDupeTemplate); + return; + } + + List topics = parsedRequest.getParameterList("to_topic"); + if (topics.size() > 0) { + try { + DatabaseContentToTopics.getInstance().setTopics(cid, topics); + } + catch (Throwable e) { + logger.error("setting content_x_topic failed"); + contentModule.deleteById(cid); + throw new ServletModuleFailure( + "smod - openindy :: insposting: setting content_x_topic failed: " + + e.toString(), e); + } + } + + i = mediaList.iterator(); + while (i.hasNext()) { + Entity mediaEnt = (Entity) i.next(); + DatabaseContentToMedia.getInstance().addMedia(cid, mediaEnt.getId()); + } + + EntityContent article = (EntityContent) contentModule.getById(cid); + try { + MirGlobal.abuse().checkArticle(article, aRequest, aResponse); + MirGlobal.localizer().openPostings().afterContentPosting(article); + } + catch (Throwable t) { + logger.error("Error while post-processing article: " + t.getMessage()); + } + deliver(aRequest, aResponse, mergeData, null, postingFormDoneTemplate); + } + catch (Throwable e) { + e.printStackTrace(logger.asPrintWriter(logger.DEBUG_MESSAGE)); + Throwable cause = ExceptionFunctions.traceCauseException(e); + + if (cause instanceof UnsupportedMediaFormatExc) { + throw new ServletModuleUserExc("media.unsupportedformat", new String[] {}); + } + throw new ServletModuleFailure(e); + } + } + + /** + * Due to a serious shortcoming of Tomcat 3.3, an extra sessionid parameter is + * generated into open session urls. Tomcat 3.3 makes it impossible to + * distinguish between sessions that are identified using a url and those + * that are identified using cookies: if both a sessionid cookie and a sessionid + * url are available, tomcat 3.3 pretends the url wasn't there... + */ + private static final String SESSION_REQUEST_KEY="sessionid"; + + /** + * Dispatch method for open sessions: a flexible extensible and customizable way + * for open access. Can be used for postings, but also for lots of other stuff. + * + * @param aRequest + * @param aResponse + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure + */ + + public void opensession(HttpServletRequest aRequest, HttpServletResponse aResponse) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + + try { + Request request = new HTTPAdapters.HTTPParsedRequestAdapter(new HTTPParsedRequest(aRequest, 1000000, "/tmp")); + + if (aRequest.isRequestedSessionIdValid() && !aRequest.isRequestedSessionIdFromURL() && + !aRequest.getRequestedSessionId().equals(aRequest.getParameter(SESSION_REQUEST_KEY))) + aRequest.getSession().invalidate(); + + Session session = new HTTPAdapters.HTTPSessionAdapter(aRequest.getSession()); + + SimpleResponse response = new SimpleResponse( + ServletHelper.makeGenerationData(new Locale[] {getLocale(aRequest), getFallbackLocale(aRequest)}, + "bundles.open")); + + response.setResponseValue("actionURL", aResponse.encodeURL(HttpUtils.getRequestURL(aRequest).toString())+"?"+SESSION_REQUEST_KEY+"="+aRequest.getSession().getId()); + + SessionHandler handler = MirGlobal.localizer().openPostings().getOpenSessionHandler(request, session); + + handler.processRequest(request, session, response); + ServletHelper.generateOpenPostingResponse(aResponse.getWriter(), response.getResponseValues(), response.getResponseGenerator()); + } + catch (Throwable t) { + logger.error(t.toString()); + t.printStackTrace(logger.asPrintWriter(logger.DEBUG_MESSAGE)); + + throw new ServletModuleFailure(t); + } + } + + /** + * Method for preparing and sending a content as an email message + */ + + public void mail(HttpServletRequest req, HttpServletResponse res) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure + { + String aid = req.getParameter("mail_aid"); + if (aid == null){ + throw new ServletModuleExc("An article id must be specified in requests to email an article. Something therefore went badly wrong...."); + } + + String to = req.getParameter("mail_to"); + String from = req.getParameter("mail_from"); + String from_name = req.getParameter("mail_from_name"); + String comment = req.getParameter("mail_comment"); + String mail_language = req.getParameter("mail_language"); + + Map mergeData = new HashMap(); + + if (to == null || from == null || from_name == null|| to.equals("") || from.equals("") || from_name.equals("") || mail_language == null || mail_language.equals("")){ + + for (Enumeration theParams = req.getParameterNames(); theParams.hasMoreElements() ;) { + String pName=(String)theParams.nextElement(); + if (pName.startsWith("mail_")){ + mergeData.put( pName,req.getParameter(pName) ); + } + } + + deliver(req, res, mergeData, null, prepareMailTemplate); + } + else { + //run checks on to and from and mail_language to make sure no monkey business occurring + if (mail_language.indexOf('.') != -1 || mail_language.indexOf('/') != -1 ) { + throw new ServletModuleExc("Invalid language"); + } + if (to.indexOf('\n') != -1 + || to.indexOf('\r') != -1 + || to.indexOf(',') != -1) { + throw new ServletModuleUserExc("email.error.invalidtoaddress", new String[] {to}); + } + if (from.indexOf('\n') != -1 || from.indexOf('\r') != -1 || from.indexOf(',') != -1 ) { + throw new ServletModuleUserExc("email.error.invalidfromaddress", new String[] {from}); + } + + + EntityContent contentEnt; + try{ + contentEnt = (EntityContent)contentModule.getById(aid); + } + catch (Throwable e){ + throw new ServletModuleFailure("Couldn't get content for article "+aid + ": " + e.getMessage(), e); + } + String producerStorageRoot=configuration.getString("Producer.StorageRoot"); + String producerDocRoot=configuration.getString("Producer.DocRoot"); + String publishPath = contentEnt.getValue("publish_path"); + String txtFilePath = producerStorageRoot + producerDocRoot + "/" + mail_language + + publishPath + "/" + aid + ".txt"; + + + File inputFile = new File(txtFilePath); + String content; + + try{ + FileReader in = new FileReader(inputFile); + StringWriter out = new StringWriter(); + int c; + while ((c = in.read()) != -1) + out.write(c); + in.close(); + content= out.toString(); + } + catch (FileNotFoundException e){ + throw new ServletModuleFailure("No text file found in " + txtFilePath, e); + } + catch (IOException e){ + throw new ServletModuleFailure("Problem reading file in " + txtFilePath, e); + } + // add some headers + content = "To: " + to + "\nReply-To: "+ from + "\n" + content; + // put in the comment where it should go + if (comment != null) { + String commentTextToInsert = "\n\nAttached comment from " + from_name + ":\n" + comment; + try { + content=StringRoutines.performRegularExpressionReplacement(content,"!COMMENT!",commentTextToInsert); + } + catch (Throwable e){ + throw new ServletModuleFailure("Problem doing regular expression replacement " + e.toString(), e); + } + } + else{ + try { + content=StringRoutines.performRegularExpressionReplacement(content,"!COMMENT!",""); + } + catch (Throwable e){ + throw new ServletModuleFailure("Problem doing regular expression replacement " + e.toString(), e); + } + } + + SMTPClient client=new SMTPClient(); + try { + int reply; + client.connect(configuration.getString("ServletModule.OpenIndy.SMTPServer")); + + reply = client.getReplyCode(); + + if (!SMTPReply.isPositiveCompletion(reply)) { + client.disconnect(); + throw new ServletModuleExc("SMTP server refused connection."); + } + + client.sendSimpleMessage(configuration.getString("ServletModule.OpenIndy.EmailIsFrom"), to, content); + + client.disconnect(); + //mission accomplished + deliver(req, res, mergeData, null, sentMailTemplate); + } + catch(IOException e) { + if(client.isConnected()) { + try { + client.disconnect(); + } catch(IOException f) { + // do nothing + } + } + throw new ServletModuleFailure(e); + } + } + } + + + + + /** + * Method for querying a lucene index + * + * @param req + * @param res + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure + */ + + public void search(HttpServletRequest req, HttpServletResponse res) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + try { + final String[] search_variables = { "search_content", "search_boolean", "search_creator", + "search_topic", "search_hasImages", "search_hasAudio", "search_hasVideo", "search_sort", + "search_submit", "search_back", "search_forward" }; + HTTPRequestParser requestParser = new HTTPRequestParser(req); + + int increment=10; + + HttpSession session = req.getSession(false); + + String queryString=""; + + Map mergeData = new HashMap(); + + KeywordSearchTerm dateTerm = new KeywordSearchTerm("date_formatted","search_date","webdb_create_formatted","webdb_create_formatted","webdb_create_formatted"); + UnIndexedSearchTerm whereTerm = new UnIndexedSearchTerm("","","","where","where"); + TextSearchTerm creatorTerm = new TextSearchTerm("creator","search_creator","creator","creator","creator"); + TextSearchTerm titleTerm = new TextSearchTerm("title","search_content","title","title","title"); + TextSearchTerm descriptionTerm = new TextSearchTerm("description","search_content","description","description","description"); + ContentSearchTerm contentTerm = new ContentSearchTerm("content_data","search_content","content","",""); + TopicSearchTerm topicTerm = new TopicSearchTerm(); + ImagesSearchTerm imagesTerm = new ImagesSearchTerm(); + AudioSearchTerm audioTerm = new AudioSearchTerm(); + VideoSearchTerm videoTerm = new VideoSearchTerm(); + + //make the query available to subsequent iterations + + Iterator j = Arrays.asList(search_variables).iterator(); + while (j.hasNext()) { + String variable = (String) j.next(); + + mergeData.put(variable, requestParser.getParameter(variable)); + } + + try{ + mergeData.put("topics", topicsModule.getTopicsAsSimpleList()); + } + catch(Throwable e) { + logger.debug("Can't get topics: " + e.toString()); + } + + String searchBackValue = req.getParameter("search_back"); + String searchForwardValue = req.getParameter("search_forward"); + + if (searchBackValue != null){ + int totalHits = ((Integer) session.getAttribute("numberOfHits")).intValue(); + int newPosition=((Integer)session.getAttribute("positionInResults")).intValue()-increment; + if (newPosition<0) + newPosition=0; + if (newPosition >= totalHits) + newPosition=totalHits-1; + session.setAttribute("positionInResults",new Integer(newPosition)); + } + else { + if (searchForwardValue != null){ + int totalHits = ((Integer) session.getAttribute("numberOfHits")).intValue(); + int newPosition=((Integer)session.getAttribute("positionInResults")).intValue()+increment; + if (newPosition<0) + newPosition=0; + if (newPosition >= totalHits) + newPosition=totalHits-1; + + session.setAttribute("positionInResults",new Integer(newPosition)); + } + else { + String indexPath=configuration.getString("IndexPath"); + + + String creatorFragment = creatorTerm.makeTerm(req); + if (creatorFragment != null){ + queryString = queryString + " +" + creatorFragment; + } + + // search title, description, and content for something + // the contentTerm uses param "search_boolean" to combine its terms + String contentFragment = contentTerm.makeTerm(req); + if (contentFragment != null){ + logger.debug("contentFragment: " + contentFragment); + queryString = queryString + " +" + contentFragment; + } + + String topicFragment = topicTerm.makeTerm(req); + if (topicFragment != null){ + queryString = queryString + " +" + topicFragment; + } + + String imagesFragment = imagesTerm.makeTerm(req); + if (imagesFragment != null){ + queryString = queryString + " +" + imagesFragment; + } + + String audioFragment = audioTerm.makeTerm(req); + if (audioFragment != null){ + queryString = queryString + " +" + audioFragment; + } + + String videoFragment = videoTerm.makeTerm(req); + if (videoFragment != null){ + queryString = queryString + " +" + videoFragment; + } + + if (queryString == null || queryString == ""){ + queryString = ""; + } + else{ + try{ + Searcher searcher = null; + try { + searcher = new IndexSearcher(indexPath); + } + catch(IOException e) { + logger.debug("Can't open indexPath: " + indexPath); + throw new ServletModuleExc("Problem with Search Index! : "+ e.toString()); + } + + Query query = null; + try { + query = QueryParser.parse(queryString, "content", new StandardAnalyzer()); + } + catch(Exception e) { + searcher.close(); + logger.debug("Query don't parse: " + queryString); + throw new ServletModuleExc("Problem with Query String! (was '"+queryString+"')"); + } + + Hits hits = null; + try { + hits = searcher.search(query); + } + catch(IOException e) { + searcher.close(); + logger.debug("Can't get hits: " + e.toString()); + throw new ServletModuleExc("Problem getting hits!"); + } + + int start = 0; + int end = hits.length(); + + String sortBy=req.getParameter("search_sort"); + if (sortBy == null || sortBy.equals("")){ + throw new ServletModuleExc("Please let me sort by something!(missing search_sort)"); + } + + // here is where the documents will go for storage across sessions + ArrayList theDocumentsSorted = new ArrayList(); + + if (sortBy.equals("score")){ + for(int i = start; i < end; i++) { + theDocumentsSorted.add(hits.doc(i)); + } + } + else{ + // then we'll sort by date! + Map dateToPosition = new HashMap(end,1.0F); //we know how big it will be + for(int i = start; i < end; i++) { + String creationDate=(hits.doc(i)).get("creationDate"); + // do a little dance in case two contents created at the same second! + if (dateToPosition.containsKey(creationDate)){ + ((ArrayList) (dateToPosition.get(creationDate))).add(new Integer(i)); + } + else{ + ArrayList thePositions = new ArrayList(); + thePositions.add(new Integer(i)); + dateToPosition.put(creationDate,thePositions); + } + } + Set keys = dateToPosition.keySet(); + ArrayList keyList= new ArrayList(keys); + Collections.sort(keyList); + if (sortBy.equals("date_desc")){ + Collections.reverse(keyList); + } + else{ + if (!sortBy.equals("date_asc")){ + throw new ServletModuleExc("don't know how to sort by: "+ sortBy); + } + } + ListIterator keyTraverser = keyList.listIterator(); + while (keyTraverser.hasNext()){ + ArrayList positions = (ArrayList)dateToPosition.get((keyTraverser.next())); + ListIterator positionsTraverser=positions.listIterator(); + while (positionsTraverser.hasNext()){ + theDocumentsSorted.add(hits.doc(((Integer)(positionsTraverser.next())).intValue())); + } + } + } + + try{ + searcher.close(); + } + catch (IOException e){ + logger.debug("Can't close searcher: " + e.toString()); + throw new ServletModuleFailure("Problem closing searcher(normal):" + e.getMessage(), e); + } + + + session.removeAttribute("numberOfHits"); + session.removeAttribute("theDocumentsSorted"); + session.removeAttribute("positionInResults"); + + session.setAttribute("numberOfHits",new Integer(end)); + session.setAttribute("theDocumentsSorted",theDocumentsSorted); + session.setAttribute("positionInResults",new Integer(0)); + + } + catch (IOException e){ + logger.debug("Can't close searcher: " + e.toString()); + throw new ServletModuleFailure("Problem closing searcher: " + e.getMessage(), e); + } + } + } + } + + try { + ArrayList theDocs = (ArrayList)session.getAttribute("theDocumentsSorted"); + if (theDocs != null){ + + mergeData.put("numberOfHits", ((Integer)session.getAttribute("numberOfHits")).toString()); + List theHits = new Vector(); + int pIR=((Integer)session.getAttribute("positionInResults")).intValue(); + int terminus; + int numHits=((Integer)session.getAttribute("numberOfHits")).intValue(); + + if (!(pIR+increment>=numHits)){ + mergeData.put("hasNext","y"); + } + else { + mergeData.put("hasNext", null); + } + if (pIR>0){ + mergeData.put("hasPrevious","y"); + } + else { + mergeData.put("hasPrevious", null); + } + + if ((pIR+increment)>numHits){ + terminus=numHits; + } + else { + terminus=pIR+increment; + } + for(int i = pIR; i < terminus; i++) { + Map h = new HashMap(); + Document theHit = (Document)theDocs.get(i); + whereTerm.returnMeta(h,theHit); + creatorTerm.returnMeta(h,theHit); + titleTerm.returnMeta(h,theHit); + descriptionTerm.returnMeta(h,theHit); + dateTerm.returnMeta(h,theHit); + imagesTerm.returnMeta(h,theHit); + audioTerm.returnMeta(h,theHit); + videoTerm.returnMeta(h,theHit); + theHits.add(h); + } + mergeData.put("hits",theHits); + } + } + catch (Throwable e) { + logger.error("Can't iterate over hits: " + e.toString()); + + throw new ServletModuleFailure("Problem getting hits: " + e.getMessage(), e); + } + + mergeData.put("queryString",queryString); + + deliver(req, res, mergeData, null, searchResultsTemplate); + } + catch (NullPointerException n){ + throw new ServletModuleFailure("Null Pointer: "+n.toString(), n); + } + } + + /* + * Method for dynamically generating a pdf using iText + */ + + + public void getpdf(HttpServletRequest req, HttpServletResponse res) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + String ID_REQUEST_PARAM = "id"; + try { + String idParam = req.getParameter(ID_REQUEST_PARAM); + if (idParam != null) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PDFGenerator pdfMaker = new PDFGenerator(out); + + RE re = new RE("[0-9]+"); + + + REMatch[] idMatches=re.getAllMatches(idParam); + + if (idMatches.length > 1){ + pdfMaker.addLine(); + for (int i = 0; i < idMatches.length; i++){ + REMatch aMatch = idMatches[i]; + String id=aMatch.toString(); + EntityContent contentEnt = (EntityContent)contentModule.getById(id); + pdfMaker.addIndexItem(contentEnt); + + } + } + + for (int i = 0; i < idMatches.length; i++){ + REMatch aMatch = idMatches[i]; + + String id=aMatch.toString(); + + EntityContent contentEnt = (EntityContent)contentModule.getById(id); + pdfMaker.add(contentEnt); + + } + + pdfMaker.stop(); + res.setContentType("application/pdf"); + byte[] content = out.toByteArray(); + res.setContentLength(content.length); + res.getOutputStream().write(content); + res.getOutputStream().flush(); + + } + else { + throw new ServletModuleExc("Missing id."); + } + } + catch (Throwable t) { + logger.error(t.toString()); + throw new ServletModuleFailure(t); + } + + } + public String generateOnetimePassword() { + Random r = new Random(); + int random = r.nextInt(); + + long l = System.currentTimeMillis(); + + l = (l * l * l * l) / random; + if (l < 0) + l = l * -1; + + String returnString = "" + l; + + return returnString.substring(5); + } + + public void deliver(HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator) + throws ServletModuleFailure { + try { + deliver(aResponse.getWriter(), aRequest, aResponse, aData, anExtra, aGenerator); + } + catch (Throwable t) { + throw new ServletModuleFailure(t); + } + } + + public void deliver(PrintWriter anOutputWriter, HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator) + throws ServletModuleFailure { + try { + Map responseData = ServletHelper.makeGenerationData(new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}, "bundles.open"); + responseData.put("data", aData); + responseData.put("extra", anExtra); + + + Generator generator = MirGlobal.localizer().generators().makeOpenPostingGeneratorLibrary().makeGenerator(aGenerator); + generator.generate(anOutputWriter, responseData, logger); + + anOutputWriter.close(); + } + catch (Throwable e) { + logger.error("Error while generating " + aGenerator + ": " + e.getMessage()); + + throw new ServletModuleFailure(e); + } + } + + public void handleError(HttpServletRequest aRequest, HttpServletResponse aResponse,PrintWriter out, Throwable anException) { + try { + logger.error("error: " + anException); + Map data = new HashMap(); + + data.put("errorstring", anException.getMessage()); + data.put("date", StringUtil.date2readableDateTime(new GregorianCalendar())); + + deliver(out, aRequest, aResponse, data, null, configuration.getString("ServletModule.OpenIndy.ErrorTemplate")); + } + catch (Throwable e) { + throw new ServletModuleFailure(e); + } + } + + public void handleUserError(HttpServletRequest aRequest, HttpServletResponse aResponse, + PrintWriter out, ServletModuleUserExc anException) { + try { + logger.warn("user error: " + anException.getMessage()); + Map data = new HashMap(); + + MessageResources messages = MessageResources.getMessageResources("bundles.open"); + data.put("errorstring", + messages.getMessage(getLocale(aRequest), anException.getMessage(), anException.getParameters()) + ); + data.put("date", StringUtil.date2readableDateTime(new GregorianCalendar())); + + deliver(out, aRequest, aResponse, data, null, configuration.getString("ServletModule.OpenIndy.UserErrorTemplate")); + } + catch (Throwable e) { + throw new ServletModuleFailure(e); + } + } + + private String createOneTimePasswd() { + return ""; + } +} diff --git a/source/mircoders/servlet/ServletModuleProducer.java b/source/mircoders/servlet/ServletModuleProducer.java index c3d41ebf..79562459 100755 --- a/source/mircoders/servlet/ServletModuleProducer.java +++ b/source/mircoders/servlet/ServletModuleProducer.java @@ -69,7 +69,7 @@ public class ServletModuleProducer extends ServletModule generator = MirGlobal.localizer().generators().makeAdminGeneratorLibrary().makeGenerator(aGeneratorIdentifier); MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(aResponseData); aResponseData.put( "lang", new ResourceBundleGeneratorFunction( aLocale, MessageResources.getMessageResources("bundles.admin"))); - generator.generate(aWriter, aResponseData, new PrintWriter(new NullWriter())); + generator.generate(aWriter, aResponseData, logger); } catch (Throwable t) { throw new ServletModuleFailure(t); @@ -135,7 +135,7 @@ public class ServletModuleProducer extends ServletModule generationData.put("producers", producersData); generationData.put("queue", MirGlobal.producerEngine().getQueueStatus()); - generator.generate(aResponse.getWriter(), generationData, new PrintWriter(new NullWriter())); + generator.generate(aResponse.getWriter(), generationData, logger); } catch (Throwable t) { throw new ServletModuleFailure(t); diff --git a/source/mircoders/storage/DatabaseContentToTopics.java b/source/mircoders/storage/DatabaseContentToTopics.java index 9bf65600..fbf46e22 100755 --- a/source/mircoders/storage/DatabaseContentToTopics.java +++ b/source/mircoders/storage/DatabaseContentToTopics.java @@ -35,8 +35,10 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; -import java.util.Collection; +import java.util.Arrays; import java.util.Iterator; +import java.util.List; +import java.util.Vector; import mir.entity.EntityList; import mir.log.LoggerWrapper; @@ -104,7 +106,7 @@ public class DatabaseContentToTopics extends Database implements StorageObject{ * Returns a ArrayList of Integer-Objects from a content-id. * @returns ArrayList */ - public ArrayList getTopicsOfContent(String contentId) + public List getTopicsOfContent(String contentId) throws StorageObjectFailure { ArrayList returnList = new ArrayList(); @@ -132,104 +134,95 @@ public class DatabaseContentToTopics extends Database implements StorageObject{ return returnList; } - /** - * Set new topics - */ - public void setTopics(String contentId, String[] topicId) - throws StorageObjectFailure { - if (contentId == null){ - return; + private String getIdListExpression(List aList) { + String result = ""; + + Iterator i = aList.iterator(); + + while (i.hasNext()) { + result = result + i.next().toString(); + if (i.hasNext()) + result = result + ", "; } - if (topicId==null || topicId[0]==null) { - return; + return result; + } + + public void setTopics(String anArticleId, String [] aTopics) throws StorageObjectFailure { + if (aTopics==null) + setTopics(anArticleId, (List) null); + else + setTopics(anArticleId, Arrays.asList(aTopics)); + } + + public void setTopics(String anArticleId, List aTopics) throws StorageObjectFailure { + List newTopics = new Vector(); + if (aTopics!=null) { + Iterator i = aTopics.iterator(); + + while (i.hasNext()) { + newTopics.add(new Integer(Integer.parseInt((String) i.next()))); + } } - //first check which topics this article has - Collection hasTopics = getTopicsOfContent(contentId); - Collection toSet = new ArrayList(); - Collection toDelete = new ArrayList(); - - if(hasTopics!=null && hasTopics.size()>0){ - //now we check if there are new topics and copy them to an array. - for(int i = 0; i< topicId.length;i++){ - boolean set=false; - int whichTopic = 0; - for(Iterator it=hasTopics.iterator();it.hasNext();){ - Integer topic = (Integer)it.next(); - if(topicId[i].equals(topic.toString())){ - set=true; - } else { - whichTopic = i; - } - } - if(set==false){ - toSet.add(topicId[i]); - logger.debug("to set: "+ topicId[i]); - } + + List currentTopics = getTopicsOfContent(anArticleId); + logger.debug("New topics = " + newTopics.toString()); + logger.debug("Current topics = " + currentTopics.toString()); + List topicsToDelete = new Vector(currentTopics); + topicsToDelete.removeAll(newTopics); + List topicsToAdd = new Vector(newTopics); + topicsToAdd.removeAll(currentTopics); + logger.debug("to delete = " + topicsToDelete.toString()); + logger.debug("to add = " + topicsToAdd.toString()); + + + if (!topicsToDelete.isEmpty()) { + String sql = + "delete from " + theTable + " " + + "where content_id=" + anArticleId + + " and topic_id in (" + getIdListExpression(topicsToDelete) + ")"; + + Connection connection=null; + Statement statement=null; + try { + connection = getPooledCon(); + statement = connection.createStatement(); + int rs = executeUpdate(statement, sql); } - //now we check if we have to delete topics - for(Iterator it=hasTopics.iterator();it.hasNext();){ - boolean delete=true; - int whichTopic = 0; - Integer topic = (Integer)it.next(); - for(int i = 0; i< topicId.length;i++){ - if(topicId[i].equals(topic.toString())){ - delete=false; - } else { - whichTopic = i; - } + catch (Exception e) { + logger.error("-- deleting topics failed"); + } + finally { + try { + freeConnection(connection, statement); } - if(delete==true){ - toDelete.add(topic.toString()); - logger.debug("to delete: "+ topic.toString()); + catch (Throwable t) { } } - } else { - //all the topics has to be set, so we copy all to the array - for (int i = 0; i < topicId.length; i++){ - toSet.add(topicId[i]); - } - } - - //first delete all row with content_id=contentId - String sql = "delete from "+ theTable +" where content_id=" + contentId - + " and topic_id in ("; - boolean first=false; - for(Iterator it = toDelete.iterator(); it.hasNext();){ - if(first==false){ - first=true; - } else { - sql+=","; - } - sql+= (String)it.next(); - } - sql+=")"; - Connection con=null;Statement stmt=null; - try { - con = getPooledCon(); - // should be a preparedStatement because is faster - stmt = con.createStatement(); - int rs = executeUpdate(stmt,sql); - } catch (Exception e) { - logger.error("-- deleting topics failed"); - } finally { - freeConnection(con,stmt); } - //now insert - //first delete all row with content_id=contentId - for (Iterator it = toSet.iterator(); it.hasNext();) { - sql = "insert into "+ theTable +" (content_id,topic_id) values (" - + contentId + "," + (String)it.next() + ")"; + Iterator i = topicsToAdd.iterator(); + while (i.hasNext()) { + Integer topicId = (Integer) i.next(); + String sql = + "insert into " + theTable + " (content_id, topic_id) "+ + "values (" + anArticleId + "," + topicId + ")"; + Connection connection=null; + Statement statement=null; try { - con = getPooledCon(); + connection = getPooledCon(); // should be a preparedStatement because is faster - stmt = con.createStatement(); - int rs = executeUpdate(stmt,sql); + statement = connection.createStatement(); + int rs = executeUpdate(statement, sql); } catch (Exception e) { - logger.error("-- set topics failed -- insert laenge topicId" + topicId.length); - } finally { - freeConnection(con,stmt); + logger.error("-- adding topics failed"); + } + finally { + try { + freeConnection(connection, statement); + } + catch (Throwable t) { + } } } }