X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fservlet%2FServletModuleOpenIndy.java;h=0bb03aa1448d3c5bbe1dc12c7e83470606b81043;hb=c26251faa299ed62d0e47c32636f440c554610ec;hp=5a63164bea9029ac7778dee6652809e8cd2654e2;hpb=ff19ba99e0ad81d4ecde3ae8479c975b64c580a6;p=mir.git diff --git a/source/mircoders/servlet/ServletModuleOpenIndy.java b/source/mircoders/servlet/ServletModuleOpenIndy.java index 5a63164b..0bb03aa1 100755 --- a/source/mircoders/servlet/ServletModuleOpenIndy.java +++ b/source/mircoders/servlet/ServletModuleOpenIndy.java @@ -1,285 +1,833 @@ +/* + * 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.f + * + * 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 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 mir.bundle.Bundle; +import mir.generator.Generator; +import mir.misc.StringUtil; +import mir.module.ModuleExc; +import mir.servlet.ServletModule; +import mir.servlet.ServletModuleExc; +import mir.servlet.ServletModuleFailure; +import mir.servlet.ServletModuleUserExc; +import mir.session.*; +import mir.util.FileRoutines; +import mir.util.HTTPParsedRequest; +import mir.util.HTTPRequestParser; +import mir.util.StringRoutines; +import mircoders.entity.EntityContent; +import mircoders.global.CacheKey; +import mircoders.global.MirGlobal; +import mircoders.localizer.MirLocalizerExc; +import mircoders.localizer.MirOpenPostingLocalizer; +import mircoders.module.ModuleContent; +import mircoders.pdf.PDFGenerator; +import mircoders.search.*; +import mircoders.storage.DatabaseTopics; +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 org.apache.oro.text.regex.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import javax.servlet.ServletOutputStream; import java.io.*; -import java.sql.*; import java.util.*; -import javax.servlet.*; -import javax.servlet.http.*; -import freemarker.template.*; -import com.oreilly.servlet.multipart.*; -import com.oreilly.servlet.*; - -import mir.servlet.*; -import mir.module.*; -import mir.misc.*; -import mir.entity.*; -import mir.storage.*; - -import mircoders.entity.*; -import mircoders.storage.*; -import mircoders.module.*; -import mircoders.producer.*; +import com.sun.image.codec.jpeg.JPEGCodec; +import com.sun.image.codec.jpeg.JPEGImageEncoder; /* - * ServletModuleOpenIndy - - * is the open-access-servlet, which is responsible for - * adding comments to articles & - * open-postings to the newswire - * - * @author RK */ -public class ServletModuleOpenIndy extends ServletModule -{ +public class ServletModuleOpenIndy extends ServletModule { + private String searchResultsTemplate; + private String prepareMailTemplate,sentMailTemplate,emailAnArticleTemplate; + private ModuleContent contentModule; - private String commentFormTemplate, commentFormDoneTemplate, commentFormDupeTemplate; - private String postingFormTemplate, postingFormDoneTemplate; - private ModuleContent contentModule; - private ModuleImages imageModule; - private ModuleTopics themenModule; - private String directOp ="yes"; + public ServletModuleOpenIndy() { + searchResultsTemplate = getConfiguration().getString("ServletModule.OpenIndy.SearchResultsTemplate"); + prepareMailTemplate = getConfiguration().getString("ServletModule.OpenIndy.PrepareMailTemplate"); + emailAnArticleTemplate = getConfiguration().getString("ServletModule.OpenIndy.MailableArticleTemplate"); + sentMailTemplate = getConfiguration().getString("ServletModule.OpenIndy.SentMailTemplate"); - // Singelton / Kontruktor - private static ServletModuleOpenIndy instance = new ServletModuleOpenIndy(); - public static ServletModule getInstance() { return instance; } + contentModule = new ModuleContent(); + } - private ServletModuleOpenIndy() { - try { - theLog = Logfile.getInstance(MirConfig.getProp("Home") + MirConfig.getProp("ServletModule.OpenIndy.Logfile")); - commentFormTemplate = MirConfig.getProp("ServletModule.OpenIndy.CommentTemplate"); - commentFormDoneTemplate = MirConfig.getProp("ServletModule.OpenIndy.CommentDoneTemplate"); - commentFormDupeTemplate = MirConfig.getProp("ServletModule.OpenIndy.CommentDupeTemplate"); - postingFormTemplate = MirConfig.getProp("ServletModule.OpenIndy.PostingTemplate"); - postingFormDoneTemplate = MirConfig.getProp("ServletModule.OpenIndy.PostingDoneTemplate"); - directOp = MirConfig.getProp("DirectOpenposting").toLowerCase(); - mainModule = new ModuleComment(DatabaseComment.getInstance()); - contentModule = new ModuleContent(DatabaseContent.getInstance()); - themenModule = new ModuleTopics(DatabaseTopics.getInstance()); - imageModule = new ModuleImages(DatabaseImages.getInstance()); - defaultAction="addposting"; - } - catch (StorageObjectException e) { - theLog.printError("servletmoduleopenindy could not be initialized"); - } + /** + * 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 + */ + public void openPostingDisabled(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + deliver(aRequest, aResponse, null, null, getConfiguration().getString("ServletModule.OpenIndy.PostingDisabledTemplate")); + } /** - * Method for making a comment + * 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"; - public void addcomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException - { - String aid = req.getParameter("aid"); // the article id the comment will belong to - if (aid!=null && !aid.equals("")) - { - SimpleHash mergeData = new SimpleHash(); - // ok, article - mergeData.put("aid", aid); - deliver(req, res, mergeData, commentFormTemplate); - } - else throw new ServletModuleException("aid not set!"); + /** + * 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 = getConfiguration().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, ""); } /** - * Method for inserting a comment into the Database and delivering - * the commentDone Page + * 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 { - public void inscomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException - { - 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 { - HashMap withValues = getIntersectingValues(req, DatabaseComment.getInstance()); - withValues.put("is_published","1"); - - // Dupe detection -// EntityList com = mainModule.getByWhereClause("description='"+req.getParameter("description")+"' AND to_media='"+aid+"' AND creator='"+req.getParameter("creator")+"'", 0); -// if (com.getCount() > 0) { -// theLog.printDebugInfo("Comment dupe dropped for article "+aid); -// deliver(req, res, (TemplateModelRoot) null, commentFormDupeTemplate); -// } else { - - // inserting into database - String id = mainModule.add(withValues); - - // producing new page - new ProducerContent().handle(null, null, true, false, aid); - - // sync the server - int exitValue = Helper.rsync(); - theLog.printDebugInfo("rsync:"+exitValue); - - // redirecting to url - // should implement back to article - SimpleHash mergeData = new SimpleHash(); - deliver(req, res, mergeData, commentFormDoneTemplate); -// } + try { + Request request = + new HTTPAdapters.HTTPParsedRequestAdapter(new HTTPParsedRequest(aRequest, + getConfiguration().getString("Mir.DefaultEncoding"), + getConfiguration().getInt("MaxMediaUploadSize")*1024, + getConfiguration().getString("TempDir"))); + + if (aRequest.isRequestedSessionIdValid() && !aRequest.isRequestedSessionIdFromURL() && + !aRequest.getRequestedSessionId().equals(aRequest.getParameter(SESSION_REQUEST_KEY))) { + aRequest.getSession().invalidate(); } - catch (StorageObjectException e) { throw new ServletModuleException(e.toString());} - catch (ModuleException e) { throw new ServletModuleException(e.toString());} + Session session = new HTTPAdapters.HTTPSessionAdapter(aRequest.getSession()); + + SimpleResponse response = new SimpleResponse( + ServletHelper.makeGenerationData(aRequest, aResponse, + new Locale[] { + getResponseLocale(aRequest.getSession(), aRequest), + getFallbackLocale(aRequest) + }, + "etc/bundles/open")); + + 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); + + handler.processRequest(request, session, response); + ServletHelper.generateOpenPostingResponse(aResponse.getWriter(), response.getResponseValues(), response.getResponseGenerator()); + } + catch (Throwable t) { + getLogger().error(t.toString(), t); + + throw new ServletModuleFailure(t); } - else throw new ServletModuleException("aid not set!"); + } + public void captcha(HttpServletRequest aRequest, HttpServletResponse aResponse) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + try { + MirOpenPostingLocalizer.Captcha captcha = MirGlobal.localizer().openPostings().generateCaptcha(aRequest.getSession().getId()); + aRequest.getSession().setAttribute("captcha", captcha); + + // the output stream to render the captcha image as jpeg into + ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); + JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream); + jpegEncoder.encode(captcha.getChallenge()); + + aResponse.setHeader("Cache-Control", "no-store"); + aResponse.setHeader("Pragma", "no-cache"); + aResponse.setDateHeader("Expires", 0); + aResponse.setContentType("image/jpeg"); + + ServletOutputStream responseOutputStream = aResponse.getOutputStream(); + + responseOutputStream.write(jpegOutputStream.toByteArray()); + responseOutputStream.flush(); + responseOutputStream.close(); + } + catch (IOException e) { + throw new ServletModuleFailure(e); + } } /** - * Method for delivering the form-Page for open posting + * Method for preparing and sending a content as an email message */ - - public void addposting(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException - { - SimpleHash mergeData = new SimpleHash(); - String numOfMedia = req.getParameter("medianum"); - if(numOfMedia==null||numOfMedia.equals("")){ - numOfMedia="1"; + public void mail(HttpServletRequest aRequest, HttpServletResponse aResponse) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + String aid = aRequest.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...."); } - - int mediaNum = Integer.parseInt(numOfMedia); - SimpleList mediaFields = new SimpleList(); - for(int i =0; i 0) { - try{ - DatabaseContentToTopics.getInstance().setTopics(cid,to_topicsArr); - theLog.printError("setting content_x_topic success"); - } catch (Exception e) { - theLog.printError("setting content_x_topic failed"); - } //end try - } //end if - - // if op contains uploaddata - String mediaId=null; - int i=1; - for(Iterator it = mp.requestList.iterator(); it.hasNext();){ - MpRequest mpReq = (MpRequest)it.next(); - byte[] mediaData=mpReq.getMedia(); - String fileName=mpReq.getFilename(); - String contentType=mpReq.getContentType(); - if (mediaData!=null && fileName!=null) { - HashMap mediaValues = new HashMap(); - mediaValues.put("date", StringUtil.date2webdbDate(new GregorianCalendar())); - mediaValues.put("to_publisher", "1"); // op user - mediaValues.put("to_media_folder", "7"); // op media_folder - mediaValues.put("is_produced", "0"); - mediaValues.put("is_published","1"); - - String mediaTitle=(String)withValues.get("media_title"+i); - i++; - if (mediaTitle==null) - mediaTitle = (String)withValues.get("title"); - mediaValues.put("title",mediaTitle); - - if (fileName.toLowerCase().endsWith("rm")) { - // this is video !! - //theLog.printDebugInfo("--GOT VIDEO"); - EntityVideo entVideo = new EntityVideo(DatabaseVideos.getInstance()); - entVideo.setValues(mediaValues); - mediaId = entVideo.insert(); - entVideo.setVideoData(mediaData); + 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(); + 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)); + } + + try { + mergeData.put("topics", DatabaseTopics.getInstance().getPopupData()); + } + catch (Throwable e) { + getLogger().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 { + File indexFile = FileRoutines.getAbsoluteOrRelativeFile(getConfiguration().getHome(), getConfiguration().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) { + getLogger().debug("contentFragment: " + contentFragment); + queryString = queryString + " +" + contentFragment; + } + + String topicFragment = topicTerm.makeTerm(req); + if (topicFragment != null) { + queryString = queryString + " +" + topicFragment; } - else if (contentType.equals("image/jpeg") || contentType.equals("image/gif")) { - // this is image !! - mediaId = imageModule.add(mediaValues); - EntityImage entImage = (EntityImage)imageModule.getById(mediaId); - - int fileType = -1; - if (contentType.equals("image/jpeg")) fileType=0; - if (contentType.equals("image/gif")) fileType=1; - if (fileType>=0) { - entImage.setImage(mediaData, fileType); - // inserting content and media id in table content_x_media - try{ - DatabaseContentToMedia.getInstance().addMedia(cid,mediaId); - theLog.printError("setting content_x_media success"); - } catch (Exception e) { - theLog.printError("setting content_x_media failed"); + + String topicMatrixFragment = topicMatrixTerm.makeTerm(req); + if (topicMatrixFragment != null) { + queryString = queryString + " +" + topicMatrixFragment; + } + + 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.length()==0) { + queryString = ""; + } + else { + try { + Searcher searcher; + + try { + searcher = new IndexSearcher(FSDirectory.getDirectory(indexFile,false)); } - - // producing new page - if(mediaId!=null){ - new ProducerImages().handle(null, null, false, false, mediaId); + catch (IOException e) { + getLogger().debug("Can't open indexPath: " + indexFile.getAbsolutePath()); + throw new ServletModuleExc("Problem with Search Index! : " + e.toString()); } - } else { - theLog.printDebugInfo("Wrong file uploaded!" + fileName); + + Query query; + try { + query = QueryParser.parse(queryString, "content", new StandardAnalyzer()); + } + catch (Exception e) { + searcher.close(); + getLogger().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(); + getLogger().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 database 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) { + getLogger().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) { + getLogger().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", (session.getAttribute("numberOfHits")).toString()); + List theHits = new ArrayList(); + 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) { + getLogger().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 aRequest, HttpServletResponse aResponse) + 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 idParameterValue = aRequest.getParameter(ID_REQUEST_PARAM); + if (idParameterValue != null) { + Pattern idPattern = new Perl5Compiler().compile("[0-9]+"); + PatternMatcher matcher = new Perl5Matcher(); + PatternMatcherInput input = new PatternMatcherInput(idParameterValue); + List ids = new ArrayList(); + while (matcher.contains(input, idPattern)) { + ids.add(matcher.getMatch().toString()); + } + + String cacheType = "pdf"; + + CacheKey theCacheKey = new CacheKey(cacheType, idParameterValue); + + byte[] thePDF; + + if (MirGlobal.mruCache().hasObject(theCacheKey)) { + getLogger().debug("fetching pdf from cache"); + thePDF = (byte[]) MirGlobal.mruCache().getObject(theCacheKey); + } + else { + getLogger().debug("generating pdf and caching it"); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PDFGenerator pdfMaker = new PDFGenerator(out); + + if (ids.size() > 1) { + pdfMaker.addLine(); + for (int i = 0; i < ids.size() && i < maxArticlesInNewsleter; i++) { + EntityContent contentEnt = (EntityContent) contentModule.getById((String) ids.get(i)); + + pdfMaker.addIndexItem(contentEnt); } } + + for (int i = 0; i < ids.size(); i++) { + EntityContent article = (EntityContent) contentModule.getById((String) ids.get(i)); + + if (!MirGlobal.localizer().openPostings().allowArticlePublication(article)) { + throw new ServletModuleExc("Illegal article"); + } + + pdfMaker.add(article, getLocale(aRequest)); + } + + pdfMaker.stop(); + thePDF = out.toByteArray(); + + //and save all our hard work! + MirGlobal.mruCache().storeObject(theCacheKey, thePDF); } + + aResponse.setContentType("application/pdf"); + aResponse.setContentLength(thePDF.length); + aResponse.getOutputStream().write(thePDF); + aResponse.getOutputStream().flush(); + String elapsedtime = (new Long(System.currentTimeMillis() - starttime)).toString(); + getLogger().info("pdf retireval took " + elapsedtime + " milliseconds"); + + } + else { + throw new ServletModuleExc("Missing id."); } + } + catch (Throwable t) { + getLogger().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(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}, "etc/bundles/open"); + responseData.put("data", aData); + responseData.put("extra", anExtra); - // producing openpostinglist - new ProducerOpenPosting().handle(null,null,false,false); - // producing new page - new ProducerContent().handle(null, null, false, false,cid); - //if direct op producing startpage - if (directOp.equals("yes")) new ProducerStartPage().handle(null,null); - - // sync the server - //should be configureable - int exitValue = Helper.rsync(); - theLog.printDebugInfo("rsync: "+exitValue); + Generator generator = + MirGlobal.localizer().generators().makeOpenPostingGeneratorLibrary().makeGenerator(aGenerator, null); + generator.generate(anOutputWriter, responseData, getLogger()); + anOutputWriter.close(); } - catch (IOException e) { throw new ServletModuleException("IOException: "+ e.toString());} - catch (StorageObjectException e) { throw new ServletModuleException("StorageObjectException" + e.toString());} - catch (ModuleException e) { throw new ServletModuleException("ModuleException"+e.toString());} + catch (Throwable e) { + getLogger().error("Error while generating " + aGenerator + ": " + e.getMessage()); - deliver(req, res, mergeData, postingFormDoneTemplate); + 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)}, "etc/bundles/open"); + responseData.put("data", aData); + responseData.put("extra", anExtra); + + + Generator generator = + MirGlobal.localizer().generators(). + makeOpenPostingGeneratorLibrary().makeGenerator(aGenerator, null); + generator.generate(anOutputWriter, responseData, getLogger()); + + anOutputWriter.close(); + } + catch (Throwable e) { + getLogger().error("Error while generating " + aGenerator + ": " + e.getMessage()); + + throw new ServletModuleFailure(e); + } } -} + public void handleError(HttpServletRequest aRequest, HttpServletResponse aResponse,PrintWriter out, Throwable anException) { + try { + getLogger().error("Error during open action", anException); + Map data = new HashMap(); + + data.put("errorstring", anException.getMessage()); + data.put("date", StringUtil.date2readableDateTime(new GregorianCalendar())); + + deliver(out, aRequest, aResponse, data, null, getConfiguration().getString("ServletModule.OpenIndy.ErrorTemplate")); + } + catch (Throwable e) { + throw new ServletModuleFailure(e); + } + } + + public void handleUserError(HttpServletRequest aRequest, HttpServletResponse aResponse, + PrintWriter out, ServletModuleUserExc anException) { + try { + getLogger().warn("user error: " + anException.getMessage()); + Map data = new HashMap(); + + 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, getConfiguration().getString("ServletModule.OpenIndy.UserErrorTemplate")); + } + catch (Throwable e) { + throw new ServletModuleFailure(e); + } + } +}