package org.gcube.common.storagehub.client.proxies; import java.io.InputStream; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import org.gcube.common.clients.Call; import org.gcube.common.clients.delegates.ProxyDelegate; import org.gcube.common.gxrest.request.GXWebTargetAdapterRequest; import org.gcube.common.gxrest.response.inbound.GXInboundResponse; import org.gcube.common.storagehub.client.StreamDescriptor; import org.gcube.common.storagehub.model.acls.ACL; import org.gcube.common.storagehub.model.acls.AccessType; import org.gcube.common.storagehub.model.exceptions.BackendGenericError; import org.gcube.common.storagehub.model.items.Item; import org.gcube.common.storagehub.model.service.ItemList; import org.gcube.common.storagehub.model.service.ItemWrapper; import org.gcube.common.storagehub.model.types.ACLList; import org.glassfish.jersey.media.multipart.FormDataMultiPart; import org.glassfish.jersey.media.multipart.MultiPartFeature; public class DefaultItemManager implements ItemManagerClient { private final ProxyDelegate delegate; public DefaultItemManager(ProxyDelegate config){ this.delegate = config; } @Override public List getChildren(String id, String ... excludeNodes) { Call call = new Call() { @Override public ItemList call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(id).path("children"); Map params = new HashMap<>(); if (excludeNodes !=null && excludeNodes.length>0) params.put("exclude",excludeNodes); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.APPLICATION_JSON_TYPE).queryParams(params).get(); if (response.hasGXError()) throw response.getException(); ItemList items = response.getSource().readEntity(ItemList.class); return items; } }; try { ItemList result = delegate.make(call); return result.getItemlist(); }catch(Exception e) { throw new RuntimeException(e); } } @Override public StreamDescriptor download(String id, String... excludeNodes) { Call call = new Call() { @Override public StreamDescriptor call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(id).path("download"); Map params = new HashMap<>(); if (excludeNodes !=null && excludeNodes.length>0) params.put("exclude",excludeNodes); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.APPLICATION_OCTET_STREAM_TYPE).queryParams(params).get(); if (response.hasGXError()) throw response.getException(); Response resp = response.getSource(); InputStream stream = resp.readEntity(InputStream.class); String disposition = resp.getHeaderString("Content-Disposition"); String fileName = disposition.replaceFirst("attachment; filename = ([^/s]+)?", "$1"); return new StreamDescriptor(stream, fileName); } }; try { StreamDescriptor result = delegate.make(call); return result; }catch(Exception e) { throw new RuntimeException(e); } } @Override public Item get(String id, String... excludeNodes) { Call> call = new Call>() { @Override public ItemWrapper call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(id); Map params = new HashMap<>(); if (excludeNodes !=null && excludeNodes.length>0) params.put("exclude",excludeNodes); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.APPLICATION_JSON_TYPE).queryParams(params).get(); if (response.hasGXError()) throw response.getException(); ItemWrapper item = response.getSource().readEntity(ItemWrapper.class); return item; } }; try { ItemWrapper result = delegate.make(call); return result.getItem(); }catch(Exception e) { throw new RuntimeException(e); } } @Override public Item getRootSharedFolder(String id) { Call> call = new Call>() { @Override public ItemWrapper call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(id).path("rootSharedFolder"); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.APPLICATION_JSON_TYPE).get(); if (response.hasGXError()) throw response.getException(); ItemWrapper item = response.getSource().readEntity(ItemWrapper.class); return item; } }; try { ItemWrapper result = delegate.make(call); return result.getItem(); }catch(Exception e) { throw new RuntimeException(e); } } @Override public URL getPublickLink(String id) { Call call = new Call() { @Override public URL call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(id).path("publiclink"); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.TEXT_PLAIN_TYPE).get(); if (response.hasGXError()) throw response.getException(); URL item = response.getSource().readEntity(URL.class); return item; } }; try { URL result = delegate.make(call); return result; }catch(Exception e) { throw new RuntimeException(e); } } @Override public List getChildren(String id, int start, int limit, String... excludeNodes) { Call call = new Call() { @Override public ItemList call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(id).path("children").path("paged"); Map params = new HashMap<>(); if (excludeNodes !=null && excludeNodes.length>0) params.put("exclude",excludeNodes); params.put("start", new Object[] {start}); params.put("limit", new Object[] {limit}); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.APPLICATION_JSON_TYPE).queryParams(params).get(); if (response.hasGXError()) throw response.getException(); ItemList items = response.getSource().readEntity(ItemList.class); return items; } }; try { ItemList result = delegate.make(call); return result.getItemlist(); }catch(Exception e) { throw new RuntimeException(e); } } @Override public List findChildrenByNamePattern(String id, String name, String... excludeNodes) { Call call = new Call() { @Override public ItemList call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(id).path("items").path(name); Map params = new HashMap<>(); if (excludeNodes !=null && excludeNodes.length>0) params.put("exclude",excludeNodes); GXInboundResponse response = myManager.queryParams(params).setAcceptedResponseType(MediaType.APPLICATION_JSON_TYPE).get(); if (response.hasGXError()) throw response.getException(); ItemList items = response.getSource().readEntity(ItemList.class); return items; } }; try { ItemList result = delegate.make(call); return result.getItemlist(); }catch(Exception e) { throw new RuntimeException(e); } } @Override public Integer childrenCount(String id) { Call call = new Call() { @Override public Integer call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(id).path("children").path("count"); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.TEXT_PLAIN_TYPE).get(); if (response.hasGXError()) throw response.getException(); return response.getSource().readEntity(Integer.class); } }; try { Integer result = delegate.make(call); return result; }catch(Exception e) { throw new RuntimeException(e); } } @Override public String uploadFile(InputStream stream, String parentId, String fileName, String description) { Call call = new Call() { @Override public String call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.register(MultiPartFeature.class).path(parentId) .path("create").path("FILE"); FormDataMultiPart multipart = new FormDataMultiPart(); multipart.field("name", fileName); multipart.field("description", description); multipart.field("file", stream, MediaType.APPLICATION_OCTET_STREAM_TYPE); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.TEXT_PLAIN_TYPE).post(Entity.entity(multipart, MediaType.MULTIPART_FORM_DATA)); if (response.hasGXError()) throw response.getException(); return response.getSource().readEntity(String.class); } }; try { return delegate.make(call); }catch(Exception e) { throw new RuntimeException(e); } } @Override public String uploadArchive(InputStream stream, String parentId, String extractionFolderName) { Call call = new Call() { @Override public String call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.register(MultiPartFeature.class).path(parentId) .path("create").path("ARCHIVE"); FormDataMultiPart multipart = new FormDataMultiPart(); multipart.field("parentFolderName", extractionFolderName); multipart.field("file", stream, MediaType.APPLICATION_OCTET_STREAM_TYPE); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.TEXT_PLAIN_TYPE).post(Entity.entity(multipart, MediaType.MULTIPART_FORM_DATA_TYPE)); if (response.hasGXError()) throw response.getException(); return response.getSource().readEntity(String.class); } }; try { return delegate.make(call); }catch(Exception e) { throw new RuntimeException(e); } } @Override public String createFolder(String parentId, String name, String description) { Call call = new Call() { @Override public String call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(parentId) .path("create").path("FOLDER"); MultivaluedMap formData = new MultivaluedHashMap(); formData.add("name", name); formData.add("description", description); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(Entity.entity(formData, MediaType.APPLICATION_FORM_URLENCODED)); if (response.hasGXError() || response.hasException()) throw response.getException(); if (response.hasErrorCode()) throw new BackendGenericError(); return response.getSource().readEntity(String.class); } }; try { return delegate.make(call); }catch(Exception e) { throw new RuntimeException(e); } } @Override public String shareFolder(String id, Set users, AccessType accessType) { Call call = new Call() { @Override public String call(GXWebTargetAdapterRequest manager) throws Exception { System.out.println("id is: "+id); GXWebTargetAdapterRequest myManager = manager.register(MultiPartFeature.class).path(id) .path("share"); try (FormDataMultiPart multipart = new FormDataMultiPart()){ multipart.field("defaultAccessType", accessType, MediaType.APPLICATION_JSON_TYPE); multipart.field("users", users, MediaType.APPLICATION_JSON_TYPE); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.TEXT_PLAIN_TYPE).put(Entity.entity(multipart, MediaType.MULTIPART_FORM_DATA_TYPE)); if (response.hasGXError()) throw response.getException(); return response.getSource().readEntity(String.class); } } }; try { return delegate.make(call); }catch(Exception e) { throw new RuntimeException(e); } } @Override public String unshareFolder(String id, Set users) { Call call = new Call() { @Override public String call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.register(MultiPartFeature.class).path(id) .path("unshare"); try (FormDataMultiPart multipart = new FormDataMultiPart()){ multipart.field("users", users, MediaType.APPLICATION_JSON_TYPE); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.TEXT_PLAIN_TYPE).put(Entity.entity(multipart, MediaType.MULTIPART_FORM_DATA_TYPE)); if (response.hasGXError()) throw response.getException(); return response.getSource().readEntity(String.class); } } }; try { return delegate.make(call); }catch(Exception e) { throw new RuntimeException(e); } } @Override public void delete(String id) { Call call = new Call() { @Override public Void call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(id); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.TEXT_PLAIN_TYPE).delete(); if (response.hasGXError()) throw response.getException(); return null; } }; try { delegate.make(call); }catch(Exception e) { throw new RuntimeException(e); } } @Override public List getAnchestors(String id, String... excludeNodes) { Call call = new Call() { @Override public ItemList call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(id).path("anchestors"); Map params = new HashMap<>(); if (excludeNodes !=null && excludeNodes.length>0) params.put("exclude",excludeNodes); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.APPLICATION_JSON_TYPE).queryParams(params).get(); if (response.hasGXError()) throw response.getException(); return response.getSource().readEntity(ItemList.class); } }; try { ItemList result = delegate.make(call); return result.getItemlist(); }catch(Exception e) { throw new RuntimeException(e); } } @Override public List getACL(String id) { Call call = new Call() { @Override public ACLList call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(id).path("acls"); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.APPLICATION_JSON_TYPE).get(); if (response.hasGXError()) throw response.getException(); return response.getSource().readEntity(ACLList.class); } }; try { return delegate.make(call).getAcls(); }catch(Exception e) { throw new RuntimeException(e); } } @Override public String copy(String id, String destinationFolderId, String newFilename) { Call call = new Call() { @Override public String call(GXWebTargetAdapterRequest manager) throws Exception { GXWebTargetAdapterRequest myManager = manager.path(id) .path("copy"); MultivaluedMap formData = new MultivaluedHashMap(); formData.add("destinationId", destinationFolderId); formData.add("fileName", newFilename); GXInboundResponse response = myManager.setAcceptedResponseType(MediaType.TEXT_PLAIN_TYPE).post(Entity.form(formData)); if (response.hasGXError()) throw response.getException(); return response.getSource().readEntity(String.class); } }; try { return delegate.make(call); }catch(Exception e) { throw new RuntimeException(e); } } }