Adding JMCR-Stable version
[Benchmarks_CSolver.git] / JMCR-Stable / real-world application / derby-10.3.2.1 / java / drda / org / apache / derby / drda / NetServlet.java
diff --git a/JMCR-Stable/real-world application/derby-10.3.2.1/java/drda/org/apache/derby/drda/NetServlet.java b/JMCR-Stable/real-world application/derby-10.3.2.1/java/drda/org/apache/derby/drda/NetServlet.java
new file mode 100644 (file)
index 0000000..51ef08a
--- /dev/null
@@ -0,0 +1,1083 @@
+/*\r
+\r
+   Derby - Class org.apache.derby.drda.NetServlet\r
+\r
+   Licensed to the Apache Software Foundation (ASF) under one or more\r
+   contributor license agreements.  See the NOTICE file distributed with\r
+   this work for additional information regarding copyright ownership.\r
+   The ASF licenses this file to You under the Apache License, Version 2.0\r
+   (the "License"); you may not use this file except in compliance with\r
+   the License.  You may obtain a copy of the License at\r
+\r
+      http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+\r
+ */\r
+\r
+package org.apache.derby.drda;\r
+\r
+import java.io.*;\r
+import java.util.*;\r
+\r
+import java.net.*;\r
+\r
+import java.security.AccessController;\r
+import java.security.PrivilegedExceptionAction;\r
+\r
+import javax.servlet.*;\r
+import javax.servlet.http.*;\r
+\r
+import org.apache.derby.iapi.tools.i18n.LocalizedResource;\r
+import org.apache.derby.iapi.reference.Property;\r
+\r
+/**\r
+       This servlet can be used to start Derby Network Server from a remote location.\r
+       <P>\r
+       These servlet configuration parameters are understood by this servlet.\r
+       <UL>\r
+       <LI><PRE>portNumber</PRE> - Port number to use. The default is 1527.\r
+       <LI><PRE>startNetworkServerOnInit</PRE> - Starts the Derby Network Server at servlet \r
+                       initialization if 'true'.\r
+       <LI><PRE>tracingDirectory</PRE> - Directory for trace files\r
+       </UL>\r
+\r
+*/\r
+public class NetServlet extends HttpServlet {\r
+       private final static int MAX_CONNECT_TRYS = 20;\r
+       private final static String SERVLET_PROP_MESSAGES =  "org.apache.derby.loc.drda.servlet";\r
+       private final static String SERVLET_ADDRESS = "derbynet";\r
+\r
+       private String formHeader = null;\r
+       private String host = "localhost";\r
+       private int portNumber=1527;\r
+       private String tracingDirectory;\r
+       private boolean logStatus= false;       /* Logging off */\r
+       private boolean traceStatus = false;    /* Tracing off */\r
+       private String[] knownLang = {"cs","en","es","de_DE","fr","hu","it",\r
+                       "ja_JP","ko_KR","pl","pt_BR","ru","zh_CN","zh_TW"};\r
+       private String locale;\r
+\r
+       private final static int NOT_GIVEN = -2;\r
+       private final static int INVALID = -3;\r
+\r
+       private NetworkServerControl server;\r
+       private PrintWriter out;\r
+\r
+       // for doPri block\r
+       private Runnable service;\r
+       \r
+       /**\r
+               Initialize the servlet.\r
+               Configuration parameters:\r
+               <UL>\r
+               <LI><PRE>portNumber</PRE> - Port number\r
+               <LI><PRE>host</PRE> - Host name\r
+               <LI><PRE>traceDirectory</PRE> - location of trace directory\r
+               <LI><PRE>startNetworkServerOnInit</PRE> - start the server on initialization\r
+               </UL>\r
+       */\r
+       public void init(ServletConfig config)\r
+               throws ServletException\r
+       {\r
+               \r
+               LocalizedResource langUtil = new LocalizedResource(null,null,SERVLET_PROP_MESSAGES);\r
+                               \r
+               String port = config.getInitParameter("portNumber");\r
+               if (port != null) {\r
+                       int p = Integer.valueOf(port).intValue();\r
+                       if (p > 0)\r
+                               portNumber = p;\r
+               }\r
+               String hostName = config.getInitParameter("host");\r
+               if (hostName != null)\r
+                       host = hostName;\r
+\r
+               this.tracingDirectory = config.getInitParameter("tracingDirectory");\r
+               \r
+               if ( this.tracingDirectory == null ) {\r
+                       this.tracingDirectory = "";\r
+               }\r
+\r
+               String startup = config.getInitParameter("startNetworkServerOnInit");\r
+\r
+               // test if the server is already running\r
+               try {\r
+                       //don't send output to console\r
+                       if (server == null) {\r
+                               server = new NetworkServerControl(InetAddress.getByName(host), portNumber);\r
+                               // assert this.tracingDirectory != null\r
+                               if  ( ! this.tracingDirectory.trim().equals("")) {\r
+                                       server.setTraceDirectory(this.tracingDirectory);\r
+                               }\r
+                       }\r
+                       \r
+                       if (isServerStarted(server,1))\r
+                               return;\r
+               } catch (Exception e) {}\r
+\r
+               if (startup != null) {\r
+                       boolean start = Boolean.valueOf(startup).booleanValue();\r
+                       if (start)\r
+                       {\r
+                               runServer(langUtil, null, null);\r
+                               return;\r
+                       }\r
+               }\r
+       }\r
+\r
+       /**\r
+               Get the form of NetServlet. Provides buttons and forms to control the\r
+               Network server.\r
+       */\r
+       public void doGet (HttpServletRequest request, HttpServletResponse response)\r
+               throws ServletException, IOException\r
+       {\r
+               String logOnMessage;\r
+               String logOffMessage;\r
+               String traceOnMessage;\r
+               String traceOffMessage;\r
+               String traceOnOffMessage;\r
+               String startMessage;\r
+               String stopMessage;\r
+               String returnMessage;\r
+               String traceSessionMessage;\r
+               String traceDirMessage;\r
+               String contMessage;\r
+               String setParamMessage;\r
+               String setParamMessage2;\r
+               String netParamMessage;\r
+               LocalizedResource langUtil;\r
+               \r
+               langUtil = getCurrentAppUI(request);\r
+               response.setContentType("text/html; charset=UTF-8");\r
+               \r
+               //prevent caching of the servlet since contents can change - beetle 4649\r
+               response.setHeader("Cache-Control", "no-cache,no-store");\r
+\r
+               formHeader = "<form enctype='multipart/form-data; charset=UTF-8' action='" +\r
+                       request.getRequestURI() +" '>";\r
+\r
+               out = new PrintWriter(new\r
+                       OutputStreamWriter(response.getOutputStream(), "UTF8"),true);\r
+               \r
+               //inialize messages\r
+               logOnMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_LogOn"));\r
+               logOffMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_LogOff"));\r
+               traceOnMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_TraceOn"));\r
+               traceOffMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_TraceOff"));\r
+               startMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_Start"));\r
+               stopMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_Stop"));\r
+               traceSessionMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_TraceSessButton"));\r
+               traceOnOffMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_TraceOnOff"));\r
+               returnMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_Return"));\r
+               traceDirMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_TraceDir"));\r
+               contMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_Continue"));\r
+               setParamMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_SetParam"));\r
+               setParamMessage2 = escapeSingleQuotes(langUtil.getTextMessage("SRV_SetParam2"));\r
+               netParamMessage = escapeSingleQuotes(langUtil.getTextMessage("SRV_NetParam"));\r
+\r
+               printBanner(langUtil);\r
+               // set up a server we can use\r
+               if (server == null) {\r
+                       try {\r
+                               server = new NetworkServerControl();\r
+                       }catch (Exception e) {\r
+                               printErrorForm(langUtil, request, e, returnMessage);\r
+                               return;\r
+                       }\r
+               }\r
+               server.setClientLocale(locale);\r
+               String form = getForm(request);\r
+               String doAction = getDoAction(request);\r
+               // if doAction is set, use it to determine form\r
+               if (doAction != null )\r
+               {\r
+                       if (doAction.equals(traceOnOffMessage))\r
+                               form = traceSessionMessage;\r
+                       else\r
+                               form = doAction;\r
+               }\r
+               // if no form, determine form based on server status\r
+               boolean serverStatus = getServerStatus();\r
+               if (form == null)\r
+               {\r
+                       if (serverStatus)\r
+                               form = startMessage;\r
+                       else\r
+                               form = stopMessage;\r
+               }\r
+               else if (form.equals(startMessage))\r
+               {\r
+                       if (!serverStatus)  {\r
+                               runServer(langUtil, request, returnMessage);\r
+                       }\r
+               }\r
+               else if (form.equals(stopMessage))\r
+               {\r
+                       if (serverStatus)   {\r
+                               shutdownServer(langUtil, request, returnMessage);\r
+                       }\r
+                       setDefaults();\r
+                                       \r
+               }\r
+               else if (form.equals(returnMessage) || form.equals(returnMessage))\r
+               {\r
+                       // check if server is still running and use that to determine which form\r
+                       if (serverStatus)\r
+                       {\r
+                               form = startMessage;\r
+                       }\r
+                       else\r
+                       {\r
+                               form = stopMessage;\r
+                       }\r
+               }\r
+\r
+               out.println( formHeader);\r
+               // display forms\r
+\r
+               form = escapeSingleQuotes(form);\r
+               doAction = escapeSingleQuotes(doAction);\r
+               if (form.equals(startMessage))\r
+               {\r
+                       String logButton = getLogging(request);\r
+                       String traceButton = getTrace(request);\r
+                       if (logButton !=  null && logButton.equals(logOnMessage))\r
+                       {\r
+                               if (logging(langUtil, true, request, returnMessage))\r
+                                       logStatus = true;\r
+                       }\r
+                       if (logButton !=  null && logButton.equals(logOffMessage))\r
+                       {\r
+                               if (logging(langUtil, false, request, returnMessage))\r
+                                       logStatus = false;\r
+                       }\r
+                       if (traceButton !=  null && traceButton.equals(traceOnMessage))\r
+                       {\r
+                               if (traceAll(langUtil, true, request, returnMessage))\r
+                                       traceStatus = true;\r
+                       }\r
+                       if (traceButton !=  null && traceButton.equals(traceOffMessage))\r
+                       {\r
+                               if (traceAll(langUtil, false, request, returnMessage))\r
+                                       traceStatus = false;\r
+                       }\r
+                       displayCurrentStatus(request, langUtil, returnMessage);\r
+                       out.println( "<h4>"+langUtil.getTextMessage("SRV_StopButton")+"</h4>" );\r
+                       out.println( "<INPUT type=submit name=form value='"+ stopMessage + "'>" );\r
+\r
+                       out.println( "<h4>"+langUtil.getTextMessage("SRV_LogButton2")+"</h4>" );\r
+\r
+                       if (logStatus)\r
+                       {\r
+                               out.println( "<INPUT type=submit name=logform value='"+logOffMessage + "'>" );\r
+                       }\r
+                       else\r
+                       {\r
+                               out.println( "<INPUT type=submit name=logform value='"+logOnMessage + "'>" );\r
+                       }\r
+                       out.println( "<h4>"+langUtil.getTextMessage("SRV_TraceButton2")+"</h4>" );\r
+                       if (traceStatus)\r
+                       {\r
+                               out.println( "<INPUT type=submit name=traceform value='"+traceOffMessage+ "'>" );\r
+                       }\r
+                       else\r
+                       {\r
+                               out.println( "<INPUT type=submit name=traceform value='"+traceOnMessage + "'>" );\r
+                       }\r
+\r
+                       out.println( "<h4>"+langUtil.getTextMessage("SRV_TraceSession")+"</h4>" );\r
+                       out.println( "<INPUT type=submit name=form value='"+ traceSessionMessage + "'>" );\r
+                       out.println( "<h4>"+langUtil.getTextMessage("SRV_TraceDirButton")+"</h4>" );\r
+                       out.println( "<INPUT type=submit name=form value='"+ traceDirMessage + "'>" );\r
+                       out.println( "<h4>"+langUtil.getTextMessage("SRV_ThreadButton")+"</h4>" );\r
+                       out.println( "<INPUT type=submit name=form value='"+ netParamMessage+ "'>" );\r
+               }\r
+               else if (form.equals(stopMessage))\r
+               {\r
+\r
+                       printAsContentHeader(langUtil.getTextMessage("SRV_NotStarted"));\r
+                       String logButton = getLogging(request);\r
+                       String traceButton =  getTrace(request);\r
+                       if (logButton !=  null && logButton.equals(logOnMessage))\r
+                               logStatus = true;\r
+                       if (logButton !=  null && logButton.equals(logOffMessage))\r
+                               logStatus = false;\r
+                       if (traceButton !=  null && traceButton.equals(traceOnMessage))\r
+                               traceStatus = true;\r
+                       if (traceButton !=  null && traceButton.equals(traceOffMessage))\r
+                               traceStatus = false;\r
+                       if (logStatus)\r
+                       {\r
+                               out.println( "<h4>"+langUtil.getTextMessage("SRV_LogOffButton")+"</h4>" );\r
+                               out.println( "<INPUT type=submit name=logform value='"+logOffMessage + "'>" );\r
+                       }\r
+                       else\r
+                       {\r
+                               out.println( "<h4>"+langUtil.getTextMessage("SRV_LogOnButton")+"</h4>" );\r
+                               out.println( "<INPUT type=submit name=logform value='"+logOnMessage + "'>" );\r
+                       }\r
+                       if (traceStatus)\r
+                       {\r
+                               out.println( "<h4>"+langUtil.getTextMessage("SRV_TraceOffButton")+"</h4>" );\r
+                               out.println( "<INPUT type=submit name=traceform value='"+traceOffMessage + "'>" );\r
+                       }\r
+                       else\r
+                       {\r
+                               out.println( "<h4>"+langUtil.getTextMessage("SRV_TraceOnButton")+"</h4>" );\r
+                               out.println( "<INPUT type=submit name=traceform value='"+traceOnMessage + "'>" );\r
+                       }\r
+                       out.println( "<h4>"+langUtil.getTextMessage("SRV_StartButton")+"</h4>" );\r
+                       out.println( "<INPUT type=submit name=form value='"+startMessage+ "'>" );\r
+               }\r
+               else if (form.equals(traceSessionMessage))\r
+               {\r
+                       if (doAction != null)\r
+                       {\r
+                               if (doAction.equals(traceOnOffMessage))\r
+                               {\r
+                                       String sessionid = request.getParameter("sessionid");\r
+                                       int session = 0;\r
+                                       try {\r
+                                               session = (new Integer(sessionid)).intValue();\r
+                                       } catch (Exception e) {\r
+                                               printErrorForm(langUtil, request,\r
+                                                       langUtil.getTextMessage("SRV_InvalidVal",\r
+                                                       sessionid, langUtil.getTextMessage("SRV_SessionID")),\r
+                                                       returnMessage);\r
+                                               return;\r
+                                       }\r
+                                       Properties p = null;\r
+                                       try {\r
+                                               p = server.getCurrentProperties();\r
+                                       } catch (Exception e) {\r
+                                               printErrorForm(langUtil, request, e, returnMessage);\r
+                                               return;\r
+                                       }\r
+                                       // if it's on, turn it off, if its off, turn it on\r
+                                       boolean val;\r
+                                       if (p.getProperty(Property.DRDA_PROP_TRACE+sessionid) != null)\r
+                                               val = false;\r
+                                       else\r
+                                               val = true;\r
+                                       if (traceSession(langUtil, val, session, request, returnMessage))\r
+                                       {\r
+                                               if (val)\r
+                                                       out.println( "<h4>"+langUtil.getTextMessage("SRV_StatusTraceNoOn", sessionid)+"</h4>");\r
+                                               else\r
+                                                       out.println( "<h4>"+langUtil.getTextMessage("SRV_StatusTraceNoOff", sessionid)+"</h4>");\r
+                                       }\r
+                                       else\r
+                                               return;\r
+                                               \r
+                               }\r
+                       }\r
+                       printAsContentHeader(langUtil.getTextMessage("SRV_TraceSessButton"));\r
+                       out.println( "<h4>" + getHtmlLabelledMessageInstance(langUtil,\r
+                               "SRV_SessionID", "sessionId") + "</h4>");\r
+                       out.println( "<INPUT type=text name=sessionid size=10 maxlength=10 " +\r
+                               "id='sessionId' value=''>");\r
+                       out.println( "<h4> </h4>");\r
+                       out.println( "<INPUT type=submit name=doaction value='"+traceOnOffMessage+ "'>" );\r
+                       out.println( "<INPUT type=submit name=form value='"+returnMessage+ "'>" );\r
+               }\r
+               else if (form.equals(traceDirMessage))\r
+               {\r
+                       boolean set = false;\r
+                       String traceDirectory = null;\r
+                       printAsContentHeader(traceDirMessage);\r
+                       if (doAction != null)\r
+                       {\r
+                               if (doAction.equals(traceDirMessage))\r
+                               {\r
+                                       traceDirectory = getParam(request, "tracedirectory");\r
+                                       if (traceDirectory(langUtil, traceDirectory, request,\r
+                                                       returnMessage) )\r
+                                               set = true;\r
+                                       else\r
+                                               return;\r
+                                       \r
+                               }\r
+                       }\r
+                       if (set)\r
+                       {\r
+                               out.println( "<h2>"+langUtil.getTextMessage("SRV_TraceDirDone", traceDirectory)+"</h2>");\r
+                               out.println( "<INPUT type=submit name=form value='"+returnMessage+"'>" );\r
+                       }\r
+                       else\r
+                       {\r
+                               out.println( "<h4>" + getHtmlLabelledMessageInstance(langUtil,\r
+                                       "SRV_TraceDir", "tracedir") + "</h4>");\r
+                               out.println( "<INPUT type=text name=tracedirectory size=60 maxlength=256 " +\r
+                                       "id='tracedir' value='"+tracingDirectory+"'>");\r
+                               out.println( "<h4> </h4>");\r
+                               out.println( "<INPUT type=submit name=doaction value='"+traceDirMessage+ "'>" );\r
+                               out.println( "<INPUT type=submit name=form value='"+returnMessage+ "'>" );\r
+                       }\r
+               }\r
+               else if (form.equals(netParamMessage))\r
+               {\r
+                       int maxThreads = 0;\r
+                       int timeSlice = 0;\r
+                       String maxName = langUtil.getTextMessage("SRV_NewMaxThreads");\r
+                       String sliceName = langUtil.getTextMessage("SRV_NewTimeSlice");\r
+                       try {\r
+                               Properties p = server.getCurrentProperties();\r
+                               String val = p.getProperty(Property.DRDA_PROP_MAXTHREADS);\r
+                               maxThreads= (new Integer(val)).intValue();\r
+                               val = p.getProperty(Property.DRDA_PROP_TIMESLICE);\r
+                               timeSlice= (new Integer(val)).intValue();\r
+                       } catch (Exception e) {\r
+                               printErrorForm(langUtil, request, e, returnMessage);\r
+                               return;\r
+                       }\r
+                       if (doAction != null && doAction.equals(netParamMessage))\r
+                       {\r
+                               int newMaxThreads = getIntParameter(request, "newmaxthreads", \r
+                                       "SRV_NewMaxThreads", langUtil, returnMessage);\r
+                               int newTimeSlice = (newMaxThreads == INVALID) ? NOT_GIVEN :\r
+                                       getIntParameter(request, "newtimeslice", "SRV_NewTimeSlice", langUtil, \r
+                                               returnMessage);\r
+                               if ((newMaxThreads == INVALID) || (newTimeSlice == INVALID))\r
+                                       return;\r
+                               else if (!(newMaxThreads == NOT_GIVEN && newTimeSlice == NOT_GIVEN))\r
+                               {\r
+                                       if (newMaxThreads != NOT_GIVEN)\r
+                                               maxThreads = newMaxThreads;\r
+                                       if (newTimeSlice != NOT_GIVEN)\r
+                                               timeSlice = newTimeSlice;\r
+                                       if (!setNetParam(langUtil, maxThreads, timeSlice, request,\r
+                                                       returnMessage))\r
+                                               return;\r
+                               }\r
+                       }\r
+                       \r
+                       out.println(formHeader);\r
+                       printAsContentHeader(netParamMessage);\r
+                       out.println( "<h4>"+langUtil.getTextMessage("SRV_MaxThreads", new Integer(maxThreads).toString()) +"</h4>");\r
+                       out.println( "<h4>"+langUtil.getTextMessage("SRV_TimeSlice", new Integer(timeSlice).toString()) +"</h4>");\r
+                       out.println( "<h4> </h4>");\r
+                       out.println( "<h4> <label for='newmaxthreads'>"+maxName+"</label> </h4>");\r
+                       out.println( "<INPUT type=text name=newmaxthreads size=10 maxlength=10 " +\r
+                               "id='newmaxthreads' value=''>" );\r
+                       out.println( "<h4> <label for='newslice'>"+sliceName+"</label> </h4>");\r
+                       out.println( "<INPUT type=text name=newtimeslice size=10 maxlength=10 " +\r
+                               "id='newslice' value=''>" );\r
+                       out.println( "<h4> </h4>");\r
+                       out.println( "<INPUT type=submit name=doaction value='"+netParamMessage+ "'>" );\r
+                       out.println( "<INPUT type=submit name=form value='"+returnMessage+ "'>" );\r
+               }\r
+               else\r
+               {\r
+                       System.out.println("Internal Error: Unknown form, "+ form);\r
+                       out.println("Internal Error: Unknown form, "+ form);\r
+\r
+\r
+               }\r
+\r
+               out.println( "</html>" ); \r
+               out.println( "</body>" );       \r
+\r
+       }\r
+\r
+       /**\r
+               Get the form of NetServlet. Provides a buttons and form to control the\r
+               Network server\r
+\r
+       */\r
+       public void doPost (HttpServletRequest request, HttpServletResponse response)\r
+               throws ServletException, IOException\r
+       {\r
+               // simply call the doGet()\r
+               doGet(request, response);\r
+       }\r
+\r
+       private String getForm(HttpServletRequest request)  throws java.io.IOException{\r
+               return getParam(request, "form");\r
+       }\r
+       private String getDoAction(HttpServletRequest request) throws java.io.IOException {\r
+               return getParam(request, "doaction");\r
+       }\r
+       private String getLogging(HttpServletRequest request) throws java.io.IOException {\r
+               return getParam(request, "logform");\r
+       }\r
+       private String getTrace(HttpServletRequest request) throws java.io.IOException {\r
+               return getParam(request, "traceform");\r
+       }\r
+\r
+       /**\r
+        *  get UTF8 parameter value and decode international characters\r
+        *  @param request   HttpServletRequest\r
+        *  @param paramName  Parameter name\r
+        *  @return decoded String\r
+        */\r
+       private String getParam(HttpServletRequest request, String paramName) throws\r
+       java.io.IOException { \r
+                               \r
+               String newValue= null;\r
+               String value = request.getParameter(paramName);\r
+               if (value == null)\r
+                       return value;\r
+               newValue = new String(value.getBytes("ISO-8859-1"),"UTF8");\r
+               return newValue;\r
+       }\r
+\r
+       /**\r
+        *      Start the network server and attempt to connect to it before\r
+        *      returning\r
+        *\r
+        * @param localUtil LocalizedResource to use to translate messages\r
+        * @param request HttpServetRequest for error forms\r
+        * @param returnMessage localized continue message for continue button on error form    \r
+        * @exception ServletException throws an exception if error in starting the \r
+        *              Network Server during initialization\r
+        */\r
+       private void runServer(LocalizedResource localUtil, HttpServletRequest request,\r
+               String returnMessage)\r
+               throws ServletException\r
+       {\r
+               service = new Runnable() {\r
+                       public void run() {\r
+                               try {\r
+                                       //Echo server output to console\r
+                                       NetworkServerControl runserver = new\r
+                                               NetworkServerControl(InetAddress.getByName(host),\r
+                                                                                        portNumber);\r
+                                       runserver.start(null);\r
+                               }\r
+                               catch (Exception e) {\r
+                                       throw new RuntimeException(e.getMessage());\r
+                               }\r
+                       }\r
+               };\r
+               Thread servThread = null;\r
+               try {\r
+                       servThread = (Thread) AccessController.doPrivileged(\r
+                                                               new PrivilegedExceptionAction() {\r
+                                                                       public Object run() throws Exception\r
+                                                                       {\r
+                                                                               return new Thread(service);\r
+                                                                       }\r
+                                                               }\r
+                                                       );\r
+               }\r
+               catch (Exception e) {\r
+                       throw new RuntimeException(e.getMessage());\r
+               }\r
+               servThread.start();\r
+\r
+               // try to connect to server\r
+               try {\r
+                       boolean connectWorked = false;\r
+                       int t = 0;\r
+                       do\r
+                       {\r
+                               t++;\r
+                               try {\r
+                                               Thread.sleep(100);\r
+                               } catch (InterruptedException ie) {\r
+                                       throw new ServletException(localUtil.getTextMessage("SRV_Interupt"));\r
+                               }\r
+                               try {\r
+                                       if (isServerStarted(server,1))\r
+                                               connectWorked = true;\r
+                               } catch (Exception e) {} //ignore error we'll just try again\r
+                               \r
+                       }while (!connectWorked && t < MAX_CONNECT_TRYS);\r
+                       if (t >= MAX_CONNECT_TRYS)\r
+                               throw new Exception(localUtil.getTextMessage("SRV_MaxTrys",\r
+                                       new Integer(MAX_CONNECT_TRYS).toString()));\r
+                       // turn logging on if required\r
+                       if (logStatus)\r
+                               server.logConnections(true);\r
+                       // turn tracing on\r
+                       if (traceStatus)\r
+                               server.trace(true);\r
+               }catch (Exception e) {\r
+                       if (out != null)\r
+                               printErrorForm(localUtil, request, e, returnMessage);\r
+                       else\r
+                               throw new ServletException(e.getMessage());\r
+               }\r
+       }\r
+       /**\r
+        *      Display an error form\r
+        *\r
+        * @param localUtil     LocalizedResource to use to translate messages\r
+        * @param request HttpServetRequest for error forms\r
+        * @param e             Exception to be displayed\r
+        * @param returnMessage localized continue message for continue button on error form\r
+        */\r
+       private void printErrorForm(LocalizedResource localUtil, HttpServletRequest request,\r
+               Exception e, String returnMessage)\r
+       {\r
+               printAsContentHeader(localUtil.getTextMessage("SRV_NetworkServerError"));\r
+               out.println( "<h4>"+localUtil.getTextMessage("SRV_Message", e.getMessage()) + "</h4>" );\r
+               out.println( "<INPUT type=submit name=form value='"+returnMessage+"'>" );\r
+               out.println( "</html>" );\r
+               out.println( "</body>" );\r
+       }\r
+       /**\r
+        *      Display an error form\r
+        *\r
+        * @param localUtil     LocalizedResource to use to translate messages\r
+        * @param request HttpServetRequest for error forms\r
+        * @param msg   String to be displayed\r
+        * @param returnMessage localized continue message for continue button on error form\r
+        */\r
+       private void printErrorForm(LocalizedResource localUtil, HttpServletRequest request,\r
+               String msg, String returnMessage)\r
+       {\r
+               printAsContentHeader(localUtil.getTextMessage("SRV_NetworkServerError"));\r
+               out.println( "<h4>"+localUtil.getTextMessage("SRV_Message", msg) + "</h4>" );\r
+               out.println( "<INPUT type=submit name=form value='"+returnMessage+"'>" );\r
+               out.println( "</html>" ); \r
+               out.println( "</body>" );       \r
+       }\r
+       /**\r
+        *      Display the current Network server status\r
+        *\r
+        * @param request       HttpServetRequest for  forms\r
+        * @param localUtil             LocalizedResource to use for localizing messages\r
+        * @param returnMessage localized continue message for continue button on error form    \r
+        */\r
+       private void displayCurrentStatus(HttpServletRequest request,\r
+               LocalizedResource localUtil, String returnMessage)\r
+       {\r
+               try {\r
+\r
+                       printAsContentHeader(localUtil.getTextMessage("SRV_Started"));\r
+                       Properties p = server.getCurrentProperties();\r
+                       String val = p.getProperty(Property.DRDA_PROP_LOGCONNECTIONS);\r
+                       if (val.equals("true"))\r
+                               logStatus = true;\r
+                       else\r
+                               logStatus = false;\r
+                       if (logStatus)\r
+                               out.println( "<h4>"+localUtil.getTextMessage("SRV_StatusLogOn")+"</h4>");\r
+                       else\r
+                               out.println( "<h4>"+localUtil.getTextMessage("SRV_StatusLogOff")+"</h4>");\r
+                       val = p.getProperty(Property.DRDA_PROP_TRACEALL);\r
+                       if (val.equals("true"))\r
+                               traceStatus = true;\r
+                       else\r
+                               traceStatus = false;\r
+                       if (traceStatus)\r
+                               out.println( "<h4>"+localUtil.getTextMessage("SRV_StatusTraceOn")+"</h4>");\r
+                       else\r
+                               out.println( "<h4>"+localUtil.getTextMessage("SRV_StatusTraceOff")+"</h4>");\r
+                       val = p.getProperty(Property.DRDA_PROP_PORTNUMBER);\r
+                       out.println( "<h4>"+localUtil.getTextMessage("SRV_PortNumber", val)+"</h4>");\r
+                       \r
+               }\r
+               catch (Exception e) {\r
+                       printErrorForm(localUtil, request, e, returnMessage);\r
+               }\r
+       }\r
+       /**\r
+        *      Get the currrent server status by using test connection\r
+        *\r
+        * @return true if server is up and reachable; false; otherwise\r
+        */\r
+       private boolean getServerStatus()\r
+       {\r
+               try {\r
+                       \r
+                       if (isServerStarted(server,1))\r
+                               return true;\r
+               } catch (Exception e) {}\r
+               return false;\r
+       }\r
+       /**\r
+        *      Shutdown the network server\r
+        *\r
+        * @param localUtil     LocalizedResource to use to translate messages\r
+        * @param request HttpServetRequest for  forms\r
+        * @param returnMessage localized continue message for continue button on error form    \r
+        * @return true if succeeded; false; otherwise\r
+        */\r
+       private boolean shutdownServer(LocalizedResource localUtil,\r
+               HttpServletRequest request, String returnMessage)\r
+       {\r
+               boolean retval = false;\r
+               try {\r
+                       server.shutdown();\r
+                       retval = true;\r
+               } catch (Exception e) \r
+               {\r
+                       printErrorForm(localUtil, request, e, returnMessage);\r
+               }\r
+               return retval;\r
+       }\r
+       /**\r
+        *      Turn logging of connections on\r
+        *\r
+        * @param localUtil     LocalizedResource to use to translate messages\r
+        * @param request HttpServetRequest for  forms\r
+        * @param returnMessage localized continue message for continue button on error form    \r
+        * @return true if succeeded; false; otherwise\r
+        */\r
+       private boolean logging(LocalizedResource localUtil, boolean val,\r
+               HttpServletRequest request, String returnMessage)\r
+       {\r
+               boolean retval = false;\r
+               try {\r
+                       server.logConnections(val);\r
+                       retval = true;\r
+               } catch (Exception e) \r
+               {\r
+                       printErrorForm(localUtil, request, e, returnMessage);\r
+               }\r
+               return retval;\r
+       }\r
+       /**\r
+        *      Change tracing for all sessions \r
+        *\r
+        * @param localUtil     LocalizedResource to use to translate messages\r
+        * @param val   if true, turn tracing on, if false turn it off\r
+        * @param request HttpServetRequest for  forms\r
+        * @param returnMessage localized continue message for continue button on error form    \r
+        * @return true if succeeded; false; otherwise\r
+        */\r
+       private boolean traceAll(LocalizedResource localUtil, boolean val,\r
+               HttpServletRequest request, String returnMessage)\r
+       {\r
+               boolean retval = false;\r
+               try {\r
+                       server.trace(val);\r
+                       retval = true;\r
+               } catch (Exception e) \r
+               {\r
+                       printErrorForm(localUtil, request, e, returnMessage);\r
+               }\r
+               return retval;\r
+       }\r
+       /**\r
+        *      Change tracing for a given session\r
+        *\r
+        * @param localUtil     LocalizedResource to use to translate messages\r
+        * @param val   if true, turn tracing on, if false turn it off\r
+        * @param session       session to trace\r
+        * @param request HttpServetRequest for  forms\r
+        * @param returnMessage localized continue message for continue button on error form    \r
+        * @return true if succeeded; false; otherwise\r
+        */\r
+       private boolean traceSession(LocalizedResource localUtil, boolean val, int session,\r
+               HttpServletRequest request, String returnMessage)\r
+       {\r
+               boolean retval = false;\r
+               try {\r
+                       server.trace(session, val);\r
+                       retval = true;\r
+               } catch (Exception e) \r
+               {\r
+                       printErrorForm(localUtil, request, e, returnMessage);\r
+               }\r
+               return retval;\r
+       }\r
+\r
+       /**\r
+        * Set trace directory\r
+        *\r
+        * @param localUtil     LocalizedResource to use to translate messages\r
+        * @param traceDirectory        directory for trace files\r
+        * @param request                       HttpServetRequest for  forms\r
+        * @param returnMessage         localized continue message for continue \r
+        *                                                      button on error form    \r
+        * @return true if succeeded; false; otherwise\r
+        */\r
+       private boolean traceDirectory(LocalizedResource localUtil, String traceDirectory,\r
+               HttpServletRequest request, String returnMessage)\r
+       {\r
+               boolean retval = false;\r
+\r
+               if ((traceDirectory == null) || traceDirectory.equals("")) {\r
+                       printErrorForm(localUtil, request,\r
+                               localUtil.getTextMessage("SRV_MissingParam",\r
+                               localUtil.getTextMessage("SRV_TraceDir")), returnMessage);\r
+\r
+                       return retval;\r
+               }\r
+\r
+               try {\r
+                       this.tracingDirectory = traceDirectory;\r
+                       server.setTraceDirectory(traceDirectory);\r
+                       retval = true;\r
+               } catch (Exception e) \r
+               {\r
+                       printErrorForm(localUtil, request, e, returnMessage);\r
+               }\r
+               return retval;\r
+       }\r
+\r
+       /**\r
+        * Set Network server parameters\r
+        *\r
+        * @param localUtil     LocalizedResource to use to translate messages\r
+        * @param max                           maximum number of threads\r
+        * @param slice                         time slice for each connection\r
+        * @param request                       HttpServetRequest for  forms\r
+        * @param returnMessage         localized continue message for continue \r
+        *                                                      button on error form    \r
+        * @return true if succeeded; false; otherwise\r
+        */\r
+       private boolean setNetParam(LocalizedResource localUtil, int max, int slice,\r
+               HttpServletRequest request, String returnMessage)\r
+       {\r
+               boolean retval = false;\r
+\r
+               try {\r
+                       server.setMaxThreads(max);\r
+                       server.setTimeSlice(slice);\r
+                       retval = true;\r
+               } catch (Exception e) \r
+               {\r
+                       printErrorForm(localUtil, request, e, returnMessage);\r
+               }\r
+               return retval;\r
+       }\r
+\r
+\r
+       /** \r
+        * Set defaults for logging and tracing (both off)\r
+        */\r
+       private void setDefaults()\r
+       {\r
+               logStatus = false;\r
+               traceStatus = false;\r
+       }\r
+       /**\r
+        * Get an integer parameter\r
+        *\r
+        * @param request                       HttpServetRequest for  forms\r
+        * @param name                          parameter name\r
+        * @param fieldKey                      Key for the name of the field we're reading.\r
+        * @param localUtil                             LocalizedResource to use in localizing messages\r
+        * @param returnMessage         localized continue message for continue \r
+        *                                                      button on error form    \r
+        */\r
+       private int getIntParameter(HttpServletRequest request,\r
+                       String name, String fieldKey, LocalizedResource localUtil, String returnMessage)\r
+       {\r
+               String val = request.getParameter(name);\r
+               int retval;\r
+               if (val == null || val.equals(""))\r
+                       return NOT_GIVEN;\r
+               try {\r
+                       retval = (new Integer(val)).intValue();\r
+               } catch (Exception e) {\r
+                       printErrorForm(localUtil, request,localUtil.getTextMessage("SRV_InvalidVal",\r
+                               val, localUtil.getTextMessage(fieldKey)), returnMessage);\r
+                       return INVALID;\r
+               }\r
+               if (retval < 0) {\r
+               // negative integers not allowed for the parameters we're getting.\r
+                       printErrorForm(localUtil, request, localUtil.getTextMessage("SRV_InvalidVal",\r
+                               val, localUtil.getTextMessage(fieldKey)), returnMessage);\r
+                       return INVALID;\r
+               }\r
+               return retval;\r
+       }\r
+       /**\r
+        * Print Derby Network Server banner\r
+        */\r
+       private void printBanner(LocalizedResource localUtil)\r
+       {\r
+               out.println("<a href=\"#navskip\">[ " +\r
+               localUtil.getTextMessage("SRV_SkipToContent") + " ]</a>");\r
+               out.println("  -  <a href=\"" + SERVLET_ADDRESS + "\">[ " +\r
+               localUtil.getTextMessage("SRV_BackToMain") + " ]</a>");\r
+               out.println( "<html>" );                \r
+               out.println( "<title>"+localUtil.getTextMessage("SRV_Banner")+"</title>" );\r
+               out.println( "<body>" );        \r
+               out.println( "<hr>" );\r
+               out.println( "<h1>"+localUtil.getTextMessage("SRV_Banner")+"</h1>" );\r
+               out.println( "<hr>" );\r
+\r
+       }\r
+       /**\r
+        * Determine the locale file needed for this browsers preferences\r
+        * Defaults to the settings for derby.locale and derby.codeset if set\r
+        *              English otherwise if browsers preferences can't be found\r
+        *\r
+        * @param request                       HttpServetRequest for forms\r
+        * @return the appUI which fits the browsers preferences\r
+        */\r
+       private LocalizedResource getCurrentAppUI(HttpServletRequest request)\r
+       {\r
+               LocalizedResource localUtil;\r
+               String acceptLanguage = request.getHeader("Accept-Language");\r
+               localUtil = new LocalizedResource(null,null,SERVLET_PROP_MESSAGES);\r
+               // if no language specified use one set by derby.locale, derby.codeset\r
+               locale = null;\r
+               if (acceptLanguage == null)\r
+               {\r
+                       return localUtil;\r
+               }\r
+               // Use a tokenizer ot separate acceptable languages\r
+               StringTokenizer tokenizer = new StringTokenizer(acceptLanguage, ",");\r
+               while (tokenizer.hasMoreTokens())\r
+               {\r
+                       //Get the next acceptable language\r
+                       String lang = tokenizer.nextToken();\r
+                       lang = getLocStringFromLanguage(lang);\r
+                       int langindex = translationAvailable(lang);\r
+                       // have we found one\r
+                       if (langindex != -1)\r
+                       {\r
+                               localUtil.init(null, lang, SERVLET_PROP_MESSAGES);\r
+                               // locale will be passed to server, server routines will get set appropriately\r
+                               locale = lang;\r
+                               return localUtil;\r
+                       }\r
+               }\r
+               // nothing worked use defaults\r
+               return localUtil;\r
+               \r
+       }\r
+       /**\r
+        * Get locale string from language which may have qvalue set\r
+        * \r
+        * @param lang  language string to parse\r
+        *\r
+        * @return stripped language string to use in matching\r
+        */\r
+       private String getLocStringFromLanguage(String lang)\r
+       {\r
+               int semi;\r
+               // Cut off any q-value that might come after a semi-colon\r
+               if ((semi = lang.indexOf(';')) != -1)\r
+               {\r
+                       lang = lang.substring(0, semi);\r
+               }\r
+               // trim any whitespace and fix the code, as some browsers might send a bad format\r
+               lang = fixLanguageCode(lang.trim());\r
+               return lang;\r
+       }\r
+       /**\r
+        * Check if the required translation is available\r
+        *\r
+        * @param lang  language we are looking for\r
+        * \r
+        * @return index into language array if found, -1 otherwise;\r
+        */\r
+       private int translationAvailable(String lang)\r
+       {\r
+               // assert lang == fixLanguageCode(lang)\r
+               // we don't need to use toUpperCase() anymore, as the lang is already fixed\r
+               for (int i = 0; i < knownLang.length; i++)\r
+                       if (knownLang[i].equals(lang))\r
+                               return i;\r
+               return -1;\r
+       }\r
+       \r
+       /**\r
+        * Fix the language code, as some browsers send then in a bad format (for instance, \r
+        * Firefox sends en-us instead of en_US).\r
+        *\r
+        * @param lang  language to be fixed\r
+        * \r
+        * @return fixed version of the language, with _ separating parts and country in upper case\r
+        */\r
+       private String fixLanguageCode( String lang ) {\r
+               int index = lang.indexOf('-');\r
+               if ( index != -1 ) {            \r
+                       return fixLanguageCode( lang, index );\r
+               }\r
+               index = lang.indexOf('_');\r
+               if ( index != -1 ) {            \r
+                       return fixLanguageCode( lang, index );\r
+               }\r
+               return lang;\r
+       }\r
+\r
+       private String fixLanguageCode(String lang, int index) {\r
+               return lang.substring(0,index) + "_" + lang.substring(index+1).toUpperCase(Locale.ENGLISH);\r
+       }\r
+\r
+       /**\r
+        * get an HTML labelled message from the resource bundle file, according to\r
+        * the given key.\r
+        */\r
+       public String getHtmlLabelledMessageInstance(LocalizedResource localUtil, String key, String id) {\r
+\r
+               if (id == null)\r
+                       id = "";\r
+\r
+               return ("<label for='" + id + "'>" + localUtil.getTextMessage(key) +\r
+                       "</label>");\r
+\r
+       }\r
+\r
+       /**\r
+        * Print the received string as a header.\r
+        * @param str The string to be printed as a header.\r
+        */\r
+       private void printAsContentHeader(String str) {\r
+\r
+               out.println("<a name=\"navskip\"></a><h2>" + str + "</h2>");\r
+               return;\r
+\r
+       }\r
+\r
+       /**\r
+        * If the received string has one or more single quotes\r
+        * in it, replace each one with the HTML escape-code\r
+        * for a single quote (apostrophe) so that the string \r
+        * can be properly displayed on a submit button.\r
+        * @param str The string in which we want to escape\r
+        *  single quotes.\r
+        */\r
+       private String escapeSingleQuotes(String str) {\r
+\r
+               if ((str == null) || (str.indexOf("'") < 0))\r
+                       return str;\r
+\r
+               char [] cA = str.toCharArray();\r
+\r
+               // Worst (and extremely unlikely) case is every \r
+               // character is a single quote, which means the\r
+               // escaped string would need to be 4 times as long.\r
+               char [] result = new char[4*cA.length];\r
+\r
+               int j = 0;\r
+               for (int i = 0; i < cA.length; i++) {\r
+\r
+                       if (cA[i] == '\'') {\r
+                               result[j++] = '&';\r
+                               result[j++] = '#';\r
+                               result[j++] = '3';\r
+                               result[j++] = '9';\r
+                       }\r
+                       else\r
+                               result[j++] = cA[i];\r
+\r
+               }\r
+\r
+               return new String(result, 0, j);\r
+\r
+       }\r
+\r
+       private static boolean isServerStarted(NetworkServerControl server, int ntries)\r
+       {\r
+               for (int i = 1; i <= ntries; i ++)\r
+               {\r
+                       try {\r
+                               Thread.sleep(500);\r
+                               server.ping();\r
+                               return true;\r
+                       }\r
+                       catch (Exception e) {\r
+                               if (i == ntries)\r
+                                       return false;\r
+                       }\r
+               }\r
+               return false;\r
+       }\r
+       \r
+}\r