blob: 8f3986885ff236df2f51ccabeda4e4cbfc16d46a [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.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
}
}