diff --git a/geoportal-service/pom.xml b/geoportal-service/pom.xml index 2893b97..8065434 100644 --- a/geoportal-service/pom.xml +++ b/geoportal-service/pom.xml @@ -19,6 +19,9 @@ 1.0 2.14.0 ${project.basedir}${file.separator}${project.artifactId}${file.separator}src${file.separator}main${file.separator}webapp${file.separator}WEB-INF + + + @@ -143,6 +146,37 @@ test + + + diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java index 119e175..97f0734 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java @@ -236,9 +236,10 @@ public interface MongoManagerI { /** * Delete file set. * - * @param id the id - * @param destination the destination - * @param force the force + * @param id the id + * @param destination the destination + * @param force the force + * @param ignore_errors the ignore errors * @return the t * @throws ConfigurationException the configuration exception * @throws StorageHubException the storage hub exception @@ -253,9 +254,8 @@ public interface MongoManagerI { * @throws InvalidUserRoleException the invalid user role exception * @throws UnauthorizedAccess the unauthorized access */ - public T deleteFileSet(String id, String destination, Boolean force) - throws ConfigurationException, StorageHubException, StorageException, StepException, - JsonProcessingException, DeletionException, EventException, ProjectLockedException, + public T deleteFileSet(String id, String path, Boolean force, Boolean ignore_errors) throws ConfigurationException, + StorageHubException, JsonProcessingException, DeletionException, EventException, ProjectLockedException, ProjectNotFoundException, InvalidLockException, InvalidUserRoleException, UnauthorizedAccess; /** diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java index 90695c5..ef64df0 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java @@ -86,17 +86,41 @@ import com.vdurmont.semver4j.Semver; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +/** + * The Class ProfiledMongoManager. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Apr 26, 2023 + */ @Slf4j public class ProfiledMongoManager extends MongoManager implements MongoManagerI { + /** + * Gets the use case descriptor. + * + * @return the use case descriptor + */ @Getter UseCaseDescriptor useCaseDescriptor; + /** + * Mongo ID field name. + * + * @return the string + */ @Override protected String mongoIDFieldName() { return ID; } + /** + * Instantiates a new profiled mongo manager. + * + * @param profileId the profile id + * @throws ConfigurationException the configuration exception + * @throws RegistrationException the registration exception + */ public ProfiledMongoManager(String profileId) throws ConfigurationException, RegistrationException { // Check UseCaseDescriptor ID log.info("Loading useCaseDescriptor ID {} ", profileId); @@ -112,11 +136,28 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } + /** + * Gets the to use collection name. + * + * @return the to use collection name + */ private String getToUseCollectionName() { // TODO collection name in UCD return useCaseDescriptor.getId(); } + /** + * Lock. + * + * @param id the id + * @param op the op + * @return the project + * @throws ProjectNotFoundException the project not found exception + * @throws ProjectLockedException the project locked exception + * @throws JsonProcessingException the json processing exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws UnauthorizedAccess the unauthorized access + */ protected Project lock(String id, String op) throws ProjectNotFoundException, ProjectLockedException, JsonProcessingException, InvalidUserRoleException, UnauthorizedAccess { log.trace("Locking {} cause {} ", id, op); @@ -154,6 +195,17 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return Serialization.convert(obj, Project.class); } + /** + * Unlock and update. + * + * @param proj the proj + * @return the project + * @throws InvalidLockException the invalid lock exception + * @throws ProjectNotFoundException the project not found exception + * @throws JsonProcessingException the json processing exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws UnauthorizedAccess the unauthorized access + */ protected Project unlockAndUpdate(Project proj) throws InvalidLockException, ProjectNotFoundException, JsonProcessingException, InvalidUserRoleException, UnauthorizedAccess { log.info("Unlocking for update {} lock is {} ", proj.getId(), proj.getLock()); @@ -163,7 +215,7 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< Document filter = new Document(mongoIDFieldName(), asId(proj.getId())).append(Project.LOCK + "." + Lock.ID, oldLock.getId()); - + log.info("Filter document is {} ", filter.toJson()); Object obj = getCollection().findOneAndReplace( @@ -181,19 +233,30 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return Serialization.convert(obj, Project.class); } + /** + * Unlock and patch. + * + * @param proj the proj + * @return the project + * @throws InvalidLockException the invalid lock exception + * @throws ProjectNotFoundException the project not found exception + * @throws JsonProcessingException the json processing exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws UnauthorizedAccess the unauthorized access + */ protected Project unlockAndPatch(Project proj) throws InvalidLockException, ProjectNotFoundException, JsonProcessingException, InvalidUserRoleException, UnauthorizedAccess { log.info("Unlocking for patching {} lock is {} ", proj.getId(), proj.getLock()); - + // find one and update Lock oldLock = proj.getLock(); Document filter = new Document(mongoIDFieldName(), asId(proj.getId())).append(Project.LOCK + "." + Lock.ID, oldLock.getId()); - + String documentValueAsJson = proj.getTheDocument().toJson(); - String updatedDocumentAsJson = new Document(Project.THE_DOCUMENT,documentValueAsJson).toJson(); + String updatedDocumentAsJson = new Document(Project.THE_DOCUMENT, documentValueAsJson).toJson(); Document setUpdatedDocument = new Document("$set", updatedDocumentAsJson); - + log.info("Filter document is {} ", filter.toJson()); log.info("$set is {} ", setUpdatedDocument); @@ -201,22 +264,32 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< // filter by id and missing lock filter, // update lock info - setUpdatedDocument, - new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)); + setUpdatedDocument, new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)); if (obj == null) { // can-t unlock, check cause throw new InvalidLockException( "Found lock for " + proj.getId() + " is " + proj.getLock() + ", expected is " + oldLock); } - - //I could use Serialization.convert(obj, Project.class), but to be sure I'm reading again the project by + + // I could use Serialization.convert(obj, Project.class), but to be sure I'm + // reading again the project by proj = getByID(proj.getId()); - + proj = unlock(proj); return proj; } + /** + * Unlock. + * + * @param proj the proj + * @return the project + * @throws InvalidLockException the invalid lock exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws ProjectNotFoundException the project not found exception + * @throws UnauthorizedAccess the unauthorized access + */ protected Project unlock(Project proj) throws InvalidLockException, InvalidUserRoleException, ProjectNotFoundException, UnauthorizedAccess { log.trace("Unlocking for update {} lock is {} ", proj.getId(), proj.getLock()); @@ -241,9 +314,19 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return Serialization.convert(obj, Project.class); } + /** + * Gets the manager. + * + * @return the manager + */ @Getter(lazy = true) private final LifecycleManager manager = getLCManager(); + /** + * Gets the LC manager. + * + * @return the LC manager + */ private LifecycleManager getLCManager() { try { LifecycleManager toReturn = null; @@ -274,6 +357,14 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } + /** + * Register new. + * + * @param toRegisterDoc the to register doc + * @return the project + * @throws IOException Signals that an I/O exception has occurred. + * @throws InvalidUserRoleException the invalid user role exception + */ @Override public Project registerNew(Document toRegisterDoc) throws IOException, InvalidUserRoleException { log.info("Registering new document in {} ", useCaseDescriptor.getId()); @@ -329,6 +420,20 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } + /** + * Update. + * + * @param id the id + * @param toSet the to set + * @return the project + * @throws IOException Signals that an I/O exception has occurred. + * @throws EventException the event exception + * @throws ProjectLockedException the project locked exception + * @throws ProjectNotFoundException the project not found exception + * @throws InvalidLockException the invalid lock exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws UnauthorizedAccess the unauthorized access + */ @Override public Project update(String id, Document toSet) throws IOException, EventException, ProjectLockedException, ProjectNotFoundException, InvalidLockException, InvalidUserRoleException, UnauthorizedAccess { @@ -359,6 +464,20 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } + /** + * Patch. + * + * @param id the id + * @param toSet the to set + * @return the project + * @throws IOException Signals that an I/O exception has occurred. + * @throws EventException the event exception + * @throws ProjectLockedException the project locked exception + * @throws ProjectNotFoundException the project not found exception + * @throws InvalidLockException the invalid lock exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws UnauthorizedAccess the unauthorized access + */ @Override public Project patch(String id, Document toSet) throws IOException, EventException, ProjectLockedException, ProjectNotFoundException, InvalidLockException, InvalidUserRoleException, UnauthorizedAccess { @@ -389,6 +508,24 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } + /** + * Sets the relation. + * + * @param id the id + * @param relation the relation + * @param targetUCD the target UCD + * @param targetId the target id + * @return the project + * @throws IOException Signals that an I/O exception has occurred. + * @throws EventException the event exception + * @throws ProjectLockedException the project locked exception + * @throws ProjectNotFoundException the project not found exception + * @throws InvalidLockException the invalid lock exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws UnauthorizedAccess the unauthorized access + * @throws RegistrationException the registration exception + * @throws ConfigurationException the configuration exception + */ @Override public Project setRelation(String id, String relation, String targetUCD, String targetId) throws IOException, EventException, ProjectLockedException, ProjectNotFoundException, InvalidLockException, @@ -451,6 +588,24 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } + /** + * Delete relation. + * + * @param id the id + * @param relation the relation + * @param targetUCD the target UCD + * @param targetId the target id + * @return the project + * @throws IOException Signals that an I/O exception has occurred. + * @throws EventException the event exception + * @throws ProjectLockedException the project locked exception + * @throws ProjectNotFoundException the project not found exception + * @throws InvalidLockException the invalid lock exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws UnauthorizedAccess the unauthorized access + * @throws RegistrationException the registration exception + * @throws ConfigurationException the configuration exception + */ @Override public Project deleteRelation(String id, String relation, String targetUCD, String targetId) throws IOException, EventException, ProjectLockedException, ProjectNotFoundException, InvalidLockException, @@ -523,6 +678,13 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } + /** + * On update. + * + * @param toUpdate the to update + * @return the project + * @throws EventException the event exception + */ private Project onUpdate(Project toUpdate) throws EventException { UserUtils.AuthenticatedUser u = UserUtils.getCurrent(); toUpdate.getInfo().setLastEditInfo(u.asInfo()); @@ -537,6 +699,19 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< // return triggerEvent(toUpdate, EventExecutionRequest.Events.ON_UPDATE_DOCUMENT, null); // } + /** + * Delete. + * + * @param id the id + * @param force the force + * @throws DeletionException the deletion exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws ProjectLockedException the project locked exception + * @throws ProjectNotFoundException the project not found exception + * @throws UnauthorizedAccess the unauthorized access + * @throws JsonProcessingException the json processing exception + * @throws InvalidLockException the invalid lock exception + */ @Override public void delete(String id, boolean force) throws DeletionException, InvalidUserRoleException, ProjectLockedException, ProjectNotFoundException, @@ -580,6 +755,15 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } + /** + * Gets the by ID. + * + * @param id the id + * @return the by ID + * @throws ProjectNotFoundException the project not found exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws UnauthorizedAccess the unauthorized access + */ @Override public Project getByID(String id) throws ProjectNotFoundException, InvalidUserRoleException, UnauthorizedAccess { User u = UserUtils.getCurrent().asInfo().getUser(); @@ -602,6 +786,13 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return p; } + /** + * Query. + * + * @param queryRequest the query request + * @return the iterable + * @throws InvalidUserRoleException the invalid user role exception + */ @Override public Iterable query(QueryRequest queryRequest) throws InvalidUserRoleException { LinkedBlockingQueue queue = new LinkedBlockingQueue(); @@ -642,6 +833,13 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return queue; } + /** + * Filter. + * + * @param queryRequest the query request + * @return the iterable + * @throws InvalidUserRoleException the invalid user role exception + */ @Override public Iterable filter(QueryRequest queryRequest) throws InvalidUserRoleException { LinkedBlockingQueue queue = new LinkedBlockingQueue(); @@ -682,6 +880,23 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return queue; } + /** + * Perform step. + * + * @param id the id + * @param step the step + * @param options the options + * @return the project + * @throws StepException the step exception + * @throws JsonProcessingException the json processing exception + * @throws ProjectLockedException the project locked exception + * @throws ProjectNotFoundException the project not found exception + * @throws InvalidLockException the invalid lock exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws UnauthorizedAccess the unauthorized access + * @throws ConfigurationException the configuration exception + * @throws InsufficientPrivileges the insufficient privileges + */ @Override public Project performStep(String id, String step, Document options) throws StepException, JsonProcessingException, ProjectLockedException, ProjectNotFoundException, InvalidLockException, InvalidUserRoleException, @@ -723,11 +938,22 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< /** * NB Put at path : - * + * * Path Examples artifact images images[1] layers[?(@.name = 'myName')].fileset * - * - * + * @param id the id + * @param request the request + * @return the project + * @throws ConfigurationException the configuration exception + * @throws StorageHubException the storage hub exception + * @throws StorageException the storage exception + * @throws JsonProcessingException the json processing exception + * @throws EventException the event exception + * @throws ProjectLockedException the project locked exception + * @throws ProjectNotFoundException the project not found exception + * @throws InvalidLockException the invalid lock exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws UnauthorizedAccess the unauthorized access */ @Override public Project registerFileSet(String id, RegisterFileSetRequest request) throws ConfigurationException, @@ -810,7 +1036,7 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< RegisteredFileSet.class); if (!(toDelete == null) && !(toDelete.isEmpty())) { String path = parentMatchingPath + "." + request.getFieldName(); - deleteFileSetRoutine(doc, false, path); + deleteFileSetRoutine(doc, false, false, path); } RegisteredFileSet fs = prepareRegisteredFileSet(toSetAccess, doc.getId(), useCaseDescriptor.getId(), @@ -872,12 +1098,32 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } + /** + * Delete file set. + * + * @param id the id + * @param path the path + * @param force the force + * @param ignore_errors the ignore errors + * @return the project + * @throws ConfigurationException the configuration exception + * @throws StorageHubException the storage hub exception + * @throws JsonProcessingException the json processing exception + * @throws DeletionException the deletion exception + * @throws EventException the event exception + * @throws ProjectLockedException the project locked exception + * @throws ProjectNotFoundException the project not found exception + * @throws InvalidLockException the invalid lock exception + * @throws InvalidUserRoleException the invalid user role exception + * @throws UnauthorizedAccess the unauthorized access + */ @Override - public Project deleteFileSet(String id, String path, Boolean force) throws ConfigurationException, - StorageHubException, JsonProcessingException, DeletionException, EventException, ProjectLockedException, - ProjectNotFoundException, InvalidLockException, InvalidUserRoleException, UnauthorizedAccess { - log.info("Deleting Fileset for {} [useCaseDescriptor ID {}], at {} [force {} ]", id, useCaseDescriptor.getId(), - path, force); + public Project deleteFileSet(String id, String path, Boolean force, Boolean ignore_errors) + throws ConfigurationException, StorageHubException, JsonProcessingException, DeletionException, + EventException, ProjectLockedException, ProjectNotFoundException, InvalidLockException, + InvalidUserRoleException, UnauthorizedAccess { + log.info("Deleting Fileset for {} [useCaseDescriptor ID {}], at {} [force {} and ignore_errors {}]", id, + useCaseDescriptor.getId(), path, force, ignore_errors); Project doc = lock(id, "Fileset Deletion"); try { User u = UserUtils.getCurrent().asInfo().getUser(); @@ -895,7 +1141,10 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< doc.getLifecycleInformation().cleanState(); doc.getLifecycleInformation().cleanState().setLastOperationStatus(LifecycleInformation.Status.OK); - doc = deleteFileSetRoutine(doc, force, path); + if (ignore_errors == null) + ignore_errors = false; + + doc = deleteFileSetRoutine(doc, force, ignore_errors, path); return unlockAndUpdate(doc); } catch (Throwable t) { log.warn("Unexpected Exception while trying to delete fileset on {}.", id, t); @@ -904,6 +1153,17 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } + /** + * Force unlock. + * + * @param id the id + * @return the project + * @throws InvalidUserRoleException the invalid user role exception + * @throws ProjectNotFoundException the project not found exception + * @throws UnauthorizedAccess the unauthorized access + * @throws JsonProcessingException the json processing exception + * @throws InvalidLockException the invalid lock exception + */ @Override public Project forceUnlock(String id) throws InvalidUserRoleException, ProjectNotFoundException, UnauthorizedAccess, JsonProcessingException, InvalidLockException { @@ -922,6 +1182,20 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } + /** + * Sets the access policy. + * + * @param id the id + * @param access the access + * @return the project + * @throws InvalidUserRoleException the invalid user role exception + * @throws ProjectLockedException the project locked exception + * @throws ProjectNotFoundException the project not found exception + * @throws UnauthorizedAccess the unauthorized access + * @throws JsonProcessingException the json processing exception + * @throws InvalidLockException the invalid lock exception + * @throws EventException the event exception + */ @Override public Project setAccessPolicy(String id, Access access) throws InvalidUserRoleException, ProjectLockedException, ProjectNotFoundException, UnauthorizedAccess, @@ -951,16 +1225,41 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } - private Project deleteFileSetRoutine(Project doc, Boolean force, String path) + /** + * Delete file set routine. updated by Francesco + * + * @param doc the doc + * @param force the force + * @param ignore_errors the ignore errors + * @param path the path + * @return the project + * @throws ConfigurationException the configuration exception + * @throws StorageHubException the storage hub exception + */ + private Project deleteFileSetRoutine(Project doc, Boolean force, Boolean ignore_errors, String path) throws ConfigurationException, StorageHubException { - log.info("Delete[force : {}] FS at {} for {}:{}", force, path, doc.getProfileID(), doc.getId()); + log.info("Delete[force : {}, ignore_errors: {}] FS at {} for {}:{}", force, ignore_errors, path, + doc.getProfileID(), doc.getId()); JSONPathWrapper wrapper = new JSONPathWrapper(doc.getTheDocument().toJson()); List matchingPaths = wrapper.getMatchingPaths(path); - if (matchingPaths.isEmpty()) - throw new WebApplicationException("No Registered FileSet found at " + path, Response.Status.BAD_REQUEST); - if (matchingPaths.size() > 1) - throw new WebApplicationException("Multiple Fileset (" + matchingPaths.size() + ") matching " + path, - Response.Status.BAD_REQUEST); + + String error = null; + if (matchingPaths.isEmpty()) { + error = "No Registered FileSet found at " + path; + if (!ignore_errors) { + throw new WebApplicationException(error, Response.Status.BAD_REQUEST); + } + } + if (matchingPaths.size() > 1 && !ignore_errors) { + error = "Multiple Fileset (" + matchingPaths.size() + ") matching " + path; + if (!ignore_errors) + throw new WebApplicationException(error, Response.Status.BAD_REQUEST); + } + + if (error != null && ignore_errors) { + log.info("Error detected {}. Ignoring it and returning input doc", error); + return doc; + } RegisteredFileSet fs = Serialization.convert(wrapper.getByPath(path).get(0), RegisteredFileSet.class); log.debug("Going to delete {}", fs); @@ -1000,6 +1299,12 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return doc; } + /** + * Gets the configuration. + * + * @return the configuration + * @throws ConfigurationException the configuration exception + */ @Override public Configuration getConfiguration() throws ConfigurationException { String context = UserUtils.getCurrent().getContext(); @@ -1072,6 +1377,17 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return toReturn; } + /** + * Step. + * + * @param theDocument the the document + * @param step the step + * @param callParameters the call parameters + * @return the project + * @throws InsufficientPrivileges the insufficient privileges + * @throws ConfigurationException the configuration exception + * @throws StepException the step exception + */ private Project step(Project theDocument, String step, Document callParameters) throws InsufficientPrivileges, ConfigurationException, StepException { try { @@ -1120,6 +1436,14 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } + /** + * Trigger event. + * + * @param project the project + * @param event the event + * @param parameters the parameters + * @return the project + */ private Project triggerEvent(Project project, String event, Document parameters) { try { log.info("[UseCaseDescriptor {}] triggering event {} on {}", useCaseDescriptor.getId(), event, @@ -1140,6 +1464,20 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } + /** + * Prepare registered file set. + * + * @param toSetAccess the to set access + * @param docID the doc ID + * @param profileID the profile ID + * @param attributes the attributes + * @param files the files + * @param storage the storage + * @param ws the ws + * @return the registered file set + * @throws StorageHubException the storage hub exception + * @throws StorageException the storage exception + */ private static final RegisteredFileSet prepareRegisteredFileSet(Access toSetAccess, String docID, String profileID, Document attributes, List files, StorageUtils storage, WorkspaceManager ws) throws StorageHubException, StorageException { @@ -1203,6 +1541,14 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return toReturn; } + /** + * Gets the field definition. + * + * @param useCaseDescriptor the use case descriptor + * @param fieldPath the field path + * @return the field definition + * @throws WebApplicationException the web application exception + */ private static Field getFieldDefinition(UseCaseDescriptor useCaseDescriptor, String fieldPath) throws WebApplicationException { JSONPathWrapper schemaWrapper = new JSONPathWrapper(useCaseDescriptor.getSchema().toJson()); diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java index 477be75..0ebeae3 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java @@ -36,444 +36,425 @@ import lombok.extern.slf4j.Slf4j; /** * The Class ProfiledDocuments. - * @author created by Fabio Sinibaldi - * @author maintainer - Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it * - * Apr 18, 2023 + * @author created by Fabio Sinibaldi + * @author new manager/developer and mantainer - Francesco Mangiacrapa at ISTI-CNR + * francesco.mangiacrapa@isti.cnr.it + * + * Apr 18, 2023 */ -@Path(InterfaceConstants.Methods.PROJECTS+"/{"+InterfaceConstants.Parameters.UCID +"}") +@Path(InterfaceConstants.Methods.PROJECTS + "/{" + InterfaceConstants.Parameters.UCID + "}") @Slf4j @RequestHeaders({ - @RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"), - @RequestHeader( name = "Content-Type", description = "application/json") -}) + @RequestHeader(name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"), + @RequestHeader(name = "Content-Type", description = "application/json") }) public class ProfiledDocuments { - private ProfiledMongoManager manager; + private ProfiledMongoManager manager; - /** - * Instantiates a new profiled documents. - * - * @param profileID the profile ID - * @throws ConfigurationException the configuration exception - */ - public ProfiledDocuments(@PathParam(InterfaceConstants.Parameters.UCID) String profileID) throws ConfigurationException { - log.info("Accessing profile "+profileID); - manager=new GuardedMethod(){ - @Override - protected ProfiledMongoManager run() throws Exception { - return new ProfiledMongoManager(profileID); - } - }.execute().getResult(); - } + /** + * Instantiates a new profiled documents. + * + * @param profileID the profile ID + * @throws ConfigurationException the configuration exception + */ + public ProfiledDocuments(@PathParam(InterfaceConstants.Parameters.UCID) String profileID) + throws ConfigurationException { + log.info("Accessing profile " + profileID); + manager = new GuardedMethod() { + @Override + protected ProfiledMongoManager run() throws Exception { + return new ProfiledMongoManager(profileID); + } + }.execute().getResult(); + } - /** - * Gets the configuration. - * - * @param profileID the profile ID - * @return the configuration - */ - @GET - @Path(InterfaceConstants.Methods.CONFIGURATION_PATH) - @Produces(MediaType.APPLICATION_JSON) - public Configuration getConfiguration(@PathParam(InterfaceConstants.Parameters.UCID) String profileID){ - return new GuardedMethod(){ + /** + * Gets the configuration. + * + * @param profileID the profile ID + * @return the configuration + */ + @GET + @Path(InterfaceConstants.Methods.CONFIGURATION_PATH) + @Produces(MediaType.APPLICATION_JSON) + public Configuration getConfiguration(@PathParam(InterfaceConstants.Parameters.UCID) String profileID) { + return new GuardedMethod() { - @Override - protected Configuration run() throws Exception, WebApplicationException { - return ImplementationProvider.get().getProvidedObjectByClass(ConfigurationCache.ConfigurationMap.class).get(profileID); - } - }.execute().getResult(); - } + @Override + protected Configuration run() throws Exception, WebApplicationException { + return ImplementationProvider.get().getProvidedObjectByClass(ConfigurationCache.ConfigurationMap.class) + .get(profileID); + } + }.execute().getResult(); + } + /** + * Creates the new. + * + * @param d the d + * @return the project + */ + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Project createNew(Document d) { + return new GuardedMethod() { + @Override + protected Project run() throws Exception, WebApplicationException { + log.info("Creating new Project ({})", manager.getUseCaseDescriptor().getId()); + Project toReturn = manager.registerNew(d); + log.info("Created new Project ({}, ID {})", manager.getUseCaseDescriptor().getId(), toReturn.getId()); + return toReturn; + } + }.execute().getResult(); + } - /** - * Creates the new. - * - * @param d the d - * @return the project - */ - @POST - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - public Project createNew(Document d) { - return new GuardedMethod() { - @Override - protected Project run() throws Exception, WebApplicationException { - log.info("Creating new Project ({})",manager.getUseCaseDescriptor().getId()); - Project toReturn= manager.registerNew(d); - log.info("Created new Project ({}, ID {})",manager.getUseCaseDescriptor().getId(),toReturn.getId()); - return toReturn; - } - }.execute().getResult(); - } + /** + * Update. + * + * @param documentId the document id + * @param d the d + * @return the project + */ + @PUT + @Path("{" + InterfaceConstants.Parameters.PROJECT_ID + "}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Project update(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String documentId, Document d) { + return new GuardedMethod() { + @Override + protected Project run() throws Exception, WebApplicationException { + log.info("Updating Project ({}, ID {})", manager.getUseCaseDescriptor().getId(), documentId); + return manager.update(documentId, d); + } + }.execute().getResult(); + } + /** + * Patch. + * + * @param documentId the document id + * @param d the d + * @return the project + */ + @PATCH + @Path("{" + InterfaceConstants.Parameters.PROJECT_ID + "}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Project patch(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String documentId, Document d) { + return new GuardedMethod() { + @Override + protected Project run() throws Exception, WebApplicationException { + log.info("Patching Project ({}, ID {})", manager.getUseCaseDescriptor().getId(), documentId); + // return manager.patch(documentId,d); + throw new WebApplicationException("This method has not yet been implemented!"); + } + }.execute().getResult(); + } - /** - * Update. - * - * @param documentId the document id - * @param d the d - * @return the project - */ - @PUT - @Path("{"+InterfaceConstants.Parameters.PROJECT_ID+"}") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - public Project update(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String documentId, Document d) { - return new GuardedMethod() { - @Override - protected Project run() throws Exception, WebApplicationException { - log.info("Updating Project ({}, ID {})",manager.getUseCaseDescriptor().getId(),documentId); - return manager.update(documentId,d); - } - }.execute().getResult(); - } - - /** - * Patch. - * - * @param documentId the document id - * @param d the d - * @return the project - */ - @PATCH - @Path("{"+InterfaceConstants.Parameters.PROJECT_ID+"}") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - public Project patch(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String documentId, Document d) { - return new GuardedMethod() { - @Override - protected Project run() throws Exception, WebApplicationException { - log.info("Patching Project ({}, ID {})",manager.getUseCaseDescriptor().getId(),documentId); - return manager.patch(documentId,d); - } - }.execute().getResult(); - } + /** + * Delete. + * + * @param id the id + * @param force the force + * @return the boolean + */ + @DELETE + @Produces(MediaType.APPLICATION_JSON) + @Path("{" + InterfaceConstants.Parameters.PROJECT_ID + "}") + public Boolean delete(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, + @DefaultValue("false") @QueryParam(InterfaceConstants.Parameters.FORCE) Boolean force) { + return new GuardedMethod() { + @Override + protected Boolean run() throws Exception, WebApplicationException { + log.info("Deleting Project ({}, ID {}). Force is {}", manager.getUseCaseDescriptor().getId(), id, + force); + manager.delete(id, force); + return true; + } + }.execute().getResult(); + } + /** + * Register file set. + * + * @param id the id + * @param request the request + * @return the project + */ + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/" + InterfaceConstants.Methods.REGISTER_FILES_PATH + "/{" + InterfaceConstants.Parameters.PROJECT_ID + "}") + public Project registerFileSet(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, + RegisterFileSetRequest request) { + return new GuardedMethod() { + @Override + protected Project run() throws Exception, WebApplicationException { + log.info("UCD {} : Project {} Registering Fileset. Request is {}", + manager.getUseCaseDescriptor().getId(), id, request); + request.validate(); + return manager.registerFileSet(id, request); + } + }.execute().getResult(); + } - /** - * Delete. - * - * @param id the id - * @param force the force - * @return the boolean - */ - @DELETE - @Produces(MediaType.APPLICATION_JSON) - @Path("{"+InterfaceConstants.Parameters.PROJECT_ID+"}") - public Boolean delete(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, - @DefaultValue("false") - @QueryParam(InterfaceConstants.Parameters.FORCE) Boolean force) { - return new GuardedMethod() { - @Override - protected Boolean run() throws Exception, WebApplicationException { - log.info("Deleting Project ({}, ID {}). Force is {}",manager.getUseCaseDescriptor().getId(),id,force); - manager.delete(id,force); - return true; - } - }.execute().getResult(); - } + /** + * Delete file set. the Authorization must be a VRE token + * + * @param id the id + * @param force the force + * @param path the path must be passed as text in the body + * @return the project + */ + @RequestHeaders({ + @RequestHeader(name = "Authorization", description = "VRE Bearer token, see https://dev.d4science.org/how-to-access-resources"), + @RequestHeader(name = "Content-Type", description = "application/json") }) + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/" + InterfaceConstants.Methods.DELETE_FILES_PATH + "/{" + InterfaceConstants.Parameters.PROJECT_ID + "}") + public Project deleteFileSet(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, + @DefaultValue("false") @QueryParam(InterfaceConstants.Parameters.FORCE) Boolean force, + @DefaultValue("false") @QueryParam(InterfaceConstants.Parameters.IGNORE_ERRORS) Boolean ignore_errors, String path) { + return new GuardedMethod() { + @Override + protected Project run() throws Exception, WebApplicationException { + log.info("Deleting FileSet of Project ({}, ID {}) at path {}. Force is {}. Ignore_errors is {}", + manager.getUseCaseDescriptor().getId(), id, path, force, ignore_errors); + return manager.deleteFileSet(id, path, force, ignore_errors); + } + }.execute().getResult(); + } - /** - * Register file set. - * - * @param id the id - * @param request the request - * @return the project - */ - @POST - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - @Path("/"+InterfaceConstants.Methods.REGISTER_FILES_PATH+"/{"+InterfaceConstants.Parameters.PROJECT_ID+"}") - public Project registerFileSet(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, - RegisterFileSetRequest request) { - return new GuardedMethod() { - @Override - protected Project run() throws Exception, WebApplicationException { - log.info("UCD {} : Project {} Registering Fileset. Request is {}", - manager.getUseCaseDescriptor().getId(), - id,request); - request.validate(); - return manager.registerFileSet(id,request); - } - }.execute().getResult(); - } + /** + * Perform step. + * + * @param id the id + * @param request the request + * @return the project + */ + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/" + InterfaceConstants.Methods.STEP + "/{" + InterfaceConstants.Parameters.PROJECT_ID + "}") + public Project performStep(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, + StepExecutionRequest request) { + return new GuardedMethod() { + @Override + protected Project run() throws Exception, WebApplicationException { + log.info("Executing step {} on Project ({},ID,{}) with options {}", request.getStepID(), + manager.getUseCaseDescriptor().getId(), id, request.getOptions()); + return manager.performStep(id, request.getStepID(), request.getOptions()); + } + }.execute().getResult(); + } - - /** - * Delete file set. - * the Authorization must be a VRE token - * - * @param id the id - * @param force the force - * @param path the path must be passed as text in the body - * @return the project - */ - @RequestHeaders({ - @RequestHeader( name = "Authorization", description = "VRE Bearer token, see https://dev.d4science.org/how-to-access-resources"), - @RequestHeader( name = "Content-Type", description = "application/json") - }) - @POST - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - @Path("/"+InterfaceConstants.Methods.DELETE_FILES_PATH+"/{"+InterfaceConstants.Parameters.PROJECT_ID+"}") - public Project deleteFileSet( - @PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, - @DefaultValue("false") - @QueryParam(InterfaceConstants.Parameters.FORCE) Boolean force, - String path) { - return new GuardedMethod() { - @Override - protected Project run() throws Exception, WebApplicationException { - log.info("Deleting FileSet of Project ({}, ID {}) at path {}. Force is {}", - manager.getUseCaseDescriptor().getId(), - id,path,force); - return manager.deleteFileSet(id,path,force); - } - }.execute().getResult(); - } + /** + * Force unlock. + * + * @param id the id + * @return the project + */ + @PUT + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/" + InterfaceConstants.Methods.FORCE_UNLOCK + "/{" + InterfaceConstants.Parameters.PROJECT_ID + "}") + public Project forceUnlock(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id) { + return new GuardedMethod() { + @Override + protected Project run() throws Exception, WebApplicationException { + log.warn("UCD {}, forcing unlock for Project ID {}", manager.getUseCaseDescriptor().getId(), id); + return manager.forceUnlock(id); + } + }.execute().getResult(); + } - /** - * Perform step. - * - * @param id the id - * @param request the request - * @return the project - */ - @POST - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - @Path("/"+InterfaceConstants.Methods.STEP+"/{"+InterfaceConstants.Parameters.PROJECT_ID+"}") - public Project performStep( - @PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, - StepExecutionRequest request) { - return new GuardedMethod() { - @Override - protected Project run() throws Exception, WebApplicationException { - log.info("Executing step {} on Project ({},ID,{}) with options {}", - request.getStepID(), - manager.getUseCaseDescriptor().getId(), - id,request.getOptions()); - return manager.performStep(id,request.getStepID(),request.getOptions()); - } - }.execute().getResult(); - } + /** + * Sets the access policy. + * + * @param id the id + * @param toSet the to set + * @return the project + */ + @PUT + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/" + InterfaceConstants.Methods.SET_PROJECT_ACCESS_POLICY + "/{" + InterfaceConstants.Parameters.PROJECT_ID + + "}") + public Project setAccessPolicy(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, Access toSet) { + return new GuardedMethod() { - /** - * Force unlock. - * - * @param id the id - * @return the project - */ - @PUT - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - @Path("/"+InterfaceConstants.Methods.FORCE_UNLOCK+"/{"+InterfaceConstants.Parameters.PROJECT_ID+"}") - public Project forceUnlock( - @PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id){ - return new GuardedMethod(){ + @Override + protected Project run() throws Exception, WebApplicationException { + log.warn("UCD {}, setting Policy {} Project ID {}", manager.getUseCaseDescriptor().getId(), toSet, id); + return manager.setAccessPolicy(id, toSet); + } + }.execute().getResult(); + } - @Override - protected Project run() throws Exception, WebApplicationException { - log.warn("UCD {}, forcing unlock for Project ID {}",manager.getUseCaseDescriptor().getId(),id); - return manager.forceUnlock(id); - } - }.execute().getResult(); - } + // ********************************** READ - /** - * Sets the access policy. - * - * @param id the id - * @param toSet the to set - * @return the project - */ - @PUT - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - @Path("/"+InterfaceConstants.Methods.SET_PROJECT_ACCESS_POLICY+"/{"+InterfaceConstants.Parameters.PROJECT_ID+"}") - public Project setAccessPolicy( - @PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, Access toSet){ - return new GuardedMethod(){ + /** + * List. + * + * @return the iterable + */ + @GET + @Produces(MediaType.APPLICATION_JSON) + public Iterable list() { + return new GuardedMethod>() { + protected Iterable run() throws Exception, WebApplicationException { + return manager.query(new QueryRequest()); + }; + }.execute().getResult(); + } - @Override - protected Project run() throws Exception, WebApplicationException { - log.warn("UCD {}, setting Policy {} Project ID {}",manager.getUseCaseDescriptor().getId(),toSet,id); - return manager.setAccessPolicy(id,toSet); - } - }.execute().getResult(); - } + /** + * Gets the by id. + * + * @param id the id + * @return the by id + */ + // BY ID + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("{" + InterfaceConstants.Parameters.PROJECT_ID + "}") + public Project getById(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id) { + return new GuardedMethod() { + @Override + protected Project run() throws Exception, WebApplicationException { + return manager.getByID(id); + } + }.execute().getResult(); + } - //********************************** READ + /** + * Search. + * + * @param filter the filter + * @return the string + */ + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/" + InterfaceConstants.Methods.SEARCH_PATH) + public String search(String filter) { + return new GuardedMethod() { + @Override + protected String run() throws Exception, WebApplicationException { + QueryRequest req = new QueryRequest(); + req.setFilter(Document.parse(filter)); + return Serialization.write(manager.query(req)); + } + }.execute().getResult(); + } - /** - * List. - * - * @return the iterable - */ - @GET - @Produces(MediaType.APPLICATION_JSON) - public Iterable list() { - return new GuardedMethod>() { - protected Iterable run() throws Exception ,WebApplicationException { - return manager.query(new QueryRequest()); - }; - }.execute().getResult(); - } + /** + * Query. + * + * @param queryString the query string + * @return the iterable + */ + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/" + InterfaceConstants.Methods.QUERY_PATH) + public Iterable query(String queryString) { + return new GuardedMethod>() { + @Override + protected Iterable run() throws Exception, WebApplicationException { + return manager.query(Serialization.parseQuery(queryString)); + } + }.execute().getResult(); + } - /** - * Gets the by id. - * - * @param id the id - * @return the by id - */ - // BY ID - @GET - @Produces(MediaType.APPLICATION_JSON) - @Path("{"+InterfaceConstants.Parameters.PROJECT_ID+"}") - public Project getById(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id) { - return new GuardedMethod() { - @Override - protected Project run() throws Exception, WebApplicationException { - return manager.getByID(id); - } - }.execute().getResult(); - } - - - /** - * Search. - * - * @param filter the filter - * @return the string - */ - @POST - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - @Path("/"+InterfaceConstants.Methods.SEARCH_PATH) - public String search(String filter){ - return new GuardedMethod() { - @Override - protected String run() throws Exception, WebApplicationException { - QueryRequest req=new QueryRequest(); - req.setFilter(Document.parse(filter)); - return Serialization.write(manager.query(req)); - } - }.execute().getResult(); - } - - /** - * Query. - * - * @param queryString the query string - * @return the iterable - */ - @POST - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - @Path("/"+InterfaceConstants.Methods.QUERY_PATH) - public Iterable query(String queryString){ - return new GuardedMethod>() { - @Override - protected Iterable run() throws Exception, WebApplicationException { - return manager.query(Serialization.parseQuery(queryString)); - } - }.execute().getResult(); - } - - // Relationships - - /** - * Gets the relationship chain. - * - * @param id the id - * @param relationshipId the relationship id - * @param deep the deep - * @return the relationship chain - */ - @GET - @Produces(MediaType.APPLICATION_JSON) - @Path("{"+InterfaceConstants.Methods.RELATIONSHIP+"}/{"+InterfaceConstants.Parameters.PROJECT_ID+"}" + - "/{"+InterfaceConstants.Parameters.RELATIONSHIP_ID+"}") - public String getRelationshipChain(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, - @PathParam(InterfaceConstants.Parameters.RELATIONSHIP_ID) String relationshipId, - @DefaultValue("false") - @QueryParam(InterfaceConstants.Parameters.DEEP) Boolean deep) { - return new GuardedMethod(){ - @Override - protected String run() throws Exception, WebApplicationException { - return Serialization.write(ProjectAccessImpl.getRelationshipChain( - manager.getUseCaseDescriptor().getId(), - id, relationshipId,deep - )); - } - }.execute().getResult(); - } - - - /** - * Sets the relation. - * - * @param id the id - * @param relationshipId the relationship id - * @param targetId the target id - * @param targetUCD the target UCD - * @return the project - */ - @PUT - @Produces(MediaType.APPLICATION_JSON) - @Path("{"+InterfaceConstants.Methods.RELATIONSHIP+"}/{"+InterfaceConstants.Parameters.PROJECT_ID+"}" + - "/{"+InterfaceConstants.Parameters.RELATIONSHIP_ID+"}") - public Project setRelation(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, - @PathParam(InterfaceConstants.Parameters.RELATIONSHIP_ID) String relationshipId, - @QueryParam(InterfaceConstants.Parameters.TARGET_ID) String targetId, - @QueryParam(InterfaceConstants.Parameters.TARGET_UCD) String targetUCD) { - return new GuardedMethod() { - @Override - protected Project run() throws Exception, WebApplicationException { - log.info("Set relation from Project ({} : {}) [{}]-> ({} : {})", - manager.getUseCaseDescriptor().getId(), id,relationshipId,targetUCD,targetId); - String toUseTargetUCD=targetUCD; - if(toUseTargetUCD==null || toUseTargetUCD.isEmpty()) { - log.debug("Target UCD is null, forcing same UCD () as source ",manager.getUseCaseDescriptor().getId()); - toUseTargetUCD = manager.getUseCaseDescriptor().getId(); - } - return manager.setRelation(id,relationshipId,toUseTargetUCD,targetId); - } - }.execute().getResult(); - } - - - /** - * Delete relation. - * - * @param id the id - * @param relationshipId the relationship id - * @param targetId the target id - * @param targetUCD the target UCD - * @return the project - */ - @DELETE - @Produces(MediaType.APPLICATION_JSON) - @Path("{"+InterfaceConstants.Methods.RELATIONSHIP+"}/{"+InterfaceConstants.Parameters.PROJECT_ID+"}" + - "/{"+InterfaceConstants.Parameters.RELATIONSHIP_ID+"}") - public Project deleteRelation(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, - @PathParam(InterfaceConstants.Parameters.RELATIONSHIP_ID) String relationshipId, - @QueryParam(InterfaceConstants.Parameters.TARGET_ID) String targetId, - @QueryParam(InterfaceConstants.Parameters.TARGET_UCD) String targetUCD) { - return new GuardedMethod() { - @Override - protected Project run() throws Exception, WebApplicationException { - log.info("Deleting relation from Project ({} : {}) [{}]-> ({} : {})", - manager.getUseCaseDescriptor().getId(), id,relationshipId,targetUCD,targetId); - return manager.deleteRelation(id,relationshipId,targetUCD,targetId); - } - }.execute().getResult(); - } + // Relationships + /** + * Gets the relationship chain. + * + * @param id the id + * @param relationshipId the relationship id + * @param deep the deep + * @return the relationship chain + */ + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("{" + InterfaceConstants.Methods.RELATIONSHIP + "}/{" + InterfaceConstants.Parameters.PROJECT_ID + "}" + "/{" + + InterfaceConstants.Parameters.RELATIONSHIP_ID + "}") + public String getRelationshipChain(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, + @PathParam(InterfaceConstants.Parameters.RELATIONSHIP_ID) String relationshipId, + @DefaultValue("false") @QueryParam(InterfaceConstants.Parameters.DEEP) Boolean deep) { + return new GuardedMethod() { + @Override + protected String run() throws Exception, WebApplicationException { + return Serialization.write(ProjectAccessImpl + .getRelationshipChain(manager.getUseCaseDescriptor().getId(), id, relationshipId, deep)); + } + }.execute().getResult(); + } + /** + * Sets the relation. + * + * @param id the id + * @param relationshipId the relationship id + * @param targetId the target id + * @param targetUCD the target UCD + * @return the project + */ + @PUT + @Produces(MediaType.APPLICATION_JSON) + @Path("{" + InterfaceConstants.Methods.RELATIONSHIP + "}/{" + InterfaceConstants.Parameters.PROJECT_ID + "}" + "/{" + + InterfaceConstants.Parameters.RELATIONSHIP_ID + "}") + public Project setRelation(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, + @PathParam(InterfaceConstants.Parameters.RELATIONSHIP_ID) String relationshipId, + @QueryParam(InterfaceConstants.Parameters.TARGET_ID) String targetId, + @QueryParam(InterfaceConstants.Parameters.TARGET_UCD) String targetUCD) { + return new GuardedMethod() { + @Override + protected Project run() throws Exception, WebApplicationException { + log.info("Set relation from Project ({} : {}) [{}]-> ({} : {})", + manager.getUseCaseDescriptor().getId(), id, relationshipId, targetUCD, targetId); + String toUseTargetUCD = targetUCD; + if (toUseTargetUCD == null || toUseTargetUCD.isEmpty()) { + log.debug("Target UCD is null, forcing same UCD () as source ", + manager.getUseCaseDescriptor().getId()); + toUseTargetUCD = manager.getUseCaseDescriptor().getId(); + } + return manager.setRelation(id, relationshipId, toUseTargetUCD, targetId); + } + }.execute().getResult(); + } + /** + * Delete relation. + * + * @param id the id + * @param relationshipId the relationship id + * @param targetId the target id + * @param targetUCD the target UCD + * @return the project + */ + @DELETE + @Produces(MediaType.APPLICATION_JSON) + @Path("{" + InterfaceConstants.Methods.RELATIONSHIP + "}/{" + InterfaceConstants.Parameters.PROJECT_ID + "}" + "/{" + + InterfaceConstants.Parameters.RELATIONSHIP_ID + "}") + public Project deleteRelation(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, + @PathParam(InterfaceConstants.Parameters.RELATIONSHIP_ID) String relationshipId, + @QueryParam(InterfaceConstants.Parameters.TARGET_ID) String targetId, + @QueryParam(InterfaceConstants.Parameters.TARGET_UCD) String targetUCD) { + return new GuardedMethod() { + @Override + protected Project run() throws Exception, WebApplicationException { + log.info("Deleting relation from Project ({} : {}) [{}]-> ({} : {})", + manager.getUseCaseDescriptor().getId(), id, relationshipId, targetUCD, targetId); + return manager.deleteRelation(id, relationshipId, targetUCD, targetId); + } + }.execute().getResult(); + } }