001: package util;
002:
003: import java.io.File;
004: import java.io.PrintStream;
005:
006: import javax.xml.parsers.DocumentBuilder;
007: import javax.xml.parsers.DocumentBuilderFactory;
008:
009: import org.w3c.dom.Document;
010: import org.w3c.dom.Element;
011: import org.w3c.dom.NodeList;
012:
013: import com.sun.org.apache.xpath.internal.XPathAPI;
014:
015: /**
016: * IF you need a servlet to start immediatley after Tomcat server start
017: * then name the servlet following the pattern pattern:
018: * <br>"<i>SomeServletName<b>StartOnStartup[NN]</b></i> " where [NN] means
019: * two digits number - the order the servlet will startup.
020: * <p> Feel free to extend this class in order to ass extra configurations
021: * to the application's context. Like Filters, Listeners or other Security
022: * Configurations.
023: * @author LPS
024: */
025: public class MakeServletMap {
026:
027: private static final String THE_SEQUENCE = "StartOnStartup";
028:
029: private int starupOrder = 0;
030:
031: public static void main(String[] args) {
032: @SuppressWarnings("unused")
033: MakeServletMap sm = new MakeServletMap(args[0], args[1]);
034: // MakeServletMap sm = new MakeServletMap("", "");
035: // System.out.println(sm.getStartupTagAndOrder("SomeCoolClassStartOnStartup02"));
036: }
037:
038: private MakeServletMap(String gwt_file_name, String tomcat_file_name) {
039: try {
040: File inFile = new File(gwt_file_name);
041: PrintStream p = new PrintStream(new File(tomcat_file_name));
042: p
043: .println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<web-app>");
044:
045: // read the GWT config file
046: DocumentBuilderFactory factory = DocumentBuilderFactory
047: .newInstance();
048: DocumentBuilder builder = factory.newDocumentBuilder();
049: Document doc = builder.parse(inFile);
050:
051: // get the servlet specifiers
052: NodeList servletNodes = XPathAPI.selectNodeList(doc,
053: "/module/servlet");
054: for (int nodeIndex = 0; nodeIndex < servletNodes
055: .getLength(); nodeIndex++) {
056: Element se = (Element) servletNodes.item(nodeIndex);
057: String servletPath = se.getAttribute("path");
058: String servletClass = se.getAttribute("class");
059: printServlet(p, servletPath, servletClass);
060: }
061: p.println("</web-app>");
062: p.close();
063: } catch (Exception e) {
064: System.err.println("MakeServletMap got exception: " + e);
065: e.printStackTrace();
066: }
067: }
068:
069: private void printServlet(PrintStream p, String servletPath,
070: String servletClass) {
071: String startupTag = "";
072: if (getClassName(servletClass).contains(THE_SEQUENCE))
073: startupTag = getStartupTagAndOrder(servletClass);
074: //
075: p.println("<servlet>");
076: p
077: .println("\t<servlet-name>" + servletClass
078: + "</servlet-name>");
079: p.println("\t<servlet-class>" + servletClass
080: + "</servlet-class>");
081: if (startupTag.length() != 0)
082: p.println("\t" + startupTag);
083: p.println("</servlet>");
084: p.println("<servlet-mapping>");
085: p
086: .println("\t<servlet-name>" + servletClass
087: + "</servlet-name>");
088: p.println("\t<url-pattern>" + servletPath + "</url-pattern>");
089: p.println("</servlet-mapping>");
090: p.println("");
091: }
092:
093: /**
094: * <p>If AFTER THE_SEQUENCE there is a 2 digit number then this will be
095: * the order the servlet will be loaded, otherwise the order will be
096: * set auromatically
097: * <p>Ex: <i>SomeCoolServlet<b>StartOnStartup05</b></i> the serlet will be the
098: * 5th servlet to start on Tomcat's startup
099: * @param servletClass
100: * @return the tag's string to be written into the file.
101: */
102: private String getStartupTagAndOrder(String servletClass) {
103: String digits = servletClass.substring(servletClass
104: .indexOf(THE_SEQUENCE)
105: + THE_SEQUENCE.length(), servletClass
106: .indexOf(THE_SEQUENCE)
107: + THE_SEQUENCE.length() + 2);
108: int n = 0;
109: try {
110: n = Integer.parseInt(digits);
111: if (starupOrder >= n) {
112: n = ++starupOrder;
113: } else {
114: starupOrder = n;
115: }
116: } catch (NumberFormatException e) {
117: n = this .starupOrder;
118: }
119: return "<load-on-startup>" + n + "</load-on-startup>";
120: }
121:
122: /**
123: * gets the last sengment in the clas name. without the package path.
124: * @param servletClass - full class name Ex: "class.is.not.the.Object"
125: * @return last segment of the full class name; Ex: "Object"
126: */
127: private String getClassName(String servletClass) {
128: String tmp = servletClass.substring(servletClass
129: .lastIndexOf(".") + 1, servletClass.length());
130: return tmp;
131: }
132: }
|