提交 42e01bf9 authored 作者: Thomas Mueller's avatar Thomas Mueller

--no commit message

--no commit message
上级 a326829f
......@@ -958,9 +958,6 @@ public class Function extends Expression implements FunctionCall {
int nanos = d.getNanos() % 1000000;
calendar.setTime(d);
calendar.add(field, count);
// TODO gcj: required so that the millis are calculated?
calendar.get(Calendar.YEAR);
calendar.get(Calendar.HOUR_OF_DAY);
long t = calendar.getTime().getTime();
Timestamp ts = new Timestamp(t);
ts.setNanos(ts.getNanos() + nanos);
......
......@@ -133,8 +133,6 @@ public class SecureSocketFactory {
// See also: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4887561 (1.4.2 cannot read keystore written with 1.4.1)
// --- generated code start ---
// GCJ hack
//KeyStore store = KeyStore.getInstance("JKS");
KeyStore store = KeyStore.getInstance(KeyStore.getDefaultType());
store.load(null, password.toCharArray());
......
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.server.web;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Properties;
import org.h2.engine.Constants;
import org.h2.message.TraceSystem;
import org.h2.util.FileUtils;
import org.h2.util.JdbcUtils;
import org.h2.util.MathUtils;
public class AppServer {
private static final String[] GENERIC = new String[] {
"Generic Firebird Server|org.firebirdsql.jdbc.FBDriver|jdbc:firebirdsql:localhost:c:/temp/firebird/test|sysdba",
"Generic OneDollarDB|in.co.daffodil.db.jdbc.DaffodilDBDriver|jdbc:daffodilDB_embedded:school;path=C:/temp;create=true|sa",
"Generic DB2|COM.ibm.db2.jdbc.net.DB2Driver|jdbc:db2://<host>/<db>|" ,
"Generic Oracle|oracle.jdbc.driver.OracleDriver|jdbc:oracle:thin:@<host>:1521:<instance>|scott" ,
"Generic PostgreSQL|org.postgresql.Driver|jdbc:postgresql:<db>|" ,
"Generic MS SQL Server|com.microsoft.jdbc.sqlserver.SQLServerDriver|jdbc:Microsoft:sqlserver://localhost:1433;DatabaseName=sqlexpress|sa",
"Generic MS SQL Server 2005|com.microsoft.sqlserver.jdbc.SQLServerDriver|jdbc:sqlserver://localhost;DatabaseName=test|sa",
"Generic MySQL|com.mysql.jdbc.Driver|jdbc:mysql://<host>:<port>/<db>|" ,
"Generic Derby (Embedded)|org.apache.derby.jdbc.EmbeddedDriver|jdbc:derby:test;create=true|sa",
"Generic Derby (Server)|org.apache.derby.jdbc.ClientDriver|jdbc:derby://localhost:1527/test;create=true|sa",
"Generic HSQLDB|org.hsqldb.jdbcDriver|jdbc:hsqldb:test;hsqldb.default_table_type=cached|sa" ,
"Generic H2|org.h2.Driver|jdbc:h2:test|sa",
};
// private URLClassLoader urlClassLoader;
private String driverList;
private static int ticker;
private int port;
private boolean allowOthers;
private boolean ssl;
private HashMap connInfoMap = new HashMap();
AppServer(String[] args) {
Properties prop = loadProperties();
driverList = prop.getProperty("drivers");
port = FileUtils.getIntProperty(prop, "webPort", Constants.DEFAULT_HTTP_PORT);
ssl = FileUtils.getBooleanProperty(prop, "webSSL", Constants.DEFAULT_HTTP_SSL);
allowOthers = FileUtils.getBooleanProperty(prop, "webAllowOthers", Constants.DEFAULT_HTTP_ALLOW_OTHERS);
for(int i=0; args != null && i<args.length; i++) {
if("-webPort".equals(args[i])) {
port = MathUtils.decodeInt(args[++i]);
} else if("-webSSL".equals(args[i])) {
ssl = Boolean.valueOf(args[++i]).booleanValue();
} else if("-webAllowOthers".equals(args[i])) {
allowOthers = Boolean.valueOf(args[++i]).booleanValue();
// } else if("-baseDir".equals(args[i])) {
// String baseDir = args[++i];
}
}
// TODO gcj: don't load drivers in case of GCJ
// if(false) {
// if(driverList != null) {
// try {
// String[] drivers = StringUtils.arraySplit(driverList, ',', false);
// URL[] urls = new URL[drivers.length];
// for(int i=0; i<drivers.length; i++) {
// urls[i] = new URL(drivers[i]);
// }
// urlClassLoader = URLClassLoader.newInstance(urls);
// } catch (MalformedURLException e) {
// TraceSystem.traceThrowable(e);
// }
// }
// }
}
void setAllowOthers(boolean b) {
allowOthers = b;
}
void setSSL(boolean b) {
ssl = b;
}
void setPort(int port) {
this.port = port;
}
boolean getAllowOthers() {
return allowOthers;
}
boolean getSSL() {
return ssl;
}
int getPort() {
return port;
}
ConnectionInfo getSetting(String name) {
return (ConnectionInfo)connInfoMap.get(name);
}
void updateSetting(ConnectionInfo info) {
connInfoMap.put(info.name, info);
info.lastAccess = ticker++;
}
void removeSetting(String name) {
connInfoMap.remove(name);
}
private String getPropertiesFileName() {
// store the properties in the user directory
return FileUtils.getFileInUserHome(Constants.SERVER_PROPERTIES_FILE);
}
Properties loadProperties() {
String fileName = getPropertiesFileName();
try {
return FileUtils.loadProperties(fileName);
} catch(IOException e) {
// TODO log exception
return new Properties();
}
}
String[] getSettingNames() {
ArrayList list = getSettings();
String[] names = new String[list.size()];
for(int i=0; i<list.size(); i++) {
names[i] = ((ConnectionInfo)list.get(i)).name;
}
return names;
}
synchronized ArrayList getSettings() {
ArrayList settings = new ArrayList();
if(connInfoMap.size() == 0) {
Properties prop = loadProperties();
if(prop.size() == 0) {
for(int i=0; i<AppServer.GENERIC.length; i++) {
ConnectionInfo info = new ConnectionInfo(AppServer.GENERIC[i]);
settings.add(info);
updateSetting(info);
}
} else {
for(int i=0; ; i++) {
String data = prop.getProperty(String.valueOf(i));
if(data == null) {
break;
}
ConnectionInfo info = new ConnectionInfo(data);
settings.add(info);
updateSetting(info);
}
}
} else {
settings.addAll(connInfoMap.values());
}
sortConnectionInfo(settings);
return settings;
}
void sortConnectionInfo(ArrayList list) {
for (int i = 1, j; i < list.size(); i++) {
ConnectionInfo t = (ConnectionInfo) list.get(i);
for (j = i - 1; j >= 0 && (((ConnectionInfo)list.get(j)).lastAccess < t.lastAccess); j--) {
list.set(j + 1, list.get(j));
}
list.set(j + 1, t);
}
}
synchronized void saveSettings() {
try {
Properties prop = new Properties();
if(driverList != null) {
prop.setProperty("drivers", driverList);
}
prop.setProperty("webPort", String.valueOf(port));
prop.setProperty("webAllowOthers", String.valueOf(allowOthers));
prop.setProperty("webSSL", String.valueOf(ssl));
ArrayList settings = getSettings();
int len = settings.size();
for(int i=0; i<len; i++) {
ConnectionInfo info = (ConnectionInfo) settings.get(i);
if(info != null) {
prop.setProperty(String.valueOf(len - i - 1), info.getString());
}
}
OutputStream out = FileUtils.openFileOutputStream(getPropertiesFileName());
prop.store(out, Constants.SERVER_PROPERTIES_TITLE);
out.close();
} catch(Exception e) {
TraceSystem.traceThrowable(e);
}
}
// TODO GCJ: if this method is synchronized, then the .exe file fails (probably does not unlock the object)
// and cannot go in here after a class was not found
Connection getConnection(String driver, String url, String user, String password) throws Exception {
driver = driver.trim();
url = url.trim();
user = user.trim();
password = password.trim();
org.h2.Driver.load();
// try {
// Driver dr = (Driver) urlClassLoader.loadClass(driver).newInstance();
// Properties p = new Properties();
// p.setProperty("user", user);
// p.setProperty("password", password);
// return dr.connect(url, p);
// } catch(ClassNotFoundException e2) {
// throw e2;
// }
return JdbcUtils.getConnection(driver, url, user, password);
}
}
......@@ -6,8 +6,10 @@ package org.h2.server.web;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
......@@ -18,9 +20,13 @@ import java.util.Locale;
import java.util.Properties;
import java.util.TimeZone;
import org.h2.engine.Constants;
import org.h2.message.TraceSystem;
import org.h2.server.Service;
import org.h2.util.ByteUtils;
import org.h2.util.FileUtils;
import org.h2.util.JdbcUtils;
import org.h2.util.MathUtils;
import org.h2.util.NetUtils;
import org.h2.util.RandomUtils;
import org.h2.util.Resources;
......@@ -43,6 +49,29 @@ public class WebServer implements Service {
{ "pl", "Polski"},
};
private static final String[] GENERIC = new String[] {
"Generic Firebird Server|org.firebirdsql.jdbc.FBDriver|jdbc:firebirdsql:localhost:c:/temp/firebird/test|sysdba",
"Generic OneDollarDB|in.co.daffodil.db.jdbc.DaffodilDBDriver|jdbc:daffodilDB_embedded:school;path=C:/temp;create=true|sa",
"Generic DB2|COM.ibm.db2.jdbc.net.DB2Driver|jdbc:db2://<host>/<db>|" ,
"Generic Oracle|oracle.jdbc.driver.OracleDriver|jdbc:oracle:thin:@<host>:1521:<instance>|scott" ,
"Generic PostgreSQL|org.postgresql.Driver|jdbc:postgresql:<db>|" ,
"Generic MS SQL Server|com.microsoft.jdbc.sqlserver.SQLServerDriver|jdbc:Microsoft:sqlserver://localhost:1433;DatabaseName=sqlexpress|sa",
"Generic MS SQL Server 2005|com.microsoft.sqlserver.jdbc.SQLServerDriver|jdbc:sqlserver://localhost;DatabaseName=test|sa",
"Generic MySQL|com.mysql.jdbc.Driver|jdbc:mysql://<host>:<port>/<db>|" ,
"Generic Derby (Embedded)|org.apache.derby.jdbc.EmbeddedDriver|jdbc:derby:test;create=true|sa",
"Generic Derby (Server)|org.apache.derby.jdbc.ClientDriver|jdbc:derby://localhost:1527/test;create=true|sa",
"Generic HSQLDB|org.hsqldb.jdbcDriver|jdbc:hsqldb:test;hsqldb.default_table_type=cached|sa" ,
"Generic H2|org.h2.Driver|jdbc:h2:test|sa",
};
// private URLClassLoader urlClassLoader;
private String driverList;
private static int ticker;
private int port;
private boolean allowOthers;
private boolean ssl;
private HashMap connInfoMap = new HashMap();
/*
String lang = new java.util.Locale("hu").getDisplayLanguage(new java.util.Locale("hu"));
java.util.Locale.CHINESE.getDisplayLanguage(
......@@ -56,11 +85,9 @@ public class WebServer implements Service {
private HashMap sessions = new HashMap();
private HashSet languages = new HashSet();
private String startDateTime;
private AppServer appServer;
private ServerSocket serverSocket;
private boolean ssl;
private int port;
private String url;
private boolean allowShutdown;
byte[] getFile(String file) throws IOException {
trace("getFile <"+file+">");
......@@ -83,17 +110,13 @@ public class WebServer implements Service {
return ByteUtils.convertBytesToString(buff);
}
AppServer getAppServer() {
return appServer;
}
WebServerSession getSession(String sessionId) {
WebSession getSession(String sessionId) {
long now = System.currentTimeMillis();
if(lastTimeoutCheck + SESSION_TIMEOUT < now) {
Object[] list = sessions.keySet().toArray();
for(int i=0; i<list.length; i++) {
String id = (String) list[i];
WebServerSession session = (WebServerSession)sessions.get(id);
WebSession session = (WebSession)sessions.get(id);
Long last = (Long) session.get("lastAccess");
if(last != null && last.longValue() + SESSION_TIMEOUT < now) {
trace("timeout for " + id);
......@@ -102,19 +125,19 @@ public class WebServer implements Service {
}
lastTimeoutCheck = now;
}
WebServerSession session = (WebServerSession)sessions.get(sessionId);
WebSession session = (WebSession)sessions.get(sessionId);
if(session != null) {
session.lastAccess = System.currentTimeMillis();
}
return session;
}
WebServerSession createNewSession(String hostname) {
WebSession createNewSession(String hostname) {
String newId;
do {
newId = generateSessionId();
} while(sessions.get(newId) != null);
WebServerSession session = new AppSession(this);
WebSession session = new WebSession(this);
session.put("sessionId", newId);
//session.put("ip", socket.getInetAddress().getCanonicalHostName());
session.put("ip", hostname);
......@@ -131,7 +154,34 @@ public class WebServer implements Service {
public void init(String[] args) throws Exception {
// TODO web: support using a different properties file
appServer = new AppServer(args);
Properties prop = loadProperties();
driverList = prop.getProperty("drivers");
port = FileUtils.getIntProperty(prop, "webPort", Constants.DEFAULT_HTTP_PORT);
ssl = FileUtils.getBooleanProperty(prop, "webSSL", Constants.DEFAULT_HTTP_SSL);
allowOthers = FileUtils.getBooleanProperty(prop, "webAllowOthers", Constants.DEFAULT_HTTP_ALLOW_OTHERS);
for(int i=0; args != null && i<args.length; i++) {
if("-webPort".equals(args[i])) {
port = MathUtils.decodeInt(args[++i]);
} else if("-webSSL".equals(args[i])) {
ssl = Boolean.valueOf(args[++i]).booleanValue();
} else if("-webAllowOthers".equals(args[i])) {
allowOthers = Boolean.valueOf(args[++i]).booleanValue();
// } else if("-baseDir".equals(args[i])) {
// String baseDir = args[++i];
}
}
// if(driverList != null) {
// try {
// String[] drivers = StringUtils.arraySplit(driverList, ',', false);
// URL[] urls = new URL[drivers.length];
// for(int i=0; i<drivers.length; i++) {
// urls[i] = new URL(drivers[i]);
// }
// urlClassLoader = URLClassLoader.newInstance(urls);
// } catch (MalformedURLException e) {
// TraceSystem.traceThrowable(e);
// }
// }
SimpleDateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", new Locale("en", ""));
synchronized(format) {
format.setTimeZone(TimeZone.getTimeZone("GMT"));
......@@ -140,10 +190,7 @@ public class WebServer implements Service {
trace(startDateTime);
for(int i=0; i<LANGUAGES.length; i++) {
languages.add(LANGUAGES[i][0]);
}
port = appServer.getPort();
ssl = appServer.getSSL();
url = (ssl?"https":"http") + "://localhost:"+port;
} url = (ssl?"https":"http") + "://localhost:"+port;
}
public String getURL() {
......@@ -158,7 +205,7 @@ public class WebServer implements Service {
try {
while (serverSocket != null) {
Socket s = serverSocket.accept();
WebServerThread c = new AppThread(s, this, true);
WebThread c = new WebThread(s, this);
c.start();
}
} catch (Exception e) {
......@@ -196,7 +243,7 @@ public class WebServer implements Service {
return languages.contains(language);
}
public void readTranslations(WebServerSession session, String language) {
public void readTranslations(WebSession session, String language) {
Properties text = new Properties();
try {
trace("translation: "+language);
......@@ -216,18 +263,164 @@ public class WebServer implements Service {
public ArrayList getSessions() {
ArrayList list = new ArrayList(sessions.values());
for(int i=0; i<list.size(); i++) {
WebServerSession s = (WebServerSession) list.get(i);
WebSession s = (WebSession) list.get(i);
list.set(i, s.getInfo());
}
return list;
}
public String getType() {
return "Web";
}
void setAllowOthers(boolean b) {
allowOthers = b;
}
public boolean getAllowOthers() {
return appServer.getAllowOthers();
return allowOthers;
}
public String getType() {
return "Web";
void setSSL(boolean b) {
ssl = b;
}
void setPort(int port) {
this.port = port;
}
boolean getSSL() {
return ssl;
}
int getPort() {
return port;
}
ConnectionInfo getSetting(String name) {
return (ConnectionInfo)connInfoMap.get(name);
}
void updateSetting(ConnectionInfo info) {
connInfoMap.put(info.name, info);
info.lastAccess = ticker++;
}
void removeSetting(String name) {
connInfoMap.remove(name);
}
private String getPropertiesFileName() {
// store the properties in the user directory
return FileUtils.getFileInUserHome(Constants.SERVER_PROPERTIES_FILE);
}
Properties loadProperties() {
String fileName = getPropertiesFileName();
try {
return FileUtils.loadProperties(fileName);
} catch(IOException e) {
// TODO log exception
return new Properties();
}
}
String[] getSettingNames() {
ArrayList list = getSettings();
String[] names = new String[list.size()];
for(int i=0; i<list.size(); i++) {
names[i] = ((ConnectionInfo)list.get(i)).name;
}
return names;
}
synchronized ArrayList getSettings() {
ArrayList settings = new ArrayList();
if(connInfoMap.size() == 0) {
Properties prop = loadProperties();
if(prop.size() == 0) {
for(int i=0; i<GENERIC.length; i++) {
ConnectionInfo info = new ConnectionInfo(GENERIC[i]);
settings.add(info);
updateSetting(info);
}
} else {
for(int i=0; ; i++) {
String data = prop.getProperty(String.valueOf(i));
if(data == null) {
break;
}
ConnectionInfo info = new ConnectionInfo(data);
settings.add(info);
updateSetting(info);
}
}
} else {
settings.addAll(connInfoMap.values());
}
sortConnectionInfo(settings);
return settings;
}
void sortConnectionInfo(ArrayList list) {
for (int i = 1, j; i < list.size(); i++) {
ConnectionInfo t = (ConnectionInfo) list.get(i);
for (j = i - 1; j >= 0 && (((ConnectionInfo)list.get(j)).lastAccess < t.lastAccess); j--) {
list.set(j + 1, list.get(j));
}
list.set(j + 1, t);
}
}
synchronized void saveSettings() {
try {
Properties prop = new Properties();
if(driverList != null) {
prop.setProperty("drivers", driverList);
}
prop.setProperty("webPort", String.valueOf(port));
prop.setProperty("webAllowOthers", String.valueOf(allowOthers));
prop.setProperty("webSSL", String.valueOf(ssl));
ArrayList settings = getSettings();
int len = settings.size();
for(int i=0; i<len; i++) {
ConnectionInfo info = (ConnectionInfo) settings.get(i);
if(info != null) {
prop.setProperty(String.valueOf(len - i - 1), info.getString());
}
}
OutputStream out = FileUtils.openFileOutputStream(getPropertiesFileName());
prop.store(out, Constants.SERVER_PROPERTIES_TITLE);
out.close();
} catch(Exception e) {
TraceSystem.traceThrowable(e);
}
}
Connection getConnection(String driver, String url, String user, String password) throws Exception {
driver = driver.trim();
url = url.trim();
user = user.trim();
password = password.trim();
org.h2.Driver.load();
// try {
// Driver dr = (Driver) urlClassLoader.loadClass(driver).newInstance();
// Properties p = new Properties();
// p.setProperty("user", user);
// p.setProperty("password", password);
// return dr.connect(url, p);
// } catch(ClassNotFoundException e2) {
// throw e2;
// }
return JdbcUtils.getConnection(driver, url, user, password);
}
public void setAllowShutdown(boolean b) {
this.allowShutdown = b;
}
boolean getAllowShutdown() {
return allowShutdown;
}
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.server.web;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Locale;
public class WebServerSession {
long lastAccess;
HashMap map = new HashMap();
Locale locale;
WebServer server;
WebServerSession(WebServer server) {
this.server = server;
}
public void put(String key, Object value) {
map.put(key, value);
}
public Object get(String key) {
if("sessions".equals(key)) {
return server.getSessions();
}
return map.get(key);
}
public void remove(String key) {
map.remove(key);
}
public HashMap getInfo() {
HashMap m = new HashMap();
m.putAll(map);
m.put("lastAccess", new Timestamp(lastAccess).toString());
return m;
}
}
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.server.web;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Locale;
import java.util.Properties;
import java.util.StringTokenizer;
import org.h2.message.TraceSystem;
import org.h2.util.StringUtils;
abstract class WebServerThread extends Thread {
protected WebServer server;
protected WebServerSession session;
protected Properties attributes;
protected Socket socket;
private InputStream input;
private String ifModifiedSince;
WebServerThread(Socket socket, WebServer server) {
this.server = server;
this.socket = socket;
}
void setSession(WebServerSession session, Properties attributes) {
int todoRefactor;
this.session = session;
this.attributes = attributes;
}
abstract String process(String file);
protected String getComboBox(String[] elements, String selected) {
StringBuffer buff = new StringBuffer();
for(int i=0; i<elements.length; i++) {
String value = elements[i];
buff.append("<option value=\"");
buff.append(PageParser.escapeHtml(value));
buff.append("\"");
if(value.equals(selected)) {
buff.append(" selected");
}
buff.append(">");
buff.append(PageParser.escapeHtml(value));
buff.append("</option>");
}
return buff.toString();
}
protected String getComboBox(String[][] elements, String selected) {
StringBuffer buff = new StringBuffer();
for(int i=0; i<elements.length; i++) {
String[] n = elements[i];
buff.append("<option value=\"");
buff.append(PageParser.escapeHtml(n[0]));
buff.append("\"");
if(n[0].equals(selected)) {
buff.append(" selected");
}
buff.append(">");
buff.append(PageParser.escapeHtml(n[1]));
buff.append("</option>");
}
return buff.toString();
}
public void run() {
try {
input = socket.getInputStream();
String head = readHeaderLine();
if(head.startsWith("GET ") || head.startsWith("POST ")) {
int begin = head.indexOf('/'), end = head.lastIndexOf(' ');
String file = head.substring(begin+1, end).trim();
if(file.length() == 0) {
file = "index.do";
}
if(!allow()) {
file = "notAllowed.jsp";
}
server.trace(head + " :" + file);
attributes = new Properties();
int paramIndex = file.indexOf("?");
session = null;
if(paramIndex >= 0) {
String attrib = file.substring(paramIndex+1);
parseAttributes(attrib);
String sessionId = attributes.getProperty("jsessionid");
file = file.substring(0, paramIndex);
session = server.getSession(sessionId);
}
// TODO web: support errors
String mimeType;
boolean cache;
int index = file.lastIndexOf('.');
String suffix;
if(index >= 0) {
suffix = file.substring(index+1);
} else {
suffix = "";
}
if(suffix.equals("ico")) {
mimeType = "image/x-icon";
cache=true;
} else if(suffix.equals("gif")) {
mimeType = "image/gif";
cache=true;
} else if(suffix.equals("css")) {
cache=true;
mimeType = "text/css";
} else if(suffix.equals("html") || suffix.equals("do") || suffix.equals("jsp")) {
cache=false;
mimeType = "text/html";
if (session == null) {
String hostname = socket.getInetAddress().getHostName();
session = server.createNewSession(hostname);
if (!file.equals("notAllowed.jsp")) {
file = "index.do";
}
}
} else if(suffix.equals("js")) {
cache=true;
mimeType = "text/javascript";
} else {
cache = false;
mimeType = "text/html";
file = "error.jsp";
server.trace("unknown mime type, file "+file);
}
server.trace("mimeType="+mimeType);
parseHeader();
server.trace(file);
if(file.endsWith(".do")) {
file = process(file);
}
String message;
byte[] bytes;
if(cache && ifModifiedSince!=null && ifModifiedSince.equals(server.getStartDateTime())) {
bytes = null;
message = "HTTP/1.1 304 Not Modified\n";
} else {
bytes = server.getFile(file);
if(bytes == null) {
message = "HTTP/1.0 404 Not Found\n";
bytes = StringUtils.utf8Encode("File not found: "+file);
} else {
if(session != null && file.endsWith(".jsp")) {
bytes = StringUtils.utf8Encode(fill(StringUtils.utf8Decode(bytes)));
}
message = "HTTP/1.1 200 OK\n";
message += "Content-Type: "+mimeType+"\n";
if(!cache) {
message += "Cache-Control: no-cache\n";
} else {
message += "Cache-Control: max-age=10\n";
message += "Last-Modified: "+server.getStartDateTime()+"\n";
}
}
}
message += "\n";
server.trace(message);
DataOutputStream output;
output = new DataOutputStream(
new BufferedOutputStream(socket.getOutputStream()));
output.write(message.getBytes());
if(bytes!=null) {
output.write(bytes);
}
output.flush();
output.close();
output.close();
socket.close();
return;
}
} catch (Exception e) {
TraceSystem.traceThrowable(e);
}
}
abstract boolean allow();
private String readHeaderLine() throws IOException {
StringBuffer buff=new StringBuffer();
while (true) {
int i = input.read();
if (i == -1) {
throw new IOException("Unexpected EOF");
} else if (i == '\r' && input.read()=='\n') {
return buff.length() > 0 ? buff.toString() : null;
} else {
buff.append((char)i);
}
}
}
private void parseAttributes(String s) throws Exception {
server.trace("data="+s);
while(s != null) {
int idx = s.indexOf('=');
if(idx>=0) {
String property = s.substring(0, idx);
s = s.substring(idx+1);
idx = s.indexOf('&');
String value;
if(idx >= 0) {
value = s.substring(0, idx);
s = s.substring(idx+1);
} else {
value = s;
}
// TODO compatibility problem with JDK 1.3
//String attr = URLDecoder.decode(value, "UTF-8");
// String attr = URLDecoder.decode(value);
String attr = StringUtils.urlDecode(value);
attributes.put(property, attr);
} else {
break;
}
}
server.trace(attributes.toString());
}
private void parseHeader() throws Exception {
server.trace("parseHeader");
int len = 0;
ifModifiedSince = null;
while(true) {
String line = readHeaderLine();
if(line == null) {
break;
}
server.trace(" "+line);
String lower = StringUtils.toLowerEnglish(line);
if(lower.startsWith("if-modified-since")) {
ifModifiedSince = line.substring(line.indexOf(':')+1).trim();
} else if(lower.startsWith("content-length")) {
len = Integer.parseInt(line.substring(line.indexOf(':')+1).trim());
server.trace("len="+len);
} else if(lower.startsWith("accept-language")) {
if(session != null) {
Locale locale = session.locale;
if(locale == null) {
String languages = line.substring(line.indexOf(':')+1).trim();
StringTokenizer tokenizer = new StringTokenizer(languages, ",;");
while(tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if(!token.startsWith("q=")) {
if(server.supportsLanguage(token)) {
int dash = token.indexOf('-');
if(dash >= 0) {
String language = token.substring(0, dash);
String country = token.substring(dash+1);
locale = new Locale(language, country);
} else {
locale = new Locale(token, "");
}
session.locale = locale;
String language = locale.getLanguage();
session.put("language", language);
server.readTranslations(session, language);
break;
}
}
}
}
}
} else if(line.trim().length()==0) {
break;
}
}
if(session != null && len > 0) {
byte[] bytes = new byte[len];
for (int pos = 0; pos < len;) {
pos += input.read(bytes, pos, len - pos);
}
String s = new String(bytes);
parseAttributes(s);
}
}
private String fill(String page) {
return PageParser.parse(server, page, session.map);
}
}
......@@ -9,13 +9,20 @@ import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import org.h2.bnf.Bnf;
import org.h2.message.TraceSystem;
public class AppSession extends WebServerSession {
public class WebSession {
long lastAccess;
HashMap map = new HashMap();
Locale locale;
WebServer server;
private static final int MAX_HISTORY = 1000;
private ArrayList commandHistory = new ArrayList();
......@@ -31,8 +38,23 @@ public class AppSession extends WebServerSession {
Statement executingStatement;
ResultSet result;
AppSession(WebServer server) {
super(server);
WebSession(WebServer server) {
this.server = server;
}
public void put(String key, Object value) {
map.put(key, value);
}
public Object get(String key) {
if("sessions".equals(key)) {
return server.getSessions();
}
return map.get(key);
}
public void remove(String key) {
map.remove(key);
}
public Bnf getBnf() {
......@@ -98,8 +120,16 @@ public class AppSession extends WebServerSession {
return commandHistory;
}
public HashMap getMainInfo() {
int todoRefactorMergeWithGetInfo;
HashMap m = new HashMap();
m.putAll(map);
m.put("lastAccess", new Timestamp(lastAccess).toString());
return m;
}
public HashMap getInfo() {
HashMap m = super.getInfo();
HashMap m = getMainInfo();
try {
m.put("url", conn == null ? "not connected" : conn.getMetaData().getURL());
m.put("user", conn == null ? "-" : conn.getMetaData().getUserName());
......
......@@ -4,6 +4,10 @@
*/
package org.h2.server.web;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.StringWriter;
......@@ -22,10 +26,13 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.Random;
import java.util.StringTokenizer;
import java.util.Map.Entry;
import org.h2.bnf.Bnf;
import org.h2.message.TraceSystem;
import org.h2.tools.SimpleResultSet;
import org.h2.util.JdbcUtils;
import org.h2.util.MathUtils;
......@@ -35,24 +42,276 @@ import org.h2.util.ObjectArray;
import org.h2.util.ScriptReader;
import org.h2.util.StringUtils;
/**
* @author Thomas
*/
class WebThread extends Thread {
protected WebServer server;
protected WebSession session;
protected Properties attributes;
protected Socket socket;
public class AppThread extends WebServerThread {
private InputStream input;
private String ifModifiedSince;
// TODO web: support online data editing like http://numsum.com/
private boolean allowShutdown;
AppThread(Socket socket, WebServer server, boolean allowShutdown) {
super(socket, server);
WebThread(Socket socket, WebServer server) {
this.server = server;
this.socket = socket;
setName("H2 Console thread");
this.allowShutdown = allowShutdown;
}
AppSession getAppSession() {
return (AppSession)session;
void setSession(WebSession session, Properties attributes) {
int todoRefactor;
this.session = session;
this.attributes = attributes;
}
protected String getComboBox(String[] elements, String selected) {
StringBuffer buff = new StringBuffer();
for(int i=0; i<elements.length; i++) {
String value = elements[i];
buff.append("<option value=\"");
buff.append(PageParser.escapeHtml(value));
buff.append("\"");
if(value.equals(selected)) {
buff.append(" selected");
}
buff.append(">");
buff.append(PageParser.escapeHtml(value));
buff.append("</option>");
}
return buff.toString();
}
protected String getComboBox(String[][] elements, String selected) {
StringBuffer buff = new StringBuffer();
for(int i=0; i<elements.length; i++) {
String[] n = elements[i];
buff.append("<option value=\"");
buff.append(PageParser.escapeHtml(n[0]));
buff.append("\"");
if(n[0].equals(selected)) {
buff.append(" selected");
}
buff.append(">");
buff.append(PageParser.escapeHtml(n[1]));
buff.append("</option>");
}
return buff.toString();
}
public void run() {
try {
input = socket.getInputStream();
String head = readHeaderLine();
if(head.startsWith("GET ") || head.startsWith("POST ")) {
int begin = head.indexOf('/'), end = head.lastIndexOf(' ');
String file = head.substring(begin+1, end).trim();
if(file.length() == 0) {
file = "index.do";
}
if(!allow()) {
file = "notAllowed.jsp";
}
server.trace(head + " :" + file);
attributes = new Properties();
int paramIndex = file.indexOf("?");
session = null;
if(paramIndex >= 0) {
String attrib = file.substring(paramIndex+1);
parseAttributes(attrib);
String sessionId = attributes.getProperty("jsessionid");
file = file.substring(0, paramIndex);
session = server.getSession(sessionId);
}
// TODO web: support errors
String mimeType;
boolean cache;
int index = file.lastIndexOf('.');
String suffix;
if(index >= 0) {
suffix = file.substring(index+1);
} else {
suffix = "";
}
if(suffix.equals("ico")) {
mimeType = "image/x-icon";
cache=true;
} else if(suffix.equals("gif")) {
mimeType = "image/gif";
cache=true;
} else if(suffix.equals("css")) {
cache=true;
mimeType = "text/css";
} else if(suffix.equals("html") || suffix.equals("do") || suffix.equals("jsp")) {
cache=false;
mimeType = "text/html";
if (session == null) {
String hostname = socket.getInetAddress().getHostName();
session = server.createNewSession(hostname);
if (!file.equals("notAllowed.jsp")) {
file = "index.do";
}
}
} else if(suffix.equals("js")) {
cache=true;
mimeType = "text/javascript";
} else {
cache = false;
mimeType = "text/html";
file = "error.jsp";
server.trace("unknown mime type, file "+file);
}
server.trace("mimeType="+mimeType);
parseHeader();
server.trace(file);
if(file.endsWith(".do")) {
file = process(file);
}
String message;
byte[] bytes;
if(cache && ifModifiedSince!=null && ifModifiedSince.equals(server.getStartDateTime())) {
bytes = null;
message = "HTTP/1.1 304 Not Modified\n";
} else {
bytes = server.getFile(file);
if(bytes == null) {
message = "HTTP/1.0 404 Not Found\n";
bytes = StringUtils.utf8Encode("File not found: "+file);
} else {
if(session != null && file.endsWith(".jsp")) {
bytes = StringUtils.utf8Encode(fill(StringUtils.utf8Decode(bytes)));
}
message = "HTTP/1.1 200 OK\n";
message += "Content-Type: "+mimeType+"\n";
if(!cache) {
message += "Cache-Control: no-cache\n";
} else {
message += "Cache-Control: max-age=10\n";
message += "Last-Modified: "+server.getStartDateTime()+"\n";
}
}
}
message += "\n";
server.trace(message);
DataOutputStream output;
output = new DataOutputStream(
new BufferedOutputStream(socket.getOutputStream()));
output.write(message.getBytes());
if(bytes!=null) {
output.write(bytes);
}
output.flush();
output.close();
output.close();
socket.close();
return;
}
} catch (Exception e) {
TraceSystem.traceThrowable(e);
}
}
private String readHeaderLine() throws IOException {
StringBuffer buff=new StringBuffer();
while (true) {
int i = input.read();
if (i == -1) {
throw new IOException("Unexpected EOF");
} else if (i == '\r' && input.read()=='\n') {
return buff.length() > 0 ? buff.toString() : null;
} else {
buff.append((char)i);
}
}
}
private void parseAttributes(String s) throws Exception {
server.trace("data="+s);
while(s != null) {
int idx = s.indexOf('=');
if(idx>=0) {
String property = s.substring(0, idx);
s = s.substring(idx+1);
idx = s.indexOf('&');
String value;
if(idx >= 0) {
value = s.substring(0, idx);
s = s.substring(idx+1);
} else {
value = s;
}
// TODO compatibility problem with JDK 1.3
//String attr = URLDecoder.decode(value, "UTF-8");
// String attr = URLDecoder.decode(value);
String attr = StringUtils.urlDecode(value);
attributes.put(property, attr);
} else {
break;
}
}
server.trace(attributes.toString());
}
private void parseHeader() throws Exception {
server.trace("parseHeader");
int len = 0;
ifModifiedSince = null;
while(true) {
String line = readHeaderLine();
if(line == null) {
break;
}
server.trace(" "+line);
String lower = StringUtils.toLowerEnglish(line);
if(lower.startsWith("if-modified-since")) {
ifModifiedSince = line.substring(line.indexOf(':')+1).trim();
} else if(lower.startsWith("content-length")) {
len = Integer.parseInt(line.substring(line.indexOf(':')+1).trim());
server.trace("len="+len);
} else if(lower.startsWith("accept-language")) {
if(session != null) {
Locale locale = session.locale;
if(locale == null) {
String languages = line.substring(line.indexOf(':')+1).trim();
StringTokenizer tokenizer = new StringTokenizer(languages, ",;");
while(tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if(!token.startsWith("q=")) {
if(server.supportsLanguage(token)) {
int dash = token.indexOf('-');
if(dash >= 0) {
String language = token.substring(0, dash);
String country = token.substring(dash+1);
locale = new Locale(language, country);
} else {
locale = new Locale(token, "");
}
session.locale = locale;
String language = locale.getLanguage();
session.put("language", language);
server.readTranslations(session, language);
break;
}
}
}
}
}
} else if(line.trim().length()==0) {
break;
}
}
if(session != null && len > 0) {
byte[] bytes = new byte[len];
for (int pos = 0; pos < len;) {
pos += input.read(bytes, pos, len - pos);
}
String s = new String(bytes);
parseAttributes(s);
}
}
private String fill(String page) {
return PageParser.parse(server, page, session.map);
}
String process(String file) {
......@@ -130,7 +389,7 @@ public class AppThread extends WebServerThread {
if(sql.trim().length()>0 && Character.isLowerCase(sql.trim().charAt(0))) {
lowercase = true;
}
Bnf bnf = getAppSession().getBnf();
Bnf bnf = session.getBnf();
if(bnf == null) {
return "autoCompleteList.jsp";
}
......@@ -184,21 +443,19 @@ public class AppThread extends WebServerThread {
}
private String admin() {
AppServer app = server.getAppServer();
session.put("port", ""+app.getPort());
session.put("allowOthers", ""+app.getAllowOthers());
session.put("ssl", String.valueOf(app.getSSL()));
session.put("port", ""+server.getPort());
session.put("allowOthers", ""+server.getAllowOthers());
session.put("ssl", String.valueOf(server.getSSL()));
session.put("sessions", server.getSessions());
return "admin.jsp";
}
private String adminSave() {
AppServer app = server.getAppServer();
try {
app.setPort(MathUtils.decodeInt((String)attributes.get("port")));
app.setAllowOthers(Boolean.valueOf((String)attributes.get("allowOthers")).booleanValue());
app.setSSL(Boolean.valueOf((String)attributes.get("ssl")).booleanValue());
app.saveSettings();
server.setPort(MathUtils.decodeInt((String)attributes.get("port")));
server.setAllowOthers(Boolean.valueOf((String)attributes.get("allowOthers")).booleanValue());
server.setSSL(Boolean.valueOf((String)attributes.get("ssl")).booleanValue());
server.saveSettings();
} catch(Exception e) {
server.trace(e.toString());
}
......@@ -206,7 +463,7 @@ public class AppThread extends WebServerThread {
}
private String adminShutdown() {
if(allowShutdown) {
if(server.getAllowShutdown()) {
System.exit(0);
}
return "admin.jsp";
......@@ -227,14 +484,14 @@ public class AppThread extends WebServerThread {
language = (String) session.get("language");
}
session.put("languageCombo", getComboBox(languageArray, language));
String[] settingNames = server.getAppServer().getSettingNames();
String[] settingNames = server.getSettingNames();
String setting = attributes.getProperty("setting");
if(setting == null && settingNames.length>0) {
setting = settingNames[0];
}
String combobox = getComboBox(settingNames, setting);
session.put("settingsList", combobox);
ConnectionInfo info = server.getAppServer().getSetting(setting);
ConnectionInfo info = server.getSetting(setting);
if(info == null) {
info = new ConnectionInfo();
}
......@@ -248,7 +505,7 @@ public class AppThread extends WebServerThread {
private String getHistory() {
int id = Integer.parseInt(attributes.getProperty("id"));
String sql = getAppSession().getCommand(id);
String sql = session.getCommand(id);
session.put("query", PageParser.escapeHtmlNoBreak(sql));
return "query.jsp";
}
......@@ -330,9 +587,8 @@ public class AppThread extends WebServerThread {
if(schema == null) {
return treeIndex;
}
AppSession app = getAppSession();
Connection conn = getAppSession().getConnection();
DatabaseMetaData meta = app.getMetaData();
Connection conn = session.getConnection();
DatabaseMetaData meta = session.getMetaData();
int level = mainSchema ? 0 : 1;
String indentation = ", "+level+", "+(level+1)+", ";
String indentNode = ", "+(level+1)+", "+(level+1)+", ";
......@@ -404,13 +660,12 @@ public class AppThread extends WebServerThread {
}
private String tables() {
AppSession app = getAppSession();
DbContents contents = app.getContents();
DbContents contents = session.getContents();
try {
contents.readContents(app.getMetaData());
app.loadBnf();
Connection conn = app.getConnection();
DatabaseMetaData meta = app.getMetaData();
contents.readContents(session.getMetaData());
session.loadBnf();
Connection conn = session.getConnection();
DatabaseMetaData meta = session.getMetaData();
boolean isH2 = contents.isH2;
StringBuffer buff = new StringBuffer();
......@@ -512,7 +767,7 @@ public class AppThread extends WebServerThread {
session.put("url", url);
session.put("user", user);
try {
Connection conn = server.getAppServer().getConnection(driver, url, user, password);
Connection conn = server.getConnection(driver, url, user, password);
JdbcUtils.closeSilently(conn);
session.put("error", "${text.login.testSuccessful}");
return "index.jsp";
......@@ -536,9 +791,8 @@ public class AppThread extends WebServerThread {
String user = attributes.getProperty("user", "");
String password = attributes.getProperty("password", "");
try {
Connection conn = server.getAppServer().getConnection(driver, url, user, password);
AppSession appSession = getAppSession();
appSession.setConnection(conn);
Connection conn = server.getConnection(driver, url, user, password);
session.setConnection(conn);
session.put("url", url);
session.put("user", user);
session.put("autoCommit", "checked");
......@@ -555,8 +809,8 @@ public class AppThread extends WebServerThread {
private String logout() {
try {
Connection conn = getAppSession().getConnection();
getAppSession().setConnection(null);
Connection conn = session.getConnection();
session.setConnection(null);
session.remove("conn");
session.remove("result");
session.remove("tables");
......@@ -573,7 +827,7 @@ public class AppThread extends WebServerThread {
private String query() {
String sql = attributes.getProperty("sql").trim();
try {
Connection conn = getAppSession().getConnection();
Connection conn = session.getConnection();
String result;
if(sql.equals("@AUTOCOMMIT TRUE")) {
conn.setAutoCommit(true);
......@@ -626,7 +880,7 @@ public class AppThread extends WebServerThread {
}
private String editResult() {
ResultSet rs = getAppSession().result;
ResultSet rs = session.result;
int row = Integer.parseInt(attributes.getProperty("row"));
int op = Integer.parseInt(attributes.getProperty("op"));
String result = "", error="";
......@@ -658,7 +912,7 @@ public class AppThread extends WebServerThread {
error = formatAsError(e.getMessage());
}
String sql = "@EDIT " + (String) session.get("resultSetSQL");
Connection conn = getAppSession().getConnection();
Connection conn = session.getConnection();
result = error + getResult(conn, -1, sql, true) + result;
session.put("result", result);
return "result.jsp";
......@@ -904,7 +1158,7 @@ public class AppThread extends WebServerThread {
boolean generatedKeys = false;
boolean edit = false;
if(sql.equals("@CANCEL")) {
stat = getAppSession().executingStatement;
stat = session.executingStatement;
if(stat != null) {
stat.cancel();
buff.append("${text.result.statementWasCancelled}");
......@@ -942,9 +1196,9 @@ public class AppThread extends WebServerThread {
} else {
int maxrows = getMaxrows();
stat.setMaxRows(maxrows);
getAppSession().executingStatement = stat;
session.executingStatement = stat;
boolean isResultSet = stat.execute(sql);
getAppSession().addCommand(sql);
session.addCommand(sql);
if(generatedKeys) {
rs = null;
//#ifdef JDK14
......@@ -977,7 +1231,7 @@ public class AppThread extends WebServerThread {
} catch(Exception e) {
return getStackTrace(id, e);
} finally {
getAppSession().executingStatement = null;
session.executingStatement = null;
}
}
......@@ -1038,7 +1292,7 @@ public class AppThread extends WebServerThread {
prep.setInt(j + 1, i);
}
}
if(getAppSession().getContents().isSQLite) {
if(session.getContents().isSQLite) {
// SQLite currently throws an exception on prep.execute()
prep.executeUpdate();
} else {
......@@ -1075,7 +1329,7 @@ public class AppThread extends WebServerThread {
private String getHistoryString() {
StringBuffer buff = new StringBuffer();
ArrayList history = getAppSession().getCommands();
ArrayList history = session.getCommands();
buff.append("<table cellspacing=0 cellpadding=0>");
buff.append("<tr><th></th><th>Command</th></tr>");
for(int i=history.size()-1; i>=0; i--) {
......@@ -1178,11 +1432,11 @@ public class AppThread extends WebServerThread {
}
boolean isUpdatable = rs.getConcurrency() == ResultSet.CONCUR_UPDATABLE;
if(edit) {
ResultSet old = getAppSession().result;
ResultSet old = session.result;
if(old != null) {
old.close();
}
getAppSession().result = rs;
session.result = rs;
} else {
rs.close();
}
......@@ -1228,25 +1482,25 @@ public class AppThread extends WebServerThread {
info.driver = attributes.getProperty("driver", "");
info.url = attributes.getProperty("url", "");
info.user = attributes.getProperty("user", "");
server.getAppServer().updateSetting(info);
server.updateSetting(info);
attributes.put("setting", info.name);
server.getAppServer().saveSettings();
server.saveSettings();
return "index.do";
}
private String settingRemove() {
String setting = attributes.getProperty("name", "");
server.getAppServer().removeSetting(setting);
ArrayList settings = server.getAppServer().getSettings();
server.removeSetting(setting);
ArrayList settings = server.getSettings();
if(settings.size() > 0) {
attributes.put("setting", settings.get(0));
}
server.getAppServer().saveSettings();
server.saveSettings();
return "index.do";
}
boolean allow() {
if(server.getAppServer().getAllowOthers()) {
if(server.getAllowOthers()) {
return true;
}
return NetUtils.isLoopbackAddress(socket);
......
......@@ -33,8 +33,6 @@ public class DateTimeUtils {
public static Time cloneAndNormalizeTime(Time value) {
Calendar cal = Calendar.getInstance();
cal.setTime(value);
// TODO gcj: required so that the millis are calculated?
cal.get(Calendar.HOUR_OF_DAY);
cal.set(1970, 0, 1);
return new Time(cal.getTime().getTime());
}
......@@ -42,8 +40,6 @@ public class DateTimeUtils {
public static Date cloneAndNormalizeDate(Date value) {
Calendar cal = Calendar.getInstance();
cal.setTime(value);
// TODO gcj: required so that the millis are calculated?
cal.get(Calendar.YEAR);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
......
......@@ -33,8 +33,6 @@ public class FileUtils {
// TODO detection of 'case in sensitive filesystem' could maybe implemented using some other means
private static final boolean isCaseInsensitiveFileSystem = (File.separatorChar == '\\');
// TODO gcj: use our own UTF-8 encoder
public static RandomAccessFile openRandomAccessFile(String fileName, String mode) throws IOException {
fileName = translateFileName(fileName);
try {
......@@ -222,10 +220,7 @@ public class FileUtils {
wait(i);
}
}
// TODO GCJ: it seems gcj throws 'CreateFile failed' if the file already exists?!
return false;
// TODO is this message used elsewhere?
// throw Message.getSQLException(Message.FILE_CREATION_FAILED_1, fileName);
}
public static void delete(String fileName) throws SQLException {
......
......@@ -23,21 +23,6 @@ import org.h2.message.Message;
public class StringUtils {
// TODO hack for gcj
//#GCJHACK private static final Class[] gcjClasses = {
//#GCJHACK gnu.gcj.convert.Input_ASCII.class,
//#GCJHACK gnu.gcj.convert.Input_UTF8.class,
//#GCJHACK gnu.gcj.convert.Input_8859_1.class,
//#GCJHACK gnu.gcj.convert.Output_ASCII.class,
//#GCJHACK gnu.gcj.convert.Output_UTF8.class,
//#GCJHACK gnu.gcj.convert.UnicodeToBytes.class,
//#GCJHACK gnu.gcj.convert.BytesToUnicode.class,
//#GCJHACK gnu.java.locale.Calendar.class,
//#GCJHACK gnu.java.locale.LocaleInformation.class,
//#GCJHACK gnu.java.locale.LocaleInformation_de.class,
//#GCJHACK java.util.GregorianCalendar.class,
//#GCJHACK };
public static boolean equals(String a, String b) {
if(a==null) {
return b==null;
......
......@@ -558,7 +558,7 @@ public class DataType {
} else if(Timestamp.class.isAssignableFrom(x)) {
return Value.TIMESTAMP;
} else if(java.util.Date.class.isAssignableFrom(x)) {
return Value.DATE;
return Value.TIMESTAMP;
} else if(java.io.Reader.class.isAssignableFrom(x)) {
return Value.CLOB;
} else if(java.sql.Clob.class.isAssignableFrom(x)) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论