[dryad] r5718 committed - Remove the old versions when a new version is installed from Discover...

3 views
Skip to first unread message

dr...@googlecode.com

unread,
Oct 2, 2012, 3:30:00 PM10/2/12
to dryad-...@googlegroups.com
Revision: 5718
Author: fabio.bo...@gmail.com
Date: Tue Oct 2 12:10:46 2012
Log: Remove the old versions when a new version is installed from
Discovery, Search and Browse.
http://code.google.com/p/dryad/source/detail?r=5718

Added:
/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/search

/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/search/SearchConsumer.java
Modified:
/trunk/dryad/dspace/config/dspace.cfg

/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/content/InstallItem.java
/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/content/Item.java

/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/discovery/IndexEventConsumer.java

/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java

=======================================
--- /dev/null
+++
/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/search/SearchConsumer.java
Tue Oct 2 12:10:46 2012
@@ -0,0 +1,266 @@
+/**
+ * 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.search;
+
+import java.sql.SQLException;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+import org.dspace.content.Bundle;
+import org.dspace.content.DCValue;
+import org.dspace.content.DSpaceObject;
+import org.dspace.content.Item;
+import org.dspace.core.Constants;
+import org.dspace.core.Context;
+import org.dspace.event.Consumer;
+import org.dspace.event.Event;
+import org.dspace.identifier.IdentifierService;
+import org.dspace.utils.DSpace;
+import org.dspace.versioning.Version;
+import org.dspace.versioning.VersionHistory;
+import org.dspace.versioning.VersioningService;
+
+/**
+ * Class for updating search indices from content events.
+ *
+ * @version $Revision: 5844 $
+ */
+public class SearchConsumer implements Consumer
+{
+ /** log4j logger */
+ private static Logger log = Logger.getLogger(SearchConsumer.class);
+
+ // collect Items, Collections, Communities that need indexing
+ private Set<DSpaceObject> objectsToUpdate = null;
+
+ // handles to delete since IDs are not useful by now.
+ private Set<String> handlesToDelete = null;
+
+ public void initialize() throws Exception
+ {
+ // No-op
+
+ }
+
+ /**
+ * Consume a content event -- just build the sets of objects to add
(new) to
+ * the index, update, and delete.
+ *
+ * @param ctx
+ * DSpace context
+ * @param event
+ * Content event
+ */
+ public void consume(Context ctx, Event event) throws Exception
+ {
+
+ if (objectsToUpdate == null)
+ {
+ objectsToUpdate = new HashSet<DSpaceObject>();
+ handlesToDelete = new HashSet<String>();
+ }
+
+ int st = event.getSubjectType();
+ if (!(st == Constants.ITEM || st == Constants.BUNDLE
+ || st == Constants.COLLECTION || st ==
Constants.COMMUNITY))
+ {
+ log
+ .warn("SearchConsumer should not have been given this
kind of Subject in an event, skipping: "
+ + event.toString());
+ return;
+ }
+
+ DSpaceObject subject = event.getSubject(ctx);
+
+ DSpaceObject object = event.getObject(ctx);
+
+
+ // If event subject is a Bundle and event was Add or Remove,
+ // transform the event to be a Modify on the owning Item.
+ // It could be a new bitstream in the TEXT bundle which
+ // would change the index.
+ int et = event.getEventType();
+ if (st == Constants.BUNDLE)
+ {
+ if ((et == Event.ADD || et == Event.REMOVE) && subject != null
+ && "TEXT".equals( ((Bundle) subject).getName()) )
+ {
+ st = Constants.ITEM;
+ et = Event.MODIFY;
+ subject = ((Bundle) subject).getItems()[0];
+ if (log.isDebugEnabled())
+ {
+ log.debug("Transforming Bundle event into MODIFY of
Item "
+ + subject.getHandle());
+ }
+ }
+ else
+ {
+ return;
+ }
+ }
+
+ switch (et)
+ {
+ case Event.INSTALL:
+ if (st == Constants.ITEM) {
+ Item item = (Item) event.getSubject(ctx);
+ VersionHistory history = getHistory(ctx, event, item);
+ if(history != null){
+ Version itemVersion = history.getVersion(item);
+ Version previousVersion =
history.getPrevious(itemVersion);
+ String handle =
previousVersion.getItem().getHandle();
+ handlesToDelete.add(handle);
+ }
+ }
+ break;
+ case Event.CREATE:
+ case Event.MODIFY:
+ case Event.MODIFY_METADATA:
+ if (subject == null)
+ {
+ log.warn(event.getEventTypeAsString() + " event, could
not get object for "
+ + event.getSubjectTypeAsString() + " id="
+ + String.valueOf(event.getSubjectID())
+ + ", perhaps it has been deleted.");
+ }
+ else
+ {
+ log.debug("consume() adding event to update queue: " +
event.toString());
+ objectsToUpdate.add(subject);
+ }
+ break;
+
+ case Event.REMOVE:
+ case Event.ADD:
+ if (object == null)
+ {
+ log.warn(event.getEventTypeAsString() + " event, could
not get object for "
+ + event.getObjectTypeAsString() + " id="
+ + String.valueOf(event.getObjectID())
+ + ", perhaps it has been deleted.");
+ }
+ else
+ {
+ log.debug("consume() adding event to update queue: " +
event.toString());
+ objectsToUpdate.add(object);
+ }
+ break;
+
+ case Event.DELETE:
+ if (st == Constants.ITEM) {
+ Item item = (Item) event.getSubject(ctx);
+
+ String id;
+ DCValue[] values = item.getMetadata("dc.identifier");
+ if(values!=null && values.length > 0){
+ id = values[0].value;
+ String idFirstPart="doi:10.5061/dryad.";
+ String idLastPart =
id.substring(idFirstPart.length());
+ if(idLastPart.indexOf('.')!=-1){ // this is a
versioned item
+ String canonical = idFirstPart +
idLastPart.substring(0, idLastPart.indexOf('.'));
+ IdentifierService identifierService = new
DSpace().getSingletonService(IdentifierService.class);
+ Item previousItem = (Item)
identifierService.resolve(ctx, canonical);
+ objectsToUpdate.add(previousItem);
+ }
+ }
+ }
+ String detail = event.getDetail();
+ if (detail == null)
+ {
+ log.warn("got null detail on DELETE event, skipping
it.");
+ }
+ else
+ {
+ log.debug("consume() adding event to delete queue: " +
event.toString());
+ handlesToDelete.add(detail);
+ }
+ break;
+ default:
+ log
+ .warn("SearchConsumer should not have been given a
event of type="
+ + event.getEventTypeAsString()
+ + " on subject="
+ + event.getSubjectTypeAsString());
+ break;
+ }
+ }
+
+ /**
+ * Process sets of objects to add, update, and delete in index.
Correct for
+ * interactions between the sets -- e.g. objects which were deleted do
not
+ * need to be added or updated, new objects don't also need an update,
etc.
+ */
+ public void end(Context ctx) throws Exception
+ {
+
+ if(objectsToUpdate != null && handlesToDelete != null)
+ {
+
+ // update the changed Items not deleted because they were on
create list
+ for (DSpaceObject iu : objectsToUpdate)
+ {
+ /* we let all types through here and
+ * allow the search DSIndexer to make
+ * decisions on indexing and/or removal
+ */
+ String hdl = iu.getHandle();
+ if (hdl != null && !handlesToDelete.contains(hdl))
+ {
+ try
+ {
+ DSIndexer.indexContent(ctx, iu, true);
+ log.debug("Indexed "
+ + Constants.typeText[iu.getType()]
+ + ", id=" + String.valueOf(iu.getID())
+ + ", handle=" + hdl);
+ }
+ catch (Exception e)
+ {
+ log.error("Failed while indexing object: ", e);
+ }
+ }
+ }
+
+ for (String hdl : handlesToDelete)
+ {
+ try
+ {
+ DSIndexer.unIndexContent(ctx, hdl);
+ if (log.isDebugEnabled())
+ {
+ log.debug("UN-Indexed Item, handle=" + hdl);
+ }
+ }
+ catch (Exception e)
+ {
+ log.error("Failed while UN-indexing object: " + hdl,
e);
+ }
+
+ }
+
+ }
+
+ // "free" the resources
+ objectsToUpdate = null;
+ handlesToDelete = null;
+ }
+
+ public void finish(Context ctx) throws Exception
+ {
+ // No-op
+
+ }
+ private VersionHistory getHistory(Context ctx, Event event, Item item)
throws SQLException {
+ VersioningService versioningService = new
DSpace().getSingletonService(VersioningService.class);
+ VersionHistory history = versioningService.findVersionHistory(ctx,
item.getID());
+ return history;
+ }
+
+}
=======================================
--- /trunk/dryad/dspace/config/dspace.cfg Thu Sep 13 11:46:01 2012
+++ /trunk/dryad/dspace/config/dspace.cfg Tue Oct 2 12:10:46 2012
@@ -965,15 +965,15 @@

# consumer to maintain the search index
event.consumer.search.class = org.dspace.search.SearchConsumer
-event.consumer.search.filters = Community|Collection|Item|Bundle+Add|
Create|Modify|Modify_Metadata|Delete|Remove
+event.consumer.search.filters = Community|Collection|Item|Bundle+Add|
Create|Modify|Modify_Metadata|Delete|Remove|Install

# consumer to maintain the discovery index
event.consumer.discovery.class = org.dspace.discovery.IndexEventConsumer
-event.consumer.discovery.filters = Community|Collection|Item|Bundle+Add|
Create|Modify|Modify_Metadata|Delete|Remove
+event.consumer.discovery.filters = Community|Collection|Item|Bundle+Add|
Create|Modify|Modify_Metadata|Delete|Remove|Install

# consumer to maintain the browse index
event.consumer.browse.class = org.dspace.browse.BrowseConsumer
-event.consumer.browse.filters = Community|Collection|Item|Bundle+Add|
Create|Modify|Modify_Metadata|Delete|Remove
+event.consumer.browse.filters = Community|Collection|Item|Bundle+Add|
Create|Modify|Modify_Metadata|Delete|Remove|Install

# consumer related to EPerson changes
event.consumer.eperson.class = org.dspace.eperson.EPersonConsumer
=======================================
---
/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/content/InstallItem.java
Tue Oct 25 10:14:34 2011
+++
/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/content/InstallItem.java
Tue Oct 2 12:10:46 2012
@@ -43,13 +43,16 @@

import org.dspace.authorize.AuthorizeException;
import org.dspace.core.ConfigurationManager;
+import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.embargo.EmbargoManager;
+import org.dspace.event.Event;
import org.dspace.handle.HandleManager;
import org.dspace.identifier.IdentifierException;
import org.dspace.identifier.IdentifierService;
import org.dspace.utils.DSpace;

+
/**
* Support to install item in the archive
*
@@ -261,6 +264,7 @@

// save changes ;-)
item.update();
+ c.addEvent(new Event(Event.INSTALL, Constants.ITEM, item.getID(),
item.getHandle()));

// remove in-progress submission
is.deleteWrapper();
=======================================
---
/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/content/Item.java
Wed Sep 28 16:38:11 2011
+++
/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/content/Item.java
Tue Oct 2 12:10:46 2012
@@ -45,6 +45,8 @@
import org.dspace.storage.rdbms.TableRow;
import org.dspace.storage.rdbms.TableRowIterator;
import org.dspace.utils.DSpace;
+import org.dspace.versioning.Version;
+import org.dspace.versioning.VersionHistory;
import org.dspace.versioning.VersioningService;
import org.dspace.workflow.DryadWorkflowUtils;

@@ -1960,6 +1962,17 @@
// Remove from indices
IndexBrowse ib = new IndexBrowse(ourContext);
ib.itemRemoved(this);
+
+ // Reinstate previous version if present
+ VersioningService versioningService = new
DSpace().getSingletonService(VersioningService.class);
+ VersionHistory history =
versioningService.findVersionHistory(ourContext, this.getID());
+ if(history!=null){
+ Version version =
versioningService.getVersion(ourContext, this);
+ Version previousVersion = history.getPrevious(version);
+ if(previousVersion!=null){
+ ib.indexItem(previousVersion.getItem());
+ }
+ }
}
catch (BrowseException e)
{
=======================================
---
/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/discovery/IndexEventConsumer.java
Tue Sep 6 03:09:25 2011
+++
/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/discovery/IndexEventConsumer.java
Tue Oct 2 12:10:46 2012
@@ -9,13 +9,23 @@

import org.apache.log4j.Logger;
import org.dspace.content.Bundle;
+import org.dspace.content.DCValue;
import org.dspace.content.DSpaceObject;
+import org.dspace.content.Item;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.event.Consumer;
import org.dspace.event.Event;
+import org.dspace.identifier.DOIIdentifierProvider;
+import org.dspace.identifier.HandleIdentifierProvider;
+import org.dspace.identifier.IdentifierService;
import org.dspace.utils.DSpace;
+import org.dspace.versioning.Version;
+import org.dspace.versioning.VersionHistory;
+import org.dspace.versioning.VersioningService;
+import org.dspace.workflow.DryadWorkflowUtils;

+import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;

@@ -79,12 +89,14 @@
// It could be a new bitstream in the TEXT bundle which
// would change the index.
int et = event.getEventType();
+
if (st == Constants.BUNDLE) {
if ((et == Event.ADD || et == Event.REMOVE) && subject != null
&& ((Bundle) subject).getName().equals("TEXT")) {
st = Constants.ITEM;
et = Event.MODIFY;
subject = ((Bundle) subject).getItems()[0];
+
if (log.isDebugEnabled())
{
log.debug("Transforming Bundle event into MODIFY of
Item "
@@ -95,8 +107,23 @@
return;
}
}
+

switch (et) {
+
+ case Event.INSTALL:
+ if (st == Constants.ITEM) {
+ Item item = (Item) event.getSubject(ctx);
+ VersionHistory history = getHistory(ctx, event, item);
+ if(history != null){
+ Version itemVersion = history.getVersion(item);
+ Version previousVersion =
history.getPrevious(itemVersion);
+ String handle =
previousVersion.getItem().getHandle();
+ handlesToDelete.add(handle);
+ }
+ }
+ break;
+
case Event.CREATE:
case Event.MODIFY:
case Event.MODIFY_METADATA:
@@ -123,12 +150,31 @@
+ ", perhaps it has been deleted.");
}
else {
+
log.debug("consume() adding event to update queue: " +
event.toString());
objectsToUpdate.add(object);
}
break;

case Event.DELETE:
+
+ if (st == Constants.ITEM) {
+ Item item = (Item) event.getSubject(ctx);
+
+ String id;
+ DCValue[] values = item.getMetadata("dc.identifier");
+ if(values!=null && values.length > 0){
+ id = values[0].value;
+ String idFirstPart="doi:10.5061/dryad.";
+ String idLastPart =
id.substring(idFirstPart.length());
+ if(idLastPart.indexOf('.')!=-1){ // this is a
versioned item
+ String canonical = idFirstPart +
idLastPart.substring(0, idLastPart.indexOf('.'));
+ IdentifierService identifierService = new
DSpace().getSingletonService(IdentifierService.class);
+ Item previousItem = (Item)
identifierService.resolve(ctx, canonical);
+ objectsToUpdate.add(previousItem);
+ }
+ }
+ }
String detail = event.getDetail();
if (detail == null)
{
@@ -156,6 +202,15 @@
*/
public void end(Context ctx) throws Exception {

+ /*Item item = (Item) event.getSubject(ctx);
+ VersioningService versioningService = new
DSpace().getSingletonService(VersioningService.class);
+ org.dspace.versioning.VersionHistory history =
versioningService.findVersionHistory(ctx, item.getID());
+ Version latestVersion = history.getLatestVersion();
+ Version previousVersion = history.getPrevious(latestVersion);
+
+ String handle = previousVersion.getItem().getHandle();
+ indexer.unIndexContent(ctx, handle, true); */
+
if (objectsToUpdate != null && handlesToDelete != null) {

// update the changed Items not deleted because they were on
create list
@@ -204,5 +259,11 @@
// No-op

}
+
+ private VersionHistory getHistory(Context ctx, Event event, Item item)
throws SQLException {
+ VersioningService versioningService = new
DSpace().getSingletonService(VersioningService.class);
+ VersionHistory history = versioningService.findVersionHistory(ctx,
item.getID());
+ return history;
+ }

}
=======================================
---
/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java
Wed Aug 8 15:38:29 2012
+++
/trunk/dryad/dspace/modules/api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java
Tue Oct 2 12:10:46 2012
@@ -165,9 +165,9 @@
DOI canonical=null;

if (collection.equals(myDataPkgColl)) {
- canonical = getCanonicalDataPackage(doi_, item);
+ canonical = getCanonicalDataPackage(doi_,
previous);
} else {
- canonical = getCanonicalDataFile(doi_, item);
+ canonical = getCanonicalDataFile(doi_, previous);

}
mint(canonical, true, null);
Reply all
Reply to author
Forward
0 new messages