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 extends TypeElement> 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;
+