From ecf5c0ff35d397a53e151a167e71459615b2cc0c Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Wed, 5 Oct 2022 17:22:14 -0300 Subject: [PATCH 1/2] Read configuration settings from client.cfg.dev --- .../com/genexus/util/IniFileMultiple.java | 27 +++-- java/client.cfg | 10 +- java/client.cfg.dev | 2 + java/client.cfg.prod | 3 + .../java/com/genexus/ConfigFileFinder.java | 113 +++++++----------- .../java/com/genexus/TestGxReadEnvVar.java | 7 +- .../TestConfigurationOverride.java | 36 ++++++ .../genexus/db/driver/TestMockDataAccess.java | 1 + .../{mockdb => genexus/sampleapp}/GXcfg.java | 2 +- .../java/com/mockdb/ausemockdataaccess.java | 6 +- .../java/com/mockdb/usemockdataaccess.java | 5 +- 11 files changed, 124 insertions(+), 88 deletions(-) create mode 100644 java/client.cfg.dev create mode 100644 java/client.cfg.prod create mode 100644 java/src/test/java/com/genexus/configuration/TestConfigurationOverride.java rename java/src/test/java/com/{mockdb => genexus/sampleapp}/GXcfg.java (87%) diff --git a/common/src/main/java/com/genexus/util/IniFileMultiple.java b/common/src/main/java/com/genexus/util/IniFileMultiple.java index 13a62df58..f2ce9270f 100644 --- a/common/src/main/java/com/genexus/util/IniFileMultiple.java +++ b/common/src/main/java/com/genexus/util/IniFileMultiple.java @@ -1,21 +1,34 @@ package com.genexus.util; -import java.io.*; +import com.genexus.diagnostics.core.ILogger; +import com.genexus.diagnostics.core.LogManager; + +import java.io.IOException; +import java.io.InputStream; public class IniFileMultiple extends IniFile { + public static final ILogger logger = LogManager.getLogger(IniFileMultiple.class); private IniFile additionalProperties; - public IniFileMultiple(InputStream in, InputStream in2) throws IOException { + public IniFileMultiple(InputStream in) throws IOException { super(in); - try { - additionalProperties = new IniFile(in2); - } catch (Exception e) { } + } + + public void addConfigurationSource(String configId, InputStream in) { + if (in != null) { + try { + additionalProperties = new IniFile(in); + logger.debug(String.format("Additional configuration file '%s' lodad", configId)); + } catch (Exception e) { + logger.warn(String.format("Could not read additional configuration file: '%s'", configId), e); + } + } } @Override public String getProperty(String section, String key, String defaultValue) { String value = null; - if (additionalProperties != null){ + if (additionalProperties != null) { value = additionalProperties.getProperty(section, key); } if (value == null) { @@ -23,6 +36,4 @@ public String getProperty(String section, String key, String defaultValue) { } return value; } - - } diff --git a/java/client.cfg b/java/client.cfg index 6038218d9..f073f58f7 100644 --- a/java/client.cfg +++ b/java/client.cfg @@ -3,7 +3,7 @@ MODEL_NUM= 2 GENERATOR_NUM= 12 LOGIN_AS_USERID=0 SMTP_HOST= -NAME_SPACE= com.mockdb +NAME_SPACE=com.genexus.sampleapp NAME_HOST= CORBA_SERVER_NAME= DCOM_GUID= @@ -28,7 +28,7 @@ CS_REORG=1 CS_REORGJAVA=1 SUBFILE_ORDER=Y FC_READONLY=GRAYED -PACKAGE=com.mockdb +PACKAGE=com.genexus.sampleapp DECIMAL_POINT=. DATE_FMT= DMY CTOD_DATE_FMT= L @@ -51,7 +51,7 @@ SAMESITE_COOKIE=Lax StorageTimeZone= 1 GX_BUILD_NUMBER=17233991 ODBC_CALLS=0 -NameSpace1= com.mockdb +NameSpace1=com.genexus.sampleapp LANGUAGE=German LANG_NAME=German Theme=Carmine @@ -141,7 +141,7 @@ decimal_point= , thousand_sep= . date_fmt= DMY culture= ar-SA -[com.mockdb] +[com.genexus.sampleapp] GXDB_LOCATION= JTA=0 DataSource1=DEFAULT @@ -152,7 +152,7 @@ JDBCLogPath= JDBCLogLevel=0 JDBCLogBuffer=0 JDBCLogDetail=0 -[com.mockdb|DEFAULT] +[com.genexus.sampleapp|DEFAULT] CS_DBNAME= INFORMIX_DB=ANSI CS_LIBL400= diff --git a/java/client.cfg.dev b/java/client.cfg.dev new file mode 100644 index 000000000..05f709bfc --- /dev/null +++ b/java/client.cfg.dev @@ -0,0 +1,2 @@ +[Client] +MY_CUSTOM_PTY=SAMPLE_VALUE_FOR_DEV diff --git a/java/client.cfg.prod b/java/client.cfg.prod new file mode 100644 index 000000000..5a0ec8c06 --- /dev/null +++ b/java/client.cfg.prod @@ -0,0 +1,3 @@ +[Client] +MY_CUSTOM_PTY=SAMPLE_VALUE_FOR_PROD +MY_CUSTOM_PTY_PROD=SHOULD_NOT_BE_READ diff --git a/java/src/main/java/com/genexus/ConfigFileFinder.java b/java/src/main/java/com/genexus/ConfigFileFinder.java index 7a16a3b85..52efb12e2 100644 --- a/java/src/main/java/com/genexus/ConfigFileFinder.java +++ b/java/src/main/java/com/genexus/ConfigFileFinder.java @@ -1,53 +1,48 @@ package com.genexus; -import java.io.BufferedInputStream; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; - +import com.genexus.diagnostics.core.ILogger; +import com.genexus.diagnostics.core.LogManager; import com.genexus.util.IniFile; import com.genexus.util.IniFileMultiple; -public class ConfigFileFinder -{ +import java.io.*; + +public class ConfigFileFinder { + public static final ILogger logger = LogManager.getLogger(ConfigFileFinder.class); private static final String CRYPTO_CFG = "crypto.cfg"; private static final String PROD_ENV_SUFFIX = ".prod"; + private static final String DEV_ENV_SUFFIX = ".dev"; - public static IniFile getConfigFile(Class resourceClassParm, String fileName, Class defaultResourceClass) - { + public static IniFile getConfigFile(Class resourceClassParm, String fileName, Class defaultResourceClass) { IniFileStream iniFileStream = new IniFileStream(resourceClassParm, fileName, defaultResourceClass).invoke(); InputStream is = iniFileStream.getIs(); InputStream crypto = iniFileStream.getCrypto(); - IniFileStream iniFileStreamProdEnv = new IniFileStream(resourceClassParm, fileName + PROD_ENV_SUFFIX, defaultResourceClass).invoke(); - InputStream isProdEnv = iniFileStreamProdEnv.getIs(); - + //If client.cfg.dev is present, any other client.cfg.* will not be read + IniFileStream configurationOverride = new IniFileStream(resourceClassParm, fileName + DEV_ENV_SUFFIX, defaultResourceClass); + if (configurationOverride == null || configurationOverride.invoke().getIs() == null) { + configurationOverride = new IniFileStream(resourceClassParm, fileName + PROD_ENV_SUFFIX, defaultResourceClass); + } + IniFile iniFile = null; - try - { - iniFile = new IniFileMultiple(is, isProdEnv); - } - catch (IOException e) - { - if (ApplicationContext.getInstance().isGXUtility()) - { + try { + iniFile = new IniFileMultiple(is); + ((IniFileMultiple) iniFile).addConfigurationSource(configurationOverride.fileName, configurationOverride.invoke().getIs()); + } catch (IOException e) { + if (ApplicationContext.getInstance().isGXUtility()) { iniFile = new IniFile(fileName); - } - else - { + } else { String userDir; - try - { + try { userDir = System.getProperty("user.dir") + "\\"; - } - catch (SecurityException ex) - { + } catch (SecurityException ex) { userDir = ""; } - throw new InternalError("Can't open " + userDir + fileName + " / " + e.getMessage()); + String errMessage = "Can't open " + userDir + fileName; + logger.fatal(errMessage, e); + throw new InternalError(errMessage + " / " + e.getMessage()); } } @@ -85,63 +80,47 @@ public IniFileStream invoke() { if (ClientContext.getModelContext() != null) resourceClass = ClientContext.getModelContext().getPackageClass(); - if (is == null && resourceClass != null) - { + if (is == null && resourceClass != null) { is = ResourceReader.getResourceAsStream(resourceClass, fileName); - if (is != null) - { + if (is != null) { crypto = ResourceReader.getResourceAsStream(resourceClass, CRYPTO_CFG); } } // This is for GeneXus programs set where is the .cfg file - if (is == null && defaultResourceClass != null) - { + if (is == null && defaultResourceClass != null) { is = ResourceReader.getResourceAsStream(defaultResourceClass, fileName); - if (is != null) - { + if (is != null) { crypto = ResourceReader.getResourceAsStream(resourceClass, CRYPTO_CFG); } } - if (is == null) - { - try - { + if (is == null) { + try { + is = new BufferedInputStream(new FileInputStream(fileName)); + if (is != null) { + crypto = new BufferedInputStream(new FileInputStream(CRYPTO_CFG)); + } + } catch (FileNotFoundException e) { + try { is = new BufferedInputStream(new FileInputStream(fileName)); - if (is != null) - { + if (is != null) { crypto = new BufferedInputStream(new FileInputStream(CRYPTO_CFG)); } + } catch (FileNotFoundException e2) { + ; } - catch (FileNotFoundException e) - { - try - { - is = new BufferedInputStream(new FileInputStream(fileName)); - if (is != null) - { - crypto = new BufferedInputStream(new FileInputStream(CRYPTO_CFG)); - } - } - catch (FileNotFoundException e2) { ; } - } + } } - if (is == null) - { - if (ApplicationContext.getInstance().isGXUtility()) - { - try - { + if (is == null) { + if (ApplicationContext.getInstance().isGXUtility()) { + try { is = new FileInputStream(fileName); - if (is != null) - { + if (is != null) { crypto = new FileInputStream(fileName); } - } - catch (IOException e) - { + } catch (IOException e) { } } } diff --git a/java/src/test/java/com/genexus/TestGxReadEnvVar.java b/java/src/test/java/com/genexus/TestGxReadEnvVar.java index 6867818fc..e5f89da27 100644 --- a/java/src/test/java/com/genexus/TestGxReadEnvVar.java +++ b/java/src/test/java/com/genexus/TestGxReadEnvVar.java @@ -1,6 +1,7 @@ package com.genexus; +import com.genexus.sampleapp.GXcfg; import com.genexus.specific.java.Connect; import com.genexus.util.EnvVarReader; import org.junit.Assert; @@ -14,9 +15,9 @@ public class TestGxReadEnvVar { private static final String GX_PROP = "DB_URL"; - private static final String GX_DATASTORE = "COM.MOCKDB|DEFAULT"; + private static final String GX_DATASTORE = "COM.GENEXUS.SAMPLEAPP|DEFAULT"; private static final String FIRST_ENV_VAR = "GX_DEFAULT_DB_URL"; - private static final String SECOND_ENV_VAR = "GX_COM_MOCKDB_DEFAULT_DB_URL"; + private static final String SECOND_ENV_VAR = "GX_COM_GENEXUS_SAMPLEAPP_DEFAULT_DB_URL"; private static final String FIRST_VALUE = "FirstDB_URL"; private static final String SECOND_VALUE = "SecondDB_URL"; @@ -24,7 +25,7 @@ public class TestGxReadEnvVar { public void testGxReadEnvVar() { Connect.init(); - ModelContext modelContext = ModelContext.getModelContext(com.mockdb.GXcfg.class); + ModelContext modelContext = ModelContext.getModelContext(GXcfg.class); try { Map newenv = new HashMap<>(); newenv.put(FIRST_ENV_VAR, FIRST_VALUE); diff --git a/java/src/test/java/com/genexus/configuration/TestConfigurationOverride.java b/java/src/test/java/com/genexus/configuration/TestConfigurationOverride.java new file mode 100644 index 000000000..b5ec2f715 --- /dev/null +++ b/java/src/test/java/com/genexus/configuration/TestConfigurationOverride.java @@ -0,0 +1,36 @@ +package com.genexus.configuration; + +import com.genexus.Application; +import com.genexus.sampleapp.GXcfg; +import com.genexus.specific.java.Connect; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class TestConfigurationOverride { + + @Before + public void setUpStreams() { + Connect.init(); + Application.init(GXcfg.class); + } + + @Test + public void testReadConfiguration() { + String packageName = Application.getClientPreferences().getPACKAGE(); + assertEquals("com.genexus.sampleapp", packageName); + } + + @Test + public void testReadConfigurationFromDev() { + String customOverridablePty = Application.getClientPreferences().getProperty("MY_CUSTOM_PTY", ""); + assertEquals("SAMPLE_VALUE_FOR_DEV", customOverridablePty); + } + + @Test + public void testReadConfigurationFromProdError() { + String customOverridablePty = Application.getClientPreferences().getProperty("MY_CUSTOM_PTY_PROD", ""); + assertEquals("", customOverridablePty); + } +} diff --git a/java/src/test/java/com/genexus/db/driver/TestMockDataAccess.java b/java/src/test/java/com/genexus/db/driver/TestMockDataAccess.java index 893278d97..254ac553c 100644 --- a/java/src/test/java/com/genexus/db/driver/TestMockDataAccess.java +++ b/java/src/test/java/com/genexus/db/driver/TestMockDataAccess.java @@ -1,5 +1,6 @@ package com.genexus.db.driver; +import com.genexus.sampleapp.GXcfg; import com.mockdb.*; import com.genexus.Application; import org.junit.Before; diff --git a/java/src/test/java/com/mockdb/GXcfg.java b/java/src/test/java/com/genexus/sampleapp/GXcfg.java similarity index 87% rename from java/src/test/java/com/mockdb/GXcfg.java rename to java/src/test/java/com/genexus/sampleapp/GXcfg.java index c6d044826..df966c04c 100644 --- a/java/src/test/java/com/mockdb/GXcfg.java +++ b/java/src/test/java/com/genexus/sampleapp/GXcfg.java @@ -1,4 +1,4 @@ -package com.mockdb ; +package com.genexus.sampleapp; import com.genexus.*; public final class GXcfg diff --git a/java/src/test/java/com/mockdb/ausemockdataaccess.java b/java/src/test/java/com/mockdb/ausemockdataaccess.java index 1c884ab35..eda7d35a8 100644 --- a/java/src/test/java/com/mockdb/ausemockdataaccess.java +++ b/java/src/test/java/com/mockdb/ausemockdataaccess.java @@ -1,13 +1,15 @@ package com.mockdb ; import com.genexus.*; import com.genexus.db.*; +import com.genexus.sampleapp.GXcfg; + import java.sql.*; public final class ausemockdataaccess extends GXProcedure { public static void main( String args[] ) { - Application.init(com.mockdb.GXcfg.class); + Application.init(GXcfg.class); ausemockdataaccess pgm = new ausemockdataaccess (-1); Application.realMainProgram = pgm; pgm.executeCmdLine(args); @@ -92,7 +94,7 @@ private void privateExecute( ) public static Object refClasses( ) { GXutil.refClasses(usemockdataaccess.class); - return new com.mockdb.GXcfg(); + return new GXcfg(); } protected void cleanup( ) diff --git a/java/src/test/java/com/mockdb/usemockdataaccess.java b/java/src/test/java/com/mockdb/usemockdataaccess.java index f78e6353f..a43774a1e 100644 --- a/java/src/test/java/com/mockdb/usemockdataaccess.java +++ b/java/src/test/java/com/mockdb/usemockdataaccess.java @@ -1,11 +1,12 @@ package com.mockdb ; import com.genexus.*; +import com.genexus.sampleapp.GXcfg; public final class usemockdataaccess extends GXProcedure { public static void main( String args[] ) { - Application.init(com.mockdb.GXcfg.class); + Application.init(GXcfg.class); usemockdataaccess pgm = new usemockdataaccess (-1); Application.realMainProgram = pgm; pgm.executeCmdLine(args); @@ -21,7 +22,7 @@ public void executeCmdLine( String args[] ) public usemockdataaccess( ) { super( -1 , new ModelContext( usemockdataaccess.class ), "" ); - Application.init(com.mockdb.GXcfg.class); + Application.init(GXcfg.class); } public usemockdataaccess( int remoteHandle ) From efa4d3366cbc7b7bba271f28f186efbae53bec31 Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Wed, 5 Oct 2022 17:30:47 -0300 Subject: [PATCH 2/2] Added Client.cfg key --- java/client.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/java/client.cfg b/java/client.cfg index f073f58f7..cfbaf0452 100644 --- a/java/client.cfg +++ b/java/client.cfg @@ -11,6 +11,7 @@ CONN_TIMEOUT=300 HELP_MODE=WINHTML HELP_BASEURL= PREFERRED_UI=BEST +MY_CUSTOM_PTY=SAMPLE_VALUE_FOR_ROOTCFG JFC_LF=NATIVE CALENDAR=1 CALC=1