svn commit: r1741624 - /ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r1741624 - /ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java

Taher Alkhateeb
Author: taher
Date: Fri Apr 29 12:50:57 2016
New Revision: 1741624

URL: http://svn.apache.org/viewvc?rev=1741624&view=rev
Log:
refactor Start.java as per guidelines in OFBIZ-6783

This specific commit achieves the following:

- remove private comments relating to the class to the JavaDoc location
  at the top of the class
- relocate class fields to the top of the class as per Java conventions
- relocate the constructor with its singleton instance to the top of the
  class below the fields
- sort all the methods starting with main, followed by public, default
  and private
- add JavaDoc to main
- remove System.exit(99) from main and replace it with throw new
  StartException(e); I did this because main declares that it throws a
  StartupException which it never does
- breakup the logic part to evaluate ofbiz command to a new method
  called evaluateOfbizCommand(String[] args). I will replace this
  eventually with apache commons-cli
- make startStartLoaders private, since it is not called outside Start.java

Modified:
    ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java

Modified: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java?rev=1741624&r1=1741623&r2=1741624&view=diff
==============================================================================
--- ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java (original)
+++ ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java Fri Apr 29 12:50:57 2016
@@ -36,87 +36,40 @@ import java.util.concurrent.atomic.Atomi
 
 /**
  * OFBiz startup class.
- *
+ *
+ * This class implements a thread-safe state machine. The design is critical
+ * for reliable starting and stopping of the server.
+ *
+ * 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.
+ *
+ * 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 getInstance()
+ * static method.
+ *
  */
 public final class Start {
 
-    /*
-     * This class implements a thread-safe state machine. The design is critical
-     * for reliable starting and stopping of the server.
-     *
-     * 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.
-     *
-     * 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 getInstance()
-     * static method.
-     *
-     */
+    private Config config = null;
+    private final List<String> loaderArgs = new ArrayList<String>();
+    private final ArrayList<StartupLoader> loaders = new ArrayList<StartupLoader>();
+    private final AtomicReference<ServerState> serverState = new AtomicReference<ServerState>(ServerState.STARTING);
+    private Thread adminPortThread = null;
 
+    // Singleton, do not change
     private static final Start instance = new Start();
-
-    private static Command checkCommand(Command command, Command wanted) {
-        if (wanted == Command.HELP || wanted.equals(command)) {
-            return wanted;
-        } else if (command == null) {
-            return wanted;
-        } else {
-            System.err.println("Duplicate command detected(was " + command + ", wanted " + wanted);
-            return Command.HELP_ERROR;
-        }
+    private Start() {
     }
 
     /**
-     * Returns the <code>Start</code> instance.
+     * 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
+     * @throws StartupException: propagates to the servlet container
      */
-    public static Start getInstance() {
-        return instance;
-    }
-
-    private static void help(PrintStream out) {
-        // Currently some commands have no dash, see OFBIZ-5872
-        out.println("");
-        out.println("Usage: java -jar ofbiz.jar [command] [arguments]");
-        out.println("both    -----> Runs simultaneously the POS (Point of Sales) application and OFBiz standard");
-        out.println("-help, -? ----> This screen");
-        out.println("load-data -----> Creates tables/load data, eg: load-data -readers=seed,demo,ext -timeout=7200 -delegator=default -group=org.ofbiz. Or: load-data -file=/tmp/dataload.xml");
-        out.println("pos     -----> Runs the POS (Point of Sales) application");
-        out.println("start -------> Starts the server");
-        out.println("-status ------> Gives the status of the server");
-        out.println("-shutdown ----> Shutdowns the server");
-        out.println("test --------> Runs the JUnit test script");
-        out.println("[no config] --> Uses default config");
-        out.println("[no command] -> Starts the server with default config");
-    }
-
     public static void main(String[] args) throws StartupException {
-        Command command = null;
-        List<String> loaderArgs = new ArrayList<String>(args.length);
-        for (String arg : args) {
-            if (arg.equals("-help") || arg.equals("-?")) {
-                command = checkCommand(command, Command.HELP);
-            } else if (arg.equals("-status")) {
-                command = checkCommand(command, Command.STATUS);
-            } else if (arg.equals("-shutdown")) {
-                command = checkCommand(command, Command.SHUTDOWN);
-            } else if (arg.startsWith("-")) {
-                if (!arg.contains("portoffset")) {
-                    command = checkCommand(command, Command.COMMAND);
-                }
-                loaderArgs.add(arg.substring(1));
-            } else {
-                command = checkCommand(command, Command.COMMAND);
-                if (command == Command.COMMAND) {
-                    loaderArgs.add(arg);
-                } else {
-                    command = Command.HELP_ERROR;
-                }
-            }
-        }
-        if (command == null) {
-            command = Command.COMMAND;
-            loaderArgs.add("start");
-        }
+        Command command = evaluateOfbizCommand(args);
         if (command == Command.HELP) {
             help(System.out);
             return;
@@ -135,39 +88,22 @@ public final class Start {
                 instance.start();
             }
         } catch (Exception e) {
-            e.printStackTrace();
-            System.exit(99);
+            throw new StartupException(e);
         }
     }
 
-    // ---------------------------------------------- //
-
-    private Config config = null;
-    private final List<String> loaderArgs = new ArrayList<String>();
-    private final ArrayList<StartupLoader> loaders = new ArrayList<StartupLoader>();
-    private final AtomicReference<ServerState> serverState = new AtomicReference<ServerState>(ServerState.STARTING);
-    private Thread adminPortThread = null;
-
-    // DO NOT CHANGE THIS!
-    private Start() {
-    }
-
-    private void createListenerThread() throws StartupException {
-        if (config.adminPort > 0) {
-            this.adminPortThread = new AdminPortThread();
-            this.adminPortThread.start();
-        } else {
-            System.out.println("Admin socket not configured; set to port 0");
-        }
+    /**
+     * Returns the <code>Start</code> instance.
+     */
+    public static Start getInstance() {
+        return instance;
     }
 
-    private void createLogDirectory() {
-        File logDir = new File(config.logDir);
-        if (!logDir.exists()) {
-            if (logDir.mkdir()) {
-                System.out.println("Created OFBiz log dir [" + logDir.getAbsolutePath() + "]");
-            }
-        }
+    /**
+     * Returns the server's main configuration.
+     */
+    public Config getConfig() {
+        return this.config;
     }
 
     /**
@@ -177,6 +113,18 @@ public final class Start {
         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();
+        }
+    }
+
     void init(String[] args, boolean fullInit) throws StartupException {
         String globalSystemPropsFileName = System.getProperty("ofbiz.system.props");
         if (globalSystemPropsFileName != null) {
@@ -239,9 +187,125 @@ public final class Start {
         initStartLoaders();
     }
 
+    void start() throws Exception {
+        if (!startStartLoaders()) {
+            if (this.serverState.get() == ServerState.STOPPING) {
+                return;
+            } else {
+                throw new Exception("Error during start.");
+            }
+        }
+        if (config.shutdownAfterLoad) {
+            stopServer();
+        }
+    }
+
+    void shutdownServer() {
+        ServerState currentState;
+        do {
+            currentState = this.serverState.get();
+            if (currentState == ServerState.STOPPING) {
+                return;
+            }
+        } while (!this.serverState.compareAndSet(currentState, ServerState.STOPPING));
+        // The current thread was the one that successfully changed the state;
+        // continue with further processing.
+        synchronized (this.loaders) {
+            // Unload in reverse order
+            for (int i = this.loaders.size(); i > 0; i--) {
+                StartupLoader loader = this.loaders.get(i - 1);
+                try {
+                    loader.unload();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        if (this.adminPortThread != null && this.adminPortThread.isAlive()) {
+            this.adminPortThread.interrupt();
+        }
+    }
+
+    void stopServer() {
+        shutdownServer();
+        System.exit(0);
+    }
+
+    private static Command evaluateOfbizCommand(String[] args) {
+        Command command = null;
+        for (String arg : args) {
+            if (arg.equals("-help") || arg.equals("-?")) {
+                command = checkCommand(command, Command.HELP);
+            } else if (arg.equals("-status")) {
+                command = checkCommand(command, Command.STATUS);
+            } else if (arg.equals("-shutdown")) {
+                command = checkCommand(command, Command.SHUTDOWN);
+            } else if (arg.startsWith("-")) {
+                if (!arg.contains("portoffset")) {
+                    command = checkCommand(command, Command.COMMAND);
+                }
+            } else {
+                command = checkCommand(command, Command.COMMAND);
+                if (command == Command.COMMAND) {
+                } else {
+                    command = Command.HELP_ERROR;
+                }
+            }
+        }
+        if (command == null) {
+            command = Command.COMMAND;
+        }
+        return command;
+    }
+
+    private static Command checkCommand(Command command, Command wanted) {
+        if (wanted == Command.HELP || wanted.equals(command)) {
+            return wanted;
+        } else if (command == null) {
+            return wanted;
+        } else {
+            System.err.println("Duplicate command detected(was " + command + ", wanted " + wanted);
+            return Command.HELP_ERROR;
+        }
+    }
+
+    private static void help(PrintStream out) {
+        // Currently some commands have no dash, see OFBIZ-5872
+        out.println("");
+        out.println("Usage: java -jar ofbiz.jar [command] [arguments]");
+        out.println("both    -----> Runs simultaneously the POS (Point of Sales) application and OFBiz standard");
+        out.println("-help, -? ----> This screen");
+        out.println("load-data -----> Creates tables/load data, eg: load-data -readers=seed,demo,ext -timeout=7200 -delegator=default -group=org.ofbiz. Or: load-data -file=/tmp/dataload.xml");
+        out.println("pos     -----> Runs the POS (Point of Sales) application");
+        out.println("start -------> Starts the server");
+        out.println("-status ------> Gives the status of the server");
+        out.println("-shutdown ----> Shutdowns the server");
+        out.println("test --------> Runs the JUnit test script");
+        out.println("[no config] --> Uses default config");
+        out.println("[no command] -> Starts the server with default config");
+    }
+
+    private void createListenerThread() throws StartupException {
+        if (config.adminPort > 0) {
+            this.adminPortThread = new AdminPortThread();
+            this.adminPortThread.start();
+        } else {
+            System.out.println("Admin socket not configured; set to port 0");
+        }
+    }
+
+    private void createLogDirectory() {
+        File logDir = new File(config.logDir);
+        if (!logDir.exists()) {
+            if (logDir.mkdir()) {
+                System.out.println("Created OFBiz log dir [" + logDir.getAbsolutePath() + "]");
+            }
+        }
+    }
+
     /**
      * Creates a new <code>NativeLibClassLoader</code> instance.
-     *
+     *
      * @return A new <code>NativeLibClassLoader</code> instance
      * @throws IOException
      */
@@ -366,38 +430,12 @@ public final class Start {
         return sendSocketCommand(Control.SHUTDOWN);
     }
 
-    void shutdownServer() {
-        ServerState currentState;
-        do {
-            currentState = this.serverState.get();
-            if (currentState == ServerState.STOPPING) {
-                return;
-            }
-        } while (!this.serverState.compareAndSet(currentState, ServerState.STOPPING));
-        // The current thread was the one that successfully changed the state;
-        // continue with further processing.
-        synchronized (this.loaders) {
-            // Unload in reverse order
-            for (int i = this.loaders.size(); i > 0; i--) {
-                StartupLoader loader = this.loaders.get(i - 1);
-                try {
-                    loader.unload();
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-        if (this.adminPortThread != null && this.adminPortThread.isAlive()) {
-            this.adminPortThread.interrupt();
-        }
-    }
-
     /**
      * Returns <code>true</code> if all loaders were started.
-     *
+     *
      * @return <code>true</code> if all loaders were started.
      */
-    boolean startStartLoaders() {
+    private boolean startStartLoaders() {
         synchronized (this.loaders) {
             // start the loaders
             for (StartupLoader loader : this.loaders) {
@@ -425,30 +463,6 @@ public final class Start {
         }
     }
 
-    void stopServer() {
-        shutdownServer();
-        System.exit(0);
-    }
-
-    void start() throws Exception {
-        if (!startStartLoaders()) {
-            if (this.serverState.get() == ServerState.STOPPING) {
-                return;
-            } else {
-                throw new Exception("Error during start.");
-            }
-        }
-        if (config.shutdownAfterLoad) {
-            stopServer();
-        }
-    }
-
-    public Config getConfig() {
-        return this.config;
-    }
-
-    // ----------------------------------------------- //
-
     private class AdminPortThread extends Thread {
         private ServerSocket serverSocket = null;
 
@@ -545,13 +559,4 @@ public final class Start {
 
         abstract void processRequest(Start start, PrintWriter writer);
     }
-
-    public enum ServerState {
-        STARTING, RUNNING, STOPPING;
-
-        @Override
-        public String toString() {
-            return name().charAt(0) + name().substring(1).toLowerCase();
-        }
-    }
 }