33import java .io .*;
44import java .text .CharacterIterator ;
55import java .text .StringCharacterIterator ;
6+ import java .util .ArrayList ;
67import java .util .Date ;
78import java .util .Locale ;
89import java .util .Set ;
@@ -430,9 +431,6 @@ public static String getEncryptionKey(com.genexus.ModelContext context, String k
430431 }
431432
432433 private static final String gxApplicationClassesFileName = "GXApplicationClasses.txt" ;
433- private static final String gxApplicationServicesClassesFileName = "GeneXus.services" ;
434- private static final String gxApplicationAIServicesClassesFileName = "GeneXusAI.services" ;
435- private static final String gxApplicationChatbotServicesClassesFileName = "Chatbot.services" ;
436434
437435 private static InputStream getInputStreamFile (Class <?> gxAppClass , String fileName ) throws FileNotFoundException {
438436 InputStream is = gxAppClass .getResourceAsStream (fileName );
@@ -472,9 +470,19 @@ public static void getGXApplicationClasses(Class<?> gxAppClass, Set<Class<?>> rr
472470
473471 public static void AddExternalServices (Class <?> gxAppClass , Set <Class <?>> rrcs )
474472 {
475- WebUtils .AddExternalServicesFile (gxAppClass , rrcs , gxApplicationServicesClassesFileName );
476- WebUtils .AddExternalServicesFile (gxAppClass , rrcs , gxApplicationAIServicesClassesFileName );
477- WebUtils .AddExternalServicesFile (gxAppClass , rrcs , gxApplicationChatbotServicesClassesFileName );
473+ String classFilePath = gxAppClass .getProtectionDomain ().getCodeSource ().getLocation ().getPath ();
474+ String [] files = new File (classFilePath .replaceAll ("%20" , " " ) + gxAppClass .getPackage ().getName ().replace ('.' , '/' )).list (new FilenameFilter () {
475+ @ Override
476+ public boolean accept (File dir , String name ) {
477+ return name .endsWith (".services" );
478+ }
479+ });
480+
481+ if (files != null ) {
482+ for (String fileName : files ) {
483+ WebUtils .AddExternalServicesFile (gxAppClass , rrcs , fileName );;
484+ }
485+ }
478486 }
479487
480488 public static void AddExternalServicesFile (Class <?> gxAppClass , Set <Class <?>> rrcs , String servicesClassesFileName )
@@ -484,22 +492,7 @@ public static void AddExternalServicesFile(Class<?> gxAppClass, Set<Class<?>> rr
484492 InputStream is = getInputStreamFile (gxAppClass , servicesClassesFileName );
485493 if (is != null )
486494 {
487- //BOMInputStream bomInputStream = new BOMInputStream(is);// Avoid using BOMInputStream because of runtime error (java.lang.NoSuchMethodError: org.apache.commons.io.IOUtils.length([Ljava/lang/Object;)I) issue 94611
488- //IOUtils.toString(bomInputStream, "UTF-8");
489- String xmlstring = PrivateUtilities .BOMInputStreamToStringUTF8 (is );
490-
491- XMLReader reader = new XMLReader ();
492- reader .openFromString (xmlstring );
493- if (reader .getErrCode () == 0 )
494- {
495- while (reader .readType (1 , "Service" ) > 0 )
496- {
497- Class serviceClass = processRestService (reader );
498- if (serviceClass != null )
499- rrcs .add (serviceClass );
500- }
501- reader .close ();
502- }
495+ WebUtils .AddExternalServicesFile (rrcs , null , is );
503496
504497 is .close ();
505498 }
@@ -516,6 +509,26 @@ public static void AddExternalServicesFile(Class<?> gxAppClass, Set<Class<?>> rr
516509 logger .error ("Error loading External Services classes " , ioe );
517510 }
518511 }
512+
513+ public static void AddExternalServicesFile (Set <Class <?>> rrcs , ArrayList <String > restImports , InputStream is ) {
514+ String xmlstring = PrivateUtilities .BOMInputStreamToStringUTF8 (is );
515+
516+ XMLReader reader = new XMLReader ();
517+ reader .openFromString (xmlstring );
518+ if (reader .getErrCode () == 0 )
519+ {
520+ while (reader .readType (1 , "Service" ) > 0 )
521+ {
522+ Class serviceClass = processRestService (reader );
523+ if (serviceClass != null )
524+ if (rrcs != null )
525+ rrcs .add (serviceClass );
526+ else
527+ restImports .add (serviceClass .getName ());
528+ }
529+ reader .close ();
530+ }
531+ }
519532
520533 public static Class processRestService (XMLReader reader ) {
521534 String className = reader .getAttributeByName ("fullName" );
0 commit comments