summaryrefslogtreecommitdiff
path: root/java/test/Util/Application.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/test/Util/Application.java')
-rw-r--r--java/test/Util/Application.java239
1 files changed, 239 insertions, 0 deletions
diff --git a/java/test/Util/Application.java b/java/test/Util/Application.java
new file mode 100644
index 00000000000..e91a545d958
--- /dev/null
+++ b/java/test/Util/Application.java
@@ -0,0 +1,239 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2009 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+package test.Util;
+
+import Ice.Communicator;
+import Ice.InitializationData;
+import Ice.LocalException;
+import Ice.LoggerI;
+import Ice.StringSeqHolder;
+import Ice.Util;
+
+public abstract class Application
+{
+ public final int WAIT = 2;
+
+ public interface ServerReadyListener
+ {
+ void serverReady();
+ };
+
+ public interface CommunicatorListener
+ {
+ void communicatorInitialized(Communicator c);
+ };
+
+ public
+ Application()
+ {
+ }
+
+ //
+ // This main() must be called by the global main(). main()
+ // initializes the Communicator, calls run(), and destroys
+ // the Communicator upon return from run(). It thereby handles
+ // all exceptions properly, i.e., error messages are printed
+ // if exceptions propagate to main(), and the Communicator is
+ // always destroyed, regardless of exceptions.
+ //
+ public final int
+ main(String appName, String[] args)
+ {
+ Ice.StringSeqHolder argsH = new Ice.StringSeqHolder(args);
+ Ice.InitializationData initData = getInitData(argsH);
+ return main(appName, argsH.value, initData);
+ }
+
+ public final int
+ main(String appName, String[] args, InitializationData initializationData)
+ {
+ java.io.PrintWriter writer = getWriter();
+ if(_communicator != null)
+ {
+ writer.println(appName + ": only one instance of the Application class can be used");
+ return 1;
+ }
+
+ _testName = appName;
+
+ //
+ // We parse the properties here to extract Ice.ProgramName.
+ //
+ StringSeqHolder argHolder = new StringSeqHolder(args);
+ if(initializationData == null)
+ {
+ initializationData = getInitData(argHolder);
+ }
+
+ InitializationData initData;
+ if(initializationData != null)
+ {
+ initData = (InitializationData)initializationData.clone();
+ }
+ else
+ {
+ initData = new InitializationData();
+ }
+ initData.properties = Util.createProperties(argHolder, initData.properties);
+
+ //
+ // If the process logger is the default logger, we replace it with a
+ // a logger which is using the program name for the prefix.
+ //
+ if(Util.getProcessLogger() instanceof LoggerI)
+ {
+ Util.setProcessLogger(new LoggerI(initData.properties.getProperty("Ice.ProgramName")));
+ }
+
+ int status = 0;
+
+ try
+ {
+ _communicator = Util.initialize(argHolder, initData);
+ if(_communicatorListener != null)
+ {
+ _communicatorListener.communicatorInitialized(_communicator);
+ }
+ status = run(argHolder.value);
+ if(status == WAIT)
+ {
+ if(_cb != null)
+ {
+ _cb.serverReady();
+ }
+ _communicator.waitForShutdown();
+ status = 0;
+ }
+ }
+ catch(LocalException ex)
+ {
+ writer.println(_testName + ": " + ex);
+ ex.printStackTrace();
+ status = 1;
+ }
+ catch(java.lang.Exception ex)
+ {
+ writer.println(_testName + ": unknown exception");
+ ex.printStackTrace(writer);
+ status = 1;
+ }
+ catch(java.lang.Error err)
+ {
+ //
+ // We catch Error to avoid hangs in some non-fatal situations
+ //
+ writer.println(_testName + ": Java error");
+ err.printStackTrace(writer);
+ status = 1;
+ }
+
+ if(_communicator != null)
+ {
+ try
+ {
+ _communicator.destroy();
+ }
+ catch(LocalException ex)
+ {
+ writer.println(_testName + ": " + ex);
+ ex.printStackTrace(writer);
+ status = 1;
+ }
+ catch(java.lang.Exception ex)
+ {
+ writer.println(_testName + ": unknown exception");
+ ex.printStackTrace(writer);
+ status = 1;
+ }
+ _communicator = null;
+ }
+ writer.flush();
+
+ return status;
+ }
+
+ public void stop()
+ {
+ if(_communicator != null)
+ {
+ _communicator.shutdown();
+ }
+ }
+
+ // Initialize a new communicator.
+ public Ice.Communicator initialize(InitializationData initData)
+ {
+ Ice.Communicator communicator = Util.initialize(initData);
+ if(_communicatorListener != null)
+ {
+ _communicatorListener.communicatorInitialized(communicator);
+ }
+ return communicator;
+ }
+
+ public abstract int run(String[] args);
+
+ // Hook to override the initialization data. This hook is
+ // necessary because some properties must be set prior to
+ // communicator initialization.
+ protected Ice.InitializationData getInitData(Ice.StringSeqHolder argsH)
+ {
+ return null;
+ }
+
+ public java.io.PrintWriter getWriter()
+ {
+ return _printWriter;
+ }
+
+ public void setWriter(java.io.Writer writer)
+ {
+ _printWriter = new java.io.PrintWriter(writer);
+ }
+
+ public void setServerReadyListener(ServerReadyListener cb)
+ {
+ _cb = cb;
+ }
+
+ public void setCommunicatorListener(CommunicatorListener listener)
+ {
+ _communicatorListener = listener;
+ }
+
+ public void serverReady()
+ {
+ if(_cb != null)
+ {
+ _cb.serverReady();
+ }
+ }
+
+ //
+ // Return the application name, i.e., argv[0].
+ //
+ public String
+ appName()
+ {
+ return _testName;
+ }
+
+ public Communicator
+ communicator()
+ {
+ return _communicator;
+ }
+
+ private String _testName;
+ private Communicator _communicator;
+ private java.io.PrintWriter _printWriter = new java.io.PrintWriter(new java.io.OutputStreamWriter(System.out));
+ private ServerReadyListener _cb = null;
+ private CommunicatorListener _communicatorListener = null;
+}