/**
* 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.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.*;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.AuthorizeManager;
import org.dspace.content.*;
import org.dspace.content.Item;
import org.dspace.core.ConfigurationManager;
import org.dspace.eperson.EPerson;
import org.dspace.utils.DSpace;
import org.dspace.versioning.Version;
import org.dspace.versioning.VersionHistory;
import org.dspace.versioning.VersioningService;
import org.dspace.workflow.WorkflowItem;
import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem;
import java.sql.SQLException;
/**
*
*
* @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 VersionHistoryForm extends AbstractDSpaceTransformer {
/** Language strings */
private static final Message T_head2 = message("xmlui.aspect.versioning.VersionHistoryForm.head2");
private static final Message T_column1 = message("xmlui.aspect.versioning.VersionHistoryForm.column1");
private static final Message T_column2 = message("xmlui.aspect.versioning.VersionHistoryForm.column2");
private static final Message T_column3 = message("xmlui.aspect.versioning.VersionHistoryForm.column3");
private static final Message T_column4 = message("xmlui.aspect.versioning.VersionHistoryForm.column4");
private static final Message T_column5 = message("xmlui.aspect.versioning.VersionHistoryForm.column5");
private static final Message T_column6 = message("xmlui.aspect.versioning.VersionHistoryForm.column6");
private static final Message T_submit_update = message("xmlui.aspect.versioning.VersionHistoryForm.update");
private static final Message T_submit_cancel = message("xmlui.aspect.versioning.VersionHistoryForm.return");
private static final Message T_submit_delete = message("xmlui.aspect.versioning.VersionHistoryForm.delete");
private static final Message T_legend = message("xmlui.aspect.versioning.VersionHistoryForm.legend");
public void addBody(Body body) throws WingException, SQLException, AuthorizeException
{
boolean isItemView=parameters.getParameterAsInteger("itemID",-1) == -1;
Item item = getItem();
if(item==null || !AuthorizeManager.isAdmin(this.context, item.getOwningCollection()))
{
if(isItemView)
{
//Check if only administrators can view the item history
if(new DSpace().getConfigurationService().getPropertyAsType("versioning.item.history.view.admin", false))
{
return;
}
}else{
//Only admins can delete versions
throw new AuthorizeException();
}
}
VersionHistory versionHistory = retrieveVersionHistory(item);
if(versionHistory!=null)
{
Division main = createMain(body);
createTable(main, versionHistory, isItemView, item);
if(!isItemView)
{
addButtons(main, versionHistory);
main.addHidden("versioning-continue").setValue(knot.getId());
}
Para note = main.addPara();
note.addContent(T_legend);
}
}
private Item getItem() throws WingException
{
try
{
if(parameters.getParameterAsInteger("itemID",-1) == -1)
{
DSpaceObject dso;
dso = HandleUtil.obtainHandle(objectModel);
if (!(dso instanceof Item))
{
return null;
}
return (Item) dso;
}else{
return Item.find(context, parameters.getParameterAsInteger("itemID", -1));
}
} catch (SQLException e) {
throw new WingException(e);
}
}
private VersionHistory retrieveVersionHistory(Item item) throws WingException
{
VersioningService versioningService = new DSpace().getSingletonService(VersioningService.class);
return versioningService.findVersionHistory(context, item.getID());
}
private Division createMain(Body body) throws WingException
{
Division main = body.addInteractiveDivision("view-verion-history", contextPath+"/item/versionhistory", Division.METHOD_POST, "view version history");
main.setHead(T_head2);
return main;
}
private void createTable(Division main, VersionHistory history, boolean isItemView, Item item) throws WingException, SQLException
{
Table table = main.addTable("versionhistory", 1, 1);
Row header = table.addRow(Row.ROLE_HEADER);
if(!isItemView)
{
header.addCell().addContent("");
}
header.addCell().addContent(T_column1);
header.addCell().addContent(T_column2);
header.addCell().addContent(T_column3);
header.addCell().addContent(T_column4);
header.addCell().addContent(T_column5);
if(!isItemView)
{
header.addCell().addContent(T_column6);
}
if(history != null)
{
for(Version version : history.getVersions())
{
//Skip items currently in submission
if(isItemInSubmission(version.getItem()))
{
continue;
}
Row row = table.addRow(null, Row.ROLE_DATA,"metadata-value");
if(!isItemView)
{
CheckBox remove = row.addCell().addCheckBox("remove");
remove.setLabel("remove");
remove.addOption(version.getVersionId());
}
row.addCell().addContent(version.getVersionNumber());
addItemIdentifier(row.addCell(), item, version);
EPerson editor = version.getEperson();
row.addCell().addXref("mailto:" + editor.getEmail(), editor.getFullName());
row.addCell().addContent(new DCDate(version.getVersionDate()).toString());
row.addCell().addContent(version.getSummary());
if(!isItemView)
{
row.addCell().addXref(contextPath + "/item/versionhistory?versioning-continue="+knot.getId()+"&versionID="+version.getVersionId() +"&itemID="+ version.getItem().getID() + "&submit_update", T_submit_update);
}
}
}
}
private boolean isItemInSubmission(Item item) throws SQLException
{
WorkspaceItem workspaceItem = WorkspaceItem.findByItem(context, item);
InProgressSubmission workflowItem;
if(ConfigurationManager.getProperty("workflow", "workflow.framework").equals("xmlworkflow"))
{
workflowItem = XmlWorkflowItem.findByItem(context, item);
}else{
workflowItem = WorkflowItem.findByItem(context, item);
}
return workspaceItem != null || workflowItem != null;
}
private void addItemIdentifier(Cell cell, Item item, Version version) throws WingException
{
String itemHandle = version.getItem().getHandle();
Metadatum[] identifiers = version.getItem().getMetadata(MetadataSchema.DC_SCHEMA, "identifier", null, Item.ANY);
String itemIdentifier=null;
if(identifiers!=null && identifiers.length > 0)
{
itemIdentifier = identifiers[0].value;
}
if(itemIdentifier!=null)
{
cell.addXref(contextPath + "/resource/" + itemIdentifier, itemIdentifier);
}else{
cell.addXref(contextPath + "/handle/" + itemHandle, itemHandle);
}
if(item.getID()==version.getItemID())
{
cell.addContent("*");
}
}
private void addButtons(Division main, VersionHistory history) throws WingException {
Para actions = main.addPara();
if(history!=null && history.getVersions().size() > 0)
{
actions.addButton("submit_delete").setValue(T_submit_delete);
}
actions.addButton("submit_cancel").setValue(T_submit_cancel);
}
}