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