/**
* 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.discovery.recentSubmissions;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
import org.apache.cocoon.environment.SourceResolver;
import org.dspace.app.util.Util;
import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.utils.HandleUtil;
import org.dspace.app.xmlui.utils.UIException;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.element.*;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Site;
import org.dspace.core.ConfigurationManager;
import org.dspace.discovery.DiscoverResult;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Map;
/**
* Transformer that renders recent submissions with a paging option to traverse them
*
* @author Kevin Van de Velde (kevin at atmire dot com)
*/
public class RecentSubmissionTransformer extends AbstractDSpaceTransformer {
protected static final Message T_dspace_home = message("xmlui.general.dspace_home");
protected static final Message T_untitled = message("xmlui.general.untitled");
protected static final Message T_head = message("xmlui.Discovery.RecentSubmissions.RecentSubmissionTransformer.head");
protected static final Message T_recent_submission_head = message("xmlui.Discovery.RecentSubmissions.RecentSubmissionTransformer.recent.head");
protected static final Message T_trail = message("xmlui.Discovery.RecentSubmissions.RecentSubmissionTransformer.trail");
protected boolean isHomePage = false;
@Override
public void setup(SourceResolver resolver, Map objectModel, String src, Parameters parameters) throws ProcessingException, SAXException, IOException {
super.setup(resolver, objectModel, src, parameters);
isHomePage = parameters.getParameterAsBoolean("isHomePage", false);
}
@Override
public void addPageMeta(PageMeta pageMeta) throws SAXException, WingException, UIException, SQLException, IOException, AuthorizeException {
DSpaceObject dso = getDSpaceObject();
// Set up the major variables
// Set the page title
String name = dso.getName();
Metadata titlePageMeta = pageMeta.addMetadata("title");
if (name == null || name.length() == 0)
{
if(isHomePage){
titlePageMeta.addContent(T_untitled);
}else{
titlePageMeta.addContent(T_recent_submission_head.parameterize(name));
}
}
else
{
if(isHomePage){
titlePageMeta.addContent(name);
}else{
titlePageMeta.addContent(T_recent_submission_head.parameterize(name));
}
}
// Add the trail back to the repository root.
pageMeta.addTrailLink(contextPath + "/",T_dspace_home);
HandleUtil.buildHandleTrail(dso, pageMeta,contextPath, !isHomePage);
if(!isHomePage)
{
//Add a trail link indicating that we are on a recent submissions page
pageMeta.addTrail().addContent(T_trail);
}
/**
* If we are on a home page add the feeds (if enabled)
*/
if(isHomePage)
{
// Add RSS links if available
String formats = ConfigurationManager.getProperty("webui.feed.formats");
if ( formats != null )
{
for (String format : formats.split(","))
{
// Remove the protocol number, i.e. just list 'rss' or' atom'
String[] parts = format.split("_");
if (parts.length < 1)
{
continue;
}
String feedFormat = parts[0].trim()+"+xml";
String feedURL = contextPath+"/feed/"+format.trim()+"/"+dso.getHandle();
pageMeta.addMetadata("feed", feedFormat).addContent(feedURL);
}
}
}
}
@Override
public void addBody(Body body) throws SAXException, WingException, SQLException, IOException, AuthorizeException, ProcessingException {
Request request = ObjectModelHelper.getRequest(objectModel);
DSpaceObject dso = getDSpaceObject();
Division mainDivision = body.addDivision("main-recent-submissions");
setMainTitle(dso, mainDivision);
Division recentSubmissionDivision = mainDivision.addDivision("recent-submissions");
if(isHomePage){
recentSubmissionDivision.setHead(T_recent_submission_head);
}
DiscoverResult recentlySubmittedItems = RecentSubmissionUtils.getRecentlySubmittedItems(context, dso, getOffset(request));
setPagination(request, dso, recentSubmissionDivision, recentlySubmittedItems);
ReferenceSet lastSubmitted = recentSubmissionDivision.addReferenceSet(
"last-submitted", ReferenceSet.TYPE_SUMMARY_LIST,
null, "recent-submissions");
for (DSpaceObject resultObject : recentlySubmittedItems.getDspaceObjects()) {
if(resultObject != null){
lastSubmitted.addReference(resultObject);
}
}
}
protected void setPagination(Request request, DSpaceObject dso, Division mainDivision, DiscoverResult recentlySubmittedItems) {
int offset = getOffset(request);
int rpp = RecentSubmissionUtils.getRecentSubmissionConfiguration(dso).getMax();
int firstIndex = offset + 1;
int lastIndex = offset + recentlySubmittedItems.getDspaceObjects().size();
mainDivision.setSimplePagination((int) recentlySubmittedItems.getTotalSearchResults(), firstIndex,
lastIndex, getPreviousPageURL(dso, offset, rpp), getNextPageURL(dso, offset, rpp, (int) recentlySubmittedItems.getTotalSearchResults()));
}
protected void setMainTitle(DSpaceObject dso, Division mainDivision) throws WingException {
String title = dso.getName();
if(isHomePage)
{
mainDivision.setHead(title);
}else{
//We are not acting as home page so use a message
mainDivision.setHead(T_head.parameterize(title));
}
}
protected String getNextPageURL(DSpaceObject dso, int currentOffset, int rpp, int total){
if((rpp + currentOffset) < total)
{
return getBaseUrl(dso) + "?offset=" + (rpp + currentOffset);
}else{
return null;
}
}
protected String getPreviousPageURL(DSpaceObject dso, int currentOffset, int rpp) {
if((currentOffset - rpp) < 0){
return null;
}else{
return getBaseUrl(dso) + "?offset=" + (currentOffset - rpp);
}
}
protected String getBaseUrl(DSpaceObject dso)
{
String url = contextPath;
if(dso != null && dso.getID() != Site.SITE_ID)
{
url += "/handle/" + dso.getHandle();
}
if(!isHomePage)
{
url += "/recent-submissions";
}
return url;
}
protected int getOffset(Request request) {
int start = Util.getIntParameter(request, "offset");
if(start == -1){
start = 0;
}
return start;
}
protected DSpaceObject getDSpaceObject() throws SQLException {
DSpaceObject dso = HandleUtil.obtainHandle(objectModel);
if(dso == null)
{
return Site.find(context, Site.SITE_ID);
}else{
return dso;
}
}
}