/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.aries.samples.ariestrader.web; import javax.servlet.*; import javax.servlet.http.*; import org.apache.aries.samples.ariestrader.api.TradeDBManager; import org.apache.aries.samples.ariestrader.api.TradeServiceUtilities; import org.apache.aries.samples.ariestrader.api.persistence.RunStatsDataBean; import org.apache.aries.samples.ariestrader.util.Log; import org.apache.aries.samples.ariestrader.util.TradeConfig; import java.io.IOException; /** * TradeConfigServlet provides a servlet interface to adjust AriesTrader runtime parameters. * TradeConfigServlet updates values in the {@link org.apache.aries.samples.ariestrader.web.TradeConfig} JavaBean holding * all configuration and runtime parameters for the Trade application * */ public class TradeConfigServlet extends HttpServlet { private static TradeDBManager tradeDBManager = null; /** * Servlet initialization method. */ public void init(ServletConfig config) throws ServletException { super.init(config); } /** * Create the TradeConfig bean and pass it the config.jsp page * to display the current Trade runtime configuration * Creation date: (2/8/2000 3:43:59 PM) */ void doConfigDisplay( HttpServletRequest req, HttpServletResponse resp, String results) throws Exception { TradeConfig currentConfig = new TradeConfig(); req.setAttribute("tradeConfig", currentConfig); req.setAttribute("status", results); getServletConfig() .getServletContext() .getRequestDispatcher(TradeConfig.getPage(TradeConfig.CONFIG_PAGE)) .include(req, resp); } void doResetTrade( HttpServletRequest req, HttpServletResponse resp, String results) throws Exception { RunStatsDataBean runStatsData = new RunStatsDataBean(); TradeConfig currentConfig = new TradeConfig(); if (tradeDBManager == null) { tradeDBManager = TradeServiceUtilities.getTradeDBManager(); } try { runStatsData = tradeDBManager.resetTrade(false); req.setAttribute("runStatsData", runStatsData); req.setAttribute("tradeConfig", currentConfig); results += "Trade Reset completed successfully"; req.setAttribute("status", results); } catch (Exception e) { results += "Trade Reset Error - see log for details"; Log.error(e, results); throw e; } getServletConfig() .getServletContext() .getRequestDispatcher(TradeConfig.getPage(TradeConfig.STATS_PAGE)) .include(req, resp); } /** * Update Trade runtime configuration parameters * Creation date: (2/8/2000 3:44:24 PM) */ void doConfigUpdate(HttpServletRequest req, HttpServletResponse resp) throws Exception { String currentConfigStr = "\n\n########## Trade configuration update. Current config:\n\n"; String runTimeModeStr = req.getParameter("RunTimeMode"); if (runTimeModeStr != null) { try { int i = Integer.parseInt(runTimeModeStr); if ((i >= 0) && (i < TradeConfig.runTimeModeNames.length)) //Input validation { TradeConfig.setRunTimeMode(TradeConfig.ModeType.values()[i]); } } catch (Exception e) { Log.error( e, "TradeConfigServlet.doConfigUpdate(..): minor exception caught", "trying to set runtimemode to " + runTimeModeStr, "reverting to current value"); } // If the value is bad, simply revert to current } currentConfigStr += "\t\tRunTimeMode:\t\t" + TradeConfig.runTimeModeNames[TradeConfig.getRunTimeMode().ordinal()] + "\n"; /* Add JPA layer choice to avoid some ugly Hibernate bugs */ String jpaLayerStr = req.getParameter("JPALayer"); if (jpaLayerStr != null) { try { int i = Integer.parseInt(jpaLayerStr); if ((i >= 0) && (i < TradeConfig.jpaLayerNames.length)) //Input validation TradeConfig.jpaLayer = i; } catch (Exception e) { Log.error( e, "TradeConfigServlet.doConfigUpdate(..): minor exception caught", "trying to set JPALayer to " + jpaLayerStr, "reverting to current value"); } // If the value is bad, simply revert to current } currentConfigStr += "\t\tJPALayer:\t\t" + TradeConfig.jpaLayerNames[TradeConfig.jpaLayer] + "\n"; String orderProcessingModeStr = req.getParameter("OrderProcessingMode"); if (orderProcessingModeStr != null) { try { int i = Integer.parseInt(orderProcessingModeStr); if ((i >= 0) && (i < TradeConfig.orderProcessingModeNames.length)) //Input validation TradeConfig.orderProcessingMode = i; } catch (Exception e) { Log.error( e, "TradeConfigServlet.doConfigUpdate(..): minor exception caught", "trying to set orderProcessing to " + orderProcessingModeStr, "reverting to current value"); } // If the value is bad, simply revert to current } currentConfigStr += "\t\tOrderProcessingMode:\t" + TradeConfig.orderProcessingModeNames[TradeConfig.orderProcessingMode] + "\n"; String accessModeStr = req.getParameter("AcessMode"); if (accessModeStr != null) { try { int i = Integer.parseInt(accessModeStr); if ((i >= 0) && (i < TradeConfig.accessModeNames.length) && (i != TradeConfig.getAccessMode())) //Input validation TradeConfig.setAccessMode(i); } catch (Exception e) { Log.error( e, "TradeConfigServlet.doConfigUpdate(..): minor exception caught", "trying to set orderProcessing to " + orderProcessingModeStr, "reverting to current value"); } // If the value is bad, simply revert to current } currentConfigStr += "\t\tAcessMode:\t\t" + TradeConfig.accessModeNames[TradeConfig.getAccessMode()] + "\n"; String workloadMixStr = req.getParameter("WorkloadMix"); if (workloadMixStr != null) { try { int i = Integer.parseInt(workloadMixStr); if ((i >= 0) && (i < TradeConfig.workloadMixNames.length)) //Input validation TradeConfig.workloadMix = i; } catch (Exception e) { Log.error( e, "TradeConfigServlet.doConfigUpdate(..): minor exception caught", "trying to set workloadMix to " + workloadMixStr, "reverting to current value"); } // If the value is bad, simply revert to current } currentConfigStr += "\t\tWorkload Mix:\t\t" + TradeConfig.workloadMixNames[TradeConfig.workloadMix] + "\n"; String webInterfaceStr = req.getParameter("WebInterface"); if (webInterfaceStr != null) { try { int i = Integer.parseInt(webInterfaceStr); if ((i >= 0) && (i < TradeConfig.webInterfaceNames.length)) //Input validation TradeConfig.webInterface = i; } catch (Exception e) { Log.error( e, "TradeConfigServlet.doConfigUpdate(..): minor exception caught", "trying to set WebInterface to " + webInterfaceStr, "reverting to current value"); } // If the value is bad, simply revert to current } currentConfigStr += "\t\tWeb Interface:\t\t" + TradeConfig.webInterfaceNames[TradeConfig.webInterface] + "\n"; String cachingTypeStr = req.getParameter("CachingType"); if (cachingTypeStr != null) { try { int i = Integer.parseInt(cachingTypeStr); if ((i >= 0) && (i < TradeConfig.cachingTypeNames.length)) //Input validation TradeConfig.cachingType = i; } catch (Exception e) { Log.error( e, "TradeConfigServlet.doConfigUpdate(..): minor exception caught", "trying to set CachingType to " + cachingTypeStr, "reverting to current value"); } // If the value is bad, simply revert to current } currentConfigStr += "\t\tCachingType:\t\t" + TradeConfig.cachingTypeNames[TradeConfig.cachingType] + "\n"; String parm = req.getParameter("SOAP_URL"); if ((parm != null) && (parm.length() > 0)) { if (!TradeConfig.getSoapURL().equals(parm)) { TradeConfig.setSoapURL(parm); } } else { TradeConfig.setSoapURL(null); } parm = req.getParameter("MaxUsers"); if ((parm != null) && (parm.length() > 0)) { try { TradeConfig.setMAX_USERS(Integer.parseInt(parm)); } catch (Exception e) { Log.error( e, "TradeConfigServlet.doConfigUpdate(..): minor exception caught", "Setting maxusers, probably error parsing string to int:" + parm, "revertying to current value: " + TradeConfig.getMAX_USERS()); } //On error, revert to saved } parm = req.getParameter("MaxQuotes"); if ((parm != null) && (parm.length() > 0)) { try { TradeConfig.setMAX_QUOTES(Integer.parseInt(parm)); } catch (Exception e) { Log.error( e, "TradeConfigServlet: minor exception caught", "trying to set max_quotes, error on parsing int " + parm, "reverting to current value " + TradeConfig.getMAX_QUOTES()); } //On error, revert to saved } currentConfigStr += "\t\t#Trade Users:\t\t" + TradeConfig.getMAX_USERS() + "\n"; currentConfigStr += "\t\t#Trade Quotes:\t\t" + TradeConfig.getMAX_QUOTES() + "\n"; parm = req.getParameter("marketSummaryInterval"); if ((parm != null) && (parm.length() > 0)) { try { TradeConfig.setMarketSummaryInterval(Integer.parseInt(parm)); } catch (Exception e) { Log.error( e, "TradeConfigServlet: minor exception caught", "trying to set marketSummaryInterval, error on parsing int " + parm, "reverting to current value " + TradeConfig.getMarketSummaryInterval()); } } currentConfigStr += "\t\tMarket Summary Interval:\t\t" + TradeConfig.getMarketSummaryInterval() + "\n"; parm = req.getParameter("primIterations"); if ((parm != null) && (parm.length() > 0)) { try { TradeConfig.setPrimIterations(Integer.parseInt(parm)); } catch (Exception e) { Log.error( e, "TradeConfigServlet: minor exception caught", "trying to set primIterations, error on parsing int " + parm, "reverting to current value " + TradeConfig.getPrimIterations()); } } currentConfigStr += "\t\tPrimitive Iterations:\t\t" + TradeConfig.getPrimIterations() + "\n"; String enablePublishQuotePriceChange = req.getParameter("EnablePublishQuotePriceChange"); if (enablePublishQuotePriceChange != null) TradeConfig.setPublishQuotePriceChange(true); else TradeConfig.setPublishQuotePriceChange(false); currentConfigStr += "\t\tTradeStreamer MDB Enabled:\t" + TradeConfig.getPublishQuotePriceChange() + "\n"; String enableTrace = req.getParameter("EnableTrace"); if (enableTrace != null) Log.setTrace(true); else Log.setTrace(false); String enableActionTrace = req.getParameter("EnableActionTrace"); if (enableActionTrace != null) Log.setActionTrace(true); else Log.setActionTrace(false); String enableLongRun = req.getParameter("EnableLongRun"); if (enableLongRun != null) TradeConfig.setLongRun(true); else TradeConfig.setLongRun(false); currentConfigStr += "\t\tLong Run Enabled:\t\t" + TradeConfig.getLongRun() + "\n"; System.out.println(currentConfigStr); } public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String action = null; String result = ""; resp.setContentType("text/html"); try { action = req.getParameter("action"); if (action == null) { doConfigDisplay(req, resp, result + "<b><br>Current AriesTrader Configuration:</br></b>"); return; } else if (action.equals("updateConfig")) { doConfigUpdate(req, resp); result = "<B><BR>AriesTrader Configuration Updated</BR></B>"; } else if (action.equals("resetTrade")) { doResetTrade(req, resp, ""); return; } else if (action.equals("buildDB")) { resp.setContentType("text/html"); new TradeBuildDB(resp.getWriter(), false); result = "AriesTrader Database Built - " + TradeConfig.getMAX_USERS() + "users created"; } else if (action.equals("buildDBTables")) { resp.setContentType("text/html"); new TradeBuildDB(resp.getWriter(), true); } doConfigDisplay(req, resp, result + "Current AriesTrader Configuration:"); } catch (Exception e) { Log.error( e, "TradeConfigServlet.service(...)", "Exception trying to perform action=" + action); resp.sendError( 500, "TradeConfigServlet.service(...)" + "Exception trying to perform action=" + action + "\nException details: " + e.toString()); } } }