--- /dev/null
+/*\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