URIReferenceService.java
package de.dlr.shepard.context.references.uri.services;
import de.dlr.shepard.auth.security.AuthenticationContext;
import de.dlr.shepard.auth.users.entities.User;
import de.dlr.shepard.auth.users.services.UserService;
import de.dlr.shepard.common.exceptions.InvalidAuthException;
import de.dlr.shepard.common.exceptions.InvalidPathException;
import de.dlr.shepard.common.util.DateHelper;
import de.dlr.shepard.context.collection.entities.DataObject;
import de.dlr.shepard.context.collection.services.CollectionService;
import de.dlr.shepard.context.collection.services.DataObjectService;
import de.dlr.shepard.context.references.IReferenceService;
import de.dlr.shepard.context.references.uri.daos.URIReferenceDAO;
import de.dlr.shepard.context.references.uri.entities.URIReference;
import de.dlr.shepard.context.references.uri.io.URIReferenceIO;
import de.dlr.shepard.context.version.services.VersionService;
import io.quarkus.logging.Log;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import java.util.List;
import java.util.UUID;
@RequestScoped
public class URIReferenceService implements IReferenceService<URIReference, URIReferenceIO> {
@Inject
URIReferenceDAO uRIReferenceDAO;
@Inject
DataObjectService dataObjectService;
@Inject
CollectionService collectionService;
@Inject
UserService userService;
@Inject
VersionService versionService;
@Inject
DateHelper dateHelper;
@Inject
AuthenticationContext authenticationContext;
/**
* Gets URIReference list for a given dataobject.
*
* @param collectionShepardId
* @param dataObjectShepardId
* @param versionUID the version UUID
* @return List<URIReference>
* @throws InvalidPathException If collection or dataobject cannot be found, or no association between dataobject and collection exists
* @throws InvalidAuthException If user has no read permissions on collection or dataobject specified by request path
*/
@Override
public List<URIReference> getAllReferencesByDataObjectId(
long collectionShepardId,
long dataObjectShepardId,
UUID versionUID
) {
dataObjectService.getDataObject(collectionShepardId, dataObjectShepardId, versionUID);
var references = uRIReferenceDAO.findByDataObjectShepardId(dataObjectShepardId);
return references;
}
/**
* Gets URIReference by shepard id.
*
* @param collectionShepardId
* @param dataObjectShepardId
* @param uriReferenceShepardId
* @param versionUID the version UUID
* @return URIReference
* @throws InvalidPathException If reference with Id does not exist or is deleted, or if collection or dataObject Id of path is not valid
* @throws InvalidAuthException If user has no read permissions on collection or dataobject specified by request path
*/
public URIReference getReference(
long collectionShepardId,
long dataObjectShepardId,
long uriReferenceShepardId,
UUID versionUID
) {
dataObjectService.getDataObject(collectionShepardId, dataObjectShepardId, versionUID);
URIReference reference = uRIReferenceDAO.findByShepardId(uriReferenceShepardId, versionUID);
if (reference == null || reference.isDeleted()) {
String errorMsg = String.format("ID ERROR - URI Reference with id %s is null or deleted", uriReferenceShepardId);
Log.error(errorMsg);
throw new InvalidPathException(errorMsg);
}
if (reference.getDataObject() == null || !reference.getDataObject().getShepardId().equals(dataObjectShepardId)) {
String errorMsg = "ID ERROR - There is no association between dataObject and reference";
Log.error(errorMsg);
throw new InvalidPathException(errorMsg);
}
return reference;
}
/**
* Creates a new URIReference
*
* @param collectionShepardId
* @param dataObjectShepardId DataObject id for the reference to be created
* @param uriReference Reference object
* @return URIReference
* @throws InvalidPathException if collection or dataobject specified by their Ids are null or deleted
* @throws InvalidAuthException if user has no permission to edit referencing collection or no read permissions on referenced container
*/
@Override
public URIReference createReference(long collectionShepardId, long dataObjectShepardId, URIReferenceIO uriReference) {
DataObject dataObject = dataObjectService.getDataObject(collectionShepardId, dataObjectShepardId);
collectionService.assertIsAllowedToEditCollection(collectionShepardId);
User user = userService.getCurrentUser();
var toCreate = new URIReference();
toCreate.setCreatedAt(dateHelper.getDate());
toCreate.setCreatedBy(user);
toCreate.setDataObject(dataObject);
toCreate.setName(uriReference.getName());
toCreate.setUri(uriReference.getUri());
toCreate.setRelationship(uriReference.getRelationship());
var created = uRIReferenceDAO.createOrUpdate(toCreate);
created.setShepardId(created.getId());
created = uRIReferenceDAO.createOrUpdate(created);
versionService.attachToVersionOfVersionableEntityAndReturnVersion(dataObject.getId(), created.getId());
return created;
}
/**
* Deletes the URI reference.
*
* @param collectionShepardId
* @param dataObjectShepardId
* @param uriReferenceShepardId
* @throws InvalidPathException if collection or dataobject specified by their Ids are null or deleted
* @throws InvalidAuthException if user has no permissions to edit the collection, which the reference is assigned to
*/
@Override
public void deleteReference(long collectionShepardId, long dataObjectShepardId, long uriReferenceShepardId) {
var old = getReference(collectionShepardId, dataObjectShepardId, uriReferenceShepardId, null);
collectionService.assertIsAllowedToEditCollection(collectionShepardId);
User user = userService.getCurrentUser();
old.setDeleted(true);
old.setUpdatedAt(dateHelper.getDate());
old.setUpdatedBy(user);
uRIReferenceDAO.createOrUpdate(old);
}
}