Purge upon deletion (optional)
This commit is contained in:
parent
815a972c82
commit
b68257d150
|
@ -364,7 +364,11 @@ public class SDIManager {
|
|||
}
|
||||
//delete file
|
||||
|
||||
dtGeoServer.getWebClient().delete(toDelete.getGeoserverPath());
|
||||
|
||||
// TODO REMOVE HARDCODED PATCH
|
||||
String path=toDelete.getGeoserverPath().replace("/srv/geoserver_data","geoserver");
|
||||
// path=toDelete.getGeoserverPath();
|
||||
dtGeoServer.getWebClient().delete(path);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -69,6 +69,10 @@ public class WorkspaceManager {
|
|||
return sgClient.open(id).asFolder();
|
||||
}
|
||||
|
||||
public void removeFolderById(String id) throws StorageHubException {
|
||||
sgClient.open(id).asFolder().delete();
|
||||
}
|
||||
|
||||
public FolderContainer getSubFolder(FolderContainer parentFolder,String path) throws StorageHubException {
|
||||
try{
|
||||
return parentFolder.openByRelativePath(path).asFolder();
|
||||
|
|
|
@ -18,14 +18,13 @@ import org.gcube.application.geoportal.service.engine.WorkspaceManager;
|
|||
import org.gcube.application.geoportal.service.engine.WorkspaceManager.FileOptions;
|
||||
import org.gcube.application.geoportal.service.engine.WorkspaceManager.FolderOptions;
|
||||
import org.gcube.application.geoportal.service.engine.postgis.PostgisIndex;
|
||||
import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException;
|
||||
import org.gcube.application.geoportal.service.model.internal.faults.InvalidStateException;
|
||||
import org.gcube.application.geoportal.service.model.internal.faults.PublishException;
|
||||
import org.gcube.application.geoportal.service.model.internal.faults.SDIInteractionException;
|
||||
import org.gcube.application.geoportal.service.model.internal.faults.*;
|
||||
import org.gcube.application.geoportal.service.utils.Serialization;
|
||||
import org.gcube.common.storagehub.client.dsl.FolderContainer;
|
||||
import org.gcube.data.transfer.library.faults.RemoteServiceException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.MalformedURLException;
|
||||
import java.sql.SQLException;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
|
@ -95,8 +94,8 @@ public class ConcessioniMongoManager extends MongoManager{
|
|||
return asConcessione(replace(asDocument(toReturn),collectionName));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public List<Concessione> list(){
|
||||
ArrayList<Concessione> toReturn=new ArrayList<>();
|
||||
iterate(null, collectionName).forEach(
|
||||
|
@ -107,19 +106,57 @@ public class ConcessioniMongoManager extends MongoManager{
|
|||
toReturn.add(asConcessione(d));
|
||||
}catch(Throwable t) {
|
||||
log.error("Unable to read Document as concessione ",t);
|
||||
log.debug("Document was "+d.toJson());
|
||||
log.debug("Document was "+d.toJson());
|
||||
}
|
||||
}
|
||||
});
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
public Concessione getById(String id) throws JsonProcessingException, IOException {
|
||||
public Concessione getById(String id)throws IOException {
|
||||
log.debug("Loading by ID "+id);
|
||||
return asConcessione(getById(asId(id),collectionName));
|
||||
}
|
||||
public void deleteById(String id) {
|
||||
delete(asId(id), collectionName);
|
||||
|
||||
public void deleteById(String id,boolean force) throws DeletionException {
|
||||
log.debug("Deleting by ID {}, force {}",id,force);
|
||||
try{
|
||||
Concessione concessione =unpublish(id);
|
||||
try{
|
||||
// UNPUBLISH
|
||||
|
||||
if (!concessione.getReport().getStatus().equals(ValidationStatus.PASSED)&&!force)
|
||||
throw new DeletionException("Unable to unpublish "+concessione.getMongo_id());
|
||||
//clean WS
|
||||
|
||||
concessione = removeContent(concessione);
|
||||
|
||||
if (!concessione.getReport().getStatus().equals(ValidationStatus.PASSED)&&!force)
|
||||
throw new DeletionException("Unable to unpublish "+concessione.getMongo_id());
|
||||
|
||||
delete(asId(id), collectionName);
|
||||
}catch(DeletionException e) {
|
||||
//storing updated - partially deleted
|
||||
replace(asDocument(concessione), collectionName);
|
||||
throw e;
|
||||
}
|
||||
}catch(Throwable t){
|
||||
throw new DeletionException("Unable to delete "+id,t);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Concessione unpublish(String id) throws DeletionException {
|
||||
try{
|
||||
Concessione toReturn=asConcessione(getById(asId(id),collectionName));
|
||||
removeFromIndex(toReturn);
|
||||
log.debug("Removed from centroids "+toReturn.getMongo_id());
|
||||
toReturn = unpublish(toReturn);
|
||||
log.debug("Concessione after unpublishing is "+toReturn);
|
||||
return asConcessione(replace(asDocument(toReturn),collectionName));
|
||||
}catch(Throwable t){
|
||||
throw new DeletionException("Unable to unpublish "+id,t);
|
||||
}
|
||||
}
|
||||
|
||||
public Concessione publish(String id) throws JsonProcessingException, IOException, InvalidStateException{
|
||||
|
@ -139,6 +176,33 @@ public class ConcessioniMongoManager extends MongoManager{
|
|||
}
|
||||
|
||||
|
||||
public static Concessione removeContent(Concessione concessione) throws DeletionException {
|
||||
if(concessione.getFolderId()==null) {
|
||||
log.debug("No content for " + concessione.getMongo_id());
|
||||
return concessione;
|
||||
}
|
||||
try {
|
||||
log.debug("Removing content for " + concessione.getMongo_id());
|
||||
WorkspaceManager manager = new WorkspaceManager();
|
||||
manager.removeFolderById(concessione.getFolderId());
|
||||
|
||||
//Removing references from Object
|
||||
concessione.setFolderId(null);
|
||||
ArrayList<AssociatedContent> list = new ArrayList<>();
|
||||
list.add(concessione.getPosizionamentoScavo());
|
||||
list.addAll(concessione.getPianteFineScavo());
|
||||
list.addAll(concessione.getImmaginiRappresentative());
|
||||
list.addAll(concessione.getGenericContent());
|
||||
for (AssociatedContent c : list) {
|
||||
c.getActualContent().clear();
|
||||
}
|
||||
return concessione;
|
||||
}catch(Throwable t){
|
||||
throw new DeletionException("Unable to delete from WS ",t);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public Concessione persistContent(String id, String destinationPath, List<TempFile> files) throws Exception{
|
||||
log.info("Persisting {} files for path {} in concessione ",files.size(),destinationPath,id);
|
||||
try{
|
||||
|
@ -146,7 +210,7 @@ public class ConcessioniMongoManager extends MongoManager{
|
|||
WorkspaceManager ws=new WorkspaceManager();
|
||||
//Check Init Base folder
|
||||
FolderContainer baseFolder=null;
|
||||
if(c.getFolderId()==null) {
|
||||
if(c.getFolderId()==null) {
|
||||
String folderName=Files.fixFilename("mConcessione"+"_"+c.getNome()+"_"+Serialization.FULL_FORMATTER.format(LocalDateTime.now()));
|
||||
log.info("Creating folder {} for Concessione ID {} ",folderName,id);
|
||||
FolderContainer folder=ws.createFolder(new FolderOptions(folderName, "Base Folder for "+c.getNome(),null));
|
||||
|
@ -182,7 +246,20 @@ public class ConcessioniMongoManager extends MongoManager{
|
|||
return record;
|
||||
}
|
||||
|
||||
|
||||
private static Concessione removeFromIndex(Concessione record) {
|
||||
log.info("Removing from index {} ",record.getId());
|
||||
ValidationReport report= new ValidationReport("Remove From Index Report ");
|
||||
PostgisIndex index;
|
||||
try {
|
||||
index = new PostgisIndex();
|
||||
index.removeCentroid(record);
|
||||
report.addMessage(ValidationStatus.PASSED, "Removed centroid");
|
||||
} catch (SDIInteractionException | SQLException | ConfigurationException e) {
|
||||
log.error("Unable to reove from index {} ",record,e);
|
||||
report.addMessage(ValidationStatus.WARNING, "Internal error while indexing.");
|
||||
}
|
||||
return record;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -196,7 +273,7 @@ public class ConcessioniMongoManager extends MongoManager{
|
|||
ValidationReport report=new ValidationReport("Publish report");
|
||||
try {
|
||||
SDIManager sdiManager=new SDIManager();
|
||||
ArrayList<AssociatedContent> list=new ArrayList<AssociatedContent>();
|
||||
ArrayList<AssociatedContent> list=new ArrayList<AssociatedContent>();
|
||||
|
||||
//Concessione
|
||||
String workspace= sdiManager.createWorkspace("gna_conc_"+conc.getMongo_id());
|
||||
|
@ -231,24 +308,61 @@ public class ConcessioniMongoManager extends MongoManager{
|
|||
return conc;
|
||||
}
|
||||
|
||||
private static final Concessione unpublish(Concessione concessione){
|
||||
ValidationReport report=new ValidationReport("Unpublish report");
|
||||
try{
|
||||
SDIManager sdi=new SDIManager();
|
||||
ArrayList<AssociatedContent> list=new ArrayList<AssociatedContent>();
|
||||
|
||||
list.add(concessione.getPosizionamentoScavo());
|
||||
list.addAll(concessione.getPianteFineScavo());
|
||||
for(AssociatedContent c:list) {
|
||||
if(c instanceof LayerConcessione) {
|
||||
//TODO actually delete
|
||||
List<PersistedContent> contents=c.getActualContent();
|
||||
List<PersistedContent> toRemove=new ArrayList<>();
|
||||
for(PersistedContent p:contents){
|
||||
if(p instanceof GeoServerContent){
|
||||
try {
|
||||
sdi.deleteContent((GeoServerContent) p);
|
||||
toRemove.add(p);
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
} catch (RemoteServiceException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
c.getActualContent().removeAll(toRemove);
|
||||
}
|
||||
}
|
||||
}catch(SDIInteractionException e){
|
||||
report.addMessage(ValidationStatus.WARNING, "Unable to unpublish layers "+e.getMessage());
|
||||
}
|
||||
concessione.setReport(report);
|
||||
return concessione;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static final void store(AssociatedContent content,List<TempFile> files, WorkspaceManager ws, FolderContainer base) throws Exception {
|
||||
FolderContainer sectionParent=null;
|
||||
FolderContainer sectionParent=null;
|
||||
|
||||
if(content instanceof RelazioneScavo)
|
||||
sectionParent = ws .createFolder(new FolderOptions(
|
||||
"relazione","Relazione di scavo : "+content.getTitolo(),base));
|
||||
|
||||
else if (content instanceof UploadedImage)
|
||||
else if (content instanceof UploadedImage)
|
||||
sectionParent = ws .createFolder(new FolderOptions(
|
||||
"imgs","Immagini rappresentative : "+content.getTitolo(),base));
|
||||
|
||||
else if (content instanceof SDILayerDescriptor)
|
||||
//SDI Section
|
||||
if(content instanceof LayerConcessione)
|
||||
if(content instanceof LayerConcessione)
|
||||
sectionParent = ws .createFolder(new FolderOptions(
|
||||
content.getTitolo(),"Layer Concessione : "+content.getTitolo(),ws.getSubFolder(base,"layers")));
|
||||
else throw new Exception("Invalid SDI Content "+content);
|
||||
else if (content instanceof OtherContent )
|
||||
else if (content instanceof OtherContent )
|
||||
sectionParent = ws .createFolder(new FolderOptions(
|
||||
content.getTitolo(),"Relazione di scavo : "+content.getTitolo(),ws.getSubFolder(base,"other")));
|
||||
else throw new Exception("Invalid Content "+content);
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
package org.gcube.application.geoportal.service.model.internal.faults;
|
||||
|
||||
public class DeletionException extends Exception {
|
||||
|
||||
public DeletionException() {
|
||||
}
|
||||
|
||||
public DeletionException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public DeletionException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public DeletionException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
public DeletionException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
|
||||
super(message, cause, enableSuppression, writableStackTrace);
|
||||
}
|
||||
}
|
|
@ -89,12 +89,14 @@ public class ConcessioniOverMongo {
|
|||
@DELETE
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
@Path("{"+InterfaceConstants.Parameters.PROJECT_ID+"}")
|
||||
public void deleteById(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id) {
|
||||
public void deleteById(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id,
|
||||
@QueryParam("force") Boolean forceOption) {
|
||||
new GuardedMethod<Concessione> () {
|
||||
@Override
|
||||
protected Concessione run() throws Exception, WebApplicationException {
|
||||
Boolean force=(forceOption!=null)?forceOption:false;
|
||||
ConcessioniMongoManager manager=new ConcessioniMongoManager();
|
||||
manager.deleteById(id);
|
||||
manager.deleteById(id,force);
|
||||
return null;
|
||||
}
|
||||
}.execute();
|
||||
|
|
|
@ -91,7 +91,14 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{
|
|||
public void delete() throws Exception {
|
||||
WebTarget target=target(PATH);
|
||||
Concessione c = get(target);
|
||||
|
||||
|
||||
|
||||
check(target.path(c.getMongo_id()).request(MediaType.APPLICATION_JSON).delete(),null);
|
||||
|
||||
Concessione published=getFullPublished(target);
|
||||
|
||||
check(target.path(published.getMongo_id()).request(MediaType.APPLICATION_JSON).delete(),null);
|
||||
}
|
||||
|
||||
|
||||
|
@ -145,28 +152,7 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{
|
|||
@Test
|
||||
public void publish() throws Exception {
|
||||
WebTarget target=target(PATH);
|
||||
Concessione c=TestModel.prepareConcessione(1,2);
|
||||
|
||||
c.setNome("Concessione : publish test");
|
||||
|
||||
|
||||
|
||||
// Register new
|
||||
c=register(target,c);
|
||||
|
||||
//Upload files
|
||||
upload(target,c.getMongo_id(),Paths.RELAZIONE,"relazione.pdf");
|
||||
upload(target,c.getMongo_id(),Paths.POSIZIONAMENTO,"pos.shp","pos.shx");
|
||||
|
||||
// Clash on workspaces
|
||||
upload(target,c.getMongo_id(),Paths.piantaByIndex(0),"pianta.shp","pianta.shx");
|
||||
upload(target,c.getMongo_id(),Paths.imgByIndex(0),"immagine.png");
|
||||
upload(target,c.getMongo_id(),Paths.imgByIndex(1),"immagine2.png");
|
||||
|
||||
|
||||
|
||||
// Immagini
|
||||
Concessione published=publish(target, c);
|
||||
Concessione published=getFullPublished(target);
|
||||
System.out.println("Published : "+published);
|
||||
System.out.println("Report is : "+published.getReport());
|
||||
assertNotNull(published.getReport());
|
||||
|
@ -181,7 +167,31 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{
|
|||
assertNotNull(published.getCentroidLong());
|
||||
}
|
||||
|
||||
|
||||
private Concessione getFullPublished(WebTarget target) throws Exception {
|
||||
Concessione c=TestModel.prepareConcessione(1,2);
|
||||
|
||||
c.setNome("Concessione : publish test");
|
||||
|
||||
|
||||
|
||||
// Register new
|
||||
c=register(target,c);
|
||||
|
||||
//Upload files
|
||||
upload(target,c.getMongo_id(),Paths.RELAZIONE,"relazione.pdf");
|
||||
upload(target,c.getMongo_id(),Paths.POSIZIONAMENTO,"pos.shp","pos.shx");
|
||||
|
||||
// Clash on workspaces
|
||||
upload(target,c.getMongo_id(),Paths.piantaByIndex(0),"pianta.shp","pianta.shx");
|
||||
upload(target,c.getMongo_id(),Paths.imgByIndex(0),"immagine.png");
|
||||
upload(target,c.getMongo_id(),Paths.imgByIndex(1),"immagine2.png");
|
||||
|
||||
|
||||
|
||||
// Immagini
|
||||
Concessione published=publish(target, c);
|
||||
return published;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
Reference in New Issue