Java Web Services via REST bereitstellen
ulrich
2014-11-11 f88c95ed978c427b33730442e03f8a1565b94e32
commit | author | age
ca8e1e 1 /*
U 2     Transit - Remote procedure calls made simple
3     Copyright (c) 2012  Ulrich Hilger
4
5     This program is free software: you can redistribute it and/or modify
6     it under the terms of the GNU Affero General Public License as published by
7     the Free Software Foundation, either version 3 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU Affero General Public License for more details.
14
15     You should have received a copy of the GNU Affero General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 package de.uhilger.transit.web;
20
21 import java.io.File;
22 import java.util.logging.FileHandler;
23 import java.util.logging.Handler;
24 import java.util.logging.Level;
25 import java.util.logging.Logger;
26
27 import javax.servlet.ServletContext;
28 import javax.servlet.ServletContextEvent;
29 import javax.servlet.ServletContextListener;
30
31 import de.uhilger.transit.TextLogFormatter;
32
33 /**
34  * Die Klasse WebApp kann von webanwendungen als Basisklasse verwendet 
35  * werden. Sie etabliert Dinge, die von einer Webanwendung zentral 
36  * benoetigt werden wie z.B. Protokollierung
37  * 
38  * Die Klasse WebApp implementiert die Schnittstell ServletContextListener. 
39  * Wird sie als Listener im Deployment Descriptor einer Webanwendung eingebunden, 
40  * werden ihre Funktionen zum Start und zum Ende ihrer Laufzeit wirksam.
41  */
42 public class WebApp implements ServletContextListener {
43   
44     public static final String P_LOGGERNAME = "loggername";
45     public static final String P_LOGDIRNAME = "logdirname";
46     public static final String P_LOGFILENAME = "logfilename";
47     public static final String P_LOGFILESIZE = "logfilesize";
48     public static final String P_LOGFILECOUNT = "logfilecount";
49     public static final String P_LOGLEVEL = "loglevel";
50     
51     public static final String P_DEBUG = "debug";
52     
53   public static final String WEBAPP_LOGGER = "webapplogger";
54
55   private Level getLevel(String levelStr) {
56       Level level = Level.INFO;
57       if(levelStr.equalsIgnoreCase(Level.ALL.getName())) {
58           level = Level.ALL;
59       } else if(levelStr.equalsIgnoreCase(Level.CONFIG.getName())) {
60           level = Level.CONFIG;
61       } else if(levelStr.equalsIgnoreCase(Level.FINEST.getName())) {
62           level = Level.FINEST;
63       } else if(levelStr.equalsIgnoreCase(Level.FINER.getName())) {
64           level = Level.FINER;
65       } else if(levelStr.equalsIgnoreCase(Level.FINEST.getName())) {
66           level = Level.FINE;
67       } else if(levelStr.equalsIgnoreCase(Level.OFF.getName())) {
68           level = Level.OFF;
69       } else if(levelStr.equalsIgnoreCase(Level.SEVERE.getName())) {
70           level = Level.SEVERE;
71       } else if(levelStr.equalsIgnoreCase(Level.WARNING.getName())) {
72           level = Level.WARNING;
73       }
74       return level;
75   }
76   
77     public void contextInitialized(ServletContextEvent event) {    
78     ServletContext servletContext = event.getServletContext();
79     Object o = servletContext.getAttribute(WEBAPP_LOGGER);
80     if(o == null) {
81       String loggername = servletContext.getInitParameter(P_LOGGERNAME); // Name der root Package dieser Anwendung
82       String logdirname = servletContext.getInitParameter(P_LOGDIRNAME);
83       String logfilename = servletContext.getInitParameter(P_LOGFILENAME); // etwas wie z.B. "log%g.%u.txt"
84       String logfilesize = servletContext.getInitParameter(P_LOGFILESIZE); // Anzahl Bytes
85       String logfilecount = servletContext.getInitParameter(P_LOGFILECOUNT); // Anzahl Dateien fuer Rotation
86       String loglevel = servletContext.getInitParameter(P_LOGLEVEL);
87       FileHandler fh;
88       Logger logger = Logger.getLogger(loggername);
89       servletContext.setAttribute(WEBAPP_LOGGER, logger);
90           try {
91         File basis = new File(this.getClass().getResource("/").toURI());
92         File catalinaBase = basis.getParentFile().getParentFile().getParentFile().getParentFile();
93           File f = new File(catalinaBase, logdirname);
94           if (!f.exists()) {
95             f.mkdirs();
96           }
97               fh = new FileHandler(f.getAbsolutePath() + File.separator + logfilename, 
98                       Integer.parseInt(logfilesize), Integer.parseInt(logfilecount), true);
99               //fh.setLevel(getLevel(loglevel));
100           fh.setFormatter(new TextLogFormatter());
101           logger.setLevel(getLevel(loglevel));
102           logger.addHandler(fh);
103           logger.finest("logger " + loggername + " erzeugt");
104           } catch (Exception e) {
105               logger.log(Level.ALL, e.getMessage(), e);
106           }
107     } else {
108       // logger ist schon da
109     }
110     }
111
112   public void contextDestroyed(ServletContextEvent event) {
113     ServletContext servletContext = event.getServletContext();
114     Object o = servletContext.getAttribute(WEBAPP_LOGGER);
115     if(o != null) {
116       Logger logger = (Logger) o;
117         Handler[] handlers = logger.getHandlers();
118           for(int i = 0; i < handlers.length; i++) {
119               handlers[i].flush(); //
120         if(handlers[i] instanceof FileHandler) {
121           ((FileHandler) handlers[i]).close();
122         }
123               logger.removeHandler(handlers[i]);
124           }
125       servletContext.removeAttribute(WEBAPP_LOGGER);
126           logger = null;
127     }
128     }
129   
130   /**
131    * Den Logger aus dem ServletContext ermitteln.
132    */
133   protected Logger getLogger(ServletContext ctx) {
134     Logger logger = null;
135     Object o = ctx.getAttribute(WEBAPP_LOGGER);
136     if(o != null) {
137       logger = (Logger) o;
138     }
139     return logger;
140   }
141 }
142