X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fservlet%2FServletModuleOpenIndy.java;h=6172d1c05dfb55a1c3179499f4579f0d2f56fceb;hb=aa507bfd18e723d21e63454a26af3320bb8c27f2;hp=9e7f5be470c6e1f08e5f01bb40f647e032dfd80c;hpb=386e5efa787066632dabe1965c7272146ac72b63;p=mir.git diff --git a/source/mircoders/servlet/ServletModuleOpenIndy.java b/source/mircoders/servlet/ServletModuleOpenIndy.java index 9e7f5be4..6172d1c0 100755 --- a/source/mircoders/servlet/ServletModuleOpenIndy.java +++ b/source/mircoders/servlet/ServletModuleOpenIndy.java @@ -30,17 +30,16 @@ package mircoders.servlet; +import gnu.regexp.RE; +import gnu.regexp.REMatch; + 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; @@ -51,24 +50,10 @@ 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.entity.Entity; import mir.generator.Generator; @@ -91,6 +76,7 @@ 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.MediaUploadProcessor; import mircoders.module.ModuleComment; @@ -104,6 +90,7 @@ import mircoders.search.ContentSearchTerm; import mircoders.search.ImagesSearchTerm; import mircoders.search.KeywordSearchTerm; import mircoders.search.TextSearchTerm; +import mircoders.search.TopicMatrixSearchTerm; import mircoders.search.TopicSearchTerm; import mircoders.search.UnIndexedSearchTerm; import mircoders.search.VideoSearchTerm; @@ -115,6 +102,18 @@ import mircoders.storage.DatabaseImages; import mircoders.storage.DatabaseLanguage; import mircoders.storage.DatabaseTopics; +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; + /* * ServletModuleOpenIndy - * is the open-access-servlet, which is responsible for @@ -122,7 +121,7 @@ import mircoders.storage.DatabaseTopics; * open-postings to the newswire * * @author mir-coders group - * @version $Id: ServletModuleOpenIndy.java,v 1.84 2003/04/29 02:36:50 zapata Exp $ + * @version $Id: ServletModuleOpenIndy.java,v 1.89.2.8 2003/10/23 14:55:25 rk Exp $ * */ @@ -132,7 +131,7 @@ 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; @@ -157,6 +156,7 @@ 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()); @@ -355,7 +355,7 @@ 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); @@ -525,6 +525,35 @@ public class ServletModuleOpenIndy extends ServletModule private static final String SESSION_REQUEST_KEY="sessionid"; /** + * Selects the language for the response. + * + * @param session + * @param aRequest + */ + + 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. * @@ -552,10 +581,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)}, + ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getResponseLocale(aRequest.getSession(), aRequest), getFallbackLocale(aRequest)}, "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); @@ -585,20 +614,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 { @@ -615,41 +644,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; @@ -735,6 +759,7 @@ public class ServletModuleOpenIndy extends ServletModule 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(); @@ -749,7 +774,7 @@ public class ServletModuleOpenIndy extends ServletModule } try { - mergeData.put("topics", topicsModule.getTopicsAsSimpleList()); + mergeData.put("topics", DatabaseTopics.getInstance().getPopupData()); } catch (Throwable e) { logger.debug("Can't get topics: " + e.toString()); @@ -799,6 +824,11 @@ public class ServletModuleOpenIndy extends ServletModule 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; @@ -989,49 +1019,77 @@ public class ServletModuleOpenIndy extends ServletModule * Method for dynamically generating a pdf using iText */ - public void getpdf(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + 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) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - PDFGenerator pdfMaker = new PDFGenerator(out); - RE re = new RE("[0-9]+"); - REMatch[] idMatches = re.getAllMatches(idParam); + RE re = new RE("[0-9]+"); - 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); - } - } + REMatch[] idMatches=re.getAllMatches(idParam); - for (int i = 0; i < idMatches.length; i++) { - REMatch aMatch = idMatches[i]; + String cacheSelector=""; - String id = aMatch.toString(); + for (int i = 0; i < idMatches.length; i++){ + cacheSelector= cacheSelector + "," + idMatches[i].toString(); + } - EntityContent contentEnt = (EntityContent) contentModule.getById(id); - pdfMaker.add(contentEnt); + 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); + } - pdfMaker.stop(); - res.setContentType("application/pdf"); - byte[] content = out.toByteArray(); - res.setContentLength(content.length); - res.getOutputStream().write(content); - res.getOutputStream().flush(); + 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."); + throw new ServletModuleExc("Missing id."); } } catch (Throwable t) { @@ -1041,6 +1099,7 @@ public class ServletModuleOpenIndy extends ServletModule } + public String generateOnetimePassword() { Random r = new Random(); int random = r.nextInt(); @@ -1068,7 +1127,27 @@ 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)}, "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 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)}, "bundles.open"); responseData.put("data", aData); responseData.put("extra", anExtra); @@ -1085,6 +1164,7 @@ public class ServletModuleOpenIndy extends ServletModule } } + public void handleError(HttpServletRequest aRequest, HttpServletResponse aResponse,PrintWriter out, Throwable anException) { try { logger.error("error: " + anException);