Fix for DS-1077: XMLUI & CLI always show a NullPointerException after running a Site-wide Curation Task. This patch ensures that the Curator is not too quick to call complete() on its Context object when running a Site-wide task. It also ensures the Curator doesn't continually create a new Context each time 'curationContext()' is called -- instead a newly created context is cached so that it can be used for the remainder of the task processing. This fix has been applied to trunk and 1.8.x branch.

git-svn-id: http://scm.dspace.org/svn/repo/dspace/trunk@6870 9c30dcfa-912a-0410-8fc2-9e0234be79fd
This commit is contained in:
Tim Donohue
2011-12-02 17:52:55 +00:00
parent 79984d3d12
commit 5852cee2b7

View File

@@ -24,7 +24,6 @@ import org.dspace.content.Site;
import org.dspace.core.Constants; import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.dspace.core.PluginManager; import org.dspace.core.PluginManager;
import org.dspace.eperson.EPerson;
import org.dspace.handle.HandleManager; import org.dspace.handle.HandleManager;
/** /**
@@ -365,19 +364,27 @@ public class Curator
} }
/** /**
* Returns the context object used in the current curation performance. * Returns the context object used in the current curation thread.
* This is primarily a utility method to allow tasks access to the context when necessary. * This is primarily a utility method to allow tasks access to the context when necessary.
* <P> * <P>
* If the context is null or not set, then this just returns * If the context is null or not set, then this just returns
* a brand new Context object representing an Anonymous User. * a brand new Context object representing an Anonymous User.
* *
* @return curation Context object (or anonymous Context if curation is null) * @return curation thread's Context object (or a new, anonymous Context if no curation Context exists)
*/ */
public static Context curationContext() throws SQLException public static Context curationContext() throws SQLException
{ {
// Return curation context or new context if undefined // Return curation context or new context if undefined/invalid
Context curCtx = curationCtx.get(); Context curCtx = curationCtx.get();
return (curCtx != null) ? curCtx : new Context();
if(curCtx==null || !curCtx.isValid())
{
//Create a new context (represents an Anonymous User)
curCtx = new Context();
//Save it to current execution thread
curationCtx.set(curCtx);
}
return curCtx;
} }
/** /**
@@ -403,10 +410,12 @@ public class Curator
Context ctx = null; Context ctx = null;
try try
{ {
ctx = curationContext(); //get access to the curation thread's current context
ctx = curationContext();
// Site-wide Tasks really should have an EPerson performer associated with them, // Site-wide Tasks really should have an EPerson performer associated with them,
// otherwise they are run as an "anonymous" user with limited access rights. // otherwise they are run as an "anonymous" user with limited access rights.
if(ctx.getCurrentUser()==null) if(ctx.getCurrentUser()==null && !ctx.ignoreAuthorization())
{ {
log.warn("You are running one or more Site-Wide curation tasks in ANONYMOUS USER mode," + log.warn("You are running one or more Site-Wide curation tasks in ANONYMOUS USER mode," +
" as there is no EPerson 'performer' associated with this task. To associate an EPerson 'performer' " + " as there is no EPerson 'performer' associated with this task. To associate an EPerson 'performer' " +
@@ -428,16 +437,9 @@ public class Curator
return false; return false;
} }
} }
//complete & close our created Context
ctx.complete();
} }
catch (SQLException sqlE) catch (SQLException sqlE)
{ {
//abort Context & all changes
if(ctx!=null)
ctx.abort();
throw new IOException(sqlE); throw new IOException(sqlE);
} }
@@ -534,7 +536,7 @@ public class Curator
} }
catch (SQLException sqlE) catch (SQLException sqlE)
{ {
throw new IOException(sqlE.getMessage()); throw new IOException(sqlE.getMessage(), sqlE);
} }
} }
} }