Skip to content

Commit 5c591a4

Browse files
Merge pull request #383 from ashitsalesforce/master
cleanup initialization and preserve java.library.path values across i…
2 parents 639fd8f + b6d553a commit 5c591a4

File tree

4 files changed

+108
-81
lines changed

4 files changed

+108
-81
lines changed

src/main/java/com/salesforce/dataloader/controller/Controller.java

+20-20
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,7 @@
5555

5656
import org.apache.logging.log4j.Logger;
5757
import org.apache.logging.log4j.LogManager;
58-
import org.apache.logging.log4j.core.LoggerContext;
59-
import org.apache.logging.log4j.core.config.ConfigurationSource;
60-
import org.apache.logging.log4j.core.config.Configurator;
61-
6258
import java.io.File;
63-
import java.io.FileInputStream;
6459
import java.io.IOException;
6560
import java.net.URI;
6661
import java.net.URISyntaxException;
@@ -75,7 +70,6 @@
7570
import java.util.HashMap;
7671
import java.util.Map;
7772
import java.util.Properties;
78-
import java.util.Set;
7973

8074
import javax.xml.parsers.FactoryConfigurationError;
8175

@@ -129,7 +123,6 @@ public class Controller {
129123
private String appPath;
130124

131125
private Controller(String name, boolean isBatchMode, String[] args) throws ControllerInitializationException {
132-
initStaticVariable();
133126
// if name is passed to controller, use it to create a unique run file name
134127
try {
135128
initConfig(name, isBatchMode, args);
@@ -385,11 +378,7 @@ private static File getInstalledConfigDir() {
385378
* Get the current config.properties and load it into the config bean.
386379
*/
387380
protected void initConfig(String name, boolean isBatchMode, String[] args) throws ControllerInitializationException {
388-
389-
// Initialize the log first to use correct logging level
390-
initLog();
391-
392-
setConfigDir(args);
381+
initializeConfigDirAndLog(args);
393382
String configDirPath = getConfigDir();
394383
File configDir;
395384

@@ -479,7 +468,7 @@ private static String getProductName() {
479468
return APP_NAME + " " + APP_VERSION;
480469
}
481470

482-
public static synchronized void initLog() throws FactoryConfigurationError, ControllerInitializationException {
471+
private static synchronized void initLog() throws FactoryConfigurationError, ControllerInitializationException {
483472
try {
484473
initStaticVariable();
485474
} catch (ControllerInitializationException ex) {
@@ -490,7 +479,6 @@ public static synchronized void initLog() throws FactoryConfigurationError, Cont
490479
if (Controller.isLogInitialized) {
491480
return;
492481
}
493-
494482
String log4jConfigFilePath = System.getenv("LOG4J_CONFIGURATION_FILE");
495483
if (log4jConfigFilePath == null || log4jConfigFilePath.isEmpty()) {
496484
// check if the system property is specified
@@ -511,11 +499,15 @@ public static synchronized void initLog() throws FactoryConfigurationError, Cont
511499

512500
String log4jConfigFileAbsolutePath = logConfFile.getAbsolutePath();
513501
if (logConfFile.exists()) {
514-
System.setProperty(Controller.SYS_PROP_LOG_CONFIG_FILE, log4jConfigFileAbsolutePath);
502+
System.setProperty(SYS_PROP_LOG_CONFIG_FILE, log4jConfigFileAbsolutePath);
515503
}
516-
logger = LogManager.getLogger(Controller.class);
517504

518-
// Make sure that logger is able to use the config file
505+
// Uncomment code block to check that logger is using the config file
506+
/*
507+
*
508+
509+
logger = LogManager.getLogger(Controller.class);
510+
519511
LoggerContext loggerContext = (LoggerContext) LogManager.getContext();
520512
String logConfigLocation = loggerContext.getConfiguration().getConfigurationSource().getLocation();
521513
if (logConfigLocation == null) {
@@ -525,17 +517,18 @@ public static synchronized void initLog() throws FactoryConfigurationError, Cont
525517
} else {
526518
logger.info("Using log4j2 configuration file at location: " + logConfigLocation);
527519
}
520+
*/
528521
logger = LogManager.getLogger(Controller.class);
529522

530523
logger.info(Messages.getString("Controller.logInit")); //$NON-NLS-1$
531524
Controller.isLogInitialized = true;
532525
}
533526

534-
public static void setConfigDir(String[] args) {
535-
setConfigDir(getArgMapFromArgArray(args));
527+
public static void initializeConfigDirAndLog(String[] args) {
528+
initializeConfigDirAndLog(getArgMapFromArgArray(args));
536529
}
537530

538-
public static void setConfigDir(Map<String, String> argMap) {
531+
public static void initializeConfigDirAndLog(Map<String, String> argMap) {
539532
String configDir = getConfigDirFromArgMap(argMap);
540533

541534
if (configDir == null || configDir.isEmpty()) {
@@ -546,11 +539,18 @@ public static void setConfigDir(Map<String, String> argMap) {
546539
configDir = Controller.CONFIG_DIR_DEFAULT_VALUE;
547540
}
548541
System.setProperty(CONFIG_DIR_PROP, configDir);
542+
// initialize logger
543+
try {
544+
initLog();
545+
} catch (ControllerInitializationException | FactoryConfigurationError e) {
546+
e.printStackTrace();
547+
}
549548
}
550549

551550
public static String getConfigDir() {
552551
String configDir = System.getProperty(CONFIG_DIR_PROP);
553552
if (configDir == null || configDir.isEmpty()) {
553+
System.err.println("salesforce.config.dir not initialized. Using default config directory");
554554
configDir = Controller.CONFIG_DIR_DEFAULT_VALUE;
555555
}
556556
return configDir;

src/main/java/com/salesforce/dataloader/process/DataLoaderRunner.java

+62-23
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,19 @@
4040
import java.io.IOException;
4141
import java.io.InputStream;
4242
import java.io.InputStreamReader;
43+
import java.io.UnsupportedEncodingException;
44+
import org.apache.logging.log4j.Logger;
4345
import java.lang.management.ManagementFactory;
46+
import java.net.URISyntaxException;
47+
import java.net.URLDecoder;
4448
import java.nio.file.Files;
4549
import java.nio.file.Paths;
50+
import java.security.CodeSource;
4651
import java.util.ArrayList;
4752
import java.util.Map;
4853

4954
import org.apache.commons.io.filefilter.WildcardFileFilter;
55+
import org.apache.logging.log4j.LogManager;
5056
import org.eclipse.swt.widgets.Display;
5157
import org.eclipse.swt.widgets.Shell;
5258

@@ -60,8 +66,11 @@ public class DataLoaderRunner extends Thread {
6066
private static final String GMT_FOR_DATE_FIELD_VALUE = "datefield.usegmt";
6167
private static final String SWT_NATIVE_LIB_IN_JAVA_LIB_PATH = "swt.nativelib.inpath";
6268
private static final String LOCAL_SWT_DIR = "target/";
69+
private static final String PATH_SEPARATOR = System.getProperty("path.separator");
70+
private static final String FILE_SEPARATOR = System.getProperty("file.separator");
6371
private static boolean useGMTForDateFieldValue = false;
6472
private static Map<String, String> argNameValuePair;
73+
private static Logger logger;
6574

6675
private static boolean isBatchMode() {
6776
return argNameValuePair.containsKey(RUN_MODE) ?
@@ -90,28 +99,17 @@ public void run() {
9099
}
91100

92101
public static void main(String[] args) {
102+
Controller.initializeConfigDirAndLog(args);
93103
Runtime.getRuntime().addShutdownHook(new DataLoaderRunner());
94104
argNameValuePair = Controller.getArgMapFromArgArray(args);
95-
Controller.setConfigDir(args);
105+
logger = LogManager.getLogger(DataLoaderRunner.class);
96106
setUseGMTForDateFieldValue();
97107
if (isBatchMode()) {
98108
ProcessRunner.runBatchMode(args);
99109
} else if (argNameValuePair.containsKey(SWT_NATIVE_LIB_IN_JAVA_LIB_PATH)
100110
&& "true".equalsIgnoreCase(argNameValuePair.get(SWT_NATIVE_LIB_IN_JAVA_LIB_PATH))){
101111
/* Run in the UI mode, get the controller instance with batchMode == false */
102112
try {
103-
String SWTDirStr = System.getProperty("java.library.path");
104-
if (SWTDirStr == null
105-
|| SWTDirStr.isBlank()
106-
|| SWTDirStr.equalsIgnoreCase("null")
107-
|| !(Files.exists(Paths.get(SWTDirStr)))) {
108-
System.err.println("Unable to find SWT directory: " + SWTDirStr);
109-
System.err.println("Native JRE for "
110-
+ System.getProperty("os.name") + " : "
111-
+ System.getProperty("os.arch") + " not supported.");
112-
System.err.println("Try JRE for the supported platform in emulation mode.");
113-
System.exit(-1);
114-
}
115113
Controller controller = Controller.getInstance(UI, false, args);
116114
controller.createAndShowGUI();
117115
} catch (ControllerInitializationException e) {
@@ -123,8 +121,6 @@ public static void main(String[] args) {
123121
}
124122

125123
private static void rerunWithSWTNativeLib(String[] args) {
126-
String separator = System.getProperty("file.separator");
127-
String classpath = System.getProperty("java.class.path");
128124
String javaExecutablePath = null;
129125
try {
130126
javaExecutablePath = ProcessHandle.current()
@@ -136,43 +132,58 @@ private static void rerunWithSWTNativeLib(String[] args) {
136132
}
137133
if (javaExecutablePath == null) {
138134
javaExecutablePath = System.getProperty("java.home")
139-
+ separator + "bin" + separator + "java";
135+
+ FILE_SEPARATOR + "bin" + FILE_SEPARATOR + "java";
140136
}
141137
// java command is the first argument
142138
ArrayList<String> jvmArgs = new ArrayList<String>(128);
139+
logger.debug("java executable path: " + javaExecutablePath);
143140
jvmArgs.add(javaExecutablePath);
144141

145142
// JVM options
146143
// set -XstartOnFirstThread for MacOS
147144
String osName = System.getProperty("os.name").toLowerCase();
148145
if ((osName.contains("mac")) || (osName.startsWith("darwin"))) {
149146
jvmArgs.add("-XstartOnFirstThread");
147+
logger.debug("added JVM arg -XstartOnFirsThread");
150148
}
151149

152150
// set JVM arguments
153-
String SWTDir = getSWTDir();
154-
jvmArgs.add("-Djava.library.path=" + SWTDir);
151+
// set library path
152+
String librarypath = System.getProperty("java.library.path");
153+
if (librarypath != null && !librarypath.isBlank()) {
154+
librarypath = getSWTDir() + PATH_SEPARATOR + librarypath;
155+
} else {
156+
librarypath = getSWTDir();
157+
}
158+
jvmArgs.add("-Djava.library.path=" + librarypath);
159+
logger.debug("set java.library.path=" + librarypath);
155160
jvmArgs.addAll(ManagementFactory.getRuntimeMXBean().getInputArguments());
156161

157162
// set classpath
158-
String pathSeparator = System.getProperty("path.separator");
163+
String classpath = System.getProperty("java.class.path");
159164
if (classpath != null && !classpath.isBlank()) {
160-
classpath = classpath + pathSeparator;
165+
classpath = getSWTJarPath() + PATH_SEPARATOR + classpath;
166+
} else {
167+
classpath = getSWTJarPath();
161168
}
162-
classpath = classpath + getSWTJarPath();
163169
jvmArgs.add("-cp");
164170
jvmArgs.add(classpath);
171+
logger.debug("set java.class.path=" + classpath);
165172

166173
// specify name of the class with main method
167174
jvmArgs.add(DataLoaderRunner.class.getName());
175+
logger.debug("added class to execute - " + DataLoaderRunner.class.getName());
168176

169177
// specify application arguments
178+
logger.debug("added following arguments:");
170179
for (int i = 0; i < args.length; i++) {
171180
jvmArgs.add(args[i]);
181+
logger.debug(" " + args[i]);
172182
}
173183

174184
// add the argument to indicate that JAVA_LIB_PATH has the directory containing SWT native libraries
175185
jvmArgs.add(SWT_NATIVE_LIB_IN_JAVA_LIB_PATH + "=true");
186+
logger.debug(" " + SWT_NATIVE_LIB_IN_JAVA_LIB_PATH + "=true");
176187
ProcessBuilder processBuilder = new ProcessBuilder(jvmArgs);
177188
processBuilder.redirectErrorStream(true);
178189
try {
@@ -234,7 +245,12 @@ private static String getOSName() {
234245
}
235246

236247
private static String getSWTDir() {
237-
String SWTDirStr = buildPathStringFromOSAndArch("swt", "", "", "");
248+
String path = getDirContainingClassJar(DataLoaderRunner.class);
249+
if (path == null) {
250+
path = ".";
251+
}
252+
253+
String SWTDirStr = buildPathStringFromOSAndArch(path + "/" +"swt", "", "", "");
238254
if (Files.exists(Paths.get(SWTDirStr))) {
239255
return SWTDirStr;
240256
}
@@ -246,7 +262,6 @@ private static String getSWTDir() {
246262
}
247263

248264
SWTDirStr = buildPathStringFromOSAndArch(LOCAL_SWT_DIR + "swt", "", "", "");
249-
250265
if (SWTDirStr == null) {
251266
System.err.println("Unable to find SWT directory for "
252267
+ System.getProperty("os.name") + " : "
@@ -271,4 +286,28 @@ private static String getSWTJarPath() {
271286
}
272287
return files[0].getPath();
273288
}
289+
290+
private static String getDirContainingClassJar(Class aClass) {
291+
CodeSource codeSource = aClass.getProtectionDomain().getCodeSource();
292+
293+
File jarFile = null;
294+
295+
if (codeSource != null && codeSource.getLocation() != null) {
296+
try {
297+
jarFile = new File(codeSource.getLocation().toURI());
298+
} catch (URISyntaxException e) {
299+
return null;
300+
}
301+
} else {
302+
String path = DataLoaderRunner.class.getResource(aClass.getSimpleName() + ".class").getPath();
303+
String jarFilePath = path.substring(path.indexOf(":") + 1, path.indexOf("!"));
304+
try {
305+
jarFilePath = URLDecoder.decode(jarFilePath, "UTF-8");
306+
} catch (UnsupportedEncodingException e) {
307+
// fail silently;
308+
}
309+
jarFile = new File(jarFilePath);
310+
}
311+
return jarFile.getParentFile().getAbsolutePath();
312+
}
274313
}

src/main/java/com/salesforce/dataloader/process/ProcessRunner.java

+24-31
Original file line numberDiff line numberDiff line change
@@ -295,40 +295,33 @@ private static ProcessRunner getInstance(String[] args) throws ProcessInitializa
295295
* @throws ProcessInitializationException
296296
*/
297297
public static synchronized ProcessRunner getInstance(Map<String, String> argMap) throws ProcessInitializationException {
298-
ProcessRunner runner;
299-
Controller.setConfigDir(argMap);
300-
try {
301-
Controller.initLog();
302-
} catch (ControllerInitializationException e) {
303-
System.err.println("ProcessRunner: log not configured" + e );
304-
throw new RuntimeException(e.getMessage());
305-
}
306298
logger = LogManager.getLogger(ProcessRunner.class);
307299

308-
// get a controller instance to load the properties except for the
309-
// runtime properties stored in XXX_lastRun.properties file.
310-
Controller controller = Controller.getInstance("", true, null);
311-
logger.info(Messages.getString("Process.initializingEngine")); //$NON-NLS-1$
312-
Config config = controller.getConfig();
313-
// load parameter overrides (from command line or caller context)
314-
logger.info(Messages.getString("Process.loadingParameters")); //$NON-NLS-1$
315-
config.loadParameterOverrides(argMap);
316-
String processName = config.getString(PROCESS_NAME);
317-
logger.debug("process name is " + processName);
318-
if (processName == null || processName.isEmpty()) {
319-
logger.info(PROCESS_NAME + "is not set in the command line or config.properties file.");
320-
// operation and other process params are specified through properties
321-
validateConfigProperties(config);
322-
runner = new ProcessRunner();
323-
runner.setName(config.getString(Config.OPERATION));
324-
runner.setConfigOverrideMap(argMap);
325-
} else {
326-
// process DynaBean name specified.
327-
runner = ProcessConfig.getProcessInstance(processName);
328-
runner.getConfigOverrideMap().putAll(argMap);
329-
}
300+
// get a controller instance to load the properties except for the
301+
// runtime properties stored in XXX_lastRun.properties file.
302+
Controller controller = Controller.getInstance("", true, null);
303+
logger.info(Messages.getString("Process.initializingEngine")); //$NON-NLS-1$
304+
Config config = controller.getConfig();
330305

331-
306+
// load parameter overrides (from command line or caller context)
307+
logger.info(Messages.getString("Process.loadingParameters")); //$NON-NLS-1$
308+
config.loadParameterOverrides(argMap);
309+
String processName = config.getString(PROCESS_NAME);
310+
logger.debug("process name is " + processName);
311+
312+
ProcessRunner runner;
313+
if (processName == null || processName.isEmpty()) {
314+
logger.info(PROCESS_NAME + "is not set in the command line or config.properties file.");
315+
// operation and other process params are specified through properties
316+
validateConfigProperties(config);
317+
runner = new ProcessRunner();
318+
runner.setName(config.getString(Config.OPERATION));
319+
runner.setConfigOverrideMap(argMap);
320+
} else {
321+
// process DynaBean name specified.
322+
runner = ProcessConfig.getProcessInstance(processName);
323+
runner.getConfigOverrideMap().putAll(argMap);
324+
}
332325
return runner;
333326
}
334327

src/test/java/com/salesforce/dataloader/TestBase.java

+2-7
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,8 @@ public abstract class TestBase {
105105
TEST_STATUS_DIR = TEST_FILES_DIR + File.separator + "status";
106106
DEFAULT_ACCOUNT_EXT_ID_FIELD = getProperty("test.account.extid");
107107

108-
try {
109-
String logConfFilePath = Paths.get(getTestConfDir(), Controller.LOG_CONF_DEFAULT).toString();
110-
System.setProperty(Controller.SYS_PROP_LOG_CONFIG_FILE, logConfFilePath);
111-
Controller.initLog();
112-
} catch (ControllerInitializationException ex) {
113-
System.out.println(ex.getMessage());
114-
}
108+
String logConfFilePath = Paths.get(getTestConfDir(), Controller.LOG_CONF_DEFAULT).toString();
109+
System.setProperty(Controller.SYS_PROP_LOG_CONFIG_FILE, logConfFilePath);
115110
logger = LogManager.getLogger(TestBase.class);
116111
}
117112

0 commit comments

Comments
 (0)