diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..730ab73 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/test/target/ \ No newline at end of file diff --git a/pom.xml b/pom.xml index eb2a735..20a2ab3 100644 --- a/pom.xml +++ b/pom.xml @@ -4,6 +4,7 @@ org.bsc.processor java2ts-processor 1.0.0-SNAPSHOT + java2ts-processor - ${project.version} java2ts-processor @@ -27,6 +28,11 @@ edu.washington.cs.types.jsr308 jsr308-compiler + + org.kohsuke.metainf-services + metainf-services + true + @@ -40,6 +46,11 @@ jsr308-compiler 1.7.5 + + org.kohsuke.metainf-services + metainf-services + 1.7 + diff --git a/src/main/java/org/bsc/processor/AbstractProcessorEx.java b/src/main/java/org/bsc/processor/AbstractProcessorEx.java index edae87e..25c984b 100644 --- a/src/main/java/org/bsc/processor/AbstractProcessorEx.java +++ b/src/main/java/org/bsc/processor/AbstractProcessorEx.java @@ -119,6 +119,8 @@ protected FileObject getSourceOutputFile( Filer filer, @Override public final boolean process(Set annotations, RoundEnvironment roundEnv) { + info( "PROCESSOR START"); + if (roundEnv.processingOver()) return false; diff --git a/src/main/java/org/bsc/processor/Tuple2.java b/src/main/java/org/bsc/processor/Tuple2.java new file mode 100644 index 0000000..c281640 --- /dev/null +++ b/src/main/java/org/bsc/processor/Tuple2.java @@ -0,0 +1,30 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.bsc.processor; + +/** + * + * @author softphone + */ +public class Tuple2 { + final T0 $0; + final T1 $1; + + public Tuple2(T0 $0, T1 $1) { + this.$0 = $0; + this.$1 = $1; + } + + @Override + public String toString() { + return String.format("%s{$0=%s,$1=%s }", + getClass().getSimpleName(), + String.valueOf($0), + String.valueOf($1) + ); + } + +} diff --git a/src/main/java/org/bsc/processor/TypescriptProcessor.java b/src/main/java/org/bsc/processor/TypescriptProcessor.java index b798df9..43a5a89 100644 --- a/src/main/java/org/bsc/processor/TypescriptProcessor.java +++ b/src/main/java/org/bsc/processor/TypescriptProcessor.java @@ -1,21 +1,35 @@ package org.bsc.processor; import io.reactivex.Observable; -import io.reactivex.functions.Function; +import java.beans.BeanInfo; +import java.beans.FeatureDescriptor; +import java.beans.IntrospectionException; +import java.beans.MethodDescriptor; +import java.beans.PropertyDescriptor; +import java.util.Arrays; import java.util.List; -import java.util.Set; -import javax.annotation.processing.RoundEnvironment; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.annotation.processing.Processor; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.ElementKind; -import javax.lang.model.element.TypeElement; import javax.lang.model.type.DeclaredType; +import org.kohsuke.MetaInfServices; /** * * @author bsoorentino */ +@SupportedSourceVersion(SourceVersion.RELEASE_8) +@SupportedAnnotationTypes("org.bsc.processor.*") +//@SupportedOptions({ "TS.outdir" }) +@MetaInfServices(Processor.class) public class TypescriptProcessor extends AbstractProcessorEx { + /** * * @param processingContext @@ -23,9 +37,65 @@ public class TypescriptProcessor extends AbstractProcessorEx { */ @Override public boolean process( Context processingContext ) { - + + rxEnumerateDeclaredPackageAndClass( processingContext ) + .toMap( (clazz) -> clazz.getName() ) + .flatMapObservable( (declaredClasses) -> + Observable.fromIterable(declaredClasses.values()) + .map( (clazz) -> new Tuple2( java.beans.Introspector.getBeanInfo(clazz), declaredClasses ))) + .doOnNext( this::processClass ) + .subscribe( (clazz) -> info( "class [%s]", clazz ) ) + ; return true; } + + private void processClass( final Tuple2>> t ) { + + final Class type = t.$0.getBeanDescriptor().getBeanClass(); + + info( "class %s", type.getName()); + + info( String.format( "properties:") ); + Arrays.asList(t.$0.getPropertyDescriptors()).stream().forEach( (pd) -> { + + info( String.format( "\t%s:%s", pd.getName(), convertJavaToTS(pd.getPropertyType(), t.$1))); + }); + + info( String.format( "methods:")); + Arrays.asList(type.getDeclaredMethods()).stream().forEach( (md) -> { + + final Class returnType = md.getReturnType(); + info( String.format( "\t%s():%s", md.getName(), convertJavaToTS(returnType, t.$1))); + + }); + + /* + Arrays.asList(t.$0.getMethodDescriptors()).stream().forEach( (md) -> { + + final Class returnType = md.getMethod().getReturnType(); + info( String.format( "\t%s():%s", md.getName(), convertJavaToTS(returnType, t.$1))); + + }); + */ + } + + + private String convertJavaToTS( Class type, java.util.Map> declaredClassMap ) { + + //info( "java type [%s]", type ); + if( type==Void.class || type.equals(Void.TYPE) ) return "void"; + if( type.isAssignableFrom(Boolean.class) || type.equals(Boolean.TYPE) ) return type.isPrimitive() ? "boolean" : "boolean" ; + if( type.isAssignableFrom(Integer.class) || type.equals(Integer.TYPE)) return type.isPrimitive() ? "number" : "number" ; + if( type.isAssignableFrom(String.class) ) return "string"; + + if( declaredClassMap.containsKey(type.getName()) ) { + return type.getSimpleName(); + } + + return "any"; + + } + private Observable> rxEnumerateDeclaredPackageAndClass( final Context processingContext ) { @@ -45,7 +115,7 @@ private Observable> rxEnumerateDeclaredPackageAndClass( final Context p .ofType(DeclaredType.class) .doOnNext((dt) -> info( "DeclaredType [%s]",dt) ) .onExceptionResumeNext(Observable.empty()) - .map((DeclaredType dt) -> { + .map((DeclaredType dt) -> { try { return Class.forName(dt.toString()); } catch (ClassNotFoundException e1) { diff --git a/src/main/java/org/bsc/processor/annotation/Java2TS.java b/src/main/java/org/bsc/processor/annotation/Java2TS.java new file mode 100644 index 0000000..ede9c8f --- /dev/null +++ b/src/main/java/org/bsc/processor/annotation/Java2TS.java @@ -0,0 +1,14 @@ +package org.bsc.processor.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +@Retention(RetentionPolicy.SOURCE) +@Target( {ElementType.TYPE, ElementType.PACKAGE} ) +public @interface Java2TS { + + Class[] declare() default {}; +} \ No newline at end of file diff --git a/test/pom.xml b/test/pom.xml new file mode 100644 index 0000000..bd747bd --- /dev/null +++ b/test/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + org.test + java2ts-processor-test + 1.0.0-SNAPSHOT + java2ts-processor::test - ${project.version} + + 1.8 + 1.8 + UTF-8 + + + + + org.bsc.processor + java2ts-processor + ${project.version} + + + + + + java2ts-processor-test + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + -Xlint:all + true + true + + + + + + diff --git a/test/src/main/java/org/test/package-info.java b/test/src/main/java/org/test/package-info.java new file mode 100644 index 0000000..8b63f34 --- /dev/null +++ b/test/src/main/java/org/test/package-info.java @@ -0,0 +1,13 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +@Java2TS(declare = { + java.beans.Beans.class, + java.sql.Connection.class +}) +package org.test; + +import org.bsc.processor.annotation.Java2TS; +