diff --git a/.classpath b/.classpath index 4591c00..6acf3ee 100644 --- a/.classpath +++ b/.classpath @@ -22,16 +22,16 @@ - - - - - + + + + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 443e085..6e80039 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,8 +1,8 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.7 +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml index d3e543c..0b77f9b 100644 --- a/.settings/org.eclipse.wst.common.project.facet.core.xml +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -1,8 +1,8 @@ - + diff --git a/src/main/java/org/gcube/data/transfer/service/transfers/REST.java b/src/main/java/org/gcube/data/transfer/service/transfers/REST.java index 8842cf3..7ebcf10 100644 --- a/src/main/java/org/gcube/data/transfer/service/transfers/REST.java +++ b/src/main/java/org/gcube/data/transfer/service/transfers/REST.java @@ -9,6 +9,7 @@ import java.util.Set; import javax.activation.MimetypesFileTypeMap; import javax.inject.Inject; import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -21,6 +22,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import org.gcube.data.transfer.model.DeletionReport; import org.gcube.data.transfer.model.Destination; import org.gcube.data.transfer.model.DestinationClashPolicy; import org.gcube.data.transfer.model.PluginInvocation; @@ -157,7 +159,7 @@ public class REST { } - // @Path("/{destinationId}/{subPath : \\S*}") + @GET @Produces("*/*") public Response getFile(@PathParam("destinationId") String destinationId, @@ -179,17 +181,18 @@ public class REST { } } -// // @Path("/{destinationId}/{subPath : \\\\S*}") -// @HEAD -// @Produces(MediaType.APPLICATION_JSON) -// public RemoteFileDescriptor getFileDescriptor(@PathParam("destinationId") String destinationId, -// @PathParam("subPath") String subPath ) { -// String pathString="<"+destinationID+">/"+subPath; -// log.info("Received HEAD request at {} ",pathString); -// try{ -// return persistence.getDescriptor(destinationId, subPath); -// }catch(DestinationAccessException e) { -// throw new WebApplicationException("Unable to access selected path "+pathString,Status.INTERNAL_SERVER_ERROR); -// } -// } + + @DELETE + @Produces(MediaType.APPLICATION_JSON) + public DeletionReport deleteFile(@PathParam("destinationId") String destinationId, + @PathParam("subPath") String subPath) { + String pathString="<"+destinationID+">/"+subPath; + log.info("Received DELETE request at {}",pathString); + try{ + return persistence.delete(destinationId, subPath); + }catch(DestinationAccessException e) { + throw new WebApplicationException("Unable to access selected path "+pathString,e,Status.INTERNAL_SERVER_ERROR); + } + } + } diff --git a/src/main/java/org/gcube/data/transfer/service/transfers/engine/PersistenceProvider.java b/src/main/java/org/gcube/data/transfer/service/transfers/engine/PersistenceProvider.java index cd6d602..7503393 100644 --- a/src/main/java/org/gcube/data/transfer/service/transfers/engine/PersistenceProvider.java +++ b/src/main/java/org/gcube/data/transfer/service/transfers/engine/PersistenceProvider.java @@ -3,6 +3,7 @@ package org.gcube.data.transfer.service.transfers.engine; import java.io.File; import java.util.Set; +import org.gcube.data.transfer.model.DeletionReport; import org.gcube.data.transfer.model.Destination; import org.gcube.data.transfer.model.RemoteFileDescriptor; import org.gcube.data.transfer.service.transfers.engine.faults.DestinationAccessException; @@ -19,4 +20,5 @@ public interface PersistenceProvider { public RemoteFileDescriptor getDescriptor(String persistenceId,String subPath) throws DestinationAccessException; + public DeletionReport delete(String persistenceId,String subPath) throws DestinationAccessException; } diff --git a/src/main/java/org/gcube/data/transfer/service/transfers/engine/impl/PersistenceProviderImpl.java b/src/main/java/org/gcube/data/transfer/service/transfers/engine/impl/PersistenceProviderImpl.java index 2598b7f..6d4f038 100644 --- a/src/main/java/org/gcube/data/transfer/service/transfers/engine/impl/PersistenceProviderImpl.java +++ b/src/main/java/org/gcube/data/transfer/service/transfers/engine/impl/PersistenceProviderImpl.java @@ -10,6 +10,7 @@ import java.util.Set; import javax.inject.Singleton; +import org.gcube.data.transfer.model.DeletionReport; import org.gcube.data.transfer.model.Destination; import org.gcube.data.transfer.model.DestinationClashPolicy; import org.gcube.data.transfer.model.RemoteFileDescriptor; @@ -32,8 +33,8 @@ public class PersistenceProviderImpl implements PersistenceProvider { File persistenceFolder=getPersistenceFolderById(persistenceId); return new File(persistenceFolder.getAbsolutePath()+"/"+subPath); } - - + + @Override public RemoteFileDescriptor getDescriptor(String persistenceId, String subPath) throws DestinationAccessException { File file=getPersistedFile(persistenceId, subPath); @@ -48,7 +49,7 @@ public class PersistenceProviderImpl implements PersistenceProvider { }catch(Throwable t) { log.warn("Unable to access attributes for {} ",file.getAbsolutePath(),t); } - + toReturn.setAbsolutePath(file.getAbsolutePath()); toReturn.setDirectory(file.isDirectory()); toReturn.setFilename(file.getName()); @@ -57,9 +58,9 @@ public class PersistenceProviderImpl implements PersistenceProvider { log.debug("Returning descriptor {} ",toReturn); return toReturn; } - - - + + + @Override public File getPersistenceFolderById(String persistenceId) throws DestinationAccessException { File toReturn=null; @@ -79,11 +80,11 @@ public class PersistenceProviderImpl implements PersistenceProvider { } } if(toReturn== null) throw new DestinationAccessException("Persistence ID "+persistenceId+" not found."); - if(!toReturn.exists()) throw new DestinationAccessException("Persistence ID "+persistenceId+", location "+toReturn.getAbsolutePath()+" location doesn't exists."); - if(!toReturn.canWrite()) throw new DestinationAccessException("Cannot write to Persistence ID "+persistenceId+", location "+toReturn.getAbsolutePath()+" ."); - if(!toReturn.isDirectory()) throw new DestinationAccessException("Persistence ID "+persistenceId+", location "+toReturn.getAbsolutePath()+" is a directory."); - if(!toReturn.canWrite()) throw new DestinationAccessException("Cannot write to Persistence ID "+persistenceId+", location "+toReturn.getAbsolutePath()+" ."); - return toReturn; + if(!toReturn.exists()) throw new DestinationAccessException("Persistence ID "+persistenceId+", location "+toReturn.getAbsolutePath()+" location doesn't exists."); + if(!toReturn.canWrite()) throw new DestinationAccessException("Cannot write to Persistence ID "+persistenceId+", location "+toReturn.getAbsolutePath()+" ."); + if(!toReturn.isDirectory()) throw new DestinationAccessException("Persistence ID "+persistenceId+", location "+toReturn.getAbsolutePath()+" is a directory."); + if(!toReturn.canWrite()) throw new DestinationAccessException("Cannot write to Persistence ID "+persistenceId+", location "+toReturn.getAbsolutePath()+" ."); + return toReturn; } @@ -148,9 +149,9 @@ public class PersistenceProviderImpl implements PersistenceProvider { String clashingName=clashing.getName(); String clashingBaseName=(!dir&&clashingName.contains("."))?clashingName.substring(0, clashingName.lastIndexOf(".")):clashingName; String destinationExtension=(!dir&&clashingName.contains("."))?clashingName.substring(clashingName.lastIndexOf(".")):""; - - - + + + int counter=1; while(clashing.exists()){ clashing=new File(clashing.getParentFile(),clashingBaseName+"("+counter+")"+destinationExtension); @@ -173,9 +174,21 @@ public class PersistenceProviderImpl implements PersistenceProvider { } return clashing; } - - - private static final void deleteRecursively(File toDelete) throws IOException { + + @Override + public DeletionReport delete(String persistenceId, String subPath) throws DestinationAccessException { + String toDeletePublicPath=persistenceId+"/"+subPath; + File toDelete=getPersistedFile(persistenceId, subPath); + try{ + log.warn("Going to DELETE {} aka {} ",toDelete.getAbsolutePath(),toDeletePublicPath); + deleteRecursively(toDelete); + return new DeletionReport(toDeletePublicPath,toDelete.getAbsolutePath()); + }catch(Throwable t) { + throw new DestinationAccessException("Unable to delete "+toDeletePublicPath,t); + } + } + + public static final void deleteRecursively(File toDelete) throws IOException { log.warn("Recursively deleting {} ",toDelete.getAbsolutePath()); if(toDelete.isDirectory()) { for(File child:toDelete.listFiles()) diff --git a/src/test/java/org/gcube/data/transfer/service/TestCall.java b/src/test/java/org/gcube/data/transfer/service/TestCall.java index 318abcc..bab384b 100644 --- a/src/test/java/org/gcube/data/transfer/service/TestCall.java +++ b/src/test/java/org/gcube/data/transfer/service/TestCall.java @@ -10,6 +10,7 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Application; import javax.ws.rs.core.MediaType; +import org.gcube.data.transfer.model.DeletionReport; import org.gcube.data.transfer.model.Destination; import org.gcube.data.transfer.model.RemoteFileDescriptor; import org.gcube.data.transfer.model.ServiceConstants; @@ -143,4 +144,13 @@ public class TestCall extends JerseyTest { System.out.println(target(ServiceConstants.REST_SERVLET_NAME).path("data-transfer-service/some/folder/inside/temp.txt").request(MediaType.APPLICATION_JSON).head().readEntity(RemoteFileDescriptor.class)); } + @Test + public void testDELETE() { + System.out.println(target(ServiceConstants.REST_SERVLET_NAME).path("data-transfer-service/temp.txt").request(MediaType.APPLICATION_JSON).head().readEntity(RemoteFileDescriptor.class)); + System.out.println(target(ServiceConstants.REST_SERVLET_NAME).path("data-transfer-service/some/folder/inside/temp.txt").request(MediaType.APPLICATION_JSON).head().readEntity(RemoteFileDescriptor.class)); + + System.out.println(target(ServiceConstants.REST_SERVLET_NAME).path("data-transfer-service/temp.txt").request(MediaType.APPLICATION_JSON).delete().readEntity(DeletionReport.class)); + System.out.println(target(ServiceConstants.REST_SERVLET_NAME).path("data-transfer-service/some/folder/inside/temp.txt").request(MediaType.APPLICATION_JSON).delete().readEntity(DeletionReport.class)); + + } }