DS-1945 Add request_message to requestitem DB table

Also, refactored requestitem to be a dspace-api "model", moved all DB logic
from XMLUI regarding this module to the dspace-api model.

Add the requestitem.request_message to display in the contact-author form,
so they can see what the original request message was.
This commit is contained in:
Peter Dietz
2014-05-10 08:20:11 -04:00
parent ce4dea172d
commit 21cb0e0520
11 changed files with 241 additions and 103 deletions

View File

@@ -0,0 +1,152 @@
package org.dspace.app.requestitem;
import org.apache.log4j.Logger;
import org.dspace.core.Context;
import org.dspace.core.Utils;
import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.storage.rdbms.TableRow;
import java.sql.SQLException;
import java.util.Date;
/**
* Object representing an Item Request
*/
public class RequestItem {
private static Logger log = Logger.getLogger(RequestItem.class);
private int bitstreamId, itemID;
private String reqEmail;
private String reqName;
private String reqMessage;
private String token;
private boolean allfiles;
private Date decision_date;
private boolean accept_request;
public RequestItem(int itemID, int bitstreamId, String reqEmail, String reqName, String reqMessage, boolean allfiles){
this.itemID = itemID;
this.bitstreamId = bitstreamId;
this.reqEmail = reqEmail;
this.reqName = reqName;
this.reqMessage = reqMessage;
this.allfiles = allfiles;
}
private RequestItem(TableRow record) {
this.itemID = record.getIntColumn("item_id");
this.bitstreamId = record.getIntColumn("bitstream_id");
this.token = record.getStringColumn("token");
this.reqEmail = record.getStringColumn("request_email");
this.reqName = record.getStringColumn("request_name");
this.reqMessage = record.getStringColumn("request_message");
this.allfiles = record.getBooleanColumn("allfiles");
this.decision_date = record.getDateColumn("decision_date");
this.accept_request = record.getBooleanColumn("accept_request");
}
public static RequestItem findByToken(Context context, String token) {
try {
TableRow requestItem = DatabaseManager.findByUnique(context, "requestitem", "token", token);
return new RequestItem(requestItem);
} catch (SQLException e) {
log.error(e.getMessage());
return null;
}
}
/**
* Save updates to the record. Only accept_request, and decision_date are set-able.
* @param context
*/
public void update(Context context) {
try {
TableRow record = DatabaseManager.findByUnique(context, "requestitem", "token", token);
record.setColumn("accept_request", accept_request);
record.setColumn("decision_date", decision_date);
DatabaseManager.update(context, record);
} catch (SQLException e) {
log.error(e.getMessage());
}
}
/**
* Generate a unique id of the request and put it into the DB
* @param context
* @return
* @throws java.sql.SQLException
*/
public String getNewToken(Context context) throws SQLException
{
TableRow record = DatabaseManager.create(context, "requestitem");
record.setColumn("token", Utils.generateHexKey());
record.setColumn("bitstream_id", bitstreamId);
record.setColumn("item_id", itemID);
record.setColumn("allfiles", allfiles);
record.setColumn("request_email", reqEmail);
record.setColumn("request_name", reqName);
record.setColumn("request_message", reqMessage);
record.setColumnNull("accept_request");
record.setColumn("request_date", new Date());
record.setColumnNull("decision_date");
record.setColumnNull("expires");
DatabaseManager.update(context, record);
if (log.isDebugEnabled())
{
log.debug("Created requestitem_token " + record.getIntColumn("requestitem_id")
+ " with token " + record.getStringColumn("token") + "\"");
}
return record.getStringColumn("token");
}
public boolean isAllfiles() {
return allfiles;
}
public String getReqMessage() {
return reqMessage;
}
public String getReqName() {
return reqName;
}
public String getReqEmail() {
return reqEmail;
}
public String getToken() {
return token;
}
public int getItemID() {
return itemID;
}
public int getBitstreamId() {
return bitstreamId;
}
public Date getDecision_date() {
return decision_date;
}
public void setDecision_date(Date decision_date) {
this.decision_date = decision_date;
}
public boolean isAccept_request() {
return accept_request;
}
public void setAccept_request(boolean accept_request) {
this.accept_request = accept_request;
}
}

View File

@@ -7,6 +7,7 @@ import org.apache.cocoon.util.HashUtil;
import org.apache.excalibur.source.SourceValidity;
import org.apache.excalibur.source.impl.validity.NOPValidity;
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.cocoon.AbstractDSpaceTransformer;
@@ -21,8 +22,6 @@ import org.dspace.content.service.ItemService;
import org.dspace.core.Context;
import org.dspace.core.I18nUtil;
import org.dspace.handle.HandleManager;
import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.storage.rdbms.TableRow;
import org.dspace.utils.DSpace;
import org.xml.sax.SAXException;
@@ -105,10 +104,10 @@ public class ItemRequestContactAuthor extends AbstractDSpaceTransformer implemen
Request request = ObjectModelHelper.getRequest(objectModel);
Context context = ContextUtil.obtainContext(objectModel);
TableRow requestItem = DatabaseManager.findByUnique(context,
"requestitem", "token", (String) request.getAttribute("token"));
String token = (String) request.getAttribute("token");
RequestItem requestItem = RequestItem.findByToken(context, token);
Item item = Item.find(context, requestItem.getIntColumn("item_id"));
Item item = Item.find(context, requestItem.getItemID());
RequestItemAuthor requestItemAuthor = new DSpace()
.getServiceManager()
@@ -122,9 +121,9 @@ public class ItemRequestContactAuthor extends AbstractDSpaceTransformer implemen
HandleManager.getCanonicalForm(item.getHandle()),
requestItemAuthor.getFullName(),
requestItemAuthor.getEmail(),
requestItem.getStringColumn("request_name"),
requestItem.getStringColumn("request_email"),
"Not Yet Implemented"
requestItem.getReqName(),
requestItem.getReqEmail(),
requestItem.getReqMessage()
};
String subject = I18nUtil.getMessage("itemRequest.response.subject.contactAuthor");

View File

@@ -6,7 +6,7 @@ import org.apache.cocoon.environment.Request;
import org.apache.cocoon.util.HashUtil;
import org.apache.excalibur.source.SourceValidity;
import org.apache.excalibur.source.impl.validity.NOPValidity;
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.cocoon.AbstractDSpaceTransformer;
@@ -19,8 +19,6 @@ import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Item;
import org.dspace.core.Context;
import org.dspace.core.I18nUtil;
import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.storage.rdbms.TableRow;
import org.dspace.utils.DSpace;
import org.xml.sax.SAXException;
@@ -34,8 +32,6 @@ import java.text.MessageFormat;
*/
public class ItemRequestContactRequester extends AbstractDSpaceTransformer implements CacheableProcessingComponent
{
//private static Logger log = Logger.getLogger(ItemRequestContactRequester.class);
/** Language Strings */
private static final Message T_title =
message("xmlui.ArtifactBrowser.ItemRequestContactRequester.title");
@@ -103,10 +99,10 @@ public class ItemRequestContactRequester extends AbstractDSpaceTransformer imple
Request request = ObjectModelHelper.getRequest(objectModel);
Context context = ContextUtil.obtainContext(objectModel);
TableRow requestItem = DatabaseManager.findByUnique(context,
"requestitem", "token", (String) request.getAttribute("token"));
String token = (String) request.getAttribute("token");
RequestItem requestItem = RequestItem.findByToken(context, token);
Item item = Item.find(context, requestItem.getIntColumn("item_id"));
Item item = Item.find(context, requestItem.getItemID());
RequestItemAuthor requestItemAuthor = new DSpace()
.getServiceManager()
@@ -115,7 +111,7 @@ public class ItemRequestContactRequester extends AbstractDSpaceTransformer imple
.getRequestItemAuthor(context, item);
Object[] args = new String[]{
requestItem.getStringColumn("request_name"),
requestItem.getReqName(),
requestItemAuthor.getFullName(),
requestItemAuthor.getEmail()
};
@@ -133,7 +129,7 @@ public class ItemRequestContactRequester extends AbstractDSpaceTransformer imple
Text toEmail = form.addItem().addText("to");
toEmail.setLabel(T_toEmail);
toEmail.setValue(requestItem.getStringColumn("request_email"));
toEmail.setValue(requestItem.getReqEmail());
toEmail.setDisabled(true);
Text subj = form.addItem().addText("subject");

View File

@@ -15,6 +15,7 @@ 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;
@@ -27,8 +28,6 @@ import org.dspace.core.Email;
import org.dspace.core.I18nUtil;
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;
@@ -67,9 +66,9 @@ public class ItemRequestResponseAction extends AbstractAction
Context context = ContextUtil.obtainContext(objectModel);
request.setAttribute("token", token);
TableRow requestItem = DatabaseManager.findByUnique(context, "requestitem", "token", token);
RequestItem requestItem = RequestItem.findByToken(context, token);
String title;
Item item = Item.find(context, requestItem.getIntColumn("item_id"));
Item item = Item.find(context, requestItem.getItemID());
DCValue[] titleDC = item.getDC("title", null, Item.ANY);
if (titleDC != null || titleDC.length > 0)
title=titleDC[0].value;
@@ -149,7 +148,7 @@ public class ItemRequestResponseAction extends AbstractAction
private boolean processOpenAccessRequest(Context context,Request request, TableRow requestItem,Item item,String title) throws SQLException, IOException, MessagingException {
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");
@@ -163,9 +162,9 @@ public class ItemRequestResponseAction extends AbstractAction
Email email = Email.getEmail(I18nUtil.getEmailFilename(context.getCurrentLocale(), "request_item.admin"));
email.addRecipient(requestItemAuthor.getEmail());
email.addArgument(Bitstream.find(context,requestItem.getIntColumn("bitstream_id")).getName());
email.addArgument(Bitstream.find(context,requestItem.getBitstreamId()).getName());
email.addArgument(HandleManager.getCanonicalForm(item.getHandle()));
email.addArgument(requestItem.getStringColumn("token"));
email.addArgument(requestItem.getToken());
email.addArgument(name);
email.addArgument(mail);
@@ -175,17 +174,17 @@ public class ItemRequestResponseAction extends AbstractAction
return false;
}
private void processSendDocuments(Context context,Request request, TableRow requestItem,Item item,String title) throws SQLException, MessagingException, IOException {
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.getStringColumn("request_email"));
email.addRecipient(requestItem.getReqEmail());
email.addArgument(message);
if (requestItem.getBooleanColumn("allfiles")){
if (requestItem.isAllfiles()){
Bundle[] bundles = item.getBundles("ORIGINAL");
for (int i = 0; i < bundles.length; i++){
Bitstream[] bitstreams = bundles[i].getBitstreams();
@@ -196,30 +195,31 @@ public class ItemRequestResponseAction extends AbstractAction
}
}
} else {
Bitstream bit = Bitstream.find(context,requestItem.getIntColumn("bitstream_id"));
email.addAttachment(BitstreamStorageManager.retrieve(context, requestItem.getIntColumn("bitstream_id")), bit.getName(), bit.getFormat().getMIMEType());
Bitstream bit = Bitstream.find(context,requestItem.getBitstreamId());
email.addAttachment(BitstreamStorageManager.retrieve(context, requestItem.getBitstreamId()), bit.getName(), bit.getFormat().getMIMEType());
}
email.send();
requestItem.setColumn("decision_date",new Date());
requestItem.setColumn("accept_request",true);
DatabaseManager.update(context, requestItem);
requestItem.setDecision_date(new Date());
requestItem.setAccept_request(true);
requestItem.update(context);
}
private void processDeny(Context context,Request request, TableRow requestItem,Item item,String title) throws SQLException, IOException, MessagingException {
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.getStringColumn("request_email"));
email.addRecipient(requestItem.getReqEmail());
email.addArgument(message);
email.send();
requestItem.setColumn("decision_date",new Date());
requestItem.setColumn("accept_request",false);
DatabaseManager.update(context, requestItem);
requestItem.setDecision_date(new Date());
requestItem.setAccept_request(false);
requestItem.update(context);
}
/**
@@ -230,14 +230,14 @@ public class ItemRequestResponseAction extends AbstractAction
* @throws IOException
* @throws MessagingException
*/
private void processContactRequester(Request request, TableRow requestItem) throws IOException, 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.getStringColumn("request_email"));
email.addRecipient(requestItem.getReqEmail());
email.addArgument(message);
email.send();

View File

@@ -18,6 +18,7 @@ import org.apache.cocoon.environment.Request;
import org.apache.cocoon.util.HashUtil;
import org.apache.excalibur.source.SourceValidity;
import org.apache.excalibur.source.impl.validity.NOPValidity;
import org.dspace.app.requestitem.RequestItem;
import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.utils.ContextUtil;
import org.dspace.app.xmlui.utils.HandleUtil;
@@ -39,8 +40,6 @@ import org.dspace.core.Context;
import org.dspace.core.I18nUtil;
import org.dspace.eperson.EPerson;
import org.dspace.handle.HandleManager;
import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.storage.rdbms.TableRow;
import org.xml.sax.SAXException;
/**
@@ -116,10 +115,11 @@ public class ItemRequestResponseFalseForm extends AbstractDSpaceTransformer impl
Request request = ObjectModelHelper.getRequest(objectModel);
Context context = ContextUtil.obtainContext(objectModel);
TableRow requestItem = DatabaseManager.findByUnique(context,
"requestitem", "token", (String) request.getAttribute("token"));
String token = (String) request.getAttribute("token");
RequestItem requestItem = RequestItem.findByToken(context, token);
String title;
Item item = Item.find(context, requestItem.getIntColumn("item_id"));
Item item = Item.find(context, requestItem.getItemID());
DCValue[] titleDC = item.getDC("title", null, Item.ANY);
if (titleDC != null || titleDC.length > 0)
title = titleDC[0].value;
@@ -129,7 +129,7 @@ public class ItemRequestResponseFalseForm extends AbstractDSpaceTransformer impl
EPerson submitter = item.getSubmitter();
Object[] args = new String[]{
requestItem.getStringColumn("request_name"),
requestItem.getReqName(),
HandleManager.getCanonicalForm(item.getHandle()), // User
title, // request item title
submitter.getFullName(), // # submmiter name

View File

@@ -18,6 +18,7 @@ import org.apache.cocoon.environment.Request;
import org.apache.cocoon.util.HashUtil;
import org.apache.excalibur.source.SourceValidity;
import org.apache.excalibur.source.impl.validity.NOPValidity;
import org.dspace.app.requestitem.RequestItem;
import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.utils.ContextUtil;
import org.dspace.app.xmlui.utils.UIException;
@@ -113,10 +114,11 @@ public class ItemRequestResponseTrueForm extends AbstractDSpaceTransformer imple
Request request = ObjectModelHelper.getRequest(objectModel);
Context context = ContextUtil.obtainContext(objectModel);
TableRow requestItem = DatabaseManager.findByUnique(context,
"requestitem", "token", (String) request.getAttribute("token"));
String token = (String) request.getAttribute("token");
RequestItem requestItem = RequestItem.findByToken(context, token);
String title;
Item item = Item.find(context, requestItem.getIntColumn("item_id"));
Item item = Item.find(context, requestItem.getItemID());
DCValue[] titleDC = item.getDC("title", null, Item.ANY);
if (titleDC != null || titleDC.length > 0)
title = titleDC[0].value;
@@ -126,7 +128,7 @@ public class ItemRequestResponseTrueForm extends AbstractDSpaceTransformer imple
EPerson submitter = item.getSubmitter();
Object[] args = new String[]{
requestItem.getStringColumn("request_name"),
requestItem.getReqName(),
HandleManager.getCanonicalForm(item.getHandle()), // User
title, // request item title
submitter.getFullName(), // # submmiter name

View File

@@ -20,6 +20,7 @@ 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;
@@ -112,6 +113,8 @@ public class SendItemRequestAction extends AbstractAction
RequestItemAuthorExtractor.class)
.getRequestItemAuthor(context, item);
RequestItem requestItem = new RequestItem(item.getID(), Integer.parseInt(bitstreamId), requesterEmail, requesterName, message, Boolean.getBoolean(allFiles));
// All data is there, send the email
Email email = Email.getEmail(I18nUtil.getEmailFilename(context.getCurrentLocale(), "request_item.author"));
email.addRecipient(requestItemAuthor.getEmail());
@@ -122,7 +125,7 @@ public class SendItemRequestAction extends AbstractAction
email.addArgument(HandleManager.getCanonicalForm(item.getHandle()));
email.addArgument(title); // request item title
email.addArgument(message); // message
email.addArgument(getLinkTokenEmail(context,request, bitstreamId, item.getID(), requesterEmail, requesterName, Boolean.parseBoolean(allFiles)));
email.addArgument(getLinkTokenEmail(context,requestItem));
email.addArgument(requestItemAuthor.getFullName()); // corresponding author name
email.addArgument(requestItemAuthor.getEmail()); // corresponding author email
email.addArgument(ConfigurationManager.getProperty("dspace.name"));
@@ -137,62 +140,22 @@ public class SendItemRequestAction extends AbstractAction
/**
* Get the link to the author in RequestLink email.
*
* @param email
* The email address to mail to
*
* @exception SQLExeption
*
* @param context
* @param requestItem
* @return
* @throws SQLException
*/
protected String getLinkTokenEmail(Context context,Request request, String bitstreamId
, int itemID, String reqEmail, String reqName, boolean allfiles)
protected String getLinkTokenEmail(Context context, RequestItem requestItem)
throws SQLException
{
String base = ConfigurationManager.getProperty("dspace.url");
request.getPathInfo();
String specialLink = (new StringBuffer()).append(base).append(
base.endsWith("/") ? "" : "/").append(
"itemRequestResponse/").append(getNewToken(context, Integer.parseInt(bitstreamId), itemID, reqEmail, reqName, allfiles))
"itemRequestResponse/").append(requestItem.getNewToken(context))
.toString()+"/";
return specialLink;
}
/**
* Generate a unique id of the request and put it into the ddbb
* @param context
* @param bitstreamId
* @param itemID
* @param reqEmail
* @param reqName
* @param allfiles
* @return
* @throws SQLException
*/
protected String getNewToken(Context context, int bitstreamId, int itemID, String reqEmail, String reqName, boolean allfiles) throws SQLException
{
TableRow rd = DatabaseManager.create(context, "requestitem");
rd.setColumn("token", Utils.generateHexKey());
rd.setColumn("bitstream_id", bitstreamId);
rd.setColumn("item_id",itemID);
rd.setColumn("allfiles", allfiles);
rd.setColumn("request_email", reqEmail);
rd.setColumn("request_name", reqName);
rd.setColumnNull("accept_request");
rd.setColumn("request_date", new Date());
rd.setColumnNull("decision_date");
rd.setColumnNull("expires");
DatabaseManager.update(context, rd);
if (log.isDebugEnabled())
{
log.debug("Created requestitem_token "
+ rd.getIntColumn("requestitem_id")
+ " with token " + rd.getStringColumn("token")
+ "\"");
}
return rd.getStringColumn("token");
}
}

View File

@@ -788,6 +788,7 @@ CREATE TABLE requestitem
allfiles NUMBER(1),
request_email VARCHAR2(64),
request_name VARCHAR2(64),
request_message TEXT,
request_date TIMESTAMP,
accept_request NUMBER(1),
decision_date TIMESTAMP,

View File

@@ -0,0 +1,12 @@
-- http://www.dspace.org/license/
-- SQL commands to upgrade the ORACLE database schema from DSpace 4.x to 5.x
-- DUMP YOUR DATABASE FIRST. DUMP YOUR DATABASE FIRST. DUMP YOUR DATABASE FIRST. DUMP YOUR DATABASE FIRST.
START TRANSACTION;
------------------------------------------------------
-- DS-1945 RequestItem Helpdesk, store request message
------------------------------------------------------
ALTER TABLE requestitem ADD request_message TEXT;
COMMIT;

View File

@@ -836,6 +836,7 @@ CREATE TABLE requestitem
allfiles bool,
request_email varchar(64),
request_name varchar(64),
request_message TEXT,
request_date timestamp,
accept_request bool,
decision_date timestamp,

View File

@@ -0,0 +1,12 @@
-- http://www.dspace.org/license/
-- SQL commands to upgrade the Postgres database schema from DSpace 4.x to 5.x
-- DUMP YOUR DATABASE FIRST. DUMP YOUR DATABASE FIRST. DUMP YOUR DATABASE FIRST. DUMP YOUR DATABASE FIRST.
BEGIN;
------------------------------------------------------
-- DS-1945 RequestItem Helpdesk, store request message
------------------------------------------------------
ALTER TABLE requestitem ADD request_message TEXT;
COMMIT;