blob: 10d2e7ac3634962d1de99208aa75331eec135ad3 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.apache.ofbiz.base.start;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.Properties;
import java.util.TimeZone;
/**
* OFBiz server parameters needed on system startup and retrieved from
* one of the properties files in the start component
*/
public final class Config {
public final String ofbizHome;
public final InetAddress adminAddress;
public final String adminKey;
public final int portOffset;
public final int adminPort;
public final String containerConfig;
public final List<String> loaders;
public final String logDir;
public final boolean shutdownAfterLoad;
public final boolean useShutdownHook;
Config(List<StartupCommand> ofbizCommands) throws StartupException {
// fetch OFBiz Properties object
Properties props = getPropertiesFile(ofbizCommands);;
// set this class fields
ofbizHome = getOfbizHome(getProperty(props, "ofbiz.home", "."));
adminAddress = getAdminAddress(getProperty(props, "ofbiz.admin.host", "127.0.0.1"));
adminKey = getProperty(props, "ofbiz.admin.key", "so3du5kasd5dn");
portOffset = getPortOffsetValue(ofbizCommands, "0");
adminPort = getAdminPort(props, 10523, portOffset); // see INFRA-6790
containerConfig = getAbsolutePath(props, "ofbiz.container.config",
"framework/base/config/ofbiz-containers.xml", ofbizHome);
loaders = Arrays.asList(getProperty(props, "ofbiz.start.loaders", "").split(","));
logDir = getAbsolutePath(props, "ofbiz.log.dir", "runtime/logs", ofbizHome);
shutdownAfterLoad = getProperty(props, "ofbiz.auto.shutdown", "false").equalsIgnoreCase("true");
useShutdownHook = getProperty(props, "ofbiz.enable.hook", "true").equalsIgnoreCase("true");
System.out.println("Set OFBIZ_HOME to - " + ofbizHome);
// set system properties
System.setProperty("ofbiz.home", ofbizHome);
System.setProperty("java.awt.headless", getProperty(props, "java.awt.headless", "true"));
System.setProperty("derby.system.home", getProperty(props, "derby.system.home", "runtime/data/derby"));
// set the default locale
setDefaultLocale(getProperty(props, "ofbiz.locale.default", ""));
// set the default timezone
String tzString = props.getProperty("ofbiz.timeZone.default", TimeZone.getDefault().getID());
TimeZone.setDefault(TimeZone.getTimeZone(tzString));
}
private String getProperty(Properties props, String key, String defaultValue) {
return Optional.ofNullable(System.getProperty(key))
.orElse(props.getProperty(key, defaultValue));
}
private String getOfbizHome(String homeProp) {
return homeProp.equals(".") ? System.getProperty("user.dir").replace('\\', '/') : homeProp;
}
private String getAbsolutePath(Properties props, String key, String def, String ofbizHome) {
return getProperty(props, key, ofbizHome + "/" + props.getProperty(key, def));
}
private Properties getPropertiesFile(List<StartupCommand> ofbizCommands) throws StartupException {
String fileName = determineOfbizPropertiesFileName(ofbizCommands);
String fullyQualifiedFileName = "org/apache/ofbiz/base/start/" + fileName;
Properties props = new Properties();
try (InputStream propsStream = getClass().getClassLoader().getResourceAsStream(fullyQualifiedFileName)) {
props.load(propsStream);
} catch (IOException e) {
throw new StartupException(e);
}
System.out.println("Config.java using configuration file " + fileName);
return props;
}
private String determineOfbizPropertiesFileName(List<StartupCommand> ofbizCommands) {
String fileName = null;
if (ofbizCommands.stream().anyMatch(command ->
command.getName().equals(StartupCommandUtil.StartupOption.START.getName())
|| command.getName().equals(StartupCommandUtil.StartupOption.SHUTDOWN.getName())
|| command.getName().equals(StartupCommandUtil.StartupOption.STATUS.getName()))
|| ofbizCommands.isEmpty()
|| ofbizCommands.stream().allMatch(command ->
command.getName().equals(StartupCommandUtil.StartupOption.PORTOFFSET.getName()))) {
fileName = "start.properties";
} else if(ofbizCommands.stream().anyMatch(
option -> option.getName().equals(StartupCommandUtil.StartupOption.LOAD_DATA.getName()))) {
fileName = "load-data.properties";
} else if(ofbizCommands.stream().anyMatch(
option -> option.getName().equals(StartupCommandUtil.StartupOption.TEST.getName()))) {
fileName = "test.properties";
}
return fileName;
}
private int getPortOffsetValue(List<StartupCommand> ofbizCommands, String defaultOffset) throws StartupException {
String extractedPortOffset = ofbizCommands.stream()
.filter(command -> command.getName().equals(StartupCommandUtil.StartupOption.PORTOFFSET.getName()))
.findFirst()
.map(ofbizCommand -> ofbizCommand.getProperties().keySet().iterator().next())
.orElse(defaultOffset);
try {
return Integer.parseInt(extractedPortOffset);
} catch(NumberFormatException e) {
throw new StartupException("invalid portoffset number: " + extractedPortOffset, e);
}
}
private int getAdminPort(Properties props, int defaultAdminPort, int portOffsetValue) {
String adminPortStr = getProperty(props, "ofbiz.admin.port", String.valueOf(defaultAdminPort));
try {
return Integer.parseInt(adminPortStr) + portOffsetValue;
} catch (NumberFormatException e) {
System.out.println("Error parsing admin port: " + adminPortStr + " -- " + e.getMessage());
return defaultAdminPort + portOffsetValue;
}
}
private InetAddress getAdminAddress(String serverHost) throws StartupException {
try {
return InetAddress.getByName(serverHost);
} catch (UnknownHostException e) {
throw new StartupException(e);
}
}
private void setDefaultLocale(String localeString) {
String locales[] = localeString.split("_");
switch (locales.length) {
case 1:
Locale.setDefault(new Locale(locales[0]));
break;
case 2:
Locale.setDefault(new Locale(locales[0], locales[1]));
break;
case 3:
Locale.setDefault(new Locale(locales[0], locales[1], locales[2]));
}
System.setProperty("user.language", localeString);
}
}