/**
* 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.sword2;
import org.apache.log4j.Logger;
import org.dspace.content.Collection;
import org.dspace.content.Community;
import org.dspace.content.DSpaceObject;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CommunityService;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import org.dspace.core.LogManager;
import org.swordapp.server.AuthCredentials;
import org.swordapp.server.ServiceDocument;
import org.swordapp.server.ServiceDocumentManager;
import org.swordapp.server.SwordAuthException;
import org.swordapp.server.SwordCollection;
import org.swordapp.server.SwordConfiguration;
import org.swordapp.server.SwordError;
import org.swordapp.server.SwordServerException;
import org.swordapp.server.SwordWorkspace;
import java.util.List;
public class ServiceDocumentManagerDSpace implements ServiceDocumentManager
{
/** logger */
private static Logger log = Logger
.getLogger(ServiceDocumentManagerDSpace.class);
protected CommunityService communityService = ContentServiceFactory
.getInstance().getCommunityService();
public ServiceDocument getServiceDocument(String sdUri,
AuthCredentials authCredentials, SwordConfiguration config)
throws SwordError, SwordServerException, SwordAuthException
{
SwordContext sc = null;
try
{
// first authenticate the request
// note: this will build our various DSpace contexts for us
SwordAuthenticator auth = new SwordAuthenticator();
sc = auth.authenticate(authCredentials);
Context context = sc.getContext();
// ensure that this method is allowed
WorkflowManagerFactory.getInstance().retrieveServiceDoc(context);
if (log.isDebugEnabled())
{
log.debug(LogManager
.getHeader(context, "sword_do_service_document", ""));
}
// log the request
String un = authCredentials.getUsername() != null ?
authCredentials.getUsername() :
"NONE";
String obo = authCredentials.getOnBehalfOf() != null ?
authCredentials.getOnBehalfOf() :
"NONE";
log.info(LogManager
.getHeader(context, "sword_service_document_request",
"username=" + un + ",on_behalf_of=" + obo));
return this.getServiceDocument(sc, sdUri,
(SwordConfigurationDSpace) config);
}
catch (DSpaceSwordException e)
{
log.error("caught exception: ", e);
throw new SwordServerException(
"The DSpace SWORD interface experienced an error", e);
}
finally
{
// this is a read operation only, so there's never any need to commit the context
if (sc != null)
{
sc.abort();
}
}
}
public ServiceDocument getServiceDocument(SwordContext context, String url,
SwordConfigurationDSpace swordConfig)
throws SwordError, SwordServerException, DSpaceSwordException
{
// first check that the sword context have
// been set
if (context == null)
{
throw new DSpaceSwordException(
"The Sword Context is null; please set it before calling getServiceDocument");
}
// ensure that this method is allowed
WorkflowManagerFactory.getInstance()
.retrieveServiceDoc(context.getContext());
// get the URL manager
SwordUrlManager urlManager = swordConfig
.getUrlManager(context.getContext(), swordConfig);
// we'll need the authenticator
SwordAuthenticator swordAuth = new SwordAuthenticator();
// construct the ATOM collection generators that we might use
AtomCollectionGenerator comGen = new CommunityCollectionGenerator();
AtomCollectionGenerator colGen = new CollectionCollectionGenerator();
// construct a new service document
ServiceDocument service = new ServiceDocument();
// set the max upload size
service.setMaxUploadSize(swordConfig.getMaxUploadSize());
if (url == null || urlManager.isBaseServiceDocumentUrl(url))
{
// we are dealing with the default service document
// set the title of the workspace as per the name of the DSpace installation
String ws = ConfigurationManager.getProperty("dspace.name");
SwordWorkspace workspace = new SwordWorkspace();
workspace.setTitle(ws);
// next thing to do is determine whether the default is communities or collections
boolean swordCommunities = ConfigurationManager
.getBooleanProperty("swordv2-server", "expose-communities");
if (swordCommunities)
{
List<Community> comms = swordAuth
.getAllowedCommunities(context);
for (Community comm : comms)
{
SwordCollection scol = comGen
.buildCollection(context.getContext(), comm,
swordConfig);
workspace.addCollection(scol);
}
}
else
{
List<Collection> cols = swordAuth
.getAllowedCollections(context);
for (Collection col : cols)
{
SwordCollection scol = colGen
.buildCollection(context.getContext(), col,
swordConfig);
workspace.addCollection(scol);
}
}
service.addWorkspace(workspace);
}
else
{
// we are dealing with a partial or sub-service document
DSpaceObject dso = urlManager.extractDSpaceObject(url);
if (dso == null)
{
throw new SwordError(404);
}
if (dso instanceof Community)
{
Community community = (Community) dso;
SwordWorkspace workspace = new SwordWorkspace();
workspace.setTitle(communityService.getName(community));
List<Collection> collections = swordAuth
.getAllowedCollections(context, community);
for (Collection collection : collections)
{
SwordCollection scol = colGen
.buildCollection(context.getContext(), collection,
swordConfig);
workspace.addCollection(scol);
}
List<Community> communities = swordAuth
.getCommunities(context, community);
for (Community comm : communities)
{
SwordCollection scol = comGen
.buildCollection(context.getContext(), comm,
swordConfig);
workspace.addCollection(scol);
}
service.addWorkspace(workspace);
}
}
return service;
}
}