package com.transmem; import javax.servlet.*; import javax.servlet.http.*; import java.sql.Connection; import javax.sql.DataSource; import java.io.IOException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import java.util.logging.Logger; //set logging output file somewhere import java.util.Enumeration; import java.util.Map; import java.util.HashMap; import java.util.ArrayList; import com.transmem.data.db.Databases; import com.transmem.data.db.Languages; import com.transmem.action.*; /** * Controller servlet for the whole web app. */ public class TransmemServlet extends HttpServlet { private static final long serialVersionUID = 1; private Logger log; /** * Init the servlet. * Obtain a datasource from the container context. * The datasource needs to be set up in the web.xml as resource-ref element. */ public void init() { log = Logger.getLogger(TransmemServlet.class.getName()); try { Context initCtx = new InitialContext(); Context envCtx = (Context)initCtx.lookup("java:comp/env"); ServletConfig sc = getServletConfig(); ServletContext sctx = getServletContext(); Map<String, DataSource> dss = new HashMap<String, DataSource>(); Enumeration names = sc.getInitParameterNames(); Databases dbs = new Databases(); while (names.hasMoreElements()) { String dskey = (String)names.nextElement(); String[] parts = dskey.split("-"); //ds-MAIN-READWRITE if (parts != null && parts.length == 3 && parts[0].equals("ds")) { String dsname = sc.getInitParameter(dskey); DataSource ds = null; if (dss.containsKey(dsname)) ds = dss.get(dsname); else { ds = (DataSource)envCtx.lookup(dsname); if (ds != null) dss.put(dsname, ds); else log.severe("envCtx.lookup("+dsname+") returned null"); } if (ds != null) { dbs.addDataSource(ds, parts[1], parts[2]); } } } sctx.setAttribute("databases", dbs); //other initial parameters int uploadsizemb = 1; //default 1 MB of maximum uploaded file size String sus = sc.getInitParameter("MaxUploadFileSizeMB"); if (sus != null) { try { uploadsizemb = Integer.parseInt(sus); } catch (Exception e) { } } sctx.setAttribute("UploadSizeMB", new Integer(uploadsizemb)); //set it in web.xml //load supported language pairs into memory Connection con = dbs.getConnection(Databases.CATEGORY_MAIN); Languages langs = new Languages(con); ArrayList langpairs = langs.querySupportedPairs(); con.close(); if (langpairs != null) sctx.setAttribute("langpairs",langpairs); log.fine("TransmemServlet.init() done"); } catch (java.sql.SQLException x) { log.severe("TransmemServlet.init() failed: "+x.toString()); } catch (javax.naming.NamingException e) { System.out.println(e.toString()); log.severe("TransmemServlet.init() failed: "+e.toString()); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { log.entering("TransmemServlet","doPost"); String view = "/"; //wrap request and response in ServletParams object and pass to action.execute ServletParams sp = new ServletParams(request, response); //get request parameter 'action' from form post String sAction = sp.getParameter("action"); if (sAction != null) { //create appropriate IAction object from the action class name IAction action = ActionFactory.createAction(sAction); if (action != null) { action.execute(sp); view = action.getNextPage(); } else { log.severe("helper.getAction() returned null"); } } else { log.warning("Request without an action"); } if (view != null) //view is null for Ajax responses { RequestDispatcher dispatcher = request.getRequestDispatcher(view); dispatcher.forward(request, response); } log.exiting("TransmemServlet","doPost"); } public void destroy() { log.entering("TransmemServlet","destroy"); //clean up datasource getServletContext().removeAttribute("databases"); getServletContext().removeAttribute("langpairs"); log.exiting("TransmemServlet","destroy"); } }