From a80e6d6bfe8e0f0638f7b80380f3a872a154b2ed Mon Sep 17 00:00:00 2001 From: iroqueta Date: Wed, 6 Dec 2023 19:33:07 -0300 Subject: [PATCH] Module's rest service is not executed in the context of the KB that imports the module Issue: 106023 --- .../genexus/springboot/GXImportSelector.java | 48 ++++++++++++++++ .../java/com/genexus/webpanels/WebUtils.java | 57 ++++++++++++------- 2 files changed, 83 insertions(+), 22 deletions(-) create mode 100644 gxspringboot/src/main/java/com/genexus/springboot/GXImportSelector.java diff --git a/gxspringboot/src/main/java/com/genexus/springboot/GXImportSelector.java b/gxspringboot/src/main/java/com/genexus/springboot/GXImportSelector.java new file mode 100644 index 000000000..93cb2d246 --- /dev/null +++ b/gxspringboot/src/main/java/com/genexus/springboot/GXImportSelector.java @@ -0,0 +1,48 @@ +package com.genexus.springboot; + +import com.genexus.diagnostics.core.ILogger; +import com.genexus.diagnostics.core.LogManager; +import com.genexus.webpanels.WebUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + +import org.springframework.context.annotation.ImportSelector; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.type.AnnotationMetadata; + +public class GXImportSelector implements ImportSelector { + + public static final ILogger logger = LogManager.getLogger(GXImportSelector.class); + @Override + public String[] selectImports(AnnotationMetadata importingClassMetadata) { + ArrayList restImports = new ArrayList<>(); + try { + Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath*:*.services"); + for (Resource resource : resources) { + selectImport(restImports, resource.getFilename()); + } + } + catch (IOException e){ + logger.error("Error loading External Services classes ", e); + } + return restImports.toArray(new String[0]); + } + + private void selectImport(ArrayList restImports, String servicesClassesFileName) { + try { + InputStream is = new ClassPathResource(servicesClassesFileName).getInputStream(); + if (is != null) { + WebUtils.AddExternalServicesFile(null, restImports, is); + + is.close(); + } + } + catch (Exception e){ + logger.error("Error loading External Services classes ", e); + } + } +} \ No newline at end of file diff --git a/java/src/main/java/com/genexus/webpanels/WebUtils.java b/java/src/main/java/com/genexus/webpanels/WebUtils.java index d7770b84b..04b332bc0 100644 --- a/java/src/main/java/com/genexus/webpanels/WebUtils.java +++ b/java/src/main/java/com/genexus/webpanels/WebUtils.java @@ -3,6 +3,7 @@ import java.io.*; import java.text.CharacterIterator; import java.text.StringCharacterIterator; +import java.util.ArrayList; import java.util.Date; import java.util.Locale; import java.util.Set; @@ -430,9 +431,6 @@ public static String getEncryptionKey(com.genexus.ModelContext context, String k } private static final String gxApplicationClassesFileName = "GXApplicationClasses.txt"; - private static final String gxApplicationServicesClassesFileName = "GeneXus.services"; - private static final String gxApplicationAIServicesClassesFileName = "GeneXusAI.services"; - private static final String gxApplicationChatbotServicesClassesFileName = "Chatbot.services"; private static InputStream getInputStreamFile(Class gxAppClass, String fileName) throws FileNotFoundException { InputStream is = gxAppClass.getResourceAsStream(fileName); @@ -472,9 +470,19 @@ public static void getGXApplicationClasses(Class gxAppClass, Set> rr public static void AddExternalServices(Class gxAppClass, Set> rrcs) { - WebUtils.AddExternalServicesFile(gxAppClass, rrcs, gxApplicationServicesClassesFileName); - WebUtils.AddExternalServicesFile(gxAppClass, rrcs, gxApplicationAIServicesClassesFileName); - WebUtils.AddExternalServicesFile(gxAppClass, rrcs, gxApplicationChatbotServicesClassesFileName); + String classFilePath = gxAppClass.getProtectionDomain().getCodeSource().getLocation().getPath(); + String[] files = new File(classFilePath.replaceAll("%20", " ") + gxAppClass.getPackage().getName().replace('.', '/')).list(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(".services"); + } + }); + + if (files != null) { + for (String fileName : files) { + WebUtils.AddExternalServicesFile(gxAppClass, rrcs, fileName);; + } + } } public static void AddExternalServicesFile(Class gxAppClass, Set> rrcs, String servicesClassesFileName) @@ -484,22 +492,7 @@ public static void AddExternalServicesFile(Class gxAppClass, Set> rr InputStream is = getInputStreamFile(gxAppClass, servicesClassesFileName); if (is != null) { - //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 - //IOUtils.toString(bomInputStream, "UTF-8"); - String xmlstring = PrivateUtilities.BOMInputStreamToStringUTF8(is); - - XMLReader reader = new XMLReader(); - reader.openFromString(xmlstring); - if (reader.getErrCode() == 0) - { - while (reader.readType(1, "Service") > 0) - { - Class serviceClass = processRestService(reader); - if (serviceClass != null) - rrcs.add(serviceClass); - } - reader.close(); - } + WebUtils.AddExternalServicesFile(rrcs, null, is); is.close(); } @@ -516,6 +509,26 @@ public static void AddExternalServicesFile(Class gxAppClass, Set> rr logger.error("Error loading External Services classes ", ioe); } } + + public static void AddExternalServicesFile(Set> rrcs, ArrayList restImports, InputStream is) { + String xmlstring = PrivateUtilities.BOMInputStreamToStringUTF8(is); + + XMLReader reader = new XMLReader(); + reader.openFromString(xmlstring); + if (reader.getErrCode() == 0) + { + while (reader.readType(1, "Service") > 0) + { + Class serviceClass = processRestService(reader); + if (serviceClass != null) + if (rrcs != null) + rrcs.add(serviceClass); + else + restImports.add(serviceClass.getName()); + } + reader.close(); + } + } public static Class processRestService(XMLReader reader) { String className = reader.getAttributeByName("fullName");