1 5 package org.h2.server.web; 6 7 import java.io.ByteArrayInputStream ; 8 import java.io.IOException ; 9 import java.net.ServerSocket ; 10 import java.net.Socket ; 11 import java.sql.SQLException ; 12 import java.text.SimpleDateFormat ; 13 import java.util.ArrayList ; 14 import java.util.Date ; 15 import java.util.HashMap ; 16 import java.util.HashSet ; 17 import java.util.Locale ; 18 import java.util.Properties ; 19 import java.util.TimeZone ; 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 32 private static final String DEFAULT_LANGUAGE = "en"; 33 private static final String [][] 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 48 private static final long SESSION_TIMEOUT = 30 * 60 * 1000; private long lastTimeoutCheck; 50 private HashMap sessions = new HashMap (); 51 private HashSet languages = new HashSet (); 52 private String startDateTime; 53 private AppServer appServer; 54 private ServerSocket serverSocket; 55 private boolean ssl; 56 private int port; 57 private String url; 58 59 byte[] getFile(String file) throws IOException { 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 getTextFile(String file) throws IOException { 71 byte[] bytes = getFile(file); 72 return new String (bytes); 73 } 74 75 private String 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 sessionId) { 85 long now = System.currentTimeMillis(); 86 if(lastTimeoutCheck + SESSION_TIMEOUT < now) { 87 Object [] list = sessions.keySet().toArray(); 88 for(int i=0; i<list.length; i++) { 89 String id = (String ) list[i]; 90 WebServerSession session = (WebServerSession)sessions.get(id); 91 Long last = (Long ) 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 socket) { 107 String 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().getHostName()); 115 session.put("language", DEFAULT_LANGUAGE); 116 sessions.put(newId, session); 117 readTranslations(session, DEFAULT_LANGUAGE); 119 return getSession(newId); 120 } 121 122 String getStartDateTime() { 123 return startDateTime; 124 } 125 126 public void init(String [] args) throws Exception { 127 appServer = new AppServer(args); 129 SimpleDateFormat format = new SimpleDateFormat ("EEE, d MMM yyyy HH:mm:ss z", new Locale ("en", "")); 130 format.setTimeZone(TimeZone.getTimeZone("GMT")); 131 startDateTime = format.format(new Date ()); 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 getURL() { 142 return url; 143 } 144 145 public void start() throws SQLException { 146 serverSocket = NetUtils.createServerSocket(port, ssl); 147 } 148 149 public void listen() { 150 try { 151 while (serverSocket != null) { 152 Socket s = serverSocket.accept(); 153 WebServerThread c = new AppThread(s, this); 154 c.start(); 155 } 156 } catch (Exception e) { 157 trace(e.toString()); 158 } 159 } 160 161 public boolean isRunning() { 162 if(serverSocket == null) { 163 return false; 164 } 165 try { 166 Socket s = NetUtils.createLoopbackSocket(port, ssl); 167 s.close(); 168 return true; 169 } catch(Exception e) { 170 return false; 171 } 172 } 173 174 public void stop() { 175 try { 176 serverSocket.close(); 177 } catch(IOException e) { 178 } 180 serverSocket = null; 181 } 182 183 void trace(String s) { 184 } 186 187 public boolean supportsLanguage(String language) { 188 return languages.contains(language); 189 } 190 191 public void readTranslations(WebServerSession session, String language) { 192 Properties text = new Properties (); 193 try { 194 trace("translation: "+language); 195 byte[] trans = getFile("_text_"+language+".properties"); 196 trace(" "+new String (trans)); 197 text.load(new ByteArrayInputStream (trans)); 198 } catch (IOException e) { 199 TraceSystem.traceThrowable(e); 200 } 201 session.put("text", new HashMap (text)); 202 } 203 204 public String [][] getLanguageArray() { 205 return LANGUAGES; 206 } 207 208 public ArrayList getSessions() { 209 ArrayList list = new ArrayList (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 getType() { 222 return "Web"; 223 } 224 225 } 226 | Popular Tags |