KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > h2 > server > web > WebServer


1 /*
2  * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
3  * Initial Developer: H2 Group
4  */

5 package org.h2.server.web;
6
7 import java.io.ByteArrayInputStream JavaDoc;
8 import java.io.IOException JavaDoc;
9 import java.net.ServerSocket JavaDoc;
10 import java.net.Socket JavaDoc;
11 import java.sql.SQLException JavaDoc;
12 import java.text.SimpleDateFormat JavaDoc;
13 import java.util.ArrayList JavaDoc;
14 import java.util.Date JavaDoc;
15 import java.util.HashMap JavaDoc;
16 import java.util.HashSet JavaDoc;
17 import java.util.Locale JavaDoc;
18 import java.util.Properties JavaDoc;
19 import java.util.TimeZone JavaDoc;
20
21 import org.h2.message.TraceSystem;
22 import org.h2.server.Service;
23 import org.h2.util.ByteUtils;
24 import org.h2.util.NetUtils;
25 import org.h2.util.RandomUtils;
26 import org.h2.util.Resources;
27
28 public class WebServer implements Service {
29     
30     // TODO tool: implement a watchdog for a server
31

32     private static final String JavaDoc DEFAULT_LANGUAGE = "en";
33     private static final String JavaDoc[][] LANGUAGES = {
34         { "en", "English" },
35         { "de", "Deutsch" },
36         { "fr", "Fran\u00e7ais" },
37         { "es", "Espa\u00f1ol" },
38         { "zh_CN", "\u4E2D\u6587"},
39         { "ja", "\u65e5\u672c\u8a9e"},
40     };
41
42 // String lang =
43
// java.util.Locale.CHINESE.getDisplayLanguage(
44
// java.util.Locale.CHINESE);
45
// for(int i=0; i<lang.length(); i++)
46
// System.out.println(Integer.toHexString(lang.charAt(i))+" ");
47

48     private static final long SESSION_TIMEOUT = 30 * 60 * 1000; // timeout is 30 min
49
private long lastTimeoutCheck;
50     private HashMap JavaDoc sessions = new HashMap JavaDoc();
51     private HashSet JavaDoc languages = new HashSet JavaDoc();
52     private String JavaDoc startDateTime;
53     private AppServer appServer;
54     private ServerSocket JavaDoc serverSocket;
55     private boolean ssl;
56     private int port;
57     private String JavaDoc url;
58
59     byte[] getFile(String JavaDoc file) throws IOException JavaDoc {
60         trace("getFile <"+file+">");
61         byte[] data = Resources.get("/org/h2/server/web/res/"+file);
62         if(data == null) {
63             trace(" null");
64         } else {
65             trace(" size="+data.length);
66         }
67         return data;
68     }
69
70     String JavaDoc getTextFile(String JavaDoc file) throws IOException JavaDoc {
71         byte[] bytes = getFile(file);
72         return new String JavaDoc(bytes);
73     }
74     
75     private String JavaDoc generateSessionId() {
76         byte[] buff = RandomUtils.getSecureBytes(16);
77         return ByteUtils.convertBytesToString(buff);
78     }
79
80     AppServer getAppServer() {
81         return appServer;
82     }
83
84     WebServerSession getSession(String JavaDoc sessionId) {
85         long now = System.currentTimeMillis();
86         if(lastTimeoutCheck + SESSION_TIMEOUT < now) {
87             Object JavaDoc[] list = sessions.keySet().toArray();
88             for(int i=0; i<list.length; i++) {
89                 String JavaDoc id = (String JavaDoc) list[i];
90                 WebServerSession session = (WebServerSession)sessions.get(id);
91                 Long JavaDoc last = (Long JavaDoc) session.get("lastAccess");
92                 if(last != null && last.longValue() + SESSION_TIMEOUT < now) {
93                     trace("timeout for " + id);
94                     sessions.remove(id);
95                 }
96             }
97             lastTimeoutCheck = now;
98         }
99         WebServerSession session = (WebServerSession)sessions.get(sessionId);
100         if(session != null) {
101             session.lastAccess = System.currentTimeMillis();
102         }
103         return session;
104     }
105
106     WebServerSession createNewSession(Socket JavaDoc socket) {
107         String JavaDoc newId;
108         do {
109             newId = generateSessionId();
110         } while(sessions.get(newId) != null);
111         WebServerSession session = new AppSession(this);
112         session.put("sessionId", newId);
113         //session.put("ip", socket.getInetAddress().getCanonicalHostName());
114
session.put("ip", socket.getInetAddress().getHostName());
115         session.put("language", DEFAULT_LANGUAGE);
116         sessions.put(newId, session);
117         // always read the english translation, to that untranslated text appears at least in english
118
readTranslations(session, DEFAULT_LANGUAGE);
119         return getSession(newId);
120     }
121
122     String JavaDoc getStartDateTime() {
123         return startDateTime;
124     }
125
126     public void init(String JavaDoc[] args) throws Exception JavaDoc {
127         // TODO web: support using a different properties file
128
appServer = new AppServer(args);
129         SimpleDateFormat JavaDoc format = new SimpleDateFormat JavaDoc("EEE, d MMM yyyy HH:mm:ss z", new Locale JavaDoc("en", ""));
130         format.setTimeZone(TimeZone.getTimeZone("GMT"));
131         startDateTime = format.format(new Date JavaDoc());
132         trace(startDateTime);
133         for(int i=0; i<LANGUAGES.length; i++) {
134             languages.add(LANGUAGES[i][0]);
135         }
136         port = appServer.getPort();
137         ssl = appServer.getSSL();
138         url = (ssl?"https":"http") + "://localhost:"+port;
139     }
140     
141     public String JavaDoc getURL() {
142         return url;
143     }
144     
145     public void start() throws SQLException JavaDoc {
146         serverSocket = NetUtils.createServerSocket(port, ssl);
147     }
148     
149     public void listen() {
150         try {
151             while (serverSocket != null) {
152                 Socket JavaDoc s = serverSocket.accept();
153                 WebServerThread c = new AppThread(s, this);
154                 c.start();
155             }
156         } catch (Exception JavaDoc e) {
157             trace(e.toString());
158         }
159     }
160
161     public boolean isRunning() {
162         if(serverSocket == null) {
163             return false;
164         }
165         try {
166             Socket JavaDoc s = NetUtils.createLoopbackSocket(port, ssl);
167             s.close();
168             return true;
169         } catch(Exception JavaDoc e) {
170             return false;
171         }
172     }
173
174     public void stop() {
175         try {
176             serverSocket.close();
177         } catch(IOException JavaDoc e) {
178             // TODO log exception
179
}
180         serverSocket = null;
181     }
182
183     void trace(String JavaDoc s) {
184 // System.out.println(s);
185
}
186
187     public boolean supportsLanguage(String JavaDoc language) {
188         return languages.contains(language);
189     }
190
191     public void readTranslations(WebServerSession session, String JavaDoc language) {
192         Properties JavaDoc text = new Properties JavaDoc();
193         try {
194             trace("translation: "+language);
195             byte[] trans = getFile("_text_"+language+".properties");
196             trace(" "+new String JavaDoc(trans));
197             text.load(new ByteArrayInputStream JavaDoc(trans));
198         } catch (IOException JavaDoc e) {
199             TraceSystem.traceThrowable(e);
200         }
201         session.put("text", new HashMap JavaDoc(text));
202     }
203
204     public String JavaDoc[][] getLanguageArray() {
205         return LANGUAGES;
206     }
207
208     public ArrayList JavaDoc getSessions() {
209         ArrayList JavaDoc list = new ArrayList JavaDoc(sessions.values());
210         for(int i=0; i<list.size(); i++) {
211             WebServerSession s = (WebServerSession) list.get(i);
212             list.set(i, s.getInfo());
213         }
214         return list;
215     }
216
217     public boolean getAllowOthers() {
218         return appServer.getAllowOthers();
219     }
220
221     public String JavaDoc getType() {
222         return "Web";
223     }
224
225 }
226
Popular Tags