Skip to content

Commit 1de914a

Browse files
committed
Module's rest service is not executed in the context of the KB that imports the module (#810)
Issue: 106023
1 parent 6f27ad9 commit 1de914a

File tree

2 files changed

+83
-22
lines changed

2 files changed

+83
-22
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.genexus.springboot;
2+
3+
import com.genexus.diagnostics.core.ILogger;
4+
import com.genexus.diagnostics.core.LogManager;
5+
import com.genexus.webpanels.WebUtils;
6+
7+
import java.io.IOException;
8+
import java.io.InputStream;
9+
import java.util.ArrayList;
10+
11+
import org.springframework.context.annotation.ImportSelector;
12+
import org.springframework.core.io.ClassPathResource;
13+
import org.springframework.core.io.Resource;
14+
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
15+
import org.springframework.core.type.AnnotationMetadata;
16+
17+
public class GXImportSelector implements ImportSelector {
18+
19+
public static final ILogger logger = LogManager.getLogger(GXImportSelector.class);
20+
@Override
21+
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
22+
ArrayList<String> restImports = new ArrayList<>();
23+
try {
24+
Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath*:*.services");
25+
for (Resource resource : resources) {
26+
selectImport(restImports, resource.getFilename());
27+
}
28+
}
29+
catch (IOException e){
30+
logger.error("Error loading External Services classes ", e);
31+
}
32+
return restImports.toArray(new String[0]);
33+
}
34+
35+
private void selectImport(ArrayList<String> restImports, String servicesClassesFileName) {
36+
try {
37+
InputStream is = new ClassPathResource(servicesClassesFileName).getInputStream();
38+
if (is != null) {
39+
WebUtils.AddExternalServicesFile(null, restImports, is);
40+
41+
is.close();
42+
}
43+
}
44+
catch (Exception e){
45+
logger.error("Error loading External Services classes ", e);
46+
}
47+
}
48+
}

java/src/main/java/com/genexus/webpanels/WebUtils.java

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.*;
44
import java.text.CharacterIterator;
55
import java.text.StringCharacterIterator;
6+
import java.util.ArrayList;
67
import java.util.Date;
78
import java.util.Locale;
89
import 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

Comments
 (0)