From fe6edc72de3d9a1a6b6be76dbd3fb9a062295bc7 Mon Sep 17 00:00:00 2001 From: vkovtun <viktor.kovtun@id.ethz.ch> Date: Thu, 5 Jan 2023 14:33:02 +0100 Subject: [PATCH] SSDM-13253 Created the first draft verion of the Java facade. --- .../SessionWorkspaceFileUploadServlet.java | 16 ++- .../server/asapi/v3/OpenBisFacade.java | 123 ++++++++++++++++++ 2 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/OpenBisFacade.java diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/SessionWorkspaceFileUploadServlet.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/SessionWorkspaceFileUploadServlet.java index a2d3924717e..36f175546bf 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/SessionWorkspaceFileUploadServlet.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/SessionWorkspaceFileUploadServlet.java @@ -63,6 +63,8 @@ public class SessionWorkspaceFileUploadServlet extends HttpServlet private static final String STATUS_PARAM = "status"; + public static final String UPLOAD_ID_PARAM = "uploadID"; + private IDssServiceRpcGeneric service; @Override @@ -94,6 +96,7 @@ public class SessionWorkspaceFileUploadServlet extends HttpServlet resultMap.put(START_BYTE_PARAM, uploadRequest.getStartByte()); resultMap.put(END_BYTE_PARAM, uploadRequest.getEndByte()); resultMap.put(FILE_NAME_PARAM, uploadRequest.getFileName()); + resultMap.put(UPLOAD_ID_PARAM, uploadRequest.getUploadId()); resultMap.put(SIZE_PARAM, bytes); resultMap.put(STATUS_PARAM, "ok"); @@ -103,10 +106,10 @@ public class SessionWorkspaceFileUploadServlet extends HttpServlet uploadResponse.writeJson(resultMap); } - private class SessionWorkspaceFileUploadRequest + private static class SessionWorkspaceFileUploadRequest { - private HttpServletRequest request; + private final HttpServletRequest request; public SessionWorkspaceFileUploadRequest(HttpServletRequest request) { @@ -140,6 +143,11 @@ public class SessionWorkspaceFileUploadServlet extends HttpServlet return HttpServletRequestUtils.getStringParameter(request, FILE_NAME_PARAM); } + public String getUploadId() + { + return HttpServletRequestUtils.getStringParameter(request, UPLOAD_ID_PARAM); + } + public InputStream getFile() throws IOException { return request.getInputStream(); @@ -172,10 +180,10 @@ public class SessionWorkspaceFileUploadServlet extends HttpServlet } - private class SessionWorkspaceFileUploadResponse + private static class SessionWorkspaceFileUploadResponse { - private HttpServletResponse response; + private final HttpServletResponse response; public SessionWorkspaceFileUploadResponse(HttpServletResponse response) { diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/OpenBisFacade.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/OpenBisFacade.java new file mode 100644 index 00000000000..b49e16e6048 --- /dev/null +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/OpenBisFacade.java @@ -0,0 +1,123 @@ +package ch.ethz.sis.openbis.generic.server.asapi.v3; + +import java.io.File; +import java.net.URI; +import java.net.URLEncoder; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.time.Duration; +import java.util.Map; + +import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId; +import ch.ethz.sis.openbis.generic.dssapi.v3.dto.dataset.create.UploadedDataSetCreation; +import ch.systemsx.cisd.common.spring.HttpInvokerUtils; +import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException; + +public class OpenBisFacade +{ + + public static final int TIMEOUT_IN_MILLIS = 30000; + + public static String uploadFileWorkspaceDss(final File[] filesOrFolders) + { +// final ServiceFinder serviceFinder = new ServiceFinder("openbis", "session_workspace_file_upload"); +// serviceFinder.computeServerUrl() + final IApplicationServerApi v3 = HttpInvokerUtils.createServiceStub(IApplicationServerApi.class, + "http://localhost:8888/openbis/openbis" + IApplicationServerApi.SERVICE_URL, 10000); + + final String sessionToken = v3.login("admin", "cahngeit"); + System.out.println("Session token: " + sessionToken); + + try + { + final File file = filesOrFolders[0]; + + if (!file.isFile()) + { + throw new UserFailureException("File must me a file for now."); + } + + final String fileName = file.getName(); + + final byte[] respose = request("POST", new URI("http://localhost:8889/datastore_server/session_workspace_file_upload"), + Map.of( + "sessionID", sessionToken, + "filename", fileName, + "id", "0", + "startByte", "0", + "endByte", String.valueOf(file.length()), + "size", String.valueOf(file.length()) + ), Files.readAllBytes(file.toPath())); + System.out.println(new String(respose)); + } catch (Exception e) + { + throw new RuntimeException(e); + } finally + { + v3.logout(sessionToken); + } + + // TODO: implement. + return null; + } + + public static DataSetPermId createUploadedDataSet(final String sessionToken, final UploadedDataSetCreation creation) + { + // TODO: implement. + return null; + } + + @SuppressWarnings({ "OptionalGetWithoutIsPresent", "unchecked" }) + private static byte[] request(final String httpMethod, final URI serverUri, + final Map<String, String> parameters, final byte [] body) throws Exception { + HttpClient client = HttpClient.newBuilder() + .version(HttpClient.Version.HTTP_1_1) + .followRedirects(HttpClient.Redirect.NORMAL) + .connectTimeout(Duration.ofMillis(TIMEOUT_IN_MILLIS)) + .build(); + + final String query = parameters.entrySet().stream() + .map(entry -> urlEncode(entry.getKey()) + "=" + urlEncode(entry.getValue())) + .reduce((s1, s2) -> s1 + "&" + s2).get(); + + final URI uri = new URI(serverUri.getScheme(), null, serverUri.getHost(), serverUri.getPort(), + serverUri.getPath(), query, null); + + final HttpRequest.Builder builder = HttpRequest.newBuilder() + .uri(uri) + .version(HttpClient.Version.HTTP_1_1) + .timeout(Duration.ofMillis(TIMEOUT_IN_MILLIS)) + .method(httpMethod, HttpRequest.BodyPublishers.ofByteArray(body)); + + final HttpRequest request = builder.build(); + + final HttpResponse<byte[]> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofByteArray()); + + final int statusCode = httpResponse.statusCode(); + if (statusCode >= 200 && statusCode < 300) { + return httpResponse.body(); + } else if (statusCode >= 400 && statusCode < 500) { + throw new UserFailureException("User failure. Received status code: " + statusCode + ". Body: " + + new String(httpResponse.body())); + } else if (statusCode >= 500 && statusCode < 600) { + throw new RuntimeException("Server failure. Received status code: " + statusCode); + } else { + throw new RuntimeException("Unknown failure. Received status code: " + statusCode); + } + } + + private static String urlEncode(final String s) { + return URLEncoder.encode(s, StandardCharsets.UTF_8); + } + + public static void main(String[] args) + { + final File file = new File("/home/viktor/Work/Projects/ETH/openbis/settings.gradle"); + uploadFileWorkspaceDss(new File[]{file}); + } + +} -- GitLab