/**
* 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.versioning;
import org.dspace.content.Collection;
import org.dspace.content.DCDate;
import org.dspace.content.Metadatum;
import org.dspace.content.Item;
import org.dspace.core.Context;
import org.springframework.beans.factory.annotation.Required;
import java.sql.SQLException;
import java.util.Date;
/**
*
*
* @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 VersioningServiceImpl implements VersioningService{
private VersionHistoryDAO versionHistoryDAO;
private VersionDAO versionDAO;
private DefaultItemVersionProvider provider;
/** Service Methods */
public Version createNewVersion(Context c, int itemId){
return createNewVersion(c, itemId, null);
}
public Version createNewVersion(Context c, int itemId, String summary) {
try{
Item item = Item.find(c, itemId);
VersionHistory vh = versionHistoryDAO.find(c, item.getID(), versionDAO);
if(vh==null)
{
// first time: create 2 versions, .1(old version) and .2(new version)
vh=versionHistoryDAO.create(c);
// get dc:date.accessioned to be set as first version date...
Metadatum[] values = item.getMetadata("dc", "date", "accessioned", Item.ANY);
Date versionDate = new Date();
if(values!=null && values.length > 0){
String date = values[0].value;
versionDate = new DCDate(date).toDate();
}
createVersion(c, vh, item, "", versionDate);
}
// Create new Item
Item itemNew = provider.createNewItemAndAddItInWorkspace(c, item);
// create new version
Version version = createVersion(c, vh, itemNew, summary, new Date());
// Complete any update of the Item and new Identifier generation that needs to happen
provider.updateItemState(c, itemNew, item);
return version;
}catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
public void removeVersion(Context c, int versionID) {
Version version = versionDAO.find(c, versionID);
if(version!=null){
removeVersion(c, version);
}
}
public void removeVersion(Context c, Item item) {
Version version = versionDAO.findByItem(c, item);
if(version!=null){
removeVersion(c, version);
}
}
protected void removeVersion(Context c, Version version) {
try{
VersionHistory history = versionHistoryDAO.findById(c, version.getVersionHistoryID(), versionDAO);
provider.deleteVersionedItem(c, version, history);
versionDAO.delete(c, version.getVersionId());
history.remove(version);
if(history.isEmpty()){
versionHistoryDAO.delete(c, version.getVersionHistoryID(), versionDAO);
}
//Delete the item linked to the version
Item item = version.getItem();
Collection[] collections = item.getCollections();
// Remove item from all the collections it's in (so our item is also deleted)
for (Collection collection : collections)
{
collection.removeItem(item);
}
}catch (Exception e) {
c.abort();
throw new RuntimeException(e.getMessage(), e);
}
}
public Version getVersion(Context c, int versionID) {
return versionDAO.find(c, versionID);
}
public Version restoreVersion(Context c, int versionID){
return restoreVersion(c, versionID, null);
}
public Version restoreVersion(Context c, int versionID, String summary) {
return null;
}
public VersionHistory findVersionHistory(Context c, int itemId){
return versionHistoryDAO.find(c, itemId, versionDAO);
}
public Version updateVersion(Context c, int itemId, String summary) {
VersionImpl version = versionDAO.findByItemId(c, itemId);
version.setSummary(summary);
versionDAO.update(version);
return version;
}
public Version getVersion(Context c, Item item){
return versionDAO.findByItemId(c, item.getID());
}
// **** PROTECTED METHODS!!
protected VersionImpl createVersion(Context c, VersionHistory vh, Item item, String summary, Date date) {
try {
VersionImpl version = versionDAO.create(c);
version.setVersionNumber(getNextVersionNumer(vh.getLatestVersion()));
version.setVersionDate(date);
version.setEperson(item.getSubmitter());
version.setItemID(item.getID());
version.setSummary(summary);
version.setVersionHistory(vh.getVersionHistoryId());
versionDAO.update(version);
vh.add(version);
return version;
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
protected int getNextVersionNumer(Version latest){
if(latest==null) return 1;
return latest.getVersionNumber()+1;
}
public VersionHistoryDAO getVersionHistoryDAO() {
return versionHistoryDAO;
}
public void setVersionHistoryDAO(VersionHistoryDAO versionHistoryDAO) {
this.versionHistoryDAO = versionHistoryDAO;
}
public VersionDAO getVersionDAO() {
return versionDAO;
}
public void setVersionDAO(VersionDAO versionDAO) {
this.versionDAO = versionDAO;
}
@Required
public void setProvider(DefaultItemVersionProvider provider) {
this.provider = provider;
}
}