| /******************************************************************************* |
| * 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); |
| } |
| } |