55import cz .habarta .typescript .generator .emitter .*;
66import cz .habarta .typescript .generator .parser .*;
77import cz .habarta .typescript .generator .util .Utils ;
8+ import java .lang .annotation .Annotation ;
89import java .lang .reflect .*;
910import java .util .*;
1011import javax .ws .rs .core .Application ;
@@ -55,10 +56,10 @@ public TsModel javaToTypeScript(Model model) {
5556 : null ;
5657
5758 if (settings .generateJaxrsApplicationInterface ) {
58- tsModel = createJaxrsInterface (symbolTable , tsModel , jaxrsApplication , responseSymbol , optionsType );
59+ tsModel = createJaxrsInterfaces (symbolTable , tsModel , jaxrsApplication , responseSymbol , optionsType );
5960 }
6061 if (settings .generateJaxrsApplicationClient ) {
61- tsModel = createJaxrsClient (symbolTable , tsModel , jaxrsApplication , responseSymbol , optionsType );
62+ tsModel = createJaxrsClients (symbolTable , tsModel , jaxrsApplication , responseSymbol , optionsType );
6263 }
6364 }
6465
@@ -314,19 +315,20 @@ private Symbol createJaxrsResponseType(SymbolTable symbolTable, TsModel tsModel)
314315 return responseSymbol ;
315316 }
316317
317- private TsModel createJaxrsInterface (SymbolTable symbolTable , TsModel tsModel , JaxrsApplicationModel jaxrsApplication , Symbol responseSymbol , TsType optionsType ) {
318- final List <TsMethodModel > methods = processJaxrsMethods (jaxrsApplication , symbolTable , responseSymbol , optionsType , false );
319- final String applicationName = getApplicationName (jaxrsApplication );
320- final TsBeanModel interfaceModel = new TsBeanModel (Application .class , TsBeanCategory .Service , false , symbolTable .getSyntheticSymbol (applicationName ), null , null , null , null , null , null , methods , null );
321- tsModel .getBeans ().add (interfaceModel );
318+ private TsModel createJaxrsInterfaces (SymbolTable symbolTable , TsModel tsModel , JaxrsApplicationModel jaxrsApplication , Symbol responseSymbol , TsType optionsType ) {
319+ final Map <Symbol , List <TsMethodModel >> groupedMethods = processJaxrsMethods (jaxrsApplication , symbolTable , null , responseSymbol , optionsType , false );
320+ for (Map .Entry <Symbol , List <TsMethodModel >> entry : groupedMethods .entrySet ()) {
321+ final TsBeanModel interfaceModel = new TsBeanModel (null , TsBeanCategory .Service , false , entry .getKey (), null , null , null , null , null , null , entry .getValue (), null );
322+ tsModel .getBeans ().add (interfaceModel );
323+ }
322324 return tsModel ;
323325 }
324326
325- private TsModel createJaxrsClient (SymbolTable symbolTable , TsModel tsModel , JaxrsApplicationModel jaxrsApplication , Symbol responseSymbol , TsType optionsType ) {
327+ private TsModel createJaxrsClients (SymbolTable symbolTable , TsModel tsModel , JaxrsApplicationModel jaxrsApplication , Symbol responseSymbol , TsType optionsType ) {
326328 final Symbol httpClientSymbol = symbolTable .getSyntheticSymbol ("HttpClient" );
327329
328330 // HttpClient interface
329- tsModel .getBeans ().add (new TsBeanModel (null , TsBeanCategory .Service , false , httpClientSymbol , null , null , null , null , null , null , Arrays .asList (
331+ tsModel .getBeans ().add (new TsBeanModel (null , TsBeanCategory .ServicePrerequisite , false , httpClientSymbol , null , null , null , null , null , null , Arrays .asList (
330332 new TsMethodModel ("request" , new TsType .GenericReferenceType (responseSymbol , TsType .Any ), Arrays .asList (
331333 new TsParameterModel ("requestConfig" , new TsType .ObjectType (
332334 new TsProperty ("method" , TsType .String ),
@@ -338,32 +340,72 @@ private TsModel createJaxrsClient(SymbolTable symbolTable, TsModel tsModel, Jaxr
338340 ), null , null )
339341 ), null ));
340342
341- // application client class
343+ // application client classes
342344 final TsConstructorModel constructor = new TsConstructorModel (
343345 Arrays .asList (new TsParameterModel (TsAccessibilityModifier .Protected , "httpClient" , new TsType .ReferenceType (httpClientSymbol ))),
344346 Collections .<TsStatement >emptyList (),
345347 null
346348 );
347- final List <TsMethodModel > methods = processJaxrsMethods (jaxrsApplication , symbolTable , responseSymbol , optionsType , true );
348- final String applicationName = getApplicationName (jaxrsApplication );
349- final String applicationClientName = applicationName + "Client" ;
350- final TsType interfaceType = settings .generateJaxrsApplicationInterface ? new TsType .ReferenceType (symbolTable .getSyntheticSymbol (applicationName )) : null ;
351- final TsBeanModel clientModel = new TsBeanModel (Application .class , TsBeanCategory .Service , true , symbolTable .getSyntheticSymbol (applicationClientName ), null , null , null , Utils .listFromNullable (interfaceType ), null , constructor , methods , null );
352- tsModel .getBeans ().add (clientModel );
349+ final String groupingSuffix = settings .generateJaxrsApplicationInterface ? null : "Client" ;
350+ final Map <Symbol , List <TsMethodModel >> groupedMethods = processJaxrsMethods (jaxrsApplication , symbolTable , groupingSuffix , responseSymbol , optionsType , true );
351+ for (Map .Entry <Symbol , List <TsMethodModel >> entry : groupedMethods .entrySet ()) {
352+ final Symbol symbol = settings .generateJaxrsApplicationInterface ? symbolTable .addSuffixToSymbol (entry .getKey (), "Client" ) : entry .getKey ();
353+ final TsType interfaceType = settings .generateJaxrsApplicationInterface ? new TsType .ReferenceType (entry .getKey ()) : null ;
354+ final TsBeanModel clientModel = new TsBeanModel (null , TsBeanCategory .Service , true , symbol , null , null , null ,
355+ Utils .listFromNullable (interfaceType ), null , constructor , entry .getValue (), null );
356+ tsModel .getBeans ().add (clientModel );
357+ }
353358 // helper
354359 tsModel .getHelpers ().add (TsHelper .loadFromResource ("/helpers/uriEncoding.ts" ));
355360 return tsModel ;
356361 }
357362
358- private List <TsMethodModel > processJaxrsMethods (JaxrsApplicationModel jaxrsApplication , SymbolTable symbolTable , Symbol responseSymbol , TsType optionsType , boolean implement ) {
359- final List <TsMethodModel > methods = new ArrayList <>();
360- final String applicationPath = jaxrsApplication .getApplicationPath ();
361- final Map <String , Long > methodNamesCount = groupingByMethodName (jaxrsApplication .getMethods ());
362- for (JaxrsMethodModel method : jaxrsApplication .getMethods ()) {
363+ private Map <Symbol , List <TsMethodModel >> processJaxrsMethods (JaxrsApplicationModel jaxrsApplication , SymbolTable symbolTable , String nameSuffix , Symbol responseSymbol , TsType optionsType , boolean implement ) {
364+ final Map <Symbol , List <TsMethodModel >> result = new LinkedHashMap <>();
365+ final Map <Symbol , List <JaxrsMethodModel >> groupedMethods = groupingByMethodContainer (jaxrsApplication , symbolTable , nameSuffix );
366+ for (Map .Entry <Symbol , List <JaxrsMethodModel >> entry : groupedMethods .entrySet ()) {
367+ result .put (entry .getKey (), processJaxrsMethodGroup (jaxrsApplication , entry .getValue (), symbolTable , responseSymbol , optionsType , implement ));
368+ }
369+ return result ;
370+ }
371+
372+ private List <TsMethodModel > processJaxrsMethodGroup (JaxrsApplicationModel jaxrsApplication , List <JaxrsMethodModel > methods , SymbolTable symbolTable , Symbol responseSymbol , TsType optionsType , boolean implement ) {
373+ final List <TsMethodModel > resultMethods = new ArrayList <>();
374+ final Map <String , Long > methodNamesCount = groupingByMethodName (methods );
375+ for (JaxrsMethodModel method : methods ) {
363376 final boolean createLongName = methodNamesCount .get (method .getName ()) > 1 ;
364- methods .add (processJaxrsMethod (symbolTable , applicationPath , responseSymbol , method , createLongName , optionsType , implement ));
377+ resultMethods .add (processJaxrsMethod (symbolTable , jaxrsApplication .getApplicationPath (), responseSymbol , method , createLongName , optionsType , implement ));
378+ }
379+ return resultMethods ;
380+ }
381+
382+ private Map <Symbol , List <JaxrsMethodModel >> groupingByMethodContainer (JaxrsApplicationModel jaxrsApplication , SymbolTable symbolTable , String nameSuffix ) {
383+ // rewrite on Java 8 using streams
384+ final Map <Symbol , List <JaxrsMethodModel >> groupedMethods = new LinkedHashMap <>();
385+ for (JaxrsMethodModel method : jaxrsApplication .getMethods ()) {
386+ final Symbol symbol = getContainerSymbol (jaxrsApplication , symbolTable , nameSuffix , method );
387+ if (!groupedMethods .containsKey (symbol )) {
388+ groupedMethods .put (symbol , new ArrayList <JaxrsMethodModel >());
389+ }
390+ groupedMethods .get (symbol ).add (method );
391+ }
392+ return groupedMethods ;
393+ }
394+
395+ private Symbol getContainerSymbol (JaxrsApplicationModel jaxrsApplication , SymbolTable symbolTable , String nameSuffix , JaxrsMethodModel method ) {
396+ if (settings .jaxrsNamespacing == JaxrsNamespacing .perResource ) {
397+ return symbolTable .getSymbol (method .getRootResource (), nameSuffix );
365398 }
366- return methods ;
399+ if (settings .jaxrsNamespacing == JaxrsNamespacing .byAnnotation ) {
400+ final Annotation annotation = method .getRootResource ().getAnnotation (settings .jaxrsNamespacingAnnotation );
401+ final String element = settings .jaxrsNamespacingAnnotationElement != null ? settings .jaxrsNamespacingAnnotationElement : "value" ;
402+ final String annotationValue = Utils .getAnnotationElementValue (annotation , element , String .class );
403+ if (annotationValue != null && Emitter .isValidIdentifierName (annotationValue )) {
404+ return symbolTable .getSyntheticSymbol (annotationValue , nameSuffix );
405+ }
406+ }
407+ final String applicationName = getApplicationName (jaxrsApplication );
408+ return symbolTable .getSyntheticSymbol (applicationName , nameSuffix );
367409 }
368410
369411 private static String getApplicationName (JaxrsApplicationModel jaxrsApplication ) {
0 commit comments