/**
* 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.versioning;
import org.apache.cocoon.ProcessingException;
import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.utils.HandleUtil;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.element.Body;
import org.dspace.app.xmlui.wing.element.Division;
import org.dspace.app.xmlui.wing.element.Para;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.AuthorizeManager;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.handle.HandleManager;
import org.dspace.utils.DSpace;
import org.dspace.versioning.Version;
import org.dspace.versioning.VersionHistory;
import org.dspace.versioning.VersioningService;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
/**
* Adds a notice to item page in the following conditions
* A new version of an item is available
* If the person is an admin an message will also be shown if the item has a new version in the workflow
*
* @author Fabio Bolognesi (fabio at atmire dot com)
* @author Mark Diggory (markd at atmire dot com)
* @author Ben Bosman (ben at atmire dot com)
*
*/
public class VersionNoticeTransformer extends AbstractDSpaceTransformer {
private static final Message T_new_version_head = message("xmlui.aspect.versioning.VersionNoticeTransformer.notice.new_version_head");
private static final Message T_new_version_help = message("xmlui.aspect.versioning.VersionNoticeTransformer.notice.new_version_help");
private static final Message T_workflow_version_head = message("xmlui.aspect.versioning.VersionNoticeTransformer.notice.workflow_version_head");
private static final Message T_workflow_version_help = message("xmlui.aspect.versioning.VersionNoticeTransformer.notice.workflow_version_help");
@Override
public void addBody(Body body) throws SAXException, WingException, SQLException, IOException, AuthorizeException, ProcessingException {
DSpaceObject dso = HandleUtil.obtainHandle(objectModel);
if (!(dso instanceof Item))
{
return;
}
Item item = (Item) dso;
if(item.isWithdrawn())
{
return;
}
//Always add a placeholder in which the item information can be added !
Division mainDivision = body.addDivision("item-view","primary");
String title = item.getName();
if(title != null)
{
mainDivision.setHead(title);
}else{
mainDivision.setHead(item.getHandle());
}
//Check if we have a history for the item
VersioningService versioningService = new DSpace().getSingletonService(VersioningService.class);
VersionHistory history = versioningService.findVersionHistory(context, item.getID());
if(history != null){
Version latestVersion = retrieveLatestVersion(history, item);
if(latestVersion != null && latestVersion.getItemID() != item.getID())
{
//We have a newer version
Item latestVersionItem = latestVersion.getItem();
if(latestVersionItem.isArchived())
{
//Available, add a link for the user alerting him that a new version is available
addVersionNotice(mainDivision, latestVersionItem, T_new_version_head, T_new_version_help, true);
}else{
//We might be dealing with a workflow/workspace item
addVersionNotice(mainDivision, latestVersionItem, T_workflow_version_head, T_workflow_version_help, false);
}
}
}
}
private Version retrieveLatestVersion(VersionHistory history, Item item) throws SQLException {
//Attempt to retrieve the latest version
List<Version> allVersions = history.getVersions();
for (Version version : allVersions) {
if (version.getItem().isArchived() || AuthorizeManager.isAdmin(context, item.getOwningCollection()))
{
return version;
}
}
return null;
}
protected void addVersionNotice(Division division, Item item, Message head, Message content, boolean addItemUrl) throws WingException, SQLException
{
Division noticeDiv = division.addDivision("general-message", "version-notice notice neutral");
noticeDiv.setHead(head);
Para para = noticeDiv.addPara();
para.addContent(content);
if(addItemUrl)
{
String url = HandleManager.resolveToURL(context, item.getHandle());
para.addXref(url, url);
}
}
}