Unlocking

This commit is contained in:
Fabio Sinibaldi 2022-05-17 15:43:19 +02:00
parent dd61ba2d37
commit 1d425405a9
6 changed files with 82 additions and 12 deletions

View File

@ -8,6 +8,7 @@ import org.gcube.application.geoportal.client.utils.Serialization;
import org.gcube.application.geoportal.common.faults.InvalidRequestException; import org.gcube.application.geoportal.common.faults.InvalidRequestException;
import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.configuration.Configuration; import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.document.access.Access;
import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest;
import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest; import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest;
@ -231,10 +232,54 @@ public class DefaultDocumentsClient<T extends Project> implements Projects<T> {
} }
} }
@Override
public T forceUnlock(String id) throws RemoteException {
try {
log.warn("Force Unlock of {} [useCaseDescriptor {} , class {}]",
id, profileID,getManagedClass());
Call<WebTarget, T> call = endpoint -> {
return ResponseCommons.check(endpoint.path(profileID).path(InterfaceConstants.Methods.FORCE_UNLOCK).path(id).
request(MediaType.APPLICATION_JSON).
put(Entity.json("")),getManagedClass());
};
T toReturn=delegate.make(call);
log.info("Unlocked ID {} useCaseDescriptor {}", id, profileID);
return toReturn;
}catch(RemoteException e){
log.error("Unexpected error ",e);
throw e;
}catch(Exception e){
log.error("Unexpected error ",e);
throw new RemoteException("Unexpected Error", e);
}
}
@Override
public T setAccessPolicy(String id, Access toSet) throws RemoteException {
try {
log.info("Setting Access of {} [useCaseDescriptor {} , class {}] as {}",
id, profileID,getManagedClass(),toSet);
Call<WebTarget, T> call = endpoint -> {
return ResponseCommons.check(endpoint.path(profileID).path(InterfaceConstants.Methods.SET_PROJECT_ACCESS_POLICY).path(id).
request(MediaType.APPLICATION_JSON).
put(Entity.json(toSet)),getManagedClass());
};
T toReturn=delegate.make(call);
log.debug("Updated Access of ID {} useCaseDescriptor {}", id, profileID);
return toReturn;
}catch(RemoteException e){
log.error("Unexpected error ",e);
throw e;
}catch(Exception e){
log.error("Unexpected error ",e);
throw new RemoteException("Unexpected Error", e);
}
}
@Override @Override
public T updateDocument(String id, Document updatedDocument) throws RemoteException { public T updateDocument(String id, Document updatedDocument) throws RemoteException {
try { try {
log.debug("Updateing {}  [useCaseDescriptor {}  , class {}] with ", log.debug("Updateing {} [useCaseDescriptor {} , class {}] with ",
id, profileID,getManagedClass(),updatedDocument); id, profileID,getManagedClass(),updatedDocument);
Call<WebTarget, T> call = endpoint -> { Call<WebTarget, T> call = endpoint -> {
return ResponseCommons.check(endpoint.path(profileID).path(id). return ResponseCommons.check(endpoint.path(profileID).path(id).
@ -242,7 +287,7 @@ public class DefaultDocumentsClient<T extends Project> implements Projects<T> {
put(Entity.entity(updatedDocument, MediaType.APPLICATION_JSON)),getManagedClass()); put(Entity.entity(updatedDocument, MediaType.APPLICATION_JSON)),getManagedClass());
}; };
T toReturn=delegate.make(call); T toReturn=delegate.make(call);
log.info("Updated ID {}  useCaseDescriptor {}  ", id, profileID); log.info("Updated ID {} useCaseDescriptor {}", id, profileID);
return toReturn; return toReturn;
}catch(RemoteException e){ }catch(RemoteException e){
log.error("Unexpected error ",e); log.error("Unexpected error ",e);

View File

@ -4,6 +4,7 @@ import org.bson.Document;
import org.gcube.application.geoportal.common.faults.InvalidRequestException; import org.gcube.application.geoportal.common.faults.InvalidRequestException;
import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.document.Project;
import org.gcube.application.geoportal.common.model.configuration.Configuration; import org.gcube.application.geoportal.common.model.configuration.Configuration;
import org.gcube.application.geoportal.common.model.document.access.Access;
import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest;
import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest; import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest;
@ -39,4 +40,7 @@ public interface Projects<P extends Project> {
public P registerFileSet(String id, RegisterFileSetRequest req) throws RemoteException, InvalidRequestException; public P registerFileSet(String id, RegisterFileSetRequest req) throws RemoteException, InvalidRequestException;
//FileSets //FileSets
public P deleteFileSet(String id, String path, Boolean force) throws RemoteException; public P deleteFileSet(String id, String path, Boolean force) throws RemoteException;
public P forceUnlock(String id) throws RemoteException;
public P setAccessPolicy(String id, Access toSet) throws RemoteException;
} }

View File

@ -683,10 +683,10 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI<
// expected exception // expected exception
toUnlock = getByID(id); toUnlock = getByID(id);
}finally { }finally {
if(toUnlock!=null) unlock(toUnlock); if(toUnlock!=null)
return unlock(toUnlock);
else throw new WebApplicationException("Unable to get Project "+id, Response.Status.EXPECTATION_FAILED); else throw new WebApplicationException("Unable to get Project "+id, Response.Status.EXPECTATION_FAILED);
} }
return null;
} }
@Override @Override

View File

@ -87,7 +87,7 @@ public class UserUtils {
user.setRoles(roles); user.setRoles(roles);
}catch(Exception e){ }catch(Exception e){
log.warn("Unable to determine user id, using FAKE",e); log.warn("Unable to determine user id, using FAKE",e);
user.setUsername("FAKE"); user.setUsername("fabio.sinibaldi");
user.setRoles(new HashSet<>()); user.setRoles(new HashSet<>());
user.getRoles().addAll(DEFAULT_ROLES); user.getRoles().addAll(DEFAULT_ROLES);
} }

View File

@ -20,6 +20,7 @@ import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget; import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue; import static org.junit.Assume.assumeTrue;
@ -105,6 +106,19 @@ public class DummyProjectTest extends AbstractProfiledDocumentsTests{
return doc; return doc;
} }
@Test
public void testUnlock() throws Exception {
assumeTrue(GCubeTest.isTestInfrastructureEnabled());
// Not automatic, needs generation of locked project
assumeTrue(false);
String id = "627e87bb02ad3d1a2e0e9e18";
String ucd = "profiledConcessioni";
Project p =check(target(InterfaceConstants.Methods.PROJECTS).path(ucd).path(InterfaceConstants.Methods.FORCE_UNLOCK).path(id).request(MediaType.APPLICATION_JSON).
put(Entity.entity("", MediaType.APPLICATION_JSON)), Project.class);
assertNull(p.getLock());
}
// @Test // @Test
// public void testSDI() throws Exception { // public void testSDI() throws Exception {
// // Create new // // Create new

View File

@ -11,9 +11,7 @@ import org.gcube.application.geoportal.common.rest.Projects;
import java.rmi.RemoteException; import java.rmi.RemoteException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.concurrent.ExecutorService; import java.util.concurrent.*;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import static org.gcube.application.geoportal.client.plugins.GeoportalAbstractPlugin.projects; import static org.gcube.application.geoportal.client.plugins.GeoportalAbstractPlugin.projects;
@ -38,14 +36,16 @@ public class ClearProjects {
AtomicLong count=new AtomicLong(0); AtomicLong count=new AtomicLong(0);
AtomicLong nullCount=new AtomicLong(0); AtomicLong nullCount=new AtomicLong(0);
AtomicLong errCount=new AtomicLong(0);
ConcurrentSkipListSet<String> errors = new ConcurrentSkipListSet<>();
AtomicLong found=new AtomicLong(0); AtomicLong found=new AtomicLong(0);
Iterator<Project> it=null; Iterator<Project> it=null;
it=client.query(new QueryRequest()); it=client.query(new QueryRequest());
// it=manager.search("{\"nome\" : {$regex : \"Mock .*\"}, \"creationTime\" :{$gt : \"2021-10-18T13:58:53.326\"}}"); // it=manager.search("{\"nome\" : {$regex : \"Mock .*\"}, \"creationTime\" :{$gt : \"2021-10-18T13:58:53.326\"}}");
ExecutorService service = Executors.newFixedThreadPool(3); ExecutorService service = Executors.newFixedThreadPool(1);
it.forEachRemaining((Project c)->{ it.forEachRemaining((Project c)->{
@ -60,6 +60,11 @@ public class ClearProjects {
System.out.println("ID IS NULL " + c); System.out.println("ID IS NULL " + c);
nullCount.incrementAndGet(); nullCount.incrementAndGet();
} }
if(c.getLock()!=null){
System.out.println("Unlocking "+currentId);
client.forceUnlock(currentId);
}
else else
if(toSkipIds.contains(currentId)) if(toSkipIds.contains(currentId))
System.out.println("Skipping "+currentId); System.out.println("Skipping "+currentId);
@ -69,7 +74,7 @@ public class ClearProjects {
} }
}catch(Throwable throwable){ }catch(Throwable throwable){
System.err.println(throwable); System.err.println(throwable);
errCount.incrementAndGet(); errors.add(c.getId());
try {Thread.sleep(1000);} catch (InterruptedException i) {} try {Thread.sleep(1000);} catch (InterruptedException i) {}
}finally { }finally {
count.incrementAndGet(); count.incrementAndGet();
@ -83,8 +88,10 @@ public class ClearProjects {
if(found.get()==count.get()) service.shutdown(); if(found.get()==count.get()) service.shutdown();
} }
System.out.println("Done "+count.get()+" [null : "+nullCount.get()+", err : "+errCount.get()+"]"); System.out.println("Done "+count.get()+" [null : "+nullCount.get()+", err : "+errors.size()+"]");
System.out.println("Errors : ");
errors.forEach(s -> System.out.println(s));
} }
} }