Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
2ad941a
Spring boot support in Java Generator
iroqueta Jul 21, 2023
a858215
implements more REST interfaces in spring boot
iroqueta Jul 25, 2023
59fb6bd
Implements more REST interfaces in spring boot, error handling, GAM, …
iroqueta Aug 7, 2023
0cd3f2b
Now JDK 17 is needed to build standar classes
iroqueta Aug 7, 2023
c343a85
Merge branch 'master' into SpringBootRest
iroqueta Aug 7, 2023
3f79599
Read theme data as resource when SpringBoot is enabled
iroqueta Aug 10, 2023
fef4600
Read .config file in Springboot
iroqueta Aug 11, 2023
bf8b4df
Error code in response error message must be numeric in springboot
iroqueta Aug 16, 2023
8ec4c09
Catch NullPointer exception when try to serialize wrong messages in r…
iroqueta Aug 17, 2023
6181055
Merge branch 'master' into SpringBootRest
iroqueta Aug 17, 2023
00250ea
Implements case insensitive support in API Object URL in Spring Boot
iroqueta Aug 18, 2023
e899261
Implements GXMultiCall support in Springboot
iroqueta Aug 28, 2023
86b2d95
Merge branch 'master' into SpringBootRest
iroqueta Aug 28, 2023
fd2d5e1
Catch general error to wirte a response with Internal Server Error in…
iroqueta Aug 29, 2023
14d8fb8
Read xml metadata tables in SD Apllications was not working using Spr…
iroqueta Aug 30, 2023
519df17
Read xml metadata tables in SD Apllications was not working using Spr…
iroqueta Aug 30, 2023
89f2f56
Merge branch 'SpringBootRest' of https://github.com/genexuslabs/JavaC…
iroqueta Aug 30, 2023
57095f5
Revert "Read xml metadata tables in SD Apllications was not working u…
iroqueta Aug 30, 2023
5da53e3
Read xml metadata tables in SD Apllications was not working using Spr…
iroqueta Aug 30, 2023
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
2 changes: 1 addition & 1 deletion .github/workflows/Build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
- name: Setup Java JDK
uses: actions/setup-java@v1.4.3
with:
java-version: 1.9
java-version: 17
gpg-private-key: ${{ secrets.MAVEN_GPG_BUILDER_PRIVATE_KEY }}
gpg-passphrase: MAVEN_GPG_PASSPHRASE

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cache-redis-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
- name: Setup Java JDK
uses: actions/setup-java@v1.4.3
with:
java-version: 1.9
java-version: 17

- name: Setup Maven settings
uses: whelk-io/maven-settings-xml-action@v14
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cloud-storage-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
- name: Setup Java JDK
uses: actions/setup-java@v1.4.3
with:
java-version: 1.9
java-version: 17

- name: Setup Maven settings
uses: whelk-io/maven-settings-xml-action@v14
Expand Down
6 changes: 6 additions & 0 deletions common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@
<artifactId>xercesImpl</artifactId>
<version>2.12.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>6.0.11</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
Expand Down
27 changes: 25 additions & 2 deletions common/src/main/java/com/genexus/ApplicationContext.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@

package com.genexus;

import org.springframework.core.io.ClassPathResource;

import java.io.File;

public class ApplicationContext
{
private static ApplicationContext instance;
Expand All @@ -14,7 +18,8 @@ public class ApplicationContext
private boolean isGXUtility = false;
private boolean isMsgsToUI = true ;
private boolean isServletEngine = false;
private boolean isEJBEngine = false;
private boolean isSpringBootApp = false;
private boolean isEJBEngine = false;
private boolean isDeveloperMenu = false;
private static Object syncObject = new Object();

Expand Down Expand Up @@ -112,6 +117,24 @@ public boolean isServletEngine()
return isServletEngine;
}

public void setSpringBootApp(boolean isSpringBootApp)
{
this.isSpringBootApp = isSpringBootApp;
}

public boolean isSpringBootApp()
{
return isSpringBootApp;
}

public boolean checkIfResourceExist(String path)
{
if (isSpringBootApp())
return new ClassPathResource(path).exists();
else
return new File(path).exists();
}

public void setEJBEngine(boolean isEJBEngine)
{
this.isEJBEngine = isEJBEngine;
Expand All @@ -126,7 +149,7 @@ public boolean isEJBEngine()
private String servletEngineDefaultPath = "";
public void setServletEngineDefaultPath(String servletEngineDefaultPath)
{
if (servletEngineDefaultPath != null) {
if (servletEngineDefaultPath != null && !isSpringBootApp()) {
this.servletEngineDefaultPath = servletEngineDefaultPath.trim();
if(this.servletEngineDefaultPath.endsWith(java.io.File.separator))
{
Expand Down
76 changes: 62 additions & 14 deletions common/src/main/java/com/genexus/BaseProvider.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package com.genexus;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;

import com.genexus.diagnostics.core.ILogger;
import com.genexus.diagnostics.core.LogManager;
import com.genexus.xml.XMLReader;
import org.apache.commons.lang.StringUtils;

Expand All @@ -16,9 +20,13 @@
import com.genexus.common.interfaces.SpecificImplementation;
import com.genexus.util.GXDirectory;
import com.genexus.util.GXFileCollection;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

public abstract class BaseProvider implements IGXSmartCacheProvider
{
private static final ILogger logger = LogManager.getLogger(BaseProvider.class);

ConcurrentHashMap<String, Vector<String>> queryTables;
protected Date startupDate;
Object syncLock = new Object();
Expand All @@ -45,30 +53,70 @@ private void loadQueryTables()
{
String path = SpecificImplementation.Application.getModelContext().getHttpContext().getDefaultPath();
String configurationDirectoryPath = path + File.separatorChar + "Metadata" + File.separatorChar + "TableAccess";
ConcurrentHashMap<String, Vector<String>> qTables = new ConcurrentHashMap<String, Vector<String>>();
GXDirectory configurationDirectory = new GXDirectory(configurationDirectoryPath);
GXFileCollection files = configurationDirectory.getFiles();

ConcurrentHashMap<String, Vector<String>> qTables = new ConcurrentHashMap();
loadQueryTablesPlatform(configurationDirectoryPath, qTables);
startupDate = CommonUtil.now(false,false);
queryTables = qTables;
}
}

public void loadQueryTablesPlatform(String configurationDirectoryPath, ConcurrentHashMap<String, Vector<String>> qTables) {
if (ApplicationContext.getInstance().isSpringBootApp())
loadQueryTablesSpringBoot(configurationDirectoryPath, qTables);
else
loadQueryTablesNone(configurationDirectoryPath, qTables);

}

public void loadQueryTablesNone(String configurationDirectoryPath, ConcurrentHashMap<String, Vector<String>> qTables) {
GXDirectory configurationDirectory = new GXDirectory(configurationDirectoryPath);
GXFileCollection files = configurationDirectory.getFiles();
XMLReader reader = new XMLReader();
short ok;
for(int i=1; i <= files.getItemCount(); i++) {
Vector<String> lst = new Vector<String>();
lst.add(FORCED_INVALIDATE); // Caso en que se invalido el cache manualmente
AbstractGXFile xmlFile = files.item(i);
reader.open(xmlFile.getAbsoluteName());
ok = reader.readType(1, "Table");
while (ok == 1) {
lst.add(normalizeKey(reader.getAttributeByName("name")));
ok = reader.readType(1, "Table");
}
reader.close();
qTables.put(normalizeKey(xmlFile.getNameNoExt()), lst);
}
}

public void loadQueryTablesSpringBoot(String configurationDirectoryPath, ConcurrentHashMap<String, Vector<String>> qTables) {
try {
Resource[] resources = new PathMatchingResourcePatternResolver().getResources(configurationDirectoryPath + "/*.xml");
XMLReader reader = new XMLReader();
reader.setDocEncoding("UTF8");
short ok;
for(int i=1; i <= files.getItemCount(); i++)
{
String xmlContent;
for (int i = 0; i < resources.length; i++) {
Vector<String> lst = new Vector<String>();
lst.add(FORCED_INVALIDATE); // Caso en que se invalido el cache manualmente
AbstractGXFile xmlFile = files.item(i);
reader.open(xmlFile.getAbsoluteName());
lst.add(FORCED_INVALIDATE);
xmlContent = resources[i].getContentAsString(StandardCharsets.UTF_8);
if (!xmlContent.startsWith("<"))
xmlContent = xmlContent.substring(1); //Avoid BOM
reader.openFromString(xmlContent);
ok = reader.readType(1, "Table");
while (ok == 1)
{
lst.add(normalizeKey((String) reader.getAttributeByName("name")));
while (ok == 1) {
lst.add(normalizeKey(reader.getAttributeByName("name")));
ok = reader.readType(1, "Table");
}
reader.close();
qTables.put(normalizeKey((String)xmlFile.getNameNoExt()), lst);
qTables.put(normalizeKey(resources[i].getFilename().substring(0, resources[i].getFilename().lastIndexOf("."))), lst);
}
startupDate = CommonUtil.now(false,false);
queryTables = qTables;
}
catch (IOException e) {
logger.error("Error reading Table Access metadata", e);
}
}

public ConcurrentHashMap<String, Vector<String>> queryTables() {
if (queryTables == null)
{
Expand Down
8 changes: 7 additions & 1 deletion common/src/main/java/com/genexus/util/ThemeHelper.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.genexus.util;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Collections;
Expand All @@ -11,6 +12,7 @@

import com.genexus.CommonUtil;
import com.genexus.common.interfaces.SpecificImplementation;
import org.springframework.core.io.ClassPathResource;

public class ThemeHelper
{
Expand All @@ -34,7 +36,11 @@ private static ThemeData getThemeData(String themeName)
ThemeData themeData;
try
{
String json = SpecificImplementation.GXutil.readFileToString(themesJsonFile, CommonUtil.normalizeEncodingName("UTF-8"));
String json;
if (com.genexus.ApplicationContext.getInstance().isSpringBootApp())
json = new ClassPathResource("themes/" + themeName + ".json").getContentAsString(StandardCharsets.UTF_8);
else
json = SpecificImplementation.GXutil.readFileToString(themesJsonFile, CommonUtil.normalizeEncodingName("UTF-8"));
themeData = ThemeData.fromJson(json);
}
catch (Exception ex)
Expand Down
16 changes: 15 additions & 1 deletion common/src/main/java/com/genexus/xml/XMLReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.io.*;
import java.util.*;

import com.genexus.ApplicationContext;
import org.apache.xerces.xni.QName;
import org.apache.xerces.xni.XMLAttributes;
import org.apache.xerces.xni.XMLDocumentHandler;
Expand All @@ -30,6 +31,7 @@
import com.genexus.ResourceReader;
import com.genexus.internet.IHttpRequest;
import com.genexus.CommonUtil;
import org.springframework.core.io.ClassPathResource;

public class XMLReader implements XMLDocumentHandler, XMLErrorHandler, XMLDTDHandler
{
Expand Down Expand Up @@ -773,7 +775,19 @@ public void open(String url)
reset();
try
{
inputSource = new XMLInputSource(null, url, null, new FileInputStream(new File(url)), null);
InputStream fileInputStream = null;
if (ApplicationContext.getInstance().isSpringBootApp())
{
ClassPathResource resource = new ClassPathResource(url.replace(".\\", ""));
if (resource.exists())
fileInputStream = resource.getInputStream();
}
else
{

Check failure

Code scanning / Fortify on Demand

Unreleased Resource: Streams

The function open() in XMLReader.java sometimes fails to release a system resource allocated by getInputStream() on line 783.The program can potentially fail to release a system resource.
File xmlFile = new File(url);
fileInputStream = new FileInputStream(xmlFile);
}
inputSource = new XMLInputSource(null, url, null, fileInputStream, null);
if (documentEncoding.length() > 0)
inputSource.setEncoding(CommonUtil.normalizeEncodingName(documentEncoding));
parserConfiguration.setInputSource(inputSource);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,11 @@ public javax.ws.rs.core.Response Upload( ) throws Exception
super.init( "POST" );
try
{
builder = new com.genexus.webpanels.GXObjectUploadServices().doInternalRestExecute(restHttpContext);
com.genexus.webpanels.GXObjectUploadServices gxObjectUpload = new com.genexus.webpanels.GXObjectUploadServices();
String jsonResponse = gxObjectUpload.doInternalRestExecute(restHttpContext);
cleanup();
builder = com.genexus.ws.rs.core.Response.statusWrapped(201).entityWrapped(jsonResponse);
builder.header("GeneXus-Object-Id", gxObjectUpload.getKeyId());
return (javax.ws.rs.core.Response) builder.build() ;
}
catch ( Exception e )
Expand Down
39 changes: 39 additions & 0 deletions gxspringboot/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>com.genexus</groupId>
<artifactId>parent</artifactId>
<version>${revision}${changelist}</version>
</parent>

<artifactId>gxspringboot</artifactId>
<name>GeneXus Spring Boot</name>

<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>gxclassR</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.1.2</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<finalName>gxspringboot</finalName>
</build>
</project>
Loading