package edu.harvard.iq.dataverse.api.datadeposit; import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.DataverseServiceBean; import edu.harvard.iq.dataverse.PermissionServiceBean; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.List; import java.util.logging.Logger; import javax.ejb.EJB; import javax.inject.Inject; 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 org.swordapp.server.UriRegistry; public class ServiceDocumentManagerImpl implements ServiceDocumentManager { private static final Logger logger = Logger.getLogger(ServiceDocumentManagerImpl.class.getCanonicalName()); @EJB DataverseServiceBean dataverseService; @EJB PermissionServiceBean permissionService; @EJB SystemConfig systemConfig; @Inject SwordAuth swordAuth; @Inject UrlManager urlManager; @Override public ServiceDocument getServiceDocument(String sdUri, AuthCredentials authCredentials, SwordConfiguration config) throws SwordError, SwordServerException, SwordAuthException { AuthenticatedUser user = swordAuth.auth(authCredentials); String warning = urlManager.processUrl(sdUri); ServiceDocument service = new ServiceDocument(); SwordWorkspace swordWorkspace = new SwordWorkspace(); Dataverse rootDataverse = dataverseService.findRootDataverse(); if (rootDataverse != null) { String name = rootDataverse.getName(); if (name != null) { swordWorkspace.setTitle(name); } } if (warning != null) { swordWorkspace.getWrappedWorkspace().setAttributeValue("warning", warning); } service.setMaxUploadSize(config.getMaxUploadSize()); String hostnamePlusBaseUrl = urlManager.getHostnamePlusBaseUrlPath(sdUri); if (hostnamePlusBaseUrl == null) { ServiceDocument serviceDocument = new ServiceDocument(); return serviceDocument; } /** * We don't expect this to support Shibboleth groups because even though * a Shibboleth user can have an API token the transient * shibIdentityProvider String on AuthenticatedUser is only set when a * SAML assertion is made at runtime via the browser. */ List<Dataverse> dataverses = permissionService.getDataversesUserHasPermissionOn(user, Permission.AddDataset); for (Dataverse dataverse : dataverses) { String dvAlias = dataverse.getAlias(); if (dvAlias != null && !dvAlias.isEmpty()) { SwordCollection swordCollection = new SwordCollection(); swordCollection.setTitle(dataverse.getName()); swordCollection.setHref(hostnamePlusBaseUrl + "/collection/dataverse/" + dvAlias); swordCollection.addAcceptPackaging(UriRegistry.PACKAGE_SIMPLE_ZIP); swordCollection.setCollectionPolicy(systemConfig.getApiTermsOfUse()); swordWorkspace.addCollection(swordCollection); } } service.addWorkspace(swordWorkspace); return service; } }