/** * 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.xmlui.aspect.artifactbrowser; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.acting.AbstractAction; import org.apache.cocoon.environment.ObjectModelHelper; import org.apache.cocoon.environment.Redirector; import org.apache.cocoon.environment.Request; import org.apache.cocoon.environment.SourceResolver; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.requestitem.RequestItem; import org.dspace.app.requestitem.RequestItemAuthor; import org.dspace.app.requestitem.RequestItemAuthorExtractor; import org.dspace.app.xmlui.utils.ContextUtil; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Metadatum; import org.dspace.content.Item; import org.dspace.core.Context; import org.dspace.core.Email; import org.dspace.core.I18nUtil; import org.dspace.handle.HandleManager; import org.dspace.storage.bitstore.BitstreamStorageManager; import org.dspace.utils.DSpace; import javax.mail.MessagingException; import java.io.IOException; import java.sql.SQLException; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * * Original Concept, JSPUI version: Universidade do Minho at www.uminho.pt * Sponsorship of XMLUI version: Instituto Oceanográfico de España at www.ieo.es * * @author Adán Román Ruiz at arvo.es (added request item support) */ public class ItemRequestResponseAction extends AbstractAction { /** log4j log */ private static Logger log = Logger.getLogger(ItemRequestResponseAction.class); public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception { Request request = ObjectModelHelper.getRequest(objectModel); String token = parameters.getParameter("token",""); String decision = request.getParameter("decision"); String isSent = request.getParameter("isSent"); String message = request.getParameter("message"); //contactPerson:requester or contactPerson:author String contactPerson = request.getParameter("contactPerson"); Context context = ContextUtil.obtainContext(objectModel); request.setAttribute("token", token); RequestItem requestItem = RequestItem.findByToken(context, token); String title; Item item = Item.find(context, requestItem.getItemID()); Metadatum[] titleDC = item.getDC("title", null, Item.ANY); if (titleDC != null || titleDC.length > 0) title=titleDC[0].value; else title="untitled"; String button=""; // Buttons on the page if(request.getParameter("send")!=null){ decision="true"; button="send"; } else if(request.getParameter("dontSend")!=null){ decision="false"; button="dontSend"; } else if(request.getParameter("contactRequester") !=null) { button = "contactRequester"; } else if (request.getParameter("contactAuthor") != null) { button = "contactAuthor"; } if(request.getParameter("mail")!=null){ button="mail"; }else if(request.getParameter("back")!=null){ button="back"; } if(request.getParameter("openAccess")!=null){ button="openAccess"; } if(button.equals("mail")) { //Send mail if(StringUtils.isNotEmpty(decision) && decision.equals("true")){ processSendDocuments(context,request,requestItem,item,title); isSent="true"; } else if(StringUtils.isNotEmpty(decision) && decision.equals("false")) { processDeny(context, request, requestItem, item, title); isSent = "true"; } else if(StringUtils.isNotEmpty(contactPerson) && contactPerson.equals("requester")) { log.info("ContactRequester"); processContactRequester(request, requestItem); decision = null; isSent = "notify"; } else if(StringUtils.isNotEmpty(contactPerson) && contactPerson.equals("author")) { processContactAuthor(request); decision = null; isSent = "notify"; } } else if(button.equals("openAccess")){ if(processOpenAccessRequest(context,request,requestItem,item,title)){ // se acabo el flujo return null; } }else if(button.equals("back")){ decision=null; contactPerson=null; } else if(button.equals("contactRequester")) { decision=null; isSent=null; contactPerson = "requester"; } else if(button.equals("contactAuthor")) { decision=null; isSent=null; contactPerson = "author"; } Map<String, String> map = new HashMap<String, String>(); map.put("decision", decision); map.put("token", token); map.put("isSent", isSent); map.put("contactPerson", contactPerson); map.put("title", title); map.put("name", request.getParameter("name")); map.put("email",request.getParameter("email")); return map; } private boolean processOpenAccessRequest(Context context,Request request, RequestItem requestItem,Item item,String title) throws SQLException, IOException, MessagingException { String name = request.getParameter("name"); String mail = request.getParameter("email"); if(StringUtils.isNotEmpty(name)&&StringUtils.isNotEmpty(mail)){ RequestItemAuthor requestItemAuthor = new DSpace() .getServiceManager() .getServiceByName(RequestItemAuthorExtractor.class.getName(), RequestItemAuthorExtractor.class) .getRequestItemAuthor(context, item); Email email = Email.getEmail(I18nUtil.getEmailFilename(context.getCurrentLocale(), "request_item.admin")); email.addRecipient(requestItemAuthor.getEmail()); email.addArgument(Bitstream.find(context,requestItem.getBitstreamId()).getName()); email.addArgument(HandleManager.getCanonicalForm(item.getHandle())); email.addArgument(requestItem.getToken()); email.addArgument(name); email.addArgument(mail); email.send(); return true; } return false; } private void processSendDocuments(Context context,Request request, RequestItem requestItem,Item item,String title) throws SQLException, MessagingException, IOException { String message = request.getParameter("message"); String subject = request.getParameter("subject"); Email email = new Email(); email.setSubject(subject); email.setContent("{0}"); email.addRecipient(requestItem.getReqEmail()); email.addArgument(message); if (requestItem.isAllfiles()){ 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.getBitstreamId()); email.addAttachment(BitstreamStorageManager.retrieve(context, requestItem.getBitstreamId()), bit.getName(), bit.getFormat().getMIMEType()); } email.send(); requestItem.setDecision_date(new Date()); requestItem.setAccept_request(true); requestItem.update(context); } private void processDeny(Context context,Request request, RequestItem requestItem,Item item,String title) throws SQLException, IOException, MessagingException { String message = request.getParameter("message"); String subject = request.getParameter("subject"); Email email = new Email(); email.setSubject(subject); email.setContent("{0}"); email.addRecipient(requestItem.getReqEmail()); email.addArgument(message); email.send(); requestItem.setDecision_date(new Date()); requestItem.setAccept_request(false); requestItem.update(context); } /** * Send an email back to the requester, letting them know request is being processed. * Use case is for helpdesk user to contact requester * @param request * @param requestItem * @throws IOException * @throws MessagingException */ private void processContactRequester(Request request, RequestItem requestItem) throws IOException, MessagingException { String message = request.getParameter("message"); String subject = request.getParameter("subject"); Email email = new Email(); email.setSubject(subject); email.setContent("{0}"); email.addRecipient(requestItem.getReqEmail()); email.addArgument(message); email.send(); } /** * Send an email to the author, asking them to consider allowing access. * Use case is for helpdesk user to contact author * @param request * @throws IOException * @throws MessagingException */ private void processContactAuthor(Request request) throws IOException, MessagingException { String message = request.getParameter("message"); String subject = request.getParameter("subject"); Email email = new Email(); email.setSubject(subject); email.setContent("{0}"); email.addRecipient(request.getParameter("toEmail")); email.addArgument(message); email.send(); } }