/**
* 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.Item;
import org.dspace.core.Context;
import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.storage.rdbms.TableRow;
import org.dspace.storage.rdbms.TableRowIterator;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
*
*
* @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 VersionDAO
{
protected final static String TABLE_NAME = "versionitem";
protected final static String VERSION_ID = "versionitem_id";
protected final static String ITEM_ID = "item_id";
protected final static String VERSION_NUMBER = "version_number";
protected final static String EPERSON_ID = "eperson_id";
protected final static String VERSION_DATE = "version_date";
protected final static String VERSION_SUMMARY = "version_summary";
protected final static String HISTORY_ID = "versionhistory_id";
public VersionImpl find(Context context, int id) {
try
{
TableRow row = DatabaseManager.findByUnique(context, TABLE_NAME, VERSION_ID, id);
if (row == null)
{
return null;
}
return new VersionImpl(context, row);
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
public VersionImpl findByItem(Context c, Item item) {
return findByItemId(c, item.getID());
}
public VersionImpl findByItemId(Context context, int itemId) {
try {
if (itemId == 0 || itemId == -1)
{
return null;
}
VersionImpl fromCache = (VersionImpl) context.fromCache(VersionImpl.class, itemId);
if (fromCache != null)
{
return fromCache;
}
TableRow row = DatabaseManager.findByUnique(context, TABLE_NAME, ITEM_ID, itemId);
if (row == null)
{
return null;
}
return new VersionImpl(context, row);
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
public List<Version> findByVersionHistory(Context context, int versionHistoryId) {
TableRowIterator tri = null;
try {
tri = DatabaseManager.query(context, "SELECT * FROM " + TABLE_NAME + " where " + HISTORY_ID + "=" + versionHistoryId + " order by " + VERSION_NUMBER + " desc");
List<Version> versions = new ArrayList<Version>();
while (tri.hasNext())
{
TableRow tr = tri.next();
VersionImpl fromCache = (VersionImpl) context.fromCache(VersionImpl.class, tr.getIntColumn(VERSION_ID));
if (fromCache != null)
{
versions.add(fromCache);
}else{
versions.add(new VersionImpl(context, tr));
}
}
return versions;
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
} finally {
if (tri != null)
{
tri.close();
}
}
}
public VersionImpl create(Context context) {
try {
TableRow row = DatabaseManager.create(context, TABLE_NAME);
VersionImpl v = new VersionImpl(context, row);
//TODO Do I have to manage the event?
//context.addEvent(new Event(Event.CREATE, Constants.VERSION, e.getID(), null));
return v;
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
public void delete(Context c, int versionID) {
try {
//TODO Do I have to manage the event?
//context.addEvent(new Event(Event.DELETE, Constants.VERSION, getID(), getEmail()));
// Remove ourself
VersionImpl version = find(c, versionID);
if(version!=null){
//Remove ourself from our cache first !
c.removeCached(version, version.getVersionId());
DatabaseManager.delete(c, version.getMyRow());
}
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
public void update(VersionImpl version) {
try {
//TODO Do I have to manage the event?
DatabaseManager.update(version.getMyContext(), version.getMyRow());
// if (modified)
// {
// myContext.addEvent(new Event(Event.MODIFY, Constants.EPERSON, getID(), null));
// modified = false;
// }
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}