X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fservlet%2FServletModuleOpenIndy.java;h=ea91bf08028a0b3e2c3f5b84f56d91db31f702e4;hb=22a2f276fcc3efb4ae0e2bda7621e607df315129;hp=b37a46f1417794f2cb71b0126774d7969cfd1e76;hpb=8b4d9fadd2d25d8e80785d643d3b397e8797b92d;p=mir.git diff --git a/source/mircoders/servlet/ServletModuleOpenIndy.java b/source/mircoders/servlet/ServletModuleOpenIndy.java index b37a46f1..ea91bf08 100755 --- a/source/mircoders/servlet/ServletModuleOpenIndy.java +++ b/source/mircoders/servlet/ServletModuleOpenIndy.java @@ -11,7 +11,7 @@ * 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. + * GNU General Public License for more details.f * * You should have received a copy of the GNU General Public License * along with Mir; if not, write to the Free Software @@ -30,46 +30,9 @@ 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.fileupload.FileItem; -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 gnu.regexp.RE; import gnu.regexp.REMatch; - +import mir.bundle.Bundle; import mir.entity.Entity; import mir.generator.Generator; import mir.log.LoggerWrapper; @@ -78,42 +41,37 @@ import mir.servlet.ServletModule; import mir.servlet.ServletModuleExc; import mir.servlet.ServletModuleFailure; import mir.servlet.ServletModuleUserExc; -import mir.session.HTTPAdapters; -import mir.session.Request; -import mir.session.Session; -import mir.session.SessionHandler; -import mir.session.SimpleResponse; -import mir.session.UploadedFile; -import mir.storage.StorageObjectFailure; -import mir.util.ExceptionFunctions; -import mir.util.HTTPParsedRequest; -import mir.util.HTTPRequestParser; -import mir.util.StringRoutines; +import mir.session.*; +import mir.storage.DatabaseFailure; +import mir.util.*; import mircoders.entity.EntityComment; import mircoders.entity.EntityContent; +import mircoders.global.CacheKey; import mircoders.global.MirGlobal; import mircoders.media.MediaUploadProcessor; +import mircoders.media.UnsupportedMediaTypeExc; import mircoders.module.ModuleComment; import mircoders.module.ModuleContent; -import mircoders.module.ModuleImages; -import mircoders.module.ModuleMediaType; -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; +import mircoders.search.*; +import mircoders.storage.*; +import org.apache.commons.fileupload.FileItem; +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.lucene.store.FSDirectory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.*; +import java.util.*; /* * ServletModuleOpenIndy - @@ -122,7 +80,7 @@ import mircoders.storage.DatabaseTopics; * open-postings to the newswire * * @author mir-coders group - * @version $Id: ServletModuleOpenIndy.java,v 1.82 2003/04/26 01:28:54 zapata Exp $ + * @version $Id: ServletModuleOpenIndy.java,v 1.89.2.18 2005/08/21 17:09:24 zapata Exp $ * */ @@ -132,15 +90,15 @@ public class ServletModuleOpenIndy extends ServletModule private String commentFormTemplate, commentFormDoneTemplate, commentFormDupeTemplate; private String postingFormTemplate, postingFormDoneTemplate, postingFormDupeTemplate; private String searchResultsTemplate; - private String prepareMailTemplate,sentMailTemplate; + private String prepareMailTemplate,sentMailTemplate,emailAnArticleTemplate; 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; } + + public static ServletModule getInstance() { + return instance; + } private ServletModuleOpenIndy() { super(); @@ -157,22 +115,28 @@ public class ServletModuleOpenIndy extends ServletModule searchResultsTemplate = configuration.getString("ServletModule.OpenIndy.SearchResultsTemplate"); prepareMailTemplate = configuration.getString("ServletModule.OpenIndy.PrepareMailTemplate"); + emailAnArticleTemplate = configuration.getString("ServletModule.OpenIndy.MailableArticleTemplate"); sentMailTemplate = configuration.getString("ServletModule.OpenIndy.SentMailTemplate"); directOp = configuration.getString("DirectOpenposting").toLowerCase(); - commentModule = new ModuleComment(DatabaseComment.getInstance()); + commentModule = new ModuleComment(); mainModule = commentModule; - contentModule = new ModuleContent(DatabaseContent.getInstance()); - topicsModule = new ModuleTopics(DatabaseTopics.getInstance()); - imageModule = new ModuleImages(DatabaseImages.getInstance()); - defaultAction="addposting"; + contentModule = new ModuleContent(); + defaultAction = "defaultAction"; } - catch (StorageObjectFailure e) { + catch (DatabaseFailure e) { logger.error("servletmoduleopenindy could not be initialized: " + e.getMessage()); } } /** - * Method to return an "apology" when open postings are disabled + * Perform the default open posting action + */ + public void defaultAction(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + opensession(aRequest, aResponse); + } + + /** + * Method to return an out of service notice when open postings are disabled * * @param aRequest * @param aResponse @@ -181,14 +145,12 @@ public class ServletModuleOpenIndy extends ServletModule * @throws ServletModuleFailure */ public void openPostingDisabled(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { - deliver(aRequest, aResponse, (Map) null, null, - configuration.getString("ServletModule.OpenIndy.PostingDisabledTemplate")); + deliver(aRequest, aResponse, 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); @@ -204,13 +166,13 @@ public class ServletModuleOpenIndy extends ServletModule // onetimepasswd if (MirGlobal.abuse().getOpenPostingPassword()) { - String passwd = this.createOneTimePasswd(); + String passwd = generateOnetimePassword(); HttpSession session = req.getSession(false); session.setAttribute("passwd", passwd); mergeData.put("passwd", passwd); } else { - mergeData.put("passwd", (String)null); + mergeData.put("passwd", null); } mergeData.put("aid", aid); @@ -276,7 +238,7 @@ public class ServletModuleOpenIndy extends ServletModule response.setResponseGenerator(commentFormDoneTemplate); if (id == null) { - deliver(req, res, (Map)null, null, commentFormDupeTemplate); + deliver(req, res, null, null, commentFormDupeTemplate); } else { DatabaseContent.getInstance().setUnproduced("id=" + aid); @@ -310,8 +272,7 @@ public class ServletModuleOpenIndy extends ServletModule */ public void addposting(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure - { + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { try { if (MirGlobal.abuse().getOpenPostingDisabled()) { openPostingDisabled(req, res); @@ -329,7 +290,7 @@ public class ServletModuleOpenIndy extends ServletModule mergeData.put("passwd", passwd); } else { - mergeData.put("passwd", (String)null); + mergeData.put("passwd", null); } String maxMedia = configuration.getString("ServletModule.OpenIndy.MaxMediaUploadItems"); @@ -344,7 +305,7 @@ public class ServletModuleOpenIndy extends ServletModule } int mediaNum = Integer.parseInt(numOfMedia); - List mediaFields = new Vector(); + List mediaFields = new ArrayList(); for (int i = 0; i < mediaNum; i++) { Integer mNum = new Integer(i + 1); mediaFields.add(mNum.toString()); @@ -355,9 +316,8 @@ public class ServletModuleOpenIndy extends ServletModule Map extraInfo = new HashMap(); extraInfo.put("languagePopUpData", DatabaseLanguage.getInstance().getPopupData()); - extraInfo.put("themenPopupData", topicsModule.getTopicsAsSimpleList()); + extraInfo.put("themenPopupData", DatabaseTopics.getInstance().getPopupData()); - extraInfo.put("topics", topicsModule.getTopicsList()); deliver(req, res, mergeData, extraInfo, postingFormTemplate); } catch (Throwable t) { @@ -390,7 +350,7 @@ public class ServletModuleOpenIndy extends ServletModule HttpSession session = aRequest.getSession(false); String sessionPasswd = (String) session.getAttribute("passwd"); if (sessionPasswd != null) { - String passwd = (String) parsedRequest.getParameter("passwd"); + String passwd = parsedRequest.getParameter("passwd"); if (passwd == null || passwd.length() == 0) { throw new ServletModuleUserExc("posting.error.missingpassword", new String[] {}); @@ -401,12 +361,12 @@ public class ServletModuleOpenIndy extends ServletModule session.invalidate(); } - if ((((String) parsedRequest.getParameter("title")).length() == 0) || - (((String) parsedRequest.getParameter("description")).length() == 0) || - (((String) parsedRequest.getParameter("content_data")).length() == 0)) + if (((parsedRequest.getParameter("title")).length() == 0) || + ((parsedRequest.getParameter("description")).length() == 0) || + ((parsedRequest.getParameter("content_data")).length() == 0)) throw new ServletModuleUserExc("posting.error.missingfield", new String[] {}); - List mediaList = new Vector(); + List mediaList = new ArrayList(); Iterator i = parsedRequest.getFiles().iterator(); while (i.hasNext()) { @@ -427,7 +387,7 @@ public class ServletModuleOpenIndy extends ServletModule } Map withValues = new HashMap(); - i = DatabaseContent.getInstance().getFields().iterator(); + i = DatabaseContent.getInstance().getFieldNames().iterator(); while (i.hasNext()) { String field = (String) i.next(); String value = parsedRequest.getParameter(field); @@ -506,9 +466,9 @@ public class ServletModuleOpenIndy extends ServletModule } catch (Throwable e) { e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE)); - Throwable cause = ExceptionFunctions.traceCauseException(e); + Throwable cause = ExceptionRoutines.traceCauseException(e); - if (cause instanceof ModuleMediaType.UnsupportedMimeTypeExc) { + if (cause instanceof UnsupportedMediaTypeExc) { throw new ServletModuleUserExc("media.unsupportedformat", new String[] {}); } throw new ServletModuleFailure(e); @@ -525,6 +485,31 @@ public class ServletModuleOpenIndy extends ServletModule private static final String SESSION_REQUEST_KEY="sessionid"; /** + * Determines the Locale to be used for the current session + */ + protected Locale getResponseLocale(HttpSession aSession, HttpServletRequest aRequest) { + String requestLanguage = aRequest.getParameter("language"); + String sessionLanguage = (String) aSession.getAttribute("language"); + String acceptLanguage = aRequest.getLocale().getLanguage(); + String defaultLanguage = configuration.getString("Mir.Login.DefaultLanguage", "en"); + + String language = requestLanguage; + + if (language==null) + language = sessionLanguage; + + if (language==null) + language = acceptLanguage; + + if (language==null) + language = defaultLanguage; + + aSession.setAttribute("language", language); + + return new Locale(language, ""); + } + + /** * 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. * @@ -534,12 +519,15 @@ public class ServletModuleOpenIndy extends ServletModule * @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")); + Request request = + new HTTPAdapters.HTTPParsedRequestAdapter(new HTTPParsedRequest(aRequest, + configuration.getString("Mir.DefaultEncoding"), + configuration.getInt("MaxMediaUploadSize")*1024, + configuration.getString("TempDir"))); if (aRequest.isRequestedSessionIdValid() && !aRequest.isRequestedSessionIdFromURL() && !aRequest.getRequestedSessionId().equals(aRequest.getParameter(SESSION_REQUEST_KEY))) @@ -548,10 +536,10 @@ public class ServletModuleOpenIndy extends ServletModule Session session = new HTTPAdapters.HTTPSessionAdapter(aRequest.getSession()); SimpleResponse response = new SimpleResponse( - ServletHelper.makeGenerationData(new Locale[] {getLocale(aRequest), getFallbackLocale(aRequest)}, - "bundles.open")); + ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getResponseLocale(aRequest.getSession(), aRequest), getFallbackLocale(aRequest)}, + "etc/bundles/open")); - response.setResponseValue("actionURL", aResponse.encodeURL(HttpUtils.getRequestURL(aRequest).toString())+"?"+SESSION_REQUEST_KEY+"="+aRequest.getSession().getId()); + response.setResponseValue("actionURL", aResponse.encodeURL(MirGlobal.config().getString("RootUri") + "/servlet/OpenMir")+"?"+SESSION_REQUEST_KEY+"="+aRequest.getSession().getId()); SessionHandler handler = MirGlobal.localizer().openPostings().getOpenSessionHandler(request, session); @@ -569,7 +557,6 @@ public class ServletModuleOpenIndy extends ServletModule /** * Method for preparing and sending a content as an email message */ - public void mail(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { @@ -581,20 +568,20 @@ public class ServletModuleOpenIndy extends ServletModule String to = req.getParameter("mail_to"); String from = req.getParameter("mail_from"); String from_name = req.getParameter("mail_from_name"); + String from_ip = req.getRemoteAddr(); String comment = req.getParameter("mail_comment"); String mail_language = req.getParameter("mail_language"); Map mergeData = new HashMap(); + mergeData.put("mail_to",to); + mergeData.put("mail_from",from); + mergeData.put("mail_from_name",from_name); + mergeData.put("mail_comment",comment); + mergeData.put("mail_aid",aid); + mergeData.put("mail_language",mail_language); - 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) ); - } - } + if (to == null || from == null || from_name == null|| to.equals("") || from.equals("") || from_name.equals("") || mail_language == null || mail_language.equals("")){ deliver(req, res, mergeData, null, prepareMailTemplate); } else { @@ -611,41 +598,36 @@ public class ServletModuleOpenIndy extends ServletModule throw new ServletModuleUserExc("email.error.invalidfromaddress", new String[] {from}); } + CacheKey theCacheKey=new CacheKey("email",aid+mail_language); + String theEmailText; - EntityContent contentEnt; - try{ - contentEnt = (EntityContent)contentModule.getById(aid); + if (MirGlobal.mruCache().hasObject(theCacheKey)){ + logger.info("fetching email text for article "+aid+" from cache"); + theEmailText = (String) MirGlobal.mruCache().getObject(theCacheKey); } - 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); + else { + EntityContent contentEnt; + try { + contentEnt = (EntityContent) contentModule.getById(aid); + StringWriter theEMailTextWriter = new StringWriter(); + PrintWriter dest = new PrintWriter(theEMailTextWriter); + Map articleData = new HashMap(); + articleData.put("article", MirGlobal.localizer().dataModel().adapterModel().makeEntityAdapter("content", contentEnt)); + articleData.put("languagecode", mail_language); + deliver(dest, req, res, articleData, null, emailAnArticleTemplate, mail_language); + theEmailText = theEMailTextWriter.toString(); + MirGlobal.mruCache().storeObject(theCacheKey, theEmailText); + } + catch (Throwable e) { + throw new ServletModuleFailure("Couldn't get content for article " + aid + mail_language + ": " + e.getMessage(), e); + } } + + String content = theEmailText; + + // add some headers - content = "To: " + to + "\nReply-To: "+ from + "\n" + content; + content = "To: " + to + "\nReply-To: "+ from + "\nX-Originating-IP: "+ from_ip + "\n" + content; // put in the comment where it should go if (comment != null) { String commentTextToInsert = "\n\nAttached comment from " + from_name + ":\n" + comment; @@ -698,350 +680,378 @@ public class ServletModuleOpenIndy extends ServletModule + /** + * Method for querying a lucene index + * + * @param req + * @param res + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure + */ - /** - * 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(); + 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); - 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(); + int increment = 10; - //make the query available to subsequent iterations + HttpSession session = req.getSession(false); - Iterator j = Arrays.asList(search_variables).iterator(); - while (j.hasNext()) { - String variable = (String) j.next(); + String queryString = ""; - mergeData.put(variable, requestParser.getParameter(variable)); - } + Map mergeData = new HashMap(); - try{ - mergeData.put("topics", topicsModule.getTopicsAsSimpleList()); - } - catch(Throwable e) { - logger.debug("Can't get topics: " + e.toString()); - } + 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(); + TopicMatrixSearchTerm topicMatrixTerm = new TopicMatrixSearchTerm(); + 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)); + } - String searchBackValue = req.getParameter("search_back"); - String searchForwardValue = req.getParameter("search_forward"); + try { + mergeData.put("topics", DatabaseTopics.getInstance().getPopupData()); + } + catch (Throwable e) { + logger.debug("Can't get topics: " + e.toString()); + } - if (searchBackValue != null){ - int totalHits = ((Integer) session.getAttribute("numberOfHits")).intValue(); - int newPosition=((Integer)session.getAttribute("positionInResults")).intValue()-increment; - if (newPosition<0) - newPosition=0; + 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)); + 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"); + File indexFile = FileRoutines.getAbsoluteOrRelativeFile(configuration.getHome(), configuration.getString("IndexPath")); + String creatorFragment = creatorTerm.makeTerm(req); + if (creatorFragment != null) { + queryString = queryString + " +" + creatorFragment; + } - 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; + } - // 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 topicFragment = topicTerm.makeTerm(req); - if (topicFragment != null){ - queryString = queryString + " +" + topicFragment; - } + String topicMatrixFragment = topicMatrixTerm.makeTerm(req); + if (topicMatrixFragment != null) { + queryString = queryString + " +" + topicMatrixFragment; + } - String imagesFragment = imagesTerm.makeTerm(req); - if (imagesFragment != null){ - queryString = queryString + " +" + imagesFragment; - } + String imagesFragment = imagesTerm.makeTerm(req); + if (imagesFragment != null) { + queryString = queryString + " +" + imagesFragment; + } - String audioFragment = audioTerm.makeTerm(req); - if (audioFragment != null){ - queryString = queryString + " +" + audioFragment; - } + String audioFragment = audioTerm.makeTerm(req); + if (audioFragment != null) { + queryString = queryString + " +" + audioFragment; + } - String videoFragment = videoTerm.makeTerm(req); - if (videoFragment != null){ - queryString = queryString + " +" + videoFragment; - } + 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()); - } + if (queryString == null || queryString.length()==0) { + queryString = ""; + } + else { + try { + Searcher searcher = null; + + try { + searcher = new IndexSearcher(FSDirectory.getDirectory(indexFile,false)); + } + catch (IOException e) { + logger.debug("Can't open indexPath: " + indexFile.getAbsolutePath()); + 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+"')"); - } + 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!"); - } + 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(); + 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)"); - } + 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(); + // here is where the documents will go for database across sessions + ArrayList theDocumentsSorted = new ArrayList(); - if (sortBy.equals("score")){ - for(int i = start; i < end; i++) { - theDocumentsSorted.add(hits.doc(i)); - } + 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); - } + } + 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)); } - 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())); - } + else { + ArrayList thePositions = new ArrayList(); + thePositions.add(new Integer(i)); + dateToPosition.put(creationDate, thePositions); } } - - try{ - searcher.close(); + 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); + } } - catch (IOException e){ - logger.debug("Can't close searcher: " + e.toString()); - throw new ServletModuleFailure("Problem closing searcher(normal):" + e.getMessage(), e); + 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())); + } } + } - - 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)); - + try { + searcher.close(); } - catch (IOException e){ + catch (IOException e) { logger.debug("Can't close searcher: " + e.toString()); - throw new ServletModuleFailure("Problem closing searcher: " + e.getMessage(), e); + throw new ServletModuleFailure("Problem closing searcher(normal):" + 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(); + session.removeAttribute("numberOfHits"); + session.removeAttribute("theDocumentsSorted"); + session.removeAttribute("positionInResults"); - 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); - } + session.setAttribute("numberOfHits", new Integer(end)); + session.setAttribute("theDocumentsSorted", theDocumentsSorted); + session.setAttribute("positionInResults", new Integer(0)); - 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); + catch (IOException e) { + logger.debug("Can't close searcher: " + e.toString()); + throw new ServletModuleFailure("Problem closing searcher: " + e.getMessage(), e); } - 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); - } + try { + ArrayList theDocs = (ArrayList) session.getAttribute("theDocumentsSorted"); + if (theDocs != null) { + + mergeData.put("numberOfHits", (session.getAttribute("numberOfHits")).toString()); + List theHits = new ArrayList(); + int pIR = ( (Integer) session.getAttribute("positionInResults")).intValue(); + int terminus; + int numHits = ( (Integer) session.getAttribute("numberOfHits")).intValue(); - mergeData.put("queryString",queryString); + 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); + } - deliver(req, res, mergeData, null, searchResultsTemplate); + 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 (NullPointerException n){ - throw new ServletModuleFailure("Null Pointer: "+n.toString(), n); + catch (Throwable e) { + logger.error("Can't iterate over hits: " + e.toString()); + + throw new ServletModuleFailure("Problem getting hits: " + e.getMessage(), e); } - } - /* - * Method for dynamically generating a pdf using iText - */ + mergeData.put("queryString", queryString); + deliver(req, res, mergeData, null, searchResultsTemplate); + } + catch (NullPointerException n) { + throw new ServletModuleFailure("Null Pointer: " + n.toString(), n); + } + } - 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); + /* + * 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]+"); + RE re = new RE("[0-9]+"); + REMatch[] idMatches = re.getAllMatches(idParam); - REMatch[] idMatches=re.getAllMatches(idParam); + String cacheSelector = ""; - 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++) { + cacheSelector = cacheSelector + "," + idMatches[i].toString(); + } - } - } + String cacheType = "pdf"; - for (int i = 0; i < idMatches.length; i++){ - REMatch aMatch = idMatches[i]; + CacheKey theCacheKey = new CacheKey(cacheType, cacheSelector); - String id=aMatch.toString(); + byte[] thePDF; - EntityContent contentEnt = (EntityContent)contentModule.getById(id); - pdfMaker.add(contentEnt); + 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); } + } - pdfMaker.stop(); - res.setContentType("application/pdf"); - byte[] content = out.toByteArray(); - res.setContentLength(content.length); - res.getOutputStream().write(content); - res.getOutputStream().flush(); + 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); } - else { - throw new ServletModuleExc("Missing id."); - } + + 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"); + } - catch (Throwable t) { - logger.error(t.toString()); - throw new ServletModuleFailure(t); + 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(); @@ -1057,8 +1067,7 @@ public class ServletModuleOpenIndy extends ServletModule return returnString.substring(5); } - public void deliver(HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator) - throws ServletModuleFailure { + public void deliver(HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator) throws ServletModuleFailure { try { deliver(aResponse.getWriter(), aRequest, aResponse, aData, anExtra, aGenerator); } @@ -1070,7 +1079,7 @@ public class ServletModuleOpenIndy extends ServletModule 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"); + Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}, "etc/bundles/open"); responseData.put("data", aData); responseData.put("extra", anExtra); @@ -1087,9 +1096,30 @@ public class ServletModuleOpenIndy extends ServletModule } } + public void deliver(PrintWriter anOutputWriter, HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator,String aLocaleString) + throws ServletModuleFailure { + try { + Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { new Locale(aLocaleString,""), getFallbackLocale(aRequest)}, "etc/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); + logger.error("Error during open action", anException); Map data = new HashMap(); data.put("errorstring", anException.getMessage()); @@ -1108,8 +1138,10 @@ public class ServletModuleOpenIndy extends ServletModule 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())); + Bundle bundle = + MirGlobal.getBundleFactory().getBundle("etc/bundles/open", new + String[] { getLocale(aRequest).getLanguage() }); + data.put("errorstring", bundle.getValue(anException.getMessage(), Arrays.asList(anException.getParameters()))); data.put("date", StringUtil.date2readableDateTime(new GregorianCalendar())); deliver(out, aRequest, aResponse, data, null, configuration.getString("ServletModule.OpenIndy.UserErrorTemplate")); @@ -1118,8 +1150,4 @@ public class ServletModuleOpenIndy extends ServletModule throw new ServletModuleFailure(e); } } - - private String createOneTimePasswd() { - return ""; - } }