/******************************************************************************* * 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.util.List; import java.util.concurrent.atomic.AtomicReference; /** * OFBiz startup class. * * <p> * This class implements a thread-safe state machine. The design is critical * for reliable starting and stopping of the server. * </p> * <p> * The machine's current state and state changes must be encapsulated in this * class. Client code may query the current state, but it may not change it. * </p> * <p> * This class uses a singleton pattern to guarantee that only one server instance * is running in the VM. Client code retrieves the instance by using the * <tt>getInstance()</tt> static method. * </p> */ public final class Start { private Config config = null; private final AtomicReference<ServerState> serverState = new AtomicReference<ServerState>(ServerState.STARTING); // Singleton, do not change private static final Start instance = new Start(); private Start() { } /** * main is the entry point to execute high level OFBiz commands * such as starting, stopping or checking the status of the server. * * @param args: The commands for OFBiz */ public static void main(String[] args) { List<StartupCommand> ofbizCommands = null; try { ofbizCommands = StartupCommandUtil.parseOfbizCommands(args); } catch (StartupException e) { // incorrect arguments passed to the command line StartupCommandUtil.highlightAndPrintErrorMessage(e.getMessage()); StartupCommandUtil.printOfbizStartupHelp(System.err); System.exit(1); } CommandType commandType = determineCommandType(ofbizCommands); if(!commandType.equals(CommandType.HELP)) { instance.config = StartupControlPanel.init(ofbizCommands); } switch (commandType) { case HELP: StartupCommandUtil.printOfbizStartupHelp(System.out); break; case STATUS: System.out.println("Current Status : " + AdminClient.requestStatus(instance.config)); break; case SHUTDOWN: System.out.println("Shutting down server : " + AdminClient.requestShutdown(instance.config)); break; case START: try { StartupControlPanel.start(instance.config, instance.serverState, ofbizCommands); } catch (StartupException e) { StartupControlPanel.fullyTerminateSystem(e); } break; } } /** * Returns the <code>Start</code> instance. */ public static Start getInstance() { return instance; } /** * Returns the server's main configuration. */ public Config getConfig() { return this.config; } /** * Returns the server's current state. */ public ServerState getCurrentState() { return serverState.get(); } /** * This enum contains the possible OFBiz server states. */ public enum ServerState { STARTING, RUNNING, STOPPING; @Override public String toString() { return name().charAt(0) + name().substring(1).toLowerCase(); } } private static CommandType determineCommandType(List<StartupCommand> ofbizCommands) { if (ofbizCommands.stream().anyMatch( command -> command.getName().equals(StartupCommandUtil.StartupOption.HELP.getName()))) { return CommandType.HELP; } else if (ofbizCommands.stream().anyMatch( command -> command.getName().equals(StartupCommandUtil.StartupOption.STATUS.getName()))) { return CommandType.STATUS; } else if (ofbizCommands.stream().anyMatch( command -> command.getName().equals(StartupCommandUtil.StartupOption.SHUTDOWN.getName()))) { return CommandType.SHUTDOWN; } else { return CommandType.START; } } private enum CommandType { HELP, STATUS, SHUTDOWN, START } }