提交 74e99362 authored 作者: Thomas Mueller's avatar Thomas Mueller

Remove duplicate code.

上级 e31a44a4
......@@ -24,11 +24,11 @@ import org.h2.jaqu.DbUpgrader.DefaultDbUpgrader;
import org.h2.jaqu.SQLDialect.DefaultSQLDialect;
import org.h2.jaqu.Table.JQDatabase;
import org.h2.jaqu.Table.JQTable;
import org.h2.jaqu.util.JdbcUtils;
import org.h2.jaqu.util.StringUtils;
import org.h2.jaqu.util.Utils;
import org.h2.jaqu.util.WeakIdentityHashMap;
//## Java 1.5 end ##
import org.h2.util.JdbcUtils;
import org.h2.util.New;
import org.h2.util.StringUtils;
/**
* This class represents a connection to a database.
......@@ -46,8 +46,7 @@ public class Db {
Collections.synchronizedMap(new WeakIdentityHashMap<Object, Token>());
private final Connection conn;
private final Map<Class<?>, TableDefinition<?>> classMap =
Utils.newHashMap();
private final Map<Class<?>, TableDefinition<?>> classMap = New.hashMap();
private final SQLDialect dialect;
private DbUpgrader dbUpgrader = new DefaultDbUpgrader();
private final Set<Class<?>> upgradeChecked = Collections.synchronizedSet(new HashSet<Class<?>>());
......
......@@ -13,9 +13,9 @@ import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.h2.jaqu.Table.JQTable;
import org.h2.jaqu.util.JdbcUtils;
import org.h2.jaqu.util.StringUtils;
import org.h2.jaqu.util.Utils;
import org.h2.util.JdbcUtils;
import org.h2.util.New;
import org.h2.util.StringUtils;
/**
* Class to inspect a model and a database for the purposes of model validation
......@@ -58,7 +58,7 @@ public class DbInspector {
public List<String> generateModel(String schema, String table,
String packageName, boolean annotateSchema, boolean trimStrings) {
try {
List<String> models = Utils.newArrayList();
List<String> models = New.arrayList();
List<TableInspector> tables = getTables(schema, table);
for (TableInspector t : tables) {
t.read(metaData);
......@@ -131,7 +131,7 @@ public class DbInspector {
ResultSet rs = null;
try {
rs = getMetaData().getSchemas();
ArrayList<String> schemaList = Utils.newArrayList();
ArrayList<String> schemaList = New.arrayList();
while (rs.next()) {
schemaList.add(rs.getString("TABLE_SCHEM"));
}
......@@ -139,7 +139,7 @@ public class DbInspector {
String jaquTables = DbVersion.class.getAnnotation(JQTable.class).name();
List<TableInspector> tables = Utils.newArrayList();
List<TableInspector> tables = New.arrayList();
if (schemaList.size() == 0) {
schemaList.add(null);
}
......@@ -159,7 +159,7 @@ public class DbInspector {
return tables;
}
// schema subset OR table subset OR exact match
List<TableInspector> matches = Utils.newArrayList();
List<TableInspector> matches = New.arrayList();
for (TableInspector t : tables) {
if (t.matches(schema, table)) {
matches.add(t);
......
......@@ -7,7 +7,7 @@
package org.h2.jaqu;
//## Java 1.5 begin ##
import org.h2.jaqu.util.Utils;
import org.h2.jaqu.util.ClassUtils;
//## Java 1.5 end ##
/**
......@@ -45,23 +45,23 @@ public class Function implements Token {
public static Integer length(Object x) {
return Db.registerToken(
Utils.newObject(Integer.class), new Function("LENGTH", x));
ClassUtils.newObject(Integer.class), new Function("LENGTH", x));
}
@SuppressWarnings("unchecked")
public static <T extends Number> T sum(T x) {
return (T) Db.registerToken(
Utils.newObject(x.getClass()), new Function("SUM", x));
ClassUtils.newObject(x.getClass()), new Function("SUM", x));
}
public static Long count(Object x) {
return Db.registerToken(
Utils.newObject(Long.class), new Function("COUNT", x));
ClassUtils.newObject(Long.class), new Function("COUNT", x));
}
public static Boolean isNull(Object x) {
return Db.registerToken(
Utils.newObject(Boolean.class), new Function("", x) {
ClassUtils.newObject(Boolean.class), new Function("", x) {
public <T> void appendSQL(SQLStatement stat, Query<T> query) {
query.appendSQL(stat, x[0]);
stat.appendSQL(" IS NULL");
......@@ -71,7 +71,7 @@ public class Function implements Token {
public static Boolean isNotNull(Object x) {
return Db.registerToken(
Utils.newObject(Boolean.class), new Function("", x) {
ClassUtils.newObject(Boolean.class), new Function("", x) {
public <T> void appendSQL(SQLStatement stat, Query<T> query) {
query.appendSQL(stat, x[0]);
stat.appendSQL(" IS NOT NULL");
......@@ -81,7 +81,7 @@ public class Function implements Token {
public static Boolean not(Boolean x) {
return Db.registerToken(
Utils.newObject(Boolean.class), new Function("", x) {
ClassUtils.newObject(Boolean.class), new Function("", x) {
public <T> void appendSQL(SQLStatement stat, Query<T> query) {
stat.appendSQL("NOT ");
query.appendSQL(stat, x[0]);
......@@ -91,7 +91,7 @@ public class Function implements Token {
public static Boolean or(Boolean... x) {
return Db.registerToken(
Utils.newObject(Boolean.class),
ClassUtils.newObject(Boolean.class),
new Function("", (Object[]) x) {
public <T> void appendSQL(SQLStatement stat, Query<T> query) {
int i = 0;
......@@ -107,7 +107,7 @@ public class Function implements Token {
public static Boolean and(Boolean... x) {
return Db.registerToken(
Utils.newObject(Boolean.class),
ClassUtils.newObject(Boolean.class),
new Function("", (Object[]) x) {
public <T> void appendSQL(SQLStatement stat, Query<T> query) {
int i = 0;
......@@ -124,19 +124,19 @@ public class Function implements Token {
@SuppressWarnings("unchecked")
public static <X> X min(X x) {
Class<X> clazz = (Class<X>) x.getClass();
X o = Utils.newObject(clazz);
X o = ClassUtils.newObject(clazz);
return Db.registerToken(o, new Function("MIN", x));
}
@SuppressWarnings("unchecked")
public static <X> X max(X x) {
Class<X> clazz = (Class<X>) x.getClass();
X o = Utils.newObject(clazz);
X o = ClassUtils.newObject(clazz);
return Db.registerToken(o, new Function("MAX", x));
}
public static Boolean like(String x, String pattern) {
Boolean o = Utils.newObject(Boolean.class);
Boolean o = ClassUtils.newObject(Boolean.class);
return Db.registerToken(o, new Function("LIKE", x, pattern) {
public <T> void appendSQL(SQLStatement stat, Query<T> query) {
stat.appendSQL("(");
......
......@@ -6,7 +6,6 @@
*/
package org.h2.jaqu;
import static org.h2.jaqu.util.StringUtils.isNullOrEmpty;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Arrays;
......@@ -208,7 +207,7 @@ public class ModelUtils {
* @return true if it is
*/
static boolean isProperlyFormattedDefaultValue(String defaultValue) {
if (isNullOrEmpty(defaultValue)) {
if (StringUtils.isNullOrEmpty(defaultValue)) {
return true;
}
Pattern literalDefault = Pattern.compile("'.*'");
......
......@@ -11,15 +11,17 @@ import java.lang.reflect.Field;
import java.sql.Clob;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.List;
import org.h2.jaqu.bytecode.ClassReader;
import org.h2.jaqu.util.StatementLogger;
import org.h2.jaqu.util.JdbcUtils;
import org.h2.jaqu.util.Utils;
import org.h2.jaqu.util.ClassUtils;
//## Java 1.5 end ##
import org.h2.util.JdbcUtils;
import org.h2.util.New;
/**
* This class represents a query.
......@@ -31,11 +33,11 @@ public class Query<T> {
private Db db;
private SelectTable<T> from;
private ArrayList<Token> conditions = Utils.newArrayList();
private ArrayList<UpdateColumn> updateColumnDeclarations = Utils.newArrayList();
private ArrayList<SelectTable<?>> joins = Utils.newArrayList();
private final IdentityHashMap<Object, SelectColumn<T>> aliasMap = Utils.newIdentityHashMap();
private ArrayList<OrderExpression<T>> orderByList = Utils.newArrayList();
private ArrayList<Token> conditions = New.arrayList();
private ArrayList<UpdateColumn> updateColumnDeclarations = New.arrayList();
private ArrayList<SelectTable<?>> joins = New.arrayList();
private final IdentityHashMap<Object, SelectColumn<T>> aliasMap = ClassUtils.newIdentityHashMap();
private ArrayList<OrderExpression<T>> orderByList = New.arrayList();
private Object[] groupByExpressions;
private long limit;
private long offset;
......@@ -58,14 +60,17 @@ public class Query<T> {
stat.appendSQL("COUNT(*) ");
appendFromWhere(stat);
ResultSet rs = stat.executeQuery();
Statement s = null;
try {
s = rs.getStatement();
rs.next();
long value = rs.getLong(1);
return value;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JdbcUtils.closeSilently(rs, true);
JdbcUtils.closeSilently(rs);
JdbcUtils.closeSilently(s);
}
}
......@@ -95,13 +100,15 @@ public class Query<T> {
}
private List<T> select(boolean distinct) {
List<T> result = Utils.newArrayList();
List<T> result = New.arrayList();
TableDefinition<T> def = from.getAliasDefinition();
SQLStatement stat = getSelectStatement(distinct);
def.appendSelectList(stat);
appendFromWhere(stat);
ResultSet rs = stat.executeQuery();
Statement s = null;
try {
s = rs.getStatement();
while (rs.next()) {
T item = from.newObject();
from.getAliasDefinition().readRow(item, rs);
......@@ -110,7 +117,8 @@ public class Query<T> {
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JdbcUtils.closeSilently(rs, true);
JdbcUtils.closeSilently(rs);
JdbcUtils.closeSilently(s);
}
return result;
}
......@@ -163,7 +171,7 @@ public class Query<T> {
@SuppressWarnings("unchecked")
private <X, Z> List<X> select(Z x, boolean distinct) {
Class<?> clazz = x.getClass();
if (Utils.isSimpleType(clazz)) {
if (ClassUtils.isSimpleType(clazz)) {
return selectSimple((X) x, distinct);
}
clazz = clazz.getSuperclass();
......@@ -171,22 +179,25 @@ public class Query<T> {
}
private <X> List<X> select(Class<X> clazz, X x, boolean distinct) {
List<X> result = Utils.newArrayList();
List<X> result = New.arrayList();
TableDefinition<X> def = db.define(clazz);
SQLStatement stat = getSelectStatement(distinct);
def.appendSelectList(stat, this, x);
appendFromWhere(stat);
ResultSet rs = stat.executeQuery();
Statement s = null;
try {
s = rs.getStatement();
while (rs.next()) {
X row = Utils.newObject(clazz);
X row = ClassUtils.newObject(clazz);
def.readRow(row, rs);
result.add(row);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JdbcUtils.closeSilently(rs, true);
JdbcUtils.closeSilently(rs);
JdbcUtils.closeSilently(s);
}
return result;
}
......@@ -197,15 +208,17 @@ public class Query<T> {
appendSQL(stat, x);
appendFromWhere(stat);
ResultSet rs = stat.executeQuery();
List<X> result = Utils.newArrayList();
List<X> result = New.arrayList();
Statement s = null;
try {
s = rs.getStatement();
while (rs.next()) {
try {
X value;
Object o = rs.getObject(1);
int convertHereIsProbablyWrong;
if (Clob.class.isAssignableFrom(o.getClass())) {
value = (X) Utils.convert(o, String.class);
value = (X) ClassUtils.convert(o, String.class);
} else {
value = (X) o;
}
......@@ -217,7 +230,8 @@ public class Query<T> {
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JdbcUtils.closeSilently(rs, true);
JdbcUtils.closeSilently(rs);
JdbcUtils.closeSilently(s);
}
return result;
}
......@@ -236,7 +250,7 @@ public class Query<T> {
}
public <A> QueryWhere<T> where(Filter filter) {
HashMap<String, Object> fieldMap = Utils.newHashMap();
HashMap<String, Object> fieldMap = New.hashMap();
for (Field f : filter.getClass().getDeclaredFields()) {
f.setAccessible(true);
try {
......
......@@ -7,8 +7,8 @@
package org.h2.jaqu;
import org.h2.jaqu.TableDefinition.IndexDefinition;
import org.h2.jaqu.util.StatementBuilder;
import org.h2.jaqu.util.StringUtils;
import org.h2.util.StatementBuilder;
import org.h2.util.StringUtils;
/**
* This interface defines points where JaQu can build different statements
......
......@@ -11,8 +11,8 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.h2.jaqu.util.JdbcUtils;
//## Java 1.5 end ##
import org.h2.util.JdbcUtils;
/**
* This class represents a parameterized SQL statement.
......
......@@ -8,9 +8,8 @@ package org.h2.jaqu;
//## Java 1.5 begin ##
import java.util.ArrayList;
import org.h2.jaqu.util.ClassUtils;
import org.h2.jaqu.util.Utils;
import org.h2.util.New;
//## Java 1.5 end ##
/**
......@@ -28,7 +27,7 @@ class SelectTable <T> {
private String as;
private TableDefinition<T> aliasDef;
private boolean outerJoin;
private ArrayList<Token> joinConditions = Utils.newArrayList();
private ArrayList<Token> joinConditions = New.arrayList();
private T alias;
@SuppressWarnings("unchecked")
......@@ -46,7 +45,7 @@ class SelectTable <T> {
}
T newObject() {
return Utils.newObject(clazz);
return ClassUtils.newObject(clazz);
}
TableDefinition<T> getAliasDefinition() {
......
......@@ -22,10 +22,11 @@ import org.h2.jaqu.Table.JQIndex;
import org.h2.jaqu.Table.JQSchema;
import org.h2.jaqu.Table.JQTable;
import org.h2.jaqu.util.StatementLogger;
import org.h2.jaqu.util.StatementBuilder;
import org.h2.jaqu.util.StringUtils;
import org.h2.jaqu.util.Utils;
import org.h2.jaqu.util.ClassUtils;
//## Java 1.5 end ##
import org.h2.util.New;
import org.h2.util.StatementBuilder;
import org.h2.util.StringUtils;
/**
* A table definition contains the index definitions of a table, the field
......@@ -73,7 +74,7 @@ class TableDefinition<T> {
}
void initWithNewObject(Object obj) {
Object o = Utils.newObject(field.getType());
Object o = ClassUtils.newObject(field.getType());
setValue(obj, o);
}
......@@ -82,7 +83,7 @@ class TableDefinition<T> {
if (!field.isAccessible()) {
field.setAccessible(true);
}
o = Utils.convert(o, field.getType());
o = ClassUtils.convert(o, field.getType());
field.set(obj, o);
} catch (Exception e) {
throw new RuntimeException(e);
......@@ -103,12 +104,12 @@ class TableDefinition<T> {
int tableVersion;
private boolean createTableIfRequired = true;
private Class<T> clazz;
private ArrayList<FieldDefinition> fields = Utils.newArrayList();
private ArrayList<FieldDefinition> fields = New.arrayList();
private IdentityHashMap<Object, FieldDefinition> fieldMap =
Utils.newIdentityHashMap();
ClassUtils.newIdentityHashMap();
private List<String> primaryKeyColumnNames;
private ArrayList<IndexDefinition> indexes = Utils.newArrayList();
private ArrayList<IndexDefinition> indexes = New.arrayList();
private boolean memoryTable;
TableDefinition(Class<T> clazz) {
......@@ -149,7 +150,7 @@ class TableDefinition<T> {
* @param columnNames the ordered list of column names
*/
void setPrimaryKey(List<String> columnNames) {
primaryKeyColumnNames = Utils.newArrayList(columnNames);
primaryKeyColumnNames = New.arrayList(columnNames);
// set isPrimaryKey flag for all field definitions
for (FieldDefinition fieldDefinition : fieldMap.values()) {
fieldDefinition.isPrimaryKey = this.primaryKeyColumnNames
......@@ -163,7 +164,7 @@ class TableDefinition<T> {
}
private ArrayList<String> mapColumnNames(Object[] columns) {
ArrayList<String> columnNames = Utils.newArrayList();
ArrayList<String> columnNames = New.arrayList();
for (Object column : columns) {
columnNames.add(getColumnName(column));
}
......@@ -190,7 +191,7 @@ class TableDefinition<T> {
void addIndex(IndexType type, List<String> columnNames) {
IndexDefinition index = new IndexDefinition();
index.indexName = tableName + "_" + indexes.size();
index.columnNames = Utils.newArrayList(columnNames);
index.columnNames = New.arrayList(columnNames);
index.type = type;
indexes.add(index);
}
......@@ -216,7 +217,7 @@ class TableDefinition<T> {
strictTypeMapping = tableAnnotation.strictTypeMapping();
}
List<Field> classFields = Utils.newArrayList();
List<Field> classFields = New.arrayList();
classFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
if (inheritColumns) {
Class<?> superClass = clazz.getSuperclass();
......@@ -261,7 +262,7 @@ class TableDefinition<T> {
fields.add(fieldDef);
}
}
List<String> primaryKey = Utils.newArrayList();
List<String> primaryKey = New.arrayList();
for (FieldDefinition fieldDef : fields) {
if (fieldDef.isPrimaryKey) {
primaryKey.add(fieldDef.columnName);
......@@ -372,7 +373,7 @@ class TableDefinition<T> {
stat.addParameter(value);
}
}
Object alias = Utils.newObject(obj.getClass());
Object alias = ClassUtils.newObject(obj.getClass());
Query<Object> query = Query.from(db, alias);
boolean firstCondition = true;
for (FieldDefinition field : fields) {
......@@ -403,7 +404,7 @@ class TableDefinition<T> {
StatementBuilder buff = new StatementBuilder("DELETE FROM ");
buff.append(db.getDialect().getTableName(schemaName, tableName));
buff.resetCount();
Object alias = Utils.newObject(obj.getClass());
Object alias = ClassUtils.newObject(obj.getClass());
Query<Object> query = Query.from(db, alias);
boolean firstCondition = true;
for (FieldDefinition field : fields) {
......@@ -506,7 +507,7 @@ class TableDefinition<T> {
* @return the column list
*/
private List<String> getColumns(String index) {
List<String> cols = Utils.newArrayList();
List<String> cols = New.arrayList();
if (index == null || index.length() == 0) {
return null;
}
......@@ -579,7 +580,7 @@ class TableDefinition<T> {
}
List<IndexDefinition> getIndexes(IndexType type) {
List<IndexDefinition> list = Utils.newArrayList();
List<IndexDefinition> list = New.arrayList();
for (IndexDefinition def:indexes) {
if (def.type.equals(type)) {
list.add(def);
......
......@@ -6,7 +6,7 @@
*/
package org.h2.jaqu;
import org.h2.jaqu.util.Utils;
import org.h2.jaqu.util.ClassUtils;
/**
* This class represents an incomplete condition.
......@@ -23,7 +23,7 @@ public class TestCondition<A> {
}
public Boolean is(A y) {
Boolean o = Utils.newObject(Boolean.class);
Boolean o = ClassUtils.newObject(Boolean.class);
return Db.registerToken(o, new Function("=", x, y) {
public <T> void appendSQL(SQLStatement stat, Query<T> query) {
stat.appendSQL("(");
......@@ -36,7 +36,7 @@ public class TestCondition<A> {
}
public Boolean bigger(A y) {
Boolean o = Utils.newObject(Boolean.class);
Boolean o = ClassUtils.newObject(Boolean.class);
return Db.registerToken(o, new Function(">", x, y) {
public <T> void appendSQL(SQLStatement stat, Query<T> query) {
stat.appendSQL("(");
......@@ -49,7 +49,7 @@ public class TestCondition<A> {
}
public Boolean biggerEqual(A y) {
Boolean o = Utils.newObject(Boolean.class);
Boolean o = ClassUtils.newObject(Boolean.class);
return Db.registerToken(o, new Function(">=", x, y) {
public <T> void appendSQL(SQLStatement stat, Query<T> query) {
stat.appendSQL("(");
......@@ -62,7 +62,7 @@ public class TestCondition<A> {
}
public Boolean smaller(A y) {
Boolean o = Utils.newObject(Boolean.class);
Boolean o = ClassUtils.newObject(Boolean.class);
return Db.registerToken(o, new Function("<", x, y) {
public <T> void appendSQL(SQLStatement stat, Query<T> query) {
stat.appendSQL("(");
......@@ -75,7 +75,7 @@ public class TestCondition<A> {
}
public Boolean smallerEqual(A y) {
Boolean o = Utils.newObject(Boolean.class);
Boolean o = ClassUtils.newObject(Boolean.class);
return Db.registerToken(o, new Function("<=", x, y) {
public <T> void appendSQL(SQLStatement stat, Query<T> query) {
stat.appendSQL("(");
......@@ -88,7 +88,7 @@ public class TestCondition<A> {
}
public Boolean like(A pattern) {
Boolean o = Utils.newObject(Boolean.class);
Boolean o = ClassUtils.newObject(Boolean.class);
return Db.registerToken(o, new Function("LIKE", x, pattern) {
public <T> void appendSQL(SQLStatement stat, Query<T> query) {
stat.appendSQL("(");
......
......@@ -8,7 +8,7 @@ package org.h2.jaqu;
import org.h2.jaqu.TableDefinition.FieldDefinition;
import org.h2.jaqu.TableInspector.ColumnInspector;
import org.h2.jaqu.util.StringUtils;
import org.h2.util.StringUtils;
/**
* A validation remark is a result of running a model validation. Each remark
......
......@@ -8,7 +8,7 @@ package org.h2.jaqu.bytecode;
import org.h2.jaqu.Query;
import org.h2.jaqu.SQLStatement;
import org.h2.jaqu.util.StringUtils;
import org.h2.util.StringUtils;
/**
* A string constant.
......
......@@ -6,34 +6,187 @@
*/
package org.h2.jaqu.util;
//## Java 1.5 begin ##
import java.io.IOException;
import java.io.Reader;
import java.io.StringWriter;
import java.lang.reflect.Constructor;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Clob;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import org.h2.util.IOUtils;
//## Java 1.5 end ##
/**
* This utility class contains functions related to class loading.
* There is a mechanism to restrict class loading.
* Generic utility methods.
*/
public class ClassUtils {
//## Java 1.5 begin ##
int todoDelete;
private static final AtomicLong COUNTER = new AtomicLong(0);
private ClassUtils() {
// utility class
}
private static final boolean MAKE_ACCESSIBLE = true;
//## Java 1.5 begin ##
private static final int BUFFER_BLOCK_SIZE = 4 * 1024;
@SuppressWarnings("unchecked")
public static <X> Class<X> getClass(X x) {
return (Class<X>) x.getClass();
// public static <T> ArrayList<T> newArrayList() {
// return new ArrayList<T>();
// }
//
// public static <T> ArrayList<T> newArrayList(Collection<T> c) {
// return new ArrayList<T>(c);
// }
//
// public static <T> HashSet<T> newHashSet() {
// return new HashSet<T>();
// }
// public static <T> HashSet<T> newHashSet(Collection<T> list) {
// return new HashSet<T>(list);
// }
//
// public static <A, B> HashMap<A, B> newHashMap() {
// return new HashMap<A, B>();
// }
//
// public static <A, B> Map<A, B> newSynchronizedHashMap() {
// HashMap<A, B> map = newHashMap();
// return Collections.synchronizedMap(map);
// }
public static <A, B> IdentityHashMap<A, B> newIdentityHashMap() {
return new IdentityHashMap<A, B>();
}
public static Class<?> loadClass(String className) {
@SuppressWarnings("unchecked")
public static <T> T newObject(Class<T> clazz) {
// must create new instances
if (clazz == Integer.class) {
return (T) new Integer((int) COUNTER.getAndIncrement());
} else if (clazz == String.class) {
return (T) ("" + COUNTER.getAndIncrement());
} else if (clazz == Long.class) {
return (T) new Long(COUNTER.getAndIncrement());
} else if (clazz == Short.class) {
return (T) new Short((short) COUNTER.getAndIncrement());
} else if (clazz == Byte.class) {
return (T) new Byte((byte) COUNTER.getAndIncrement());
} else if (clazz == Float.class) {
return (T) new Float(COUNTER.getAndIncrement());
} else if (clazz == Double.class) {
return (T) new Double(COUNTER.getAndIncrement());
} else if (clazz == Boolean.class) {
return (T) new Boolean(false);
} else if (clazz == BigDecimal.class) {
return (T) new BigDecimal(COUNTER.getAndIncrement());
} else if (clazz == BigInteger.class) {
return (T) new BigInteger("" + COUNTER.getAndIncrement());
} else if (clazz == java.sql.Date.class) {
return (T) new java.sql.Date(COUNTER.getAndIncrement());
} else if (clazz == java.sql.Time.class) {
return (T) new java.sql.Time(COUNTER.getAndIncrement());
} else if (clazz == java.sql.Timestamp.class) {
return (T) new java.sql.Timestamp(COUNTER.getAndIncrement());
} else if (clazz == java.util.Date.class) {
return (T) new java.util.Date(COUNTER.getAndIncrement());
} else if (clazz == List.class) {
return (T) new ArrayList();
}
try {
return Class.forName(className);
return clazz.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
if (MAKE_ACCESSIBLE) {
Constructor[] constructors = clazz.getDeclaredConstructors();
// try 0 length constructors
for (Constructor c : constructors) {
if (c.getParameterTypes().length == 0) {
c.setAccessible(true);
try {
return clazz.newInstance();
} catch (Exception e2) {
// ignore
}
}
}
// try 1 length constructors
for (Constructor c : constructors) {
if (c.getParameterTypes().length == 1) {
c.setAccessible(true);
try {
return (T) c.newInstance(new Object[1]);
} catch (Exception e2) {
// ignore
}
}
}
}
throw new RuntimeException("Exception trying to create " +
clazz.getName() + ": " + e, e);
}
}
//## Java 1.5 end ##
public static <T> boolean isSimpleType(Class<T> clazz) {
if (Number.class.isAssignableFrom(clazz)) {
return true;
} else if (clazz == String.class) {
return true;
}
return false;
}
public static Object convert(Object o, Class<?> targetType) {
if (o == null) {
return null;
}
Class<?> currentType = o.getClass();
if (targetType.isAssignableFrom(currentType)) {
return o;
}
if (targetType == String.class) {
if (Clob.class.isAssignableFrom(currentType)) {
Clob c = (Clob) o;
try {
Reader r = c.getCharacterStream();
return IOUtils.readStringAndClose(r, -1);
} catch (Exception e) {
throw new RuntimeException("Error converting CLOB to String: " + e.toString(), e);
}
}
return o.toString();
}
if (Number.class.isAssignableFrom(currentType)) {
Number n = (Number) o;
if (targetType == Byte.class) {
return n.byteValue();
} else if (targetType == Short.class) {
return n.shortValue();
} else if (targetType == Integer.class) {
return n.intValue();
} else if (targetType == Long.class) {
return n.longValue();
} else if (targetType == Double.class) {
return n.doubleValue();
} else if (targetType == Float.class) {
return n.floatValue();
}
}
throw new RuntimeException("Can not convert the value " + o +
" from " + currentType + " to " + targetType);
}
@SuppressWarnings("unchecked")
public static <X> Class<X> getClass(X x) {
return (Class<X>) x.getClass();
}
//## Java 1.5 end ##
}
......@@ -22,6 +22,8 @@ import java.util.regex.Pattern;
import org.h2.jaqu.Db;
import org.h2.jaqu.DbInspector;
import org.h2.message.DbException;
import org.h2.util.JdbcUtils;
import org.h2.util.StringUtils;
/**
* Generates JaQu models.
......
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.jaqu.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.naming.Context;
import javax.sql.DataSource;
import javax.sql.XAConnection;
/**
* This is a utility class with JDBC helper functions.
*/
public class JdbcUtils {
private static final int todoDeleteClass = 0;
private static final String[] DRIVERS = {
"h2:", "org.h2.Driver",
"Cache:", "com.intersys.jdbc.CacheDriver",
"daffodilDB://", "in.co.daffodil.db.rmi.RmiDaffodilDBDriver",
"daffodil", "in.co.daffodil.db.jdbc.DaffodilDBDriver",
"db2:", "COM.ibm.db2.jdbc.net.DB2Driver",
"derby:net:", "org.apache.derby.jdbc.ClientDriver",
"derby://", "org.apache.derby.jdbc.ClientDriver",
"derby:", "org.apache.derby.jdbc.EmbeddedDriver",
"FrontBase:", "com.frontbase.jdbc.FBJDriver",
"firebirdsql:", "org.firebirdsql.jdbc.FBDriver",
"hsqldb:", "org.hsqldb.jdbcDriver",
"informix-sqli:", "com.informix.jdbc.IfxDriver",
"jtds:", "net.sourceforge.jtds.jdbc.Driver",
"microsoft:", "com.microsoft.jdbc.sqlserver.SQLServerDriver",
"mimer:", "com.mimer.jdbc.Driver",
"mysql:", "com.mysql.jdbc.Driver",
"odbc:", "sun.jdbc.odbc.JdbcOdbcDriver",
"oracle:", "oracle.jdbc.driver.OracleDriver",
"pervasive:", "com.pervasive.jdbc.v2.Driver",
"pointbase:micro:", "com.pointbase.me.jdbc.jdbcDriver",
"pointbase:", "com.pointbase.jdbc.jdbcUniversalDriver",
"postgresql:", "org.postgresql.Driver",
"sybase:", "com.sybase.jdbc3.jdbc.SybDriver",
"sqlserver:", "com.microsoft.sqlserver.jdbc.SQLServerDriver",
"teradata:", "com.ncr.teradata.TeraDriver",
};
private JdbcUtils() {
// utility class
}
/**
* Close a statement without throwing an exception.
*
* @param stat the statement or null
*/
public static void closeSilently(Statement stat) {
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
// ignore
}
}
}
/**
* Close a connection without throwing an exception.
*
* @param conn the connection or null
*/
public static void closeSilently(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// ignore
}
}
}
/**
* Close a result set without throwing an exception.
*
* @param rs the result set or null
*/
public static void closeSilently(ResultSet rs) {
closeSilently(rs, false);
}
/**
* Close a result set, and optionally its statement without throwing an
* exception.
*
* @param rs the result set or null
*/
public static void closeSilently(ResultSet rs, boolean closeStatement) {
if (rs != null) {
Statement stat = null;
if (closeStatement) {
try {
stat = rs.getStatement();
} catch (SQLException e) {
//ignore
}
}
try {
rs.close();
} catch (SQLException e) {
// ignore
}
closeSilently(stat);
}
}
/**
* Close an XA connection set without throwing an exception.
*
* @param conn the XA connection or null
*/
//## Java 1.4 begin ##
public static void closeSilently(XAConnection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// ignore
}
}
}
//## Java 1.4 end ##
/**
* Open a new database connection with the given settings.
*
* @param driver the driver class name
* @param url the database URL
* @param user the user name
* @param password the password
* @return the database connection
*/
public static Connection getConnection(String driver, String url, String user, String password) throws SQLException {
Properties prop = new Properties();
if (user != null) {
prop.setProperty("user", user);
}
if (password != null) {
prop.setProperty("password", password);
}
return getConnection(driver, url, prop);
}
/**
* Escape table or schema patterns used for DatabaseMetaData functions.
*
* @param pattern the pattern
* @return the escaped pattern
*/
public static String escapeMetaDataPattern(String pattern) {
if (pattern == null || pattern.length() == 0) {
return pattern;
}
return StringUtils.replaceAll(pattern, "\\", "\\\\");
}
/**
* Open a new database connection with the given settings.
*
* @param driver the driver class name
* @param url the database URL
* @param prop the properties containing at least the user name and password
* @return the database connection
*/
public static Connection getConnection(String driver, String url, Properties prop) throws SQLException {
if (StringUtils.isNullOrEmpty(driver)) {
JdbcUtils.load(url);
} else {
Class<?> d = ClassUtils.loadClass(driver);
if (java.sql.Driver.class.isAssignableFrom(d)) {
return DriverManager.getConnection(url, prop);
//## Java 1.4 begin ##
} else if (javax.naming.Context.class.isAssignableFrom(d)) {
// JNDI context
try {
Context context = (Context) d.newInstance();
DataSource ds = (DataSource) context.lookup(url);
String user = prop.getProperty("user");
String password = prop.getProperty("password");
if (StringUtils.isNullOrEmpty(user) && StringUtils.isNullOrEmpty(password)) {
return ds.getConnection();
}
return ds.getConnection(user, password);
} catch (Exception e) {
throw Message.convert(e);
}
//## Java 1.4 end ##
} else {
// Don't know, but maybe it loaded a JDBC Driver
return DriverManager.getConnection(url, prop);
}
}
return DriverManager.getConnection(url, prop);
}
/**
* Get the driver class name for the given URL, or null if the URL is
* unknown.
*
* @param url the database URL
* @return the driver class name
*/
public static String getDriver(String url) {
if (url.startsWith("jdbc:")) {
url = url.substring("jdbc:".length());
for (int i = 0; i < DRIVERS.length; i += 2) {
String prefix = DRIVERS[i];
if (url.startsWith(prefix)) {
return DRIVERS[i + 1];
}
}
}
return null;
}
/**
* Load the driver class for the given URL, if the database URL is known.
*
* @param url the database URL
*/
public static void load(String url) {
String driver = getDriver(url);
if (driver != null) {
ClassUtils.loadClass(driver);
}
}
}
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.jaqu.util;
/**
* A utility class to build a statement. In addition to the methods supported by
* StringBuilder, it allows to add a text only in the second iteration. This
* simplified constructs such as:
* <pre>
* StringBuilder buff = new StringBuilder();
* for (int i = 0; i &lt; args.length; i++) {
* if (i &gt; 0) {
* buff.append(&quot;, &quot;);
* }
* buff.append(args[i]);
* }
* </pre>
* to
* <pre>
* StatementBuilder buff = new StatementBuilder();
* for (String s : args) {
* buff.appendExceptFirst(&quot;, &quot;);
* buff.append(a);
* }
*</pre>
*/
public class StatementBuilder {
private int todoDelete;
private final StringBuilder builder = new StringBuilder();
private int index;
/**
* Create a new builder.
*/
public StatementBuilder() {
// nothing to do
}
/**
* Create a new builder.
*
* @param string the initial string
*/
public StatementBuilder(String string) {
builder.append(string);
}
/**
* Append a text.
*
* @param s the text to append
* @return itself
*/
public StatementBuilder append(String s) {
builder.append(s);
return this;
}
/**
* Append a character.
*
* @param c the character to append
* @return itself
*/
public StatementBuilder append(char c) {
builder.append(c);
return this;
}
/**
* Append a number.
*
* @param x the number to append
* @return itself
*/
public StatementBuilder append(long x) {
builder.append(x);
return this;
}
/**
* Reset the loop counter.
*
* @return itself
*/
public StatementBuilder resetCount() {
index = 0;
return this;
}
/**
* Append a text, but only if appendExceptFirst was never called.
*
* @param s the text to append
*/
public void appendOnlyFirst(String s) {
if (index == 0) {
builder.append(s);
}
}
/**
* Append a text, except when this method is called the first time.
*
* @param s the text to append
*/
public void appendExceptFirst(String s) {
if (index++ > 0) {
builder.append(s);
}
}
public void append(StatementBuilder sb) {
builder.append(sb);
}
public void insert(int offset, char c) {
builder.insert(offset, c);
}
public String toString() {
return builder.toString();
}
/**
* Get the length.
*
* @return the length
*/
public int length() {
return builder.length();
}
}
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.jaqu.util;
/**
* Common string utilities. I expect that this class will be removed.
*
*/
public class StringUtils {
private int todoDelete;
/**
* Replace all occurrences of the before string with the after string.
*
* @param s the string
* @param before the old text
* @param after the new text
* @return the string with the before string replaced
*/
public static String replaceAll(String s, String before, String after) {
int next = s.indexOf(before);
if (next < 0) {
return s;
}
StringBuilder buff = new StringBuilder(s.length() - before.length() + after.length());
int index = 0;
while (true) {
buff.append(s.substring(index, next)).append(after);
index = next + before.length();
next = s.indexOf(before, index);
if (next < 0) {
buff.append(s.substring(index));
break;
}
}
return buff.toString();
}
/**
* Check if a String is null or empty (the length is null).
*
* @param s the string to check
* @return true if it is null or empty
*/
public static boolean isNullOrEmpty(String s) {
return s == null || s.length() == 0;
}
/**
* Convert a string to a Java literal using the correct escape sequences.
* The literal is not enclosed in double quotes. The result can be used in
* properties files or in Java source code.
*
* @param s the text to convert
* @return the Java representation
*/
public static String javaEncode(String s) {
int length = s.length();
StringBuilder buff = new StringBuilder(length);
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
switch (c) {
// case '\b':
// // BS backspace
// // not supported in properties files
// buff.append("\\b");
// break;
case '\t':
// HT horizontal tab
buff.append("\\t");
break;
case '\n':
// LF linefeed
buff.append("\\n");
break;
case '\f':
// FF form feed
buff.append("\\f");
break;
case '\r':
// CR carriage return
buff.append("\\r");
break;
case '"':
// double quote
buff.append("\\\"");
break;
case '\\':
// backslash
buff.append("\\\\");
break;
default:
int ch = c & 0xffff;
if (ch >= ' ' && (ch < 0x80)) {
buff.append(c);
// not supported in properties files
// } else if(ch < 0xff) {
// buff.append("\\");
// // make sure it's three characters (0x200 is octal 1000)
// buff.append(Integer.toOctalString(0x200 |
// ch).substring(1));
} else {
buff.append("\\u");
// make sure it's four characters
buff.append(Integer.toHexString(0x10000 | ch).substring(1));
}
}
}
return buff.toString();
}
/**
* Pad a string. This method is used for the SQL function RPAD and LPAD.
*
* @param string the original string
* @param n the target length
* @param padding the padding string
* @param right true if the padding should be appended at the end
* @return the padded string
*/
public static String pad(String string, int n, String padding, boolean right) {
if (n < 0) {
n = 0;
}
if (n < string.length()) {
return string.substring(0, n);
} else if (n == string.length()) {
return string;
}
char paddingChar;
if (padding == null || padding.length() == 0) {
paddingChar = ' ';
} else {
paddingChar = padding.charAt(0);
}
StringBuilder buff = new StringBuilder(n);
n -= string.length();
if (right) {
buff.append(string);
}
for (int i = 0; i < n; i++) {
buff.append(paddingChar);
}
if (!right) {
buff.append(string);
}
return buff.toString();
}
/**
* Convert a string to a SQL literal. Null is converted to NULL. The text is
* enclosed in single quotes. If there are any special characters, the method
* STRINGDECODE is used.
*
* @param s the text to convert.
* @return the SQL literal
*/
public static String quoteStringSQL(String s) {
if (s == null) {
return "NULL";
}
int length = s.length();
StringBuilder buff = new StringBuilder(length + 2);
buff.append('\'');
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
if (c == '\'') {
buff.append(c);
} else if (c < ' ' || c > 127) {
// need to start from the beginning because maybe there was a \
// that was not quoted
return "STRINGDECODE(" + quoteStringSQL(javaEncode(s)) + ")";
}
buff.append(c);
}
buff.append('\'');
return buff.toString();
}
}
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.jaqu.util;
//## Java 1.5 begin ##
import java.io.IOException;
import java.io.Reader;
import java.io.StringWriter;
import java.lang.reflect.Constructor;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Clob;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
//## Java 1.5 end ##
/**
* Generic utility methods.
*/
public class Utils {
//## Java 1.5 begin ##
private static final AtomicLong COUNTER = new AtomicLong(0);
private static final boolean MAKE_ACCESSIBLE = true;
private static final int BUFFER_BLOCK_SIZE = 4 * 1024;
public static <T> ArrayList<T> newArrayList() {
return new ArrayList<T>();
}
public static <T> ArrayList<T> newArrayList(Collection<T> c) {
return new ArrayList<T>(c);
}
public static <T> HashSet<T> newHashSet() {
return new HashSet<T>();
}
public static <T> HashSet<T> newHashSet(Collection<T> list) {
return new HashSet<T>(list);
}
public static <A, B> HashMap<A, B> newHashMap() {
return new HashMap<A, B>();
}
public static <A, B> Map<A, B> newSynchronizedHashMap() {
HashMap<A, B> map = newHashMap();
return Collections.synchronizedMap(map);
}
public static <A, B> IdentityHashMap<A, B> newIdentityHashMap() {
return new IdentityHashMap<A, B>();
}
@SuppressWarnings("unchecked")
public static <T> T newObject(Class<T> clazz) {
// must create new instances
if (clazz == Integer.class) {
return (T) new Integer((int) COUNTER.getAndIncrement());
} else if (clazz == String.class) {
return (T) ("" + COUNTER.getAndIncrement());
} else if (clazz == Long.class) {
return (T) new Long(COUNTER.getAndIncrement());
} else if (clazz == Short.class) {
return (T) new Short((short) COUNTER.getAndIncrement());
} else if (clazz == Byte.class) {
return (T) new Byte((byte) COUNTER.getAndIncrement());
} else if (clazz == Float.class) {
return (T) new Float(COUNTER.getAndIncrement());
} else if (clazz == Double.class) {
return (T) new Double(COUNTER.getAndIncrement());
} else if (clazz == Boolean.class) {
return (T) new Boolean(false);
} else if (clazz == BigDecimal.class) {
return (T) new BigDecimal(COUNTER.getAndIncrement());
} else if (clazz == BigInteger.class) {
return (T) new BigInteger("" + COUNTER.getAndIncrement());
} else if (clazz == java.sql.Date.class) {
return (T) new java.sql.Date(COUNTER.getAndIncrement());
} else if (clazz == java.sql.Time.class) {
return (T) new java.sql.Time(COUNTER.getAndIncrement());
} else if (clazz == java.sql.Timestamp.class) {
return (T) new java.sql.Timestamp(COUNTER.getAndIncrement());
} else if (clazz == java.util.Date.class) {
return (T) new java.util.Date(COUNTER.getAndIncrement());
} else if (clazz == List.class) {
return (T) new ArrayList();
}
try {
return clazz.newInstance();
} catch (Exception e) {
if (MAKE_ACCESSIBLE) {
Constructor[] constructors = clazz.getDeclaredConstructors();
// try 0 length constructors
for (Constructor c : constructors) {
if (c.getParameterTypes().length == 0) {
c.setAccessible(true);
try {
return clazz.newInstance();
} catch (Exception e2) {
// ignore
}
}
}
// try 1 length constructors
for (Constructor c : constructors) {
if (c.getParameterTypes().length == 1) {
c.setAccessible(true);
try {
return (T) c.newInstance(new Object[1]);
} catch (Exception e2) {
// ignore
}
}
}
}
throw new RuntimeException("Exception trying to create " +
clazz.getName() + ": " + e, e);
}
}
public static <T> boolean isSimpleType(Class<T> clazz) {
if (Number.class.isAssignableFrom(clazz)) {
return true;
} else if (clazz == String.class) {
return true;
}
return false;
}
public static Object convert(Object o, Class<?> targetType) {
if (o == null) {
return null;
}
Class<?> currentType = o.getClass();
if (targetType.isAssignableFrom(currentType)) {
return o;
}
if (targetType == String.class) {
if (Clob.class.isAssignableFrom(currentType)) {
Clob c = (Clob) o;
try {
Reader r = c.getCharacterStream();
return readStringAndClose(r, -1);
} catch (Exception e) {
throw new RuntimeException("Error converting CLOB to String: " + e.toString(), e);
}
}
return o.toString();
}
if (Number.class.isAssignableFrom(currentType)) {
Number n = (Number) o;
if (targetType == Byte.class) {
return n.byteValue();
} else if (targetType == Short.class) {
return n.shortValue();
} else if (targetType == Integer.class) {
return n.intValue();
} else if (targetType == Long.class) {
return n.longValue();
} else if (targetType == Double.class) {
return n.doubleValue();
} else if (targetType == Float.class) {
return n.floatValue();
}
}
throw new RuntimeException("Can not convert the value " + o +
" from " + currentType + " to " + targetType);
}
/**
* Read a number of characters from a reader and close it.
*
* @param in the reader
* @param length the maximum number of characters to read, or -1 to read
* until the end of file
* @return the string read
*/
public static String readStringAndClose(Reader in, int length) throws IOException {
try {
if (length <= 0) {
length = Integer.MAX_VALUE;
}
int block = Math.min(BUFFER_BLOCK_SIZE, length);
StringWriter out = new StringWriter(length == Integer.MAX_VALUE ? block : length);
char[] buff = new char[block];
while (length > 0) {
int len = Math.min(block, length);
len = in.read(buff, 0, len);
if (len < 0) {
break;
}
out.write(buff, 0, len);
length -= len;
}
return out.toString();
} finally {
in.close();
}
}
//## Java 1.5 end ##
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论