/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.app.webui.servlet; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.requestitem.RequestItemAuthor; import org.dspace.app.requestitem.RequestItemAuthorExtractor; import org.dspace.app.webui.util.JSPManager; import org.dspace.app.webui.util.RequestItemManager; import org.dspace.app.webui.util.UIUtil; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Metadatum; import org.dspace.content.Item; import org.dspace.core.*; import org.dspace.eperson.EPerson; import org.dspace.handle.HandleManager; import org.dspace.storage.bitstore.BitstreamStorageManager; import org.dspace.storage.rdbms.DatabaseManager; import org.dspace.storage.rdbms.TableRow; import org.dspace.utils.DSpace; import javax.mail.MessagingException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.sql.SQLException; import java.text.MessageFormat; import java.util.Date; /** * Servlet for generate a statistisc report * * @author Arnaldo Dantas * @version $Revision: 1.0 $ */ public class RequestItemServlet extends DSpaceServlet { /** log4j category */ private static Logger log = Logger.getLogger(RequestItemServlet.class); /** The information get by form step */ public static final int ENTER_FORM_PAGE = 1; /** The link by submmiter email step*/ public static final int ENTER_TOKEN = 2; /** The link Aproved genarate letter step*/ public static final int APROVE_TOKEN = 3; /* resume leter for request user*/ public static final int RESUME_REQUEST = 4; /* resume leter for request dspace administrator*/ public static final int RESUME_FREEACESS = 5; protected void doDSGet(Context context, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException, AuthorizeException { // First get the step int step = UIUtil.getIntParameter(request, "step"); try { switch (step) { case ENTER_FORM_PAGE: processForm(context, request, response); break; case ENTER_TOKEN: processToken(context, request, response); break; case APROVE_TOKEN: processLetter(context, request, response); break; case RESUME_REQUEST: processAttach(context, request, response); break; case RESUME_FREEACESS: processAdmin(context, request, response); break; default: processForm(context, request, response); } context.complete(); } catch (MessagingException e) { throw new RuntimeException(e.getMessage(), e); } } protected void doDSPost(Context context, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException, AuthorizeException { // Treat as a GET doDSGet(context, request, response); } private void processForm (Context context, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException, AuthorizeException { boolean showRequestCopy = false; if ("all".equalsIgnoreCase(ConfigurationManager.getProperty("request.item.type")) || ("logged".equalsIgnoreCase(ConfigurationManager.getProperty("request.item.type")) && context.getCurrentUser() != null)) { showRequestCopy = true; } if (!showRequestCopy) { throw new AuthorizeException("The request copy feature is disabled"); } // handle String handle = request.getParameter("handle"); String bitstream_id=request.getParameter("bitstream-id"); // Title String title = null; Item item = null; if (StringUtils.isNotBlank(handle)) { item = (Item) HandleManager.resolveToObject(context, handle); } if (item == null) { JSPManager.showInvalidIDError(request, response, handle, -1); } Metadatum[] titleDC = item.getDC("title", null, Item.ANY); if (titleDC != null || titleDC.length > 0) { title = titleDC[0].value; } else { title = I18nUtil.getMessage("jsp.general.untitled", context); } // User email from context String requesterEmail = request.getParameter("email"); EPerson currentUser = context.getCurrentUser(); String userName = null; if (currentUser != null) { requesterEmail = currentUser.getEmail(); userName = currentUser.getFullName(); } if (request.getParameter("submit") != null) { String reqname = request.getParameter("reqname"); String coment = request.getParameter("coment"); if (coment == null || coment.equals("")) coment = ""; boolean allfiles = "true".equals(request.getParameter("allfiles")); // Check all data is there if (requesterEmail == null || requesterEmail.equals("") || reqname == null || reqname.equals("")) { request.setAttribute("handle",handle); request.setAttribute("bitstream-id", bitstream_id); request.setAttribute("reqname", reqname); request.setAttribute("email", requesterEmail); request.setAttribute("coment", coment); request.setAttribute("title", title); request.setAttribute("allfiles", allfiles?"true":null); request.setAttribute("requestItem.problem", new Boolean(true)); JSPManager.showJSP(request, response, "/requestItem/request-form.jsp"); return; } try { // All data is there, send the email Email email = Email.getEmail(I18nUtil.getEmailFilename( context.getCurrentLocale(), "request_item.author")); RequestItemAuthor author = new DSpace() .getServiceManager() .getServiceByName( RequestItemAuthorExtractor.class.getName(), RequestItemAuthorExtractor.class) .getRequestItemAuthor(context, item); String authorEmail = author.getEmail(); String authorName = author.getFullName(); email.addRecipient(authorEmail); email.addArgument(reqname); email.addArgument(requesterEmail); email.addArgument(allfiles ? I18nUtil .getMessage("itemRequest.all") : Bitstream.find( context, Integer.parseInt(bitstream_id)).getName()); email.addArgument(HandleManager.getCanonicalForm(item .getHandle())); email.addArgument(title); // request item title email.addArgument(coment); // message email.addArgument(RequestItemManager.getLinkTokenEmail(context, bitstream_id, item.getID(), requesterEmail, reqname, allfiles)); email.addArgument(authorName); // corresponding author name email.addArgument(authorEmail); // corresponding author email email.addArgument(ConfigurationManager .getProperty("dspace.name")); email.addArgument(ConfigurationManager .getProperty("mail.helpdesk")); email.setReplyTo(requesterEmail); email.send(); log.info(LogManager.getHeader(context, "sent_email_requestItem", "submitter_id=" + requesterEmail + ",bitstream_id="+bitstream_id + ",requestEmail="+requesterEmail)); request.setAttribute("handle", handle); JSPManager.showJSP(request, response, "/requestItem/request-send.jsp"); } catch (MessagingException me) { log.warn(LogManager.getHeader(context, "error_mailing_requestItem", ""), me); JSPManager.showInternalError(request, response); } } else { // Display request copy form log.info(LogManager.getHeader(context, "show_requestItem_form", "problem=false")); request.setAttribute("handle", handle); request.setAttribute("bitstream-id", bitstream_id); request.setAttribute("email", requesterEmail); request.setAttribute("reqname", userName); request.setAttribute("title", title); request.setAttribute("allfiles", "true"); JSPManager.showJSP(request, response, "/requestItem/request-form.jsp"); } } /* receive token * get all request data by token * send email to request user */ private void processToken (Context context, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException, AuthorizeException { // Token String token = request.getParameter("token"); TableRow requestItem = RequestItemManager.getRequestbyToken( context, token); // validate if (requestItem != null) { Item item = Item.find(context, requestItem.getIntColumn("item_id")); String title = ""; if (item != null) { Metadatum[] titleDC = item.getDC("title", null, Item.ANY); if (titleDC != null || titleDC.length > 0) title = titleDC[0].value; } request.setAttribute("request-name", requestItem.getStringColumn("request_name")); request.setAttribute("handle", item.getHandle()); request.setAttribute("title", title); JSPManager.showJSP(request, response, "/requestItem/request-information.jsp"); }else{ JSPManager.showInvalidIDError(request, response, token, -1); } } /* * receive approvation and generate a letter * get all request data by token * send email to request user */ private void processLetter(Context context, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException, AuthorizeException, MessagingException { // Token String token = request.getParameter("token"); boolean yes = request.getParameter("submit_yes") != null; boolean no = request.getParameter("submit_no") != null; // get token, get register, get email template, format email, get // message to jsp TableRow requestItem = RequestItemManager.getRequestbyToken(context, token); if (requestItem != null && (yes || no)) { Item item = Item.find(context, requestItem.getIntColumn("item_id")); Metadatum[] titleDC = item.getDC("title", null, Item.ANY); String title = titleDC.length > 0 ? titleDC[0].value : I18nUtil .getMessage("jsp.general.untitled", context); EPerson submiter = item.getSubmitter(); Object[] args = new String[]{ requestItem.getStringColumn("request_name"), HandleManager.getCanonicalForm(item.getHandle()), // User title, // request item title submiter.getFullName(), // # submmiter name submiter.getEmail() // # submmiter email }; String subject = I18nUtil.getMessage("itemRequest.response.subject." + (yes ? "approve" : "reject"), context); String message = MessageFormat.format(I18nUtil.getMessage("itemRequest.response.body." + (yes ? "approve" : "reject"), context), args); // page request.setAttribute("response", yes); request.setAttribute("subject", subject); request.setAttribute("message", message); JSPManager.showJSP(request, response, "/requestItem/request-letter.jsp"); } else { JSPManager.showInvalidIDError(request, response, token, -1); } } /* * receive token * get all request data by token * send email to request user */ private void processAttach (Context context, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException, AuthorizeException { // Token String token = request.getParameter("token"); //buttom boolean submit_next = (request.getParameter("submit_next") != null); if (submit_next) { TableRow requestItem = RequestItemManager.getRequestbyToken( context, token); // validate if (requestItem != null) { // Token String subject = request.getParameter("subject"); String message = request.getParameter("message"); boolean accept = UIUtil.getBoolParameter(request, "accept_request"); try { Item item = Item.find(context, requestItem.getIntColumn("item_id")); Email email = new Email(); email.setSubject(subject); email.setContent("{0}"); email.addRecipient(requestItem.getStringColumn("request_email")); email.addArgument(message); // add attach if (accept) { if (requestItem.getBooleanColumn("allfiles")) { Bundle[] bundles = item.getBundles("ORIGINAL"); for (int i = 0; i < bundles.length; i++) { Bitstream[] bitstreams = bundles[i] .getBitstreams(); for (int k = 0; k < bitstreams.length; k++) { if (!bitstreams[k].getFormat().isInternal() && RequestItemManager.isRestricted( context, bitstreams[k])) { email.addAttachment( BitstreamStorageManager .retrieve( context, bitstreams[k] .getID()), bitstreams[k].getName(), bitstreams[k].getFormat() .getMIMEType()); } } } } else { Bitstream bit = Bitstream.find(context, requestItem.getIntColumn("bitstream_id")); email.addAttachment(BitstreamStorageManager .retrieve(context, requestItem .getIntColumn("bitstream_id")), bit .getName(), bit.getFormat().getMIMEType()); } } email.send(); requestItem.setColumn("accept_request",accept); requestItem.setColumn("decision_date",new Date()); DatabaseManager.update(context, requestItem); log.info(LogManager.getHeader(context, "sent_attach_requestItem", "token=" + token)); JSPManager.showJSP(request, response, "/requestItem/request-free-access.jsp"); } catch (MessagingException me) { log.warn(LogManager.getHeader(context, "error_mailing_requestItem", ""), me); JSPManager.showInternalError(request, response); } } else JSPManager.showInvalidIDError(request, response, null, -1); } else { processToken(context, request, response); } } /* * receive approvation and generate a letter * get all request data by token * send email to request user */ private void processAdmin(Context context, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException, AuthorizeException { // Token String token = request.getParameter("token"); boolean free = request.getParameter("submit_free") != null; String name = request.getParameter("name"); String mail = request.getParameter("email"); // get token, get register, get email template, format email, get // message to jsp TableRow requestItem = RequestItemManager.getRequestbyToken(context, token); if (requestItem != null && free) { try { Item item = Item.find(context, requestItem.getIntColumn("item_id")); String emailRequest; EPerson submiter = item.getSubmitter(); if (submiter != null) { emailRequest = submiter.getEmail(); } else { emailRequest = ConfigurationManager .getProperty("mail.helpdesk"); } if (emailRequest == null) { emailRequest = ConfigurationManager .getProperty("mail.admin"); } Email email = Email.getEmail(I18nUtil.getEmailFilename( context.getCurrentLocale(), "request_item.admin")); email.addRecipient(emailRequest); email.addArgument(Bitstream.find(context, requestItem.getIntColumn("bitstream_id")).getName()); email.addArgument(HandleManager.getCanonicalForm(item .getHandle())); email.addArgument(requestItem.getStringColumn("token")); email.addArgument(name); email.addArgument(mail); email.send(); log.info(LogManager.getHeader(context, "sent_adm_requestItem", "token=" + requestItem.getStringColumn("token") + "item_id=" + item.getID())); JSPManager.showJSP(request, response, "/requestItem/response-send.jsp"); } catch (MessagingException me) { log.warn(LogManager.getHeader(context, "error_mailing_requestItem", ""), me); JSPManager.showInternalError(request, response); } } else { JSPManager.showInvalidIDError(request, response, token, -1); } } }