Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<String> 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<String> 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);
}
}
}
57 changes: 35 additions & 22 deletions java/src/main/java/com/genexus/webpanels/WebUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -472,9 +470,19 @@ public static void getGXApplicationClasses(Class<?> gxAppClass, Set<Class<?>> rr

public static void AddExternalServices(Class<?> gxAppClass, Set<Class<?>> 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<Class<?>> rrcs, String servicesClassesFileName)
Expand All @@ -484,22 +492,7 @@ public static void AddExternalServicesFile(Class<?> gxAppClass, Set<Class<?>> 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();
}
Expand All @@ -516,6 +509,26 @@ public static void AddExternalServicesFile(Class<?> gxAppClass, Set<Class<?>> rr
logger.error("Error loading External Services classes ", ioe);
}
}

public static void AddExternalServicesFile(Set<Class<?>> rrcs, ArrayList<String> 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");
Expand Down