From b6e1dd25f441361ac30d9cd20ed22b3d3015979e Mon Sep 17 00:00:00 2001
From: pkupczyk <piotr.kupczyk@id.ethz.ch>
Date: Mon, 27 Nov 2023 14:34:20 +0100
Subject: [PATCH] BIS-757 : Write Translator to TypeScript - extension for the
 openbis module exported by default

---
 api-openbis-java/build.gradle                 | 12 ++++-
 .../tsprocessor/OpenBISModuleExtension.java   | 52 +++++++++++++++++++
 2 files changed, 62 insertions(+), 2 deletions(-)
 create mode 100644 lib-typescriptprocessor/source/java/ch/empa/tsprocessor/OpenBISModuleExtension.java

diff --git a/api-openbis-java/build.gradle b/api-openbis-java/build.gradle
index dc3bb8dec87..690fdc1c482 100644
--- a/api-openbis-java/build.gradle
+++ b/api-openbis-java/build.gradle
@@ -73,10 +73,18 @@ generateTypeScript {
                             "ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.ExternalDmsSearchCriteria",
                             "ch.ethz.sis.openbis.generic.dssapi.v3.dto.common.operation.IOperationResult",
                             "ch.ethz.sis.openbis.generic.dssapi.v3.dto.service.execute.AbstractExecutionOptionsWithParameters"]
+    mapClasses = "asInterfaces"
     outputKind = 'module'
     outputFileType = 'declarationFile'
-    customTypeNaming = ["ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.ExternalDmsSearchCriteria:ExternalDmsSearchCriteria", "ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.search.ExternalDmsSearchCriteria:DSExternalDmsSearchCriteria"]
-    extensionsWithConfiguration = [new ConfiguredExtension(className: 'ch.empa.tsprocessor.MethodExtension', configuration: ['asyncClasses': "[\"ch.ethz.sis.openbis.generic.OpenBIS\"]"])]
+    customTypeNaming = [
+            "ch.ethz.sis.openbis.generic.OpenBIS:facade",
+            "ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.ExternalDmsSearchCriteria:ExternalDmsSearchCriteria",
+            "ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.search.ExternalDmsSearchCriteria:DSExternalDmsSearchCriteria"
+    ]
+    extensionsWithConfiguration = [
+            new ConfiguredExtension(className: 'ch.empa.tsprocessor.MethodExtension', configuration: ['asyncClasses': "[\"ch.ethz.sis.openbis.generic.OpenBIS\"]"]),
+            new ConfiguredExtension(className: 'ch.empa.tsprocessor.OpenBISModuleExtension')
+    ]
     jackson2ModuleDiscovery = true
     outputFile = file('../api-openbis-javascript/src/v3/openbis.d.ts')
 }
diff --git a/lib-typescriptprocessor/source/java/ch/empa/tsprocessor/OpenBISModuleExtension.java b/lib-typescriptprocessor/source/java/ch/empa/tsprocessor/OpenBISModuleExtension.java
new file mode 100644
index 00000000000..df4c9e48313
--- /dev/null
+++ b/lib-typescriptprocessor/source/java/ch/empa/tsprocessor/OpenBISModuleExtension.java
@@ -0,0 +1,52 @@
+package ch.empa.tsprocessor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import cz.habarta.typescript.generator.Extension;
+import cz.habarta.typescript.generator.Settings;
+import cz.habarta.typescript.generator.TsType;
+import cz.habarta.typescript.generator.compiler.ModelCompiler;
+import cz.habarta.typescript.generator.compiler.Symbol;
+import cz.habarta.typescript.generator.compiler.TsModelTransformer;
+import cz.habarta.typescript.generator.emitter.EmitterExtensionFeatures;
+import cz.habarta.typescript.generator.emitter.TsBeanCategory;
+import cz.habarta.typescript.generator.emitter.TsBeanModel;
+import cz.habarta.typescript.generator.emitter.TsModel;
+import cz.habarta.typescript.generator.emitter.TsPropertyModel;
+
+public class OpenBISModuleExtension extends Extension
+{
+    @Override public EmitterExtensionFeatures getFeatures()
+    {
+        final EmitterExtensionFeatures features = new EmitterExtensionFeatures();
+        features.generatesRuntimeCode = false;
+        features.generatesModuleCode = true;
+        features.worksWithPackagesMappedToNamespaces = true;
+        features.generatesJaxrsApplicationClient = false;
+        return features;
+    }
+
+    @Override public List<TransformerDefinition> getTransformers()
+    {
+        return List.of(new TransformerDefinition(ModelCompiler.TransformationPhase.AfterDeclarationSorting, (TsModelTransformer) (context, model) ->
+        {
+            List<TsBeanModel> beans = model.getBeans();
+            List<TsPropertyModel> properties = new ArrayList<>();
+
+            for (TsBeanModel bean : beans)
+            {
+                properties.add(new TsPropertyModel(bean.getName().getSimpleName(), new TsType.ReferenceType(bean.getName()), null, true, null));
+            }
+
+            beans.add(new TsBeanModel(null, TsBeanCategory.Data, false, new Symbol("openbis"), null, null, null, null, properties, null, null, null));
+
+            return model.withBeans(beans);
+        }));
+    }
+
+    @Override public void emitElements(final Writer writer, final Settings settings, final boolean exportKeyword, final TsModel model)
+    {
+        writer.writeIndentedLine("export default openbis");
+    }
+}
-- 
GitLab