diff --git a/api-openbis-java/build.gradle b/api-openbis-java/build.gradle index 91855a760cb9fbde46e50b4baed2ff527bc21ef2..6b1280153471a3baa8f6e88934db6acbafda656b 100644 --- a/api-openbis-java/build.gradle +++ b/api-openbis-java/build.gradle @@ -67,9 +67,16 @@ generateTypeScript { // 'ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.**', // 'ch.ethz.sis.openbis.generic.asapi.v3.dto.property.**', // 'ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.**', -// 'ch.ethz.sis.openbis.generic.asapi.v3.dto.datastore.**', +// 'ch.ethz.sis.openbis.generic.asapi.v3.dto.project.**', +// 'ch.ethz.sis.openbis.generic.asapi.v3.dto.person.**', // 'ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.**', - 'ch.ethz.sis.openbis.generic.OpenBIS' +// 'ch.ethz.sis.openbis.generic.asapi.v3.dto.material.**', +// 'ch.ethz.sis.openbis.generic.asapi.v3.dto.space.**', +// 'ch.ethz.sis.openbis.generic.asapi.v3.dto.common.**', +// 'ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.**', +// 'ch.ethz.sis.openbis.generic.OpenBIS', + 'ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.archive.ArchiveDataSetsOperation' + ] excludeClassPatterns = ["**.v1.**", "**.generic.shared.**", @@ -78,11 +85,9 @@ generateTypeScript { "ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.ExternalDmsSearchCriteria"] outputKind = 'module' outputFileType = 'declarationFile' - //customTypeProcessor = "ch.empa.tsprocessor.CustomTypeProcessor" - extensionsWithConfiguration = [ new ConfiguredExtension(className:'ch.empa.tsprocessor.MethodExtension', configuration: ['asnycClasses':['ch.ethz.sis.openbis.generic.OpenBIS']])] + 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\"]"])] jackson2ModuleDiscovery = true outputFile = file('../api-openbis-javascript/src/v3/openbis.d.ts') - //module = 'dto' - } diff --git a/api-openbis-java/source/java/ch/empa/tsprocessor/MethodExtension.java b/api-openbis-java/source/java/ch/empa/tsprocessor/MethodExtension.java index 1d048fd094a752d91ce45fc2e463ac14914209f7..c0fec2ee094d879d7ab34083001c47486a09aae5 100644 --- a/api-openbis-java/source/java/ch/empa/tsprocessor/MethodExtension.java +++ b/api-openbis-java/source/java/ch/empa/tsprocessor/MethodExtension.java @@ -1,72 +1,43 @@ package ch.empa.tsprocessor; -import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; import cz.habarta.typescript.generator.*; import cz.habarta.typescript.generator.compiler.ModelCompiler; +import cz.habarta.typescript.generator.compiler.Symbol; import cz.habarta.typescript.generator.compiler.SymbolTable; import cz.habarta.typescript.generator.compiler.TsModelTransformer; import cz.habarta.typescript.generator.emitter.*; -import cz.habarta.typescript.generator.parser.BeanModel; -import cz.habarta.typescript.generator.util.Utils; import java.io.IOException; import java.lang.reflect.*; import java.util.*; -import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; import com.fasterxml.jackson.databind.ObjectMapper;// in play 2.3 interface MethodProcessor { - TsPropertyModel makeFunction(Method method, TsModelTransformer.Context context, SymbolTable symbolTable); + TsPropertyModel makeFunction(Method method, SymbolTable symbolTable); } public class MethodExtension extends Extension { - static final ObjectMapper mapper = new ObjectMapper(); - public static final String CFG_ASYNC_CLASSES = "asyncClasses"; - + static final ObjectMapper mapper = new ObjectMapper(); private List<String> asnycClasses = new ArrayList<>(); public MethodExtension() { } + public MethodExtension(List<String> asyncClasses) { this.asnycClasses = asyncClasses; } - - - @Override - public void setConfiguration(Map<String, String> configuration) throws RuntimeException { - if (configuration.containsKey(CFG_ASYNC_CLASSES)) { - String classString = configuration.get(CFG_ASYNC_CLASSES); - try { - String[] classes = mapper.readValue(classString, String[].class); - asnycClasses = Arrays.asList(classes); - } catch (IOException e) { - throw new RuntimeException(e); - } - System.out.println(classString); - - } - } - - private static String formatAllMethods(TsBeanModel bean) { - System.out.println("MethodExtension.formatAllMethos"); - Class<?> origin = bean.getOrigin(); - return Arrays.stream(origin.getMethods()).map(method -> method.getName()).collect(Collectors.joining("\n")); - - } - private static boolean filterMethods(Method method) { - System.out.println("MethodExtension.filterMethods"); - return !((method.getDeclaringClass() == Object.class) || (method.getName().matches("^(set|get|is).*|hashCode|toString|equals"))); + return !((method.getDeclaringClass() == Object.class) || (method.getName().matches("hashCode|toString|equals"))); } private static List<TsParameter> getMethodParameters(Method method, SymbolTable symbolTable) { - System.out.println("MethodExtension.getMethodParameters"); return Arrays.stream(method.getParameters()).map(parameter -> new TsParameter(method.getName(), ResolveGenericType(parameter.getParameterizedType(), symbolTable))).collect(Collectors.toList()); } @@ -79,8 +50,16 @@ public class MethodExtension extends Extension { // Manually map List<T> to Array<T> TsType elementType = ResolveGenericType(parameterizedType.getActualTypeArguments()[0], symbolTable); return new TsType.GenericReferenceType(symbolTable.getSymbol(Array.class), Collections.singletonList(elementType)); + } else if (Set.class.isAssignableFrom(rawType)) { + // Manually map List<T> to Array<T> + TsType elementType = ResolveGenericType(parameterizedType.getActualTypeArguments()[0], symbolTable); + return new TsType.GenericReferenceType(symbolTable.getSymbol(Set.class), Collections.singletonList(elementType)); + } else if (ArrayList.class.isAssignableFrom(rawType)) { + TsType elementType = ResolveGenericType(parameterizedType.getActualTypeArguments()[0], symbolTable); + return new TsType.GenericReferenceType(symbolTable.getSymbol(ArrayList.class), Collections.singletonList(elementType)); } else { Class<?> rawClass = (Class<?>) parameterizedType.getRawType(); + System.out.printf("Other type %s\n", rawClass.getName()); TsType[] typeArguments = Arrays.stream(parameterizedType.getActualTypeArguments()).map(typeArgument -> ResolveGenericType(typeArgument, symbolTable)).toArray(TsType[]::new); return new TsType.GenericReferenceType(symbolTable.getSymbol(rawClass), Arrays.asList(typeArguments)); } @@ -93,32 +72,27 @@ public class MethodExtension extends Extension { } else if (type instanceof WildcardType) { WildcardType wildcardType = (WildcardType) type; final Type[] upperBounds = wildcardType.getUpperBounds(); - return upperBounds.length > 0 ? new TsType.ReferenceType(symbolTable.getSymbol(upperBounds[0].getClass())) : TsType.Any; + return upperBounds.length > 0 ? ResolveGenericType(upperBounds[0], symbolTable) : TsType.Any; } else { // Handle TypeVariable case return TsType.Any; } } - private static TsType getReturnType(Method method, TsModelTransformer.Context context, SymbolTable symbolTable) { - System.out.println("MethodExtension.getReturnType"); - TsType typeParams = ResolveGenericType(method.getGenericReturnType(), symbolTable); - return typeParams; + private static TsType getReturnType(Method method, SymbolTable symbolTable) { + return ResolveGenericType(method.getGenericReturnType(), symbolTable); } - - private static TsPropertyModel makeFunction(Method method, TsModelTransformer.Context context, SymbolTable symbolTable) { - //System.out.println("MethodExtension.makeFunction"); + private static TsPropertyModel makeFunction(Method method, SymbolTable symbolTable) { List<TsParameter> params = getMethodParameters(method, symbolTable); - TsType returnType = getReturnType(method, context, symbolTable); + TsType returnType = getReturnType(method, symbolTable); return new TsPropertyModel(method.getName(), new TsType.FunctionType(params, returnType), TsModifierFlags.None, false, null); } - private static TsPropertyModel makeCallBackFunction(Method method, TsModelTransformer.Context context, SymbolTable symbolTable) { - //System.out.println("MethodExtension.makeCallBackFunction"); + private static TsPropertyModel makeCallBackFunction(Method method, SymbolTable symbolTable) { List<TsParameter> params = getMethodParameters(method, symbolTable); - TsType returnType = getReturnType(method, context, symbolTable); + TsType returnType = getReturnType(method, symbolTable); TsParameter callbackParam = new TsParameter("callback", returnType); TsType.FunctionType arrowFunction = new TsType.FunctionType(List.of(callbackParam), TsType.Null); TsParameter callback = new TsParameter("callback", arrowFunction); @@ -126,15 +100,39 @@ public class MethodExtension extends Extension { return new TsPropertyModel(method.getName(), new TsType.FunctionType(paramsWithCallback, TsType.Null), TsModifierFlags.None, false, null); } + private static TsPropertyModel makePromiseReturningFunction(Method method, SymbolTable symbolTable) { + List<TsParameter> params = getMethodParameters(method, symbolTable); + List<TsType> returnType = List.of(getReturnType(method, symbolTable)); + TsType promiseType = new TsType.GenericReferenceType(new Symbol("Promise"), returnType); + return new TsPropertyModel(method.getName(), new TsType.FunctionType(params, promiseType), TsModifierFlags.None, false, null); + } private static TsBeanModel addFunctions(TsBeanModel bean, TsModelTransformer.Context context, SymbolTable symbolTable, MethodProcessor processor) { - //System.out.println("MethodExtension.addFunction"); Class<?> origin = bean.getOrigin(); - Stream<TsPropertyModel> params = Arrays.stream(origin.getMethods()).filter(mt -> filterMethods(mt)).map(method -> processor.makeFunction(method, context, symbolTable)); + Stream<TsPropertyModel> params = Arrays.stream(origin.getMethods()).filter(MethodExtension::filterMethods).map(method -> processor.makeFunction(method, symbolTable)); List<TsPropertyModel> allProps = Stream.concat(params, bean.getProperties().stream()).collect(Collectors.toList()); return bean.withProperties(allProps); } + @Override + public void setConfiguration(Map<String, String> configuration) throws RuntimeException { + + if (configuration.containsKey(CFG_ASYNC_CLASSES)) { + + String classString = configuration.get(CFG_ASYNC_CLASSES); + try { + TypeScriptGenerator.getLogger().info(String.format("MethodExtension: setConfiguration, %s, %s", configuration, classString)); + ArrayList<String> classes = mapper.readValue(classString, new TypeReference<ArrayList<String>>() { + }); + asnycClasses = classes; + } catch (IOException e) { + throw new RuntimeException(e); + } + System.out.println(classString); + + } + } + @Override public EmitterExtensionFeatures getFeatures() { final EmitterExtensionFeatures features = new EmitterExtensionFeatures(); @@ -148,29 +146,17 @@ public class MethodExtension extends Extension { @Override public List<TransformerDefinition> getTransformers() { return List.of(new TransformerDefinition(ModelCompiler.TransformationPhase.BeforeSymbolResolution, (TsModelTransformer) (context, model) -> { - //System.out.println("MethodExtension.getTransformers"); - Stream<TsBeanModel> processedBeans = model.getBeans().stream().map(bean -> { - System.out.printf("bean: %s\n", (bean.getOrigin().getName())); - if (asnycClasses.contains(bean.getOrigin().getName())){ - return addFunctions(bean, context, context.getSymbolTable(), MethodExtension::makeCallBackFunction); + Stream<TsBeanModel> processedBeans = model.getBeans().stream().map(bean -> { + if (asnycClasses.contains(bean.getOrigin().getName())) { + return addFunctions(bean, context, context.getSymbolTable(), MethodExtension::makePromiseReturningFunction); } else { - return addFunctions(bean, context, context.getSymbolTable(), MethodExtension::makeFunction); + return addFunctions(bean, context, context.getSymbolTable(), MethodExtension::makeFunction); } - } ); + }); return model.withBeans(processedBeans.collect(Collectors.toList())); })); } - public void emitElements(Writer writer, Settings settings, boolean exportKeyword, TsModel model) { - System.out.println("MethodExtension.emitElements"); - for (TsBeanModel bean : model.getBeans()) { - //System.out.printf("bean: %s\n", formatAllMethods(bean)); - if (bean.isJaxrsApplicationClientBean()) { - final String clientName = bean.getName().getSimpleName(); - final String clientFullName = settings.mapPackagesToNamespaces ? bean.getName().getFullName() : bean.getName().getSimpleName(); - } - } - } }