Format all Java files with google-java-format
Change-Id: Iff8da485f1a01bd9c829464b28ea79aa5b821f7e
diff --git a/src/main/java/com/google/gwtorm/client/Column.java b/src/main/java/com/google/gwtorm/client/Column.java
index 8ed6f0d..a3e4f45 100644
--- a/src/main/java/com/google/gwtorm/client/Column.java
+++ b/src/main/java/com/google/gwtorm/client/Column.java
@@ -21,11 +21,10 @@
/**
* Annotation marking an entity field for persistence in the data store.
- * <p>
- * Fields marked with <code>Column</code> must not be final and must not be
- * private. Fields which might be accessed cross-packages (such as those
- * declared in a common Key type like {@link StringKey}) must be declared with
- * public access so generated code can access them directly.
+ *
+ * <p>Fields marked with <code>Column</code> must not be final and must not be private. Fields which
+ * might be accessed cross-packages (such as those declared in a common Key type like {@link
+ * StringKey}) must be declared with public access so generated code can access them directly.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@@ -36,18 +35,12 @@
/** @return unique identity of this field within its parent object. */
int id();
- /**
- * @return name of the column in the data store. Defaults to the field name.
- */
+ /** @return name of the column in the data store. Defaults to the field name. */
String name() default "";
- /**
- * @return maximum length (in characters). Only valid for String.
- */
+ /** @return maximum length (in characters). Only valid for String. */
int length() default 0;
- /**
- * @return is a value required. Defaults to true (NOT NULL).
- */
+ /** @return is a value required. Defaults to true (NOT NULL). */
boolean notNull() default true;
}
diff --git a/src/main/java/com/google/gwtorm/client/CompoundKey.java b/src/main/java/com/google/gwtorm/client/CompoundKey.java
index 0087ccb..1c66d18 100644
--- a/src/main/java/com/google/gwtorm/client/CompoundKey.java
+++ b/src/main/java/com/google/gwtorm/client/CompoundKey.java
@@ -18,21 +18,17 @@
/**
* Abstract key type composed of other keys.
- * <p>
- * Applications should subclass this type to create their own entity-specific
- * key classes.
+ *
+ * <p>Applications should subclass this type to create their own entity-specific key classes.
*
* @param <P> the parent key type. Use {@link Key} if no parent key is needed.
*/
@SuppressWarnings("serial")
-public abstract class CompoundKey<P extends Key<?>> implements Key<P>,
- Serializable {
+public abstract class CompoundKey<P extends Key<?>> implements Key<P>, Serializable {
/** @return the member key components, minus the parent key. */
public abstract Key<?>[] members();
- /**
- * @return the parent key instance; null if this is a root level key.
- */
+ /** @return the parent key instance; null if this is a root level key. */
@Override
public P getParentKey() {
return null;
diff --git a/src/main/java/com/google/gwtorm/client/IntKey.java b/src/main/java/com/google/gwtorm/client/IntKey.java
index f64493b..08c90e0 100644
--- a/src/main/java/com/google/gwtorm/client/IntKey.java
+++ b/src/main/java/com/google/gwtorm/client/IntKey.java
@@ -18,25 +18,20 @@
/**
* Abstract key type using a single integer value.
- * <p>
- * Applications should subclass this type to create their own entity-specific
- * key classes.
+ *
+ * <p>Applications should subclass this type to create their own entity-specific key classes.
*
* @param <P> the parent key type. Use {@link Key} if no parent key is needed.
*/
@SuppressWarnings("serial")
public abstract class IntKey<P extends Key<?>> implements Key<P>, Serializable {
- /**
- * @return id of the entity instance.
- */
+ /** @return id of the entity instance. */
public abstract int get();
/** @param newValue the new value of this key. */
protected abstract void set(int newValue);
- /**
- * @return the parent key instance; null if this is a root level key.
- */
+ /** @return the parent key instance; null if this is a root level key. */
@Override
public P getParentKey() {
return null;
diff --git a/src/main/java/com/google/gwtorm/client/Key.java b/src/main/java/com/google/gwtorm/client/Key.java
index b5b3d3a..69a2248 100644
--- a/src/main/java/com/google/gwtorm/client/Key.java
+++ b/src/main/java/com/google/gwtorm/client/Key.java
@@ -16,10 +16,9 @@
/**
* Generic type for an entity key.
- * <p>
- * Although not required, entities should make their primary key type implement
- * this interface, permitting traversal up through the containment hierarchy of
- * the entity keys.
+ *
+ * <p>Although not required, entities should make their primary key type implement this interface,
+ * permitting traversal up through the containment hierarchy of the entity keys.
*
* @param <P> type of the parent key. If no parent, use {@link Key} itself.
*/
diff --git a/src/main/java/com/google/gwtorm/client/KeyUtil.java b/src/main/java/com/google/gwtorm/client/KeyUtil.java
index c4b4551..d815ea6 100644
--- a/src/main/java/com/google/gwtorm/client/KeyUtil.java
+++ b/src/main/java/com/google/gwtorm/client/KeyUtil.java
@@ -20,12 +20,11 @@
/**
* Set the encoder implementation to a valid implementation.
- * <p>
- * Server-side code needs to set the encoder to a
- * {@link com.google.gwtorm.server.StandardKeyEncoder} instance prior to
- * invoking any methods in this class. Typically this is done by the
- * {@link com.google.gwtorm.server.SchemaFactory} implementation's static
- * initializer.
+ *
+ * <p>Server-side code needs to set the encoder to a {@link
+ * com.google.gwtorm.server.StandardKeyEncoder} instance prior to invoking any methods in this
+ * class. Typically this is done by the {@link com.google.gwtorm.server.SchemaFactory}
+ * implementation's static initializer.
*/
public static void setEncoderImpl(final Encoder e) {
ENCODER_IMPL = e;
@@ -37,8 +36,8 @@
* @param <T> type of the key entity.
* @param a first key to test; may be null.
* @param b second key to test; may be null.
- * @return true if both <code>a</code> and <code>b</code> are null, or if both
- * are not-null and <code>a.equals(b)</code> is true. Otherwise false.
+ * @return true if both <code>a</code> and <code>b</code> are null, or if both are not-null and
+ * <code>a.equals(b)</code> is true. Otherwise false.
*/
public static <T extends Key<?>> boolean eq(final T a, final T b) {
if (a == b) {
@@ -52,11 +51,10 @@
/**
* Encode a string to be safe for use within a URL like string.
- * <p>
- * The returned encoded string has URL component characters escaped with hex
- * escapes (e.g. ' ' is '+' and '%' is '%25'). The special character '/' is
- * left literal. The comma character (',') is always encoded, permitting
- * multiple encoded string values to be joined together safely.
+ *
+ * <p>The returned encoded string has URL component characters escaped with hex escapes (e.g. ' '
+ * is '+' and '%' is '%25'). The special character '/' is left literal. The comma character (',')
+ * is always encoded, permitting multiple encoded string values to be joined together safely.
*
* @param e the string to encode, must not be null.
* @return the encoded string.
@@ -90,17 +88,16 @@
if (comma < 0 && parent != null) {
throw new IllegalArgumentException("Not enough components: " + in);
}
- assert(parent != null);
+ assert (parent != null);
parent.fromString(in.substring(0, comma));
return decode(in.substring(comma + 1));
}
- public static abstract class Encoder {
+ public abstract static class Encoder {
public abstract String encode(String e);
public abstract String decode(String e);
}
- private KeyUtil() {
- }
+ private KeyUtil() {}
}
diff --git a/src/main/java/com/google/gwtorm/client/LongKey.java b/src/main/java/com/google/gwtorm/client/LongKey.java
index 986285e..a983064 100644
--- a/src/main/java/com/google/gwtorm/client/LongKey.java
+++ b/src/main/java/com/google/gwtorm/client/LongKey.java
@@ -18,25 +18,20 @@
/**
* Abstract key type using a single long value.
- * <p>
- * Applications should subclass this type to create their own entity-specific
- * key classes.
+ *
+ * <p>Applications should subclass this type to create their own entity-specific key classes.
*
* @param <P> the parent key type. Use {@link Key} if no parent key is needed.
*/
@SuppressWarnings("serial")
public abstract class LongKey<P extends Key<?>> implements Key<P>, Serializable {
- /**
- * @return id of the entity instance.
- */
+ /** @return id of the entity instance. */
public abstract long get();
/** @param newValue the new value of this key. */
protected abstract void set(long newValue);
- /**
- * @return the parent key instance; null if this is a root level key.
- */
+ /** @return the parent key instance; null if this is a root level key. */
@Override
public P getParentKey() {
return null;
diff --git a/src/main/java/com/google/gwtorm/client/RowVersion.java b/src/main/java/com/google/gwtorm/client/RowVersion.java
index 3cae45c..e9c0d3a 100644
--- a/src/main/java/com/google/gwtorm/client/RowVersion.java
+++ b/src/main/java/com/google/gwtorm/client/RowVersion.java
@@ -21,16 +21,14 @@
/**
* Annotation marking a field as the row version used for optimistic locking.
- * <p>
- * Fields marked with <code>RowVersion</code> must also be marked with
- * {@link Column} and must be of type <code>int</code>. The field will be
- * automatically incremented during INSERT and UPDATE operations, and will be
- * tested during UPDATE and DELETE operations. Concurrent modifications of the
- * same entity fail as the row version won't match.
- * <p>
- * At most one RowVersion annotation should appear in any entity.
+ *
+ * <p>Fields marked with <code>RowVersion</code> must also be marked with {@link Column} and must be
+ * of type <code>int</code>. The field will be automatically incremented during INSERT and UPDATE
+ * operations, and will be tested during UPDATE and DELETE operations. Concurrent modifications of
+ * the same entity fail as the row version won't match.
+ *
+ * <p>At most one RowVersion annotation should appear in any entity.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
-public @interface RowVersion {
-}
+public @interface RowVersion {}
diff --git a/src/main/java/com/google/gwtorm/client/ShortKey.java b/src/main/java/com/google/gwtorm/client/ShortKey.java
index abda6d1..efc7f57 100644
--- a/src/main/java/com/google/gwtorm/client/ShortKey.java
+++ b/src/main/java/com/google/gwtorm/client/ShortKey.java
@@ -18,26 +18,20 @@
/**
* Abstract key type using a single short value.
- * <p>
- * Applications should subclass this type to create their own entity-specific
- * key classes.
+ *
+ * <p>Applications should subclass this type to create their own entity-specific key classes.
*
* @param <P> the parent key type. Use {@link Key} if no parent key is needed.
*/
@SuppressWarnings("serial")
-public abstract class ShortKey<P extends Key<?>> implements Key<P>,
- Serializable {
- /**
- * @return id of the entity instance.
- */
+public abstract class ShortKey<P extends Key<?>> implements Key<P>, Serializable {
+ /** @return id of the entity instance. */
public abstract short get();
/** @param newValue the new value of this key. */
protected abstract void set(short newValue);
- /**
- * @return the parent key instance; null if this is a root level key.
- */
+ /** @return the parent key instance; null if this is a root level key. */
@Override
public P getParentKey() {
return null;
diff --git a/src/main/java/com/google/gwtorm/client/StringKey.java b/src/main/java/com/google/gwtorm/client/StringKey.java
index a4dcf4c..e56661f 100644
--- a/src/main/java/com/google/gwtorm/client/StringKey.java
+++ b/src/main/java/com/google/gwtorm/client/StringKey.java
@@ -18,26 +18,21 @@
/**
* Abstract key type using a single string value.
- * <p>
- * Applications should subclass this type to create their own entity-specific
- * key classes.
+ *
+ * <p>Applications should subclass this type to create their own entity-specific key classes.
*
* @param <P> the parent key type. Use {@link Key} if no parent key is needed.
*/
@SuppressWarnings("serial")
-public abstract class StringKey<P extends Key<?>> implements Key<P>,
- Serializable, Comparable<StringKey<?>> {
- /**
- * @return name of the entity instance.
- */
+public abstract class StringKey<P extends Key<?>>
+ implements Key<P>, Serializable, Comparable<StringKey<?>> {
+ /** @return name of the entity instance. */
public abstract String get();
/** @param newValue the new value of this key. */
protected abstract void set(String newValue);
- /**
- * @return the parent key instance; null if this is a root level key.
- */
+ /** @return the parent key instance; null if this is a root level key. */
@Override
public P getParentKey() {
return null;
@@ -60,8 +55,7 @@
}
final StringKey<P> q = cast(b);
- return get().equals(q.get())
- && KeyUtil.eq(getParentKey(), q.getParentKey());
+ return get().equals(q.get()) && KeyUtil.eq(getParentKey(), q.getParentKey());
}
@Override
diff --git a/src/main/java/com/google/gwtorm/jdbc/AccessGen.java b/src/main/java/com/google/gwtorm/jdbc/AccessGen.java
index 9cfe6f5..de65541 100644
--- a/src/main/java/com/google/gwtorm/jdbc/AccessGen.java
+++ b/src/main/java/com/google/gwtorm/jdbc/AccessGen.java
@@ -25,13 +25,6 @@
import com.google.gwtorm.server.CodeGenSupport;
import com.google.gwtorm.server.GeneratedClassLoader;
import com.google.gwtorm.server.OrmException;
-
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -39,6 +32,11 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
/** Generates a concrete implementation of an {@link Access} extension. */
class AccessGen implements Opcodes {
@@ -68,13 +66,11 @@
private String implTypeName;
private Type entityType;
- AccessGen(final GeneratedClassLoader loader,
- final RelationModel rm, final SqlDialect sd) {
+ AccessGen(final GeneratedClassLoader loader, final RelationModel rm, final SqlDialect sd) {
classLoader = loader;
model = rm;
dialect = sd;
- entityType =
- Type.getObjectType(model.getEntityTypeClassName().replace('.', '/'));
+ entityType = Type.getObjectType(model.getEntityTypeClassName().replace('.', '/'));
}
public Class<?> create() throws OrmException {
@@ -106,8 +102,8 @@
if (model.getPrimaryKey() != null) {
implementKeyQuery(model.getPrimaryKey());
- if ((model.getPrimaryKey().getField().isNested() || !model
- .getPrimaryKey().getField().getPrimitiveType().isPrimitive())
+ if ((model.getPrimaryKey().getField().isNested()
+ || !model.getPrimaryKey().getField().getPrimitiveType().isPrimitive())
&& model.getPrimaryKey().getAllLeafColumns().size() == 1) {
overrideGetMany();
}
@@ -134,21 +130,27 @@
private void init() {
superTypeName = Type.getInternalName(JdbcAccess.class);
implClassName =
- model.getEntityTypeClassName() + "_Access_" + model.getMethodName()
- + "_" + Util.createRandomName();
+ model.getEntityTypeClassName()
+ + "_Access_"
+ + model.getMethodName()
+ + "_"
+ + Util.createRandomName();
implTypeName = implClassName.replace('.', '/');
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- cw.visit(V1_3, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, implTypeName, null,
- superTypeName, new String[] {model.getAccessInterfaceName().replace(
- '.', '/')});
+ cw.visit(
+ V1_3,
+ ACC_PUBLIC | ACC_FINAL | ACC_SUPER,
+ implTypeName,
+ null,
+ superTypeName,
+ new String[] {model.getAccessInterfaceName().replace('.', '/')});
}
private void implementConstructor() {
final String consName = "<init>";
final String consDesc =
- Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type
- .getType(JdbcSchema.class)});
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.getType(JdbcSchema.class)});
final MethodVisitor mv;
mv = cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
mv.visitCode();
@@ -160,12 +162,14 @@
mv.visitEnd();
}
- private void implementGetString(final String methodName,
- final String returnValue) {
+ private void implementGetString(final String methodName, final String returnValue) {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, methodName, Type
- .getMethodDescriptor(Type.getType(String.class), new Type[] {}),
- null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ methodName,
+ Type.getMethodDescriptor(Type.getType(String.class), new Type[] {}),
+ null,
+ null);
mv.visitCode();
mv.visitLdcInsn(returnValue);
mv.visitInsn(ARETURN);
@@ -175,8 +179,12 @@
private void implementGetRelationID() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getRelationID", Type
- .getMethodDescriptor(Type.INT_TYPE, new Type[] {}), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "getRelationID",
+ Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {}),
+ null,
+ null);
mv.visitCode();
new CodeGenSupport(mv).push(model.getRelationID());
mv.visitInsn(IRETURN);
@@ -184,12 +192,14 @@
mv.visitEnd();
}
- private void implementMissingGetString(final String methodName,
- final String why) {
+ private void implementMissingGetString(final String methodName, final String why) {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, methodName, Type
- .getMethodDescriptor(Type.getType(String.class), new Type[] {}),
- null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ methodName,
+ Type.getMethodDescriptor(Type.getType(String.class), new Type[] {}),
+ null,
+ null);
mv.visitCode();
throwUnsupported(mv, model.getMethodName() + " does not support " + why);
mv.visitInsn(RETURN);
@@ -202,25 +212,34 @@
mv.visitTypeInsn(NEW, eType.getInternalName());
mv.visitInsn(DUP);
mv.visitLdcInsn(message);
- mv.visitMethodInsn(INVOKESPECIAL, eType.getInternalName(), "<init>", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type
- .getType(String.class)}));
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ eType.getInternalName(),
+ "<init>",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.getType(String.class)}));
mv.visitInsn(ATHROW);
}
private void implementPrimaryKey() {
final KeyModel pk = model.getPrimaryKey();
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "primaryKey", Type
- .getMethodDescriptor(Type.getType(Key.class), new Type[] {Type
- .getType(Object.class)}), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "primaryKey",
+ Type.getMethodDescriptor(
+ Type.getType(Key.class), new Type[] {Type.getType(Object.class)}),
+ null,
+ null);
mv.visitCode();
if (pk != null && pk.getField().isNested()) {
final ColumnModel pkf = pk.getField();
mv.visitVarInsn(ALOAD, 1);
mv.visitTypeInsn(CHECKCAST, entityType.getInternalName());
- mv.visitFieldInsn(GETFIELD, entityType.getInternalName(), pkf
- .getFieldName(), CodeGenSupport.toType(pkf).getDescriptor());
+ mv.visitFieldInsn(
+ GETFIELD,
+ entityType.getInternalName(),
+ pkf.getFieldName(),
+ CodeGenSupport.toType(pkf).getDescriptor());
} else {
mv.visitInsn(ACONST_NULL);
}
@@ -233,18 +252,24 @@
final KeyModel pk = model.getPrimaryKey();
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "get", Type.getMethodDescriptor(
- Type.getType(Object.class), new Type[] {Type.getType(Key.class)}),
- null, new String[] {Type.getType(OrmException.class)
- .getInternalName()});
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "get",
+ Type.getMethodDescriptor(
+ Type.getType(Object.class), new Type[] {Type.getType(Key.class)}),
+ null,
+ new String[] {Type.getType(OrmException.class).getInternalName()});
mv.visitCode();
if (pk != null && pk.getField().isNested()) {
final Type keyType = CodeGenSupport.toType(pk.getField());
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
mv.visitTypeInsn(CHECKCAST, keyType.getInternalName());
- mv.visitMethodInsn(INVOKEVIRTUAL, implTypeName, pk.getName(), Type
- .getMethodDescriptor(entityType, new Type[] {keyType}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ implTypeName,
+ pk.getName(),
+ Type.getMethodDescriptor(entityType, new Type[] {keyType}));
mv.visitInsn(ARETURN);
} else {
throwUnsupported(mv, model.getMethodName() + " does not support get(Key)");
@@ -255,13 +280,19 @@
private void implementNewEntityInstance() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "newEntityInstance", Type
- .getMethodDescriptor(Type.getType(Object.class), new Type[] {}),
- null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "newEntityInstance",
+ Type.getMethodDescriptor(Type.getType(Object.class), new Type[] {}),
+ null,
+ null);
mv.visitCode();
mv.visitTypeInsn(NEW, entityType.getInternalName());
mv.visitInsn(DUP);
- mv.visitMethodInsn(INVOKESPECIAL, entityType.getInternalName(), "<init>",
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ entityType.getInternalName(),
+ "<init>",
Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
mv.visitInsn(ARETURN);
mv.visitMaxs(-1, -1);
@@ -270,11 +301,14 @@
private void implementBindOne(final DmlType type) {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, type.methodName, Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {
- Type.getType(PreparedStatement.class),
- Type.getType(Object.class)}), null, new String[] {Type.getType(
- SQLException.class).getInternalName()});
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ type.methodName,
+ Type.getMethodDescriptor(
+ Type.VOID_TYPE,
+ new Type[] {Type.getType(PreparedStatement.class), Type.getType(Object.class)}),
+ null,
+ new String[] {Type.getType(SQLException.class).getInternalName()});
mv.visitCode();
if (type != DmlType.INSERT && model.getPrimaryKey() == null) {
@@ -331,8 +365,8 @@
mv.visitEnd();
}
- private void doBindOne(final MethodVisitor mv, final CodeGenSupport cgs,
- final ColumnModel field) {
+ private void doBindOne(
+ final MethodVisitor mv, final CodeGenSupport cgs, final ColumnModel field) {
if (field.isNested() && field.isNotNull()) {
for (final ColumnModel c : field.getAllLeafColumns()) {
doBindOne(mv, cgs, c);
@@ -368,11 +402,14 @@
private void implementBindOneFetch() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "bindOneFetch", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {
- Type.getType(ResultSet.class), Type.getType(Object.class)}),
- null, new String[] {Type.getType(SQLException.class)
- .getInternalName()});
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "bindOneFetch",
+ Type.getMethodDescriptor(
+ Type.VOID_TYPE,
+ new Type[] {Type.getType(ResultSet.class), Type.getType(Object.class)}),
+ null,
+ new String[] {Type.getType(SQLException.class).getInternalName()});
mv.visitCode();
mv.visitVarInsn(ALOAD, 2);
@@ -382,8 +419,7 @@
final CodeGenSupport cgs = new CodeGenSupport(mv);
cgs.setEntityType(entityType);
- if (model.getPrimaryKey() != null
- && model.getPrimaryKey().getField().isNested()) {
+ if (model.getPrimaryKey() != null && model.getPrimaryKey().getField().isNested()) {
final ColumnModel pkf = model.getPrimaryKey().getField();
final Type vType = CodeGenSupport.toType(pkf);
final int oldIdx = cgs.getColumnIndex();
@@ -391,8 +427,11 @@
cgs.fieldSetBegin();
mv.visitTypeInsn(NEW, vType.getInternalName());
mv.visitInsn(DUP);
- mv.visitMethodInsn(INVOKESPECIAL, vType.getInternalName(), "<init>", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ vType.getInternalName(),
+ "<init>",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
cgs.fieldSetEnd();
cgs.resetColumnIndex(oldIdx);
}
@@ -410,8 +449,11 @@
mv.visitEnd();
}
- private void doFetchOne(final MethodVisitor mv, final CodeGenSupport cgs,
- final ColumnModel field, final int reportLiveInto) {
+ private void doFetchOne(
+ final MethodVisitor mv,
+ final CodeGenSupport cgs,
+ final ColumnModel field,
+ final int reportLiveInto) {
if (field.isNested()) {
int oldIdx = cgs.getColumnIndex();
final Type vType = CodeGenSupport.toType(field);
@@ -429,8 +471,11 @@
cgs.fieldSetBegin();
mv.visitTypeInsn(NEW, vType.getInternalName());
mv.visitInsn(DUP);
- mv.visitMethodInsn(INVOKESPECIAL, vType.getInternalName(), "<init>", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ vType.getInternalName(),
+ "<init>",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
cgs.fieldSetEnd();
cgs.resetColumnIndex(oldIdx);
@@ -465,8 +510,7 @@
} else {
final int dupTo;
- if (reportLiveInto >= 0
- && CodeGenSupport.toType(field).getSort() == Type.OBJECT) {
+ if (reportLiveInto >= 0 && CodeGenSupport.toType(field).getSort() == Type.OBJECT) {
dupTo = cgs.newLocal();
} else {
dupTo = -1;
@@ -484,9 +528,11 @@
cgs.freeLocal(dupTo);
} else {
cgs.pushSqlHandle();
- mv.visitMethodInsn(INVOKEINTERFACE, Type.getType(ResultSet.class)
- .getInternalName(), "wasNull", Type.getMethodDescriptor(
- Type.BOOLEAN_TYPE, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ Type.getType(ResultSet.class).getInternalName(),
+ "wasNull",
+ Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {}));
mv.visitJumpInsn(IFNE, wasnull);
}
mv.visitIincInsn(reportLiveInto, 1);
@@ -501,8 +547,7 @@
query.append(model.getSelectSql(dialect, REL_ALIAS));
query.append(" WHERE ");
int nth = 1;
- for (final Iterator<ColumnModel> i = info.getAllLeafColumns().iterator(); i
- .hasNext();) {
+ for (final Iterator<ColumnModel> i = info.getAllLeafColumns().iterator(); i.hasNext(); ) {
final ColumnModel c = i.next();
query.append(REL_ALIAS);
query.append('.');
@@ -515,39 +560,46 @@
}
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, info.getName(), Type
- .getMethodDescriptor(entityType, new Type[] {keyType}), null,
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ info.getName(),
+ Type.getMethodDescriptor(entityType, new Type[] {keyType}),
+ null,
new String[] {Type.getType(OrmException.class).getInternalName()});
mv.visitCode();
final int keyvar = 1, psvar = keyvar + keyType.getSize();
mv.visitVarInsn(ALOAD, 0);
mv.visitLdcInsn(query.toString());
- mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "prepareStatement", Type
- .getMethodDescriptor(Type.getType(PreparedStatement.class),
- new Type[] {Type.getType(String.class)}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ superTypeName,
+ "prepareStatement",
+ Type.getMethodDescriptor(
+ Type.getType(PreparedStatement.class), new Type[] {Type.getType(String.class)}));
mv.visitVarInsn(ASTORE, psvar);
- final CodeGenSupport cgs = new CodeGenSupport(mv) {
- @Override
- public void pushSqlHandle() {
- mv.visitVarInsn(ALOAD, psvar);
- }
+ final CodeGenSupport cgs =
+ new CodeGenSupport(mv) {
+ @Override
+ public void pushSqlHandle() {
+ mv.visitVarInsn(ALOAD, psvar);
+ }
- @Override
- public void pushFieldValue() {
- appendGetField(getFieldReference());
- }
+ @Override
+ public void pushFieldValue() {
+ appendGetField(getFieldReference());
+ }
- @Override
- protected void appendGetField(final ColumnModel c) {
- if (c.getParent() == null) {
- loadVar(keyType, keyvar);
- } else {
- super.appendGetField(c);
- }
- }
- };
+ @Override
+ protected void appendGetField(final ColumnModel c) {
+ if (c.getParent() == null) {
+ loadVar(keyType, keyvar);
+ } else {
+ super.appendGetField(c);
+ }
+ }
+ };
for (final ColumnModel c : info.getAllLeafColumns()) {
cgs.setFieldReference(c);
dialect.getSqlTypeInfo(c).generatePreparedStatementSet(cgs);
@@ -555,9 +607,12 @@
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, psvar);
- mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "queryOne", Type
- .getMethodDescriptor(Type.getType(Object.class), new Type[] {Type
- .getType(PreparedStatement.class)}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ superTypeName,
+ "queryOne",
+ Type.getMethodDescriptor(
+ Type.getType(Object.class), new Type[] {Type.getType(PreparedStatement.class)}));
mv.visitTypeInsn(CHECKCAST, entityType.getInternalName());
mv.visitInsn(ARETURN);
mv.visitMaxs(-1, -1);
@@ -576,10 +631,13 @@
query.append(" IN");
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getBySqlIn", Type
- .getMethodDescriptor(Type
- .getType(com.google.gwtorm.server.ResultSet.class),
- new Type[] {Type.getType(Collection.class)}), null,
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "getBySqlIn",
+ Type.getMethodDescriptor(
+ Type.getType(com.google.gwtorm.server.ResultSet.class),
+ new Type[] {Type.getType(Collection.class)}),
+ null,
new String[] {Type.getType(OrmException.class).getInternalName()});
mv.visitCode();
@@ -592,15 +650,21 @@
mv.visitVarInsn(ALOAD, 0);
mv.visitLdcInsn(query.toString());
mv.visitVarInsn(ALOAD, keyset);
- mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "prepareBySqlIn", Type
- .getMethodDescriptor(Type.getType(PreparedStatement.class), new Type[] {
- Type.getType(String.class), Type.getType(Collection.class)}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ superTypeName,
+ "prepareBySqlIn",
+ Type.getMethodDescriptor(
+ Type.getType(PreparedStatement.class),
+ new Type[] {Type.getType(String.class), Type.getType(Collection.class)}));
mv.visitVarInsn(ASTORE, psvar);
mv.visitVarInsn(ALOAD, keyset);
- mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Collection.class),
- "iterator", Type.getMethodDescriptor(Type.getType(Iterator.class),
- new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ Type.getInternalName(Collection.class),
+ "iterator",
+ Type.getMethodDescriptor(Type.getType(Iterator.class), new Type[] {}));
mv.visitVarInsn(ASTORE, itrvar);
mv.visitInsn(ICONST_1);
@@ -610,43 +674,48 @@
final Label again = new Label();
mv.visitLabel(again);
mv.visitVarInsn(ALOAD, itrvar);
- mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Iterator.class),
- "hasNext", Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ Type.getInternalName(Iterator.class),
+ "hasNext",
+ Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {}));
mv.visitJumpInsn(IFEQ, endbind);
mv.visitVarInsn(ALOAD, itrvar);
- mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Iterator.class),
- "next", Type.getMethodDescriptor(Type.getType(Object.class),
- new Type[] {}));
- mv.visitTypeInsn(CHECKCAST, CodeGenSupport.toType(pk.getField())
- .getInternalName());
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ Type.getInternalName(Iterator.class),
+ "next",
+ Type.getMethodDescriptor(Type.getType(Object.class), new Type[] {}));
+ mv.visitTypeInsn(CHECKCAST, CodeGenSupport.toType(pk.getField()).getInternalName());
mv.visitVarInsn(ASTORE, keyvar);
- final CodeGenSupport cgs = new CodeGenSupport(mv) {
- @Override
- public void pushSqlHandle() {
- mv.visitVarInsn(ALOAD, psvar);
- }
+ final CodeGenSupport cgs =
+ new CodeGenSupport(mv) {
+ @Override
+ public void pushSqlHandle() {
+ mv.visitVarInsn(ALOAD, psvar);
+ }
- @Override
- public void pushFieldValue() {
- appendGetField(getFieldReference());
- }
+ @Override
+ public void pushFieldValue() {
+ appendGetField(getFieldReference());
+ }
- @Override
- public void pushColumnIndex() {
- mv.visitVarInsn(ILOAD, colvar);
- }
+ @Override
+ public void pushColumnIndex() {
+ mv.visitVarInsn(ILOAD, colvar);
+ }
- @Override
- protected void appendGetField(final ColumnModel c) {
- if (c.getParent() == null) {
- mv.visitVarInsn(ALOAD, keyvar);
- } else {
- super.appendGetField(c);
- }
- }
- };
+ @Override
+ protected void appendGetField(final ColumnModel c) {
+ if (c.getParent() == null) {
+ mv.visitVarInsn(ALOAD, keyvar);
+ } else {
+ super.appendGetField(c);
+ }
+ }
+ };
cgs.setFieldReference(pkcol);
dialect.getSqlTypeInfo(pkcol).generatePreparedStatementSet(cgs);
@@ -656,8 +725,12 @@
mv.visitLabel(endbind);
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, psvar);
- mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "queryList", Type
- .getMethodDescriptor(Type.getType(com.google.gwtorm.server.ResultSet.class),
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ superTypeName,
+ "queryList",
+ Type.getMethodDescriptor(
+ Type.getType(com.google.gwtorm.server.ResultSet.class),
new Type[] {Type.getType(PreparedStatement.class)}));
mv.visitInsn(ARETURN);
mv.visitMaxs(-1, -1);
@@ -683,42 +756,48 @@
final int psvar = nextVar++;
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, info.getName(), Type
- .getMethodDescriptor(Type
- .getType(com.google.gwtorm.server.ResultSet.class), pTypes),
- null, new String[] {Type.getType(OrmException.class)
- .getInternalName()});
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ info.getName(),
+ Type.getMethodDescriptor(
+ Type.getType(com.google.gwtorm.server.ResultSet.class), pTypes),
+ null,
+ new String[] {Type.getType(OrmException.class).getInternalName()});
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitLdcInsn(info.getSelectSql(dialect, REL_ALIAS));
- mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "prepareStatement", Type
- .getMethodDescriptor(Type.getType(PreparedStatement.class),
- new Type[] {Type.getType(String.class)}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ superTypeName,
+ "prepareStatement",
+ Type.getMethodDescriptor(
+ Type.getType(PreparedStatement.class), new Type[] {Type.getType(String.class)}));
mv.visitVarInsn(ASTORE, psvar);
final int argIdx[] = new int[] {0};
- final CodeGenSupport cgs = new CodeGenSupport(mv) {
- @Override
- public void pushSqlHandle() {
- mv.visitVarInsn(ALOAD, psvar);
- }
+ final CodeGenSupport cgs =
+ new CodeGenSupport(mv) {
+ @Override
+ public void pushSqlHandle() {
+ mv.visitVarInsn(ALOAD, psvar);
+ }
- @Override
- public void pushFieldValue() {
- appendGetField(getFieldReference());
- }
+ @Override
+ public void pushFieldValue() {
+ appendGetField(getFieldReference());
+ }
- @Override
- protected void appendGetField(final ColumnModel c) {
- final int n = argIdx[0];
- if (c == pCols.get(n)) {
- loadVar(pTypes[n], pVars[n]);
- } else {
- super.appendGetField(c);
- }
- }
- };
+ @Override
+ protected void appendGetField(final ColumnModel c) {
+ final int n = argIdx[0];
+ if (c == pCols.get(n)) {
+ loadVar(pTypes[n], pVars[n]);
+ } else {
+ super.appendGetField(c);
+ }
+ }
+ };
for (final ColumnModel c : pCols) {
if (c.isNested()) {
for (final ColumnModel n : c.getAllLeafColumns()) {
@@ -737,18 +816,19 @@
mv.visitVarInsn(ALOAD, psvar);
if (hasLimitParam) {
if (dialect.selectHasLimit()) {
- CodeGenSupport cgs2 = new CodeGenSupport(mv) {
- @Override
- public void pushSqlHandle() {
- mv.visitVarInsn(ALOAD, psvar);
- }
+ CodeGenSupport cgs2 =
+ new CodeGenSupport(mv) {
+ @Override
+ public void pushSqlHandle() {
+ mv.visitVarInsn(ALOAD, psvar);
+ }
- @Override
- public void pushFieldValue() {
- final int n = argIdx[0];
- loadVar(pTypes[n], pVars[n]);
- }
- };
+ @Override
+ public void pushFieldValue() {
+ final int n = argIdx[0];
+ loadVar(pTypes[n], pVars[n]);
+ }
+ };
cgs2.resetColumnIndex(cgs.getColumnIndex() + 1);
dialect.getSqlTypeInfo(Integer.TYPE).generatePreparedStatementSet(cgs2);
}
@@ -756,16 +836,22 @@
} else {
cgs.push(info.getStaticLimit());
}
- mv.visitMethodInsn(INVOKEINTERFACE, Type.getType(
- PreparedStatement.class).getInternalName(), "setMaxRows", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE}));
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ Type.getType(PreparedStatement.class).getInternalName(),
+ "setMaxRows",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE}));
}
}
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, psvar);
- mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "queryList", Type
- .getMethodDescriptor(Type.getType(com.google.gwtorm.server.ResultSet.class),
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ superTypeName,
+ "queryList",
+ Type.getMethodDescriptor(
+ Type.getType(com.google.gwtorm.server.ResultSet.class),
new Type[] {Type.getType(PreparedStatement.class)}));
mv.visitInsn(ARETURN);
mv.visitMaxs(-1, -1);
diff --git a/src/main/java/com/google/gwtorm/jdbc/Database.java b/src/main/java/com/google/gwtorm/jdbc/Database.java
index 0de0f11..2db2833 100644
--- a/src/main/java/com/google/gwtorm/jdbc/Database.java
+++ b/src/main/java/com/google/gwtorm/jdbc/Database.java
@@ -26,24 +26,21 @@
import com.google.gwtorm.server.SchemaFactory;
import com.google.gwtorm.server.SchemaGen;
import com.google.gwtorm.server.StandardKeyEncoder;
-
import java.sql.Connection;
import java.sql.SQLException;
-
import javax.sql.DataSource;
/**
* Constructor for application {@link Schema} extensions.
- * <p>
- * Applications should use the Database class to create instances of their
- * Schema extension interface, and thus open and connect to the JDBC data store.
- * <p>
- * Creating a new Database instance is expensive, due to the type analysis and
- * code generation performed to implement the Schema and Access interfaces.
- * Applications should create and cache their Database instance for the live of
- * the application.
- * <p>
- * Database instances are thread-safe, but returned Schema instances are not.
+ *
+ * <p>Applications should use the Database class to create instances of their Schema extension
+ * interface, and thus open and connect to the JDBC data store.
+ *
+ * <p>Creating a new Database instance is expensive, due to the type analysis and code generation
+ * performed to implement the Schema and Access interfaces. Applications should create and cache
+ * their Database instance for the live of the application.
+ *
+ * <p>Database instances are thread-safe, but returned Schema instances are not.
*
* @param <T>
*/
@@ -62,11 +59,10 @@
*
* @param ds JDBC connection information
* @param schema application extension of the Schema interface to implement.
- * @throws OrmException the schema interface is incorrectly defined, or the
- * driver class is not available through the current class loader.
+ * @throws OrmException the schema interface is incorrectly defined, or the driver class is not
+ * available through the current class loader.
*/
- public Database(final DataSource ds, final Class<T> schema)
- throws OrmException {
+ public Database(final DataSource ds, final Class<T> schema) throws OrmException {
dataSource = ds;
SqlDialect dialect;
@@ -89,16 +85,21 @@
}
@SuppressWarnings({"unchecked", "rawtypes"})
- private Class<T> generate(final SqlDialect dialect,
- final GeneratedClassLoader loader) throws OrmException {
- return new SchemaGen(loader, schemaModel, getClass(), JdbcSchema.class,
- new SchemaGen.AccessGenerator() {
- @Override
- public Class<?> create(GeneratedClassLoader loader, RelationModel rm)
- throws OrmException {
- return new AccessGen(loader, rm, dialect).create();
- }
- }).create();
+ private Class<T> generate(final SqlDialect dialect, final GeneratedClassLoader loader)
+ throws OrmException {
+ return new SchemaGen(
+ loader,
+ schemaModel,
+ getClass(),
+ JdbcSchema.class,
+ new SchemaGen.AccessGenerator() {
+ @Override
+ public Class<?> create(GeneratedClassLoader loader, RelationModel rm)
+ throws OrmException {
+ return new AccessGen(loader, rm, dialect).create();
+ }
+ })
+ .create();
}
SqlDialect getDialect() {
@@ -113,9 +114,8 @@
* Open a new connection to the database and get a Schema wrapper.
*
* @return a new JDBC connection, wrapped up in the application's Schema.
- * @throws OrmException the connection could not be opened to the database.
- * The JDBC exception detail should be examined to determine the root
- * cause of the connection failure.
+ * @throws OrmException the connection could not be opened to the database. The JDBC exception
+ * detail should be examined to determine the root cause of the connection failure.
*/
@Override
public T open() throws OrmException {
diff --git a/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java b/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java
index 7335427..c1ca085 100644
--- a/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java
+++ b/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java
@@ -22,7 +22,6 @@
import com.google.gwtorm.server.ListResultSet;
import com.google.gwtorm.server.OrmConcurrencyException;
import com.google.gwtorm.server.OrmException;
-
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -32,8 +31,7 @@
import java.util.List;
/** Internal base class for implementations of {@link Access}. */
-public abstract class JdbcAccess<T, K extends Key<?>> extends
- AbstractAccess<T, K> {
+public abstract class JdbcAccess<T, K extends Key<?>> extends AbstractAccess<T, K> {
private final JdbcSchema schema;
protected JdbcAccess(final JdbcSchema s) {
@@ -66,30 +64,30 @@
case 0:
// Nothing requested, nothing to return.
//
- return new ListResultSet<>(Collections.<T> emptyList());
+ return new ListResultSet<>(Collections.<T>emptyList());
- case 1: {
- // Only one key requested, use a faster equality lookup.
- //
- final T entity = get(keySet.iterator().next());
- if (entity != null) {
- return new ListResultSet<>(Collections.singletonList(entity));
+ case 1:
+ {
+ // Only one key requested, use a faster equality lookup.
+ //
+ final T entity = get(keySet.iterator().next());
+ if (entity != null) {
+ return new ListResultSet<>(Collections.singletonList(entity));
+ }
+ return new ListResultSet<>(Collections.<T>emptyList());
}
- return new ListResultSet<>(Collections.<T> emptyList());
- }
default:
return getBySqlIn(keySet);
}
}
- protected com.google.gwtorm.server.ResultSet<T> getBySqlIn(
- final Collection<K> keys) throws OrmException {
+ protected com.google.gwtorm.server.ResultSet<T> getBySqlIn(final Collection<K> keys)
+ throws OrmException {
return super.get(keys);
}
- protected PreparedStatement prepareStatement(final String sql)
- throws OrmException {
+ protected PreparedStatement prepareStatement(final String sql) throws OrmException {
try {
return schema.getConnection().prepareStatement(sql);
} catch (SQLException e) {
@@ -97,8 +95,8 @@
}
}
- protected PreparedStatement prepareBySqlIn(final String sql,
- final Collection<K> keys) throws OrmException {
+ protected PreparedStatement prepareBySqlIn(final String sql, final Collection<K> keys)
+ throws OrmException {
final int n = keys.size();
final StringBuilder buf = new StringBuilder(sql.length() + n << 1 + 1);
buf.append(sql);
@@ -138,15 +136,15 @@
}
}
- protected com.google.gwtorm.server.ResultSet<T> queryList(
- final PreparedStatement ps) throws OrmException {
+ protected com.google.gwtorm.server.ResultSet<T> queryList(final PreparedStatement ps)
+ throws OrmException {
final ResultSet rs;
try {
rs = ps.executeQuery();
if (!rs.next()) {
rs.close();
ps.close();
- return new ListResultSet<>(Collections.<T> emptyList());
+ return new ListResultSet<>(Collections.<T>emptyList());
}
} catch (SQLException err) {
try {
@@ -174,8 +172,8 @@
}
}
- private void insertIndividually(Iterable<T> instances) throws SQLException,
- OrmConcurrencyException {
+ private void insertIndividually(Iterable<T> instances)
+ throws SQLException, OrmConcurrencyException {
PreparedStatement ps = null;
try {
boolean concurrencyViolationDetected = false;
@@ -199,8 +197,8 @@
}
}
- private void insertAsBatch(final Iterable<T> instances) throws SQLException,
- OrmConcurrencyException {
+ private void insertAsBatch(final Iterable<T> instances)
+ throws SQLException, OrmConcurrencyException {
PreparedStatement ps = null;
try {
int cnt = 0;
@@ -235,8 +233,8 @@
}
}
- private void updateIndividually(Iterable<T> instances) throws SQLException,
- OrmConcurrencyException {
+ private void updateIndividually(Iterable<T> instances)
+ throws SQLException, OrmConcurrencyException {
PreparedStatement ps = null;
try {
boolean concurrencyViolationDetected = false;
@@ -260,8 +258,8 @@
}
}
- private void updateAsBatch(final Iterable<T> instances) throws SQLException,
- OrmConcurrencyException {
+ private void updateAsBatch(final Iterable<T> instances)
+ throws SQLException, OrmConcurrencyException {
PreparedStatement ps = null;
try {
int cnt = 0;
@@ -285,11 +283,9 @@
* Attempt to update instances.
*
* @param instances the instances to attempt to update
- * @return collection of instances that cannot be updated as they are not yet
- * existing
+ * @return collection of instances that cannot be updated as they are not yet existing
*/
- private Collection<T> attemptUpdate(final Iterable<T> instances)
- throws OrmException {
+ private Collection<T> attemptUpdate(final Iterable<T> instances) throws OrmException {
if (schema.getDialect().canDetermineIndividualBatchUpdateCounts()) {
return attemptUpdateAsBatch(instances);
} else {
@@ -297,8 +293,7 @@
}
}
- private Collection<T> attemptUpdatesIndividually(Iterable<T> instances)
- throws OrmException {
+ private Collection<T> attemptUpdatesIndividually(Iterable<T> instances) throws OrmException {
Collection<T> inserts = null;
try {
PreparedStatement ps = null;
@@ -314,7 +309,8 @@
if (inserts == null) {
inserts = new ArrayList<>();
}
- inserts.add(o); }
+ inserts.add(o);
+ }
allInstances.add(o);
}
} finally {
@@ -342,8 +338,7 @@
}
}
- private Collection<T> attemptUpdateAsBatch(final Iterable<T> instances)
- throws OrmException {
+ private Collection<T> attemptUpdateAsBatch(final Iterable<T> instances) throws OrmException {
Collection<T> inserts = null;
try {
PreparedStatement ps = null;
@@ -405,8 +400,8 @@
}
}
- private void deleteIndividually(Iterable<T> instances) throws SQLException,
- OrmConcurrencyException {
+ private void deleteIndividually(Iterable<T> instances)
+ throws SQLException, OrmConcurrencyException {
PreparedStatement ps = null;
try {
boolean concurrencyViolationDetected = false;
@@ -430,8 +425,8 @@
}
}
- private void deleteAsBatch(final Iterable<T> instances) throws SQLException,
- OrmConcurrencyException {
+ private void deleteAsBatch(final Iterable<T> instances)
+ throws SQLException, OrmConcurrencyException {
PreparedStatement ps = null;
try {
int cnt = 0;
@@ -459,7 +454,7 @@
final int numberOfRowsUpdated = schema.getDialect().executeBatch(ps);
if (numberOfRowsUpdated != cnt) {
- throw new OrmConcurrencyException();
+ throw new OrmConcurrencyException();
}
}
@@ -497,15 +492,11 @@
protected abstract String getDeleteOneSql();
- protected abstract void bindOneInsert(PreparedStatement ps, T entity)
- throws SQLException;
+ protected abstract void bindOneInsert(PreparedStatement ps, T entity) throws SQLException;
- protected abstract void bindOneUpdate(PreparedStatement ps, T entity)
- throws SQLException;
+ protected abstract void bindOneUpdate(PreparedStatement ps, T entity) throws SQLException;
- protected abstract void bindOneDelete(PreparedStatement ps, T entity)
- throws SQLException;
+ protected abstract void bindOneDelete(PreparedStatement ps, T entity) throws SQLException;
- protected abstract void bindOneFetch(ResultSet rs, T entity)
- throws SQLException;
+ protected abstract void bindOneFetch(ResultSet rs, T entity) throws SQLException;
}
diff --git a/src/main/java/com/google/gwtorm/jdbc/JdbcExecutor.java b/src/main/java/com/google/gwtorm/jdbc/JdbcExecutor.java
index b310535..e9750da 100644
--- a/src/main/java/com/google/gwtorm/jdbc/JdbcExecutor.java
+++ b/src/main/java/com/google/gwtorm/jdbc/JdbcExecutor.java
@@ -16,7 +16,6 @@
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.StatementExecutor;
-
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
diff --git a/src/main/java/com/google/gwtorm/jdbc/JdbcResultSet.java b/src/main/java/com/google/gwtorm/jdbc/JdbcResultSet.java
index af9a49b..6e26b4d 100644
--- a/src/main/java/com/google/gwtorm/jdbc/JdbcResultSet.java
+++ b/src/main/java/com/google/gwtorm/jdbc/JdbcResultSet.java
@@ -17,7 +17,6 @@
import com.google.gwtorm.client.Key;
import com.google.gwtorm.server.AbstractResultSet;
import com.google.gwtorm.server.OrmRuntimeException;
-
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
diff --git a/src/main/java/com/google/gwtorm/jdbc/JdbcSchema.java b/src/main/java/com/google/gwtorm/jdbc/JdbcSchema.java
index 1173140..0a84978 100644
--- a/src/main/java/com/google/gwtorm/jdbc/JdbcSchema.java
+++ b/src/main/java/com/google/gwtorm/jdbc/JdbcSchema.java
@@ -26,7 +26,6 @@
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.Schema;
import com.google.gwtorm.server.StatementExecutor;
-
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashSet;
@@ -111,8 +110,7 @@
}
}
- private void createSequences(final StatementExecutor e) throws OrmException,
- SQLException {
+ private void createSequences(final StatementExecutor e) throws OrmException, SQLException {
final SqlDialect dialect = dbDef.getDialect();
final SchemaModel model = dbDef.getSchemaModel();
@@ -124,8 +122,7 @@
}
}
- private void createRelations(final StatementExecutor e) throws SQLException,
- OrmException {
+ private void createRelations(final StatementExecutor e) throws SQLException, OrmException {
final SqlDialect dialect = dbDef.getDialect();
final SchemaModel model = dbDef.getSchemaModel();
Set<String> have = dialect.listTables(getConnection());
@@ -139,8 +136,9 @@
private void addColumns(final StatementExecutor e, final RelationModel rel)
throws SQLException, OrmException {
final SqlDialect dialect = dbDef.getDialect();
- Set<String> have = dialect.listColumns( //
- getConnection(), rel.getRelationName().toLowerCase());
+ Set<String> have =
+ dialect.listColumns( //
+ getConnection(), rel.getRelationName().toLowerCase());
for (final ColumnModel c : rel.getColumns()) {
if (!have.contains(c.getColumnName().toLowerCase())) {
dialect.addColumn(e, rel.getRelationName(), c);
@@ -148,16 +146,15 @@
}
}
- public void renameTable(final StatementExecutor e, String from, String to)
- throws OrmException {
+ public void renameTable(final StatementExecutor e, String from, String to) throws OrmException {
Preconditions.checkNotNull(e);
Preconditions.checkNotNull(from);
Preconditions.checkNotNull(to);
getDialect().renameTable(e, from, to);
}
- public void renameField(final StatementExecutor e, String table, String from,
- String to) throws OrmException {
+ public void renameField(final StatementExecutor e, String table, String from, String to)
+ throws OrmException {
final RelationModel rel = findRelationModel(table);
if (rel == null) {
throw new OrmException("Relation " + table + " not defined");
@@ -169,8 +166,8 @@
getDialect().renameColumn(e, table, from, col);
}
- public void renameColumn(final StatementExecutor e, String table, String from,
- String to) throws OrmException {
+ public void renameColumn(final StatementExecutor e, String table, String from, String to)
+ throws OrmException {
final RelationModel rel = findRelationModel(table);
if (rel == null) {
throw new OrmException("Relation " + table + " not defined");
@@ -205,8 +202,7 @@
}
}
- private void pruneSequences(final StatementExecutor e) throws SQLException,
- OrmException {
+ private void pruneSequences(final StatementExecutor e) throws SQLException, OrmException {
final SqlDialect dialect = dbDef.getDialect();
final SchemaModel model = dbDef.getSchemaModel();
HashSet<String> want = new HashSet<>();
@@ -220,8 +216,7 @@
}
}
- private void pruneRelations(final StatementExecutor e) throws SQLException,
- OrmException {
+ private void pruneRelations(final StatementExecutor e) throws SQLException, OrmException {
final SqlDialect dialect = dbDef.getDialect();
final SchemaModel model = dbDef.getSchemaModel();
HashSet<String> want = new HashSet<>();
@@ -242,8 +237,9 @@
for (final ColumnModel c : rel.getColumns()) {
want.add(c.getColumnName().toLowerCase());
}
- for (String column : dialect.listColumns( //
- getConnection(), rel.getRelationName().toLowerCase())) {
+ for (String column :
+ dialect.listColumns( //
+ getConnection(), rel.getRelationName().toLowerCase())) {
if (!want.contains(column)) {
dialect.dropColumn(e, rel.getRelationName(), column);
}
diff --git a/src/main/java/com/google/gwtorm/jdbc/SimpleDataSource.java b/src/main/java/com/google/gwtorm/jdbc/SimpleDataSource.java
index 2536e50..abefb66 100644
--- a/src/main/java/com/google/gwtorm/jdbc/SimpleDataSource.java
+++ b/src/main/java/com/google/gwtorm/jdbc/SimpleDataSource.java
@@ -28,7 +28,6 @@
import java.util.List;
import java.util.Properties;
import java.util.logging.Logger;
-
import javax.sql.DataSource;
/** A simple non-pooling DataSource representation. */
@@ -40,14 +39,13 @@
/**
* Create a non-pooling data source.
- * <p>
- * The JDBC properties information must define at least <code>url</code> and
- * <code>driver</code>, but may also include driver specific properties such
- * as <code>username</code> and <code>password</code>.
+ *
+ * <p>The JDBC properties information must define at least <code>url</code> and <code>driver
+ * </code>, but may also include driver specific properties such as <code>username</code> and
+ * <code>password</code>.
*
* @param dbInfo JDBC connection information. The property table is copied.
- * @throws SQLException the driver class is not available through the current
- * class loader.
+ * @throws SQLException the driver class is not available through the current class loader.
*/
public SimpleDataSource(final Properties dbInfo) throws SQLException {
connectionInfo = new Properties();
@@ -90,8 +88,7 @@
logWriter = new PrintWriter(System.out);
}
- private static SQLException badClasspath(final String classpath,
- final MalformedURLException e1) {
+ private static SQLException badClasspath(final String classpath, final MalformedURLException e1) {
final SQLException sqle;
sqle = new SQLException("Invalid driver classpath " + classpath);
sqle.initCause(e1);
@@ -107,8 +104,7 @@
}
@Override
- public Connection getConnection(String user, String password)
- throws SQLException {
+ public Connection getConnection(String user, String password) throws SQLException {
if (driver != null) {
final Properties info = new Properties(connectionInfo);
if (user != null) {
@@ -138,8 +134,7 @@
}
@Override
- public void setLoginTimeout(int seconds) {
- }
+ public void setLoginTimeout(int seconds) {}
@Override
public boolean isWrapperFor(Class<?> iface) {
@@ -156,8 +151,8 @@
throw new SQLFeatureNotSupportedException();
}
- private static synchronized Driver loadDriver(final String driver,
- final ClassLoader loader) throws SQLException {
+ private static synchronized Driver loadDriver(final String driver, final ClassLoader loader)
+ throws SQLException {
// I've seen some drivers (*cough* Informix *cough*) which won't load
// on multiple threads at the same time. Forcing our code to synchronize
// around loading the driver ensures we won't ever ask for the same driver
diff --git a/src/main/java/com/google/gwtorm/nosql/AccessGen.java b/src/main/java/com/google/gwtorm/nosql/AccessGen.java
index 0a8bbd9..41de1a6 100644
--- a/src/main/java/com/google/gwtorm/nosql/AccessGen.java
+++ b/src/main/java/com/google/gwtorm/nosql/AccessGen.java
@@ -27,18 +27,16 @@
import com.google.gwtorm.server.GeneratedClassLoader;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
-
-import org.antlr.runtime.tree.Tree;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import org.antlr.runtime.tree.Tree;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
/** Generates a concrete implementation of a {@link NoSqlAccess} extension. */
class AccessGen implements Opcodes {
@@ -50,8 +48,7 @@
private static final Type byteArray = Type.getType(byte[].class);
private static final Type ormException = Type.getType(OrmException.class);
private static final Type resultSet = Type.getType(ResultSet.class);
- private static final Type indexKeyBuilder =
- Type.getType(IndexKeyBuilder.class);
+ private static final Type indexKeyBuilder = Type.getType(IndexKeyBuilder.class);
private static final String F_OBJECT_CODEC = "objectCodec";
private static final String F_INDEXES = "indexes";
@@ -68,16 +65,17 @@
private String implClassName;
private String implTypeName;
- AccessGen(final GeneratedClassLoader loader, final RelationModel rm,
+ AccessGen(
+ final GeneratedClassLoader loader,
+ final RelationModel rm,
final Class<? extends NoSqlSchema> schemaClazz,
- @SuppressWarnings("rawtypes")
- final Class<? extends NoSqlAccess> accessClazz) throws OrmException {
+ @SuppressWarnings("rawtypes") final Class<? extends NoSqlAccess> accessClazz)
+ throws OrmException {
classLoader = loader;
model = rm;
try {
- modelClass =
- Class.forName(model.getEntityTypeClassName(), true, classLoader);
+ modelClass = Class.forName(model.getEntityTypeClassName(), true, classLoader);
} catch (ClassNotFoundException cnfe) {
throw new OrmException("Cannot locate model class", cnfe);
}
@@ -88,8 +86,7 @@
key = model.getPrimaryKey();
if (key == null) {
- throw new OrmException("Relation " + rm.getMethodName()
- + " has no primary key");
+ throw new OrmException("Relation " + rm.getMethodName() + " has no primary key");
}
}
@@ -187,52 +184,69 @@
private void init() {
implClassName =
- model.getEntityTypeClassName() + "_Access_" + model.getMethodName()
- + "_" + Util.createRandomName();
+ model.getEntityTypeClassName()
+ + "_Access_"
+ + model.getMethodName()
+ + "_"
+ + Util.createRandomName();
implTypeName = implClassName.replace('.', '/');
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- cw.visit(V1_3, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, implTypeName, null,
- accessType.getInternalName(), new String[] {model
- .getAccessInterfaceName().replace('.', '/')});
+ cw.visit(
+ V1_3,
+ ACC_PUBLIC | ACC_FINAL | ACC_SUPER,
+ implTypeName,
+ null,
+ accessType.getInternalName(),
+ new String[] {model.getAccessInterfaceName().replace('.', '/')});
}
private void implementStaticFields() {
- cw.visitField(ACC_PRIVATE | ACC_STATIC, F_OBJECT_CODEC,
- protobufCodec.getDescriptor(), null, null).visitEnd();
- cw.visitField(ACC_PRIVATE | ACC_STATIC, F_INDEXES,
- Type.getType(IndexFunction[].class).getDescriptor(), null, null)
+ cw.visitField(
+ ACC_PRIVATE | ACC_STATIC, F_OBJECT_CODEC, protobufCodec.getDescriptor(), null, null)
+ .visitEnd();
+ cw.visitField(
+ ACC_PRIVATE | ACC_STATIC,
+ F_INDEXES,
+ Type.getType(IndexFunction[].class).getDescriptor(),
+ null,
+ null)
.visitEnd();
for (final QueryModel q : model.getQueries()) {
if (needsIndexFunction(q)) {
- cw.visitField(ACC_PRIVATE | ACC_STATIC, "index_" + q.getName(),
- indexFunction.getDescriptor(), null, null).visitEnd();
+ cw.visitField(
+ ACC_PRIVATE | ACC_STATIC,
+ "index_" + q.getName(),
+ indexFunction.getDescriptor(),
+ null,
+ null)
+ .visitEnd();
}
}
}
private void implementConstructor() {
final String consName = "<init>";
- final String consDesc =
- Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {schemaType});
- final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
+ final String consDesc = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {schemaType});
+ final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
- mv.visitMethodInsn(INVOKESPECIAL, accessType.getInternalName(), consName,
- consDesc);
+ mv.visitMethodInsn(INVOKESPECIAL, accessType.getInternalName(), consName, consDesc);
mv.visitInsn(RETURN);
mv.visitMaxs(-1, -1);
mv.visitEnd();
}
- private void implementGetString(final String methodName,
- final String returnValue) {
+ private void implementGetString(final String methodName, final String returnValue) {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, methodName, Type
- .getMethodDescriptor(string, new Type[] {}), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ methodName,
+ Type.getMethodDescriptor(string, new Type[] {}),
+ null,
+ null);
mv.visitCode();
mv.visitLdcInsn(returnValue);
mv.visitInsn(ARETURN);
@@ -242,8 +256,12 @@
private void implementGetRelationID() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getRelationID", Type
- .getMethodDescriptor(Type.INT_TYPE, new Type[] {}), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "getRelationID",
+ Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {}),
+ null,
+ null);
mv.visitCode();
new CodeGenSupport(mv).push(model.getRelationID());
mv.visitInsn(IRETURN);
@@ -253,11 +271,14 @@
private void implementGetObjectCodec() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getObjectCodec", Type
- .getMethodDescriptor(protobufCodec, new Type[] {}), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "getObjectCodec",
+ Type.getMethodDescriptor(protobufCodec, new Type[] {}),
+ null,
+ null);
mv.visitCode();
- mv.visitFieldInsn(GETSTATIC, implTypeName, F_OBJECT_CODEC, protobufCodec
- .getDescriptor());
+ mv.visitFieldInsn(GETSTATIC, implTypeName, F_OBJECT_CODEC, protobufCodec.getDescriptor());
mv.visitInsn(ARETURN);
mv.visitMaxs(-1, -1);
mv.visitEnd();
@@ -265,12 +286,15 @@
private void implementGetIndexes() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getIndexes", Type
- .getMethodDescriptor(Type.getType(IndexFunction[].class),
- new Type[] {}), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "getIndexes",
+ Type.getMethodDescriptor(Type.getType(IndexFunction[].class), new Type[] {}),
+ null,
+ null);
mv.visitCode();
- mv.visitFieldInsn(GETSTATIC, implTypeName, F_INDEXES, Type.getType(
- IndexFunction[].class).getDescriptor());
+ mv.visitFieldInsn(
+ GETSTATIC, implTypeName, F_INDEXES, Type.getType(IndexFunction[].class).getDescriptor());
mv.visitInsn(ARETURN);
mv.visitMaxs(-1, -1);
mv.visitEnd();
@@ -279,12 +303,19 @@
private void implementPrimaryKey() {
final ColumnModel f = key.getField();
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "primaryKey", Type
- .getMethodDescriptor(ormKey, new Type[] {object}), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "primaryKey",
+ Type.getMethodDescriptor(ormKey, new Type[] {object}),
+ null,
+ null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 1);
mv.visitTypeInsn(CHECKCAST, entityType.getInternalName());
- mv.visitFieldInsn(GETFIELD, entityType.getInternalName(), f.getFieldName(),
+ mv.visitFieldInsn(
+ GETFIELD,
+ entityType.getInternalName(),
+ f.getFieldName(),
CodeGenSupport.toType(f).getDescriptor());
mv.visitInsn(ARETURN);
mv.visitMaxs(-1, -1);
@@ -295,17 +326,19 @@
final List<ColumnModel> pCols = Collections.singletonList(key.getField());
final Type argType = CodeGenSupport.toType(key.getField());
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "encodePrimaryKey", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {indexKeyBuilder,
- ormKey}), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "encodePrimaryKey",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {indexKeyBuilder, ormKey}),
+ null,
+ null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 2);
mv.visitTypeInsn(CHECKCAST, argType.getInternalName());
mv.visitVarInsn(ASTORE, 2);
- final QueryCGS cgs =
- new QueryCGS(mv, new Type[] {argType}, pCols, new int[] {2}, 1);
+ final QueryCGS cgs = new QueryCGS(mv, new Type[] {argType}, pCols, new int[] {2}, 1);
for (ColumnModel f : pCols) {
IndexFunctionGen.encodeField(new QueryModel.OrderBy(f, false), mv, cgs);
}
@@ -318,15 +351,21 @@
private void implementKeyQuery(KeyModel key) {
final Type keyType = CodeGenSupport.toType(key.getField());
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, key.getName(), Type
- .getMethodDescriptor(entityType, new Type[] {keyType}), null,
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ key.getName(),
+ Type.getMethodDescriptor(entityType, new Type[] {keyType}),
+ null,
new String[] {Type.getType(OrmException.class).getInternalName()});
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
- mv.visitMethodInsn(INVOKESPECIAL, accessType.getInternalName(), "get", Type
- .getMethodDescriptor(object, new Type[] {ormKey}));
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ accessType.getInternalName(),
+ "get",
+ Type.getMethodDescriptor(object, new Type[] {ormKey}));
mv.visitTypeInsn(CHECKCAST, entityType.getInternalName());
mv.visitInsn(ARETURN);
@@ -352,8 +391,11 @@
}
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, info.getName(), Type
- .getMethodDescriptor(resultSet, pTypes), null,
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ info.getName(),
+ Type.getMethodDescriptor(resultSet, pTypes),
+ null,
new String[] {ormException.getInternalName()});
mv.visitCode();
@@ -364,8 +406,11 @@
final int fromBuf = nextVar++;
mv.visitTypeInsn(NEW, indexKeyBuilder.getInternalName());
mv.visitInsn(DUP);
- mv.visitMethodInsn(INVOKESPECIAL, indexKeyBuilder.getInternalName(),
- "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ indexKeyBuilder.getInternalName(),
+ "<init>",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
mv.visitVarInsn(ASTORE, fromBuf);
QueryCGS cgs = new QueryCGS(mv, pTypes, pCols, pVars, fromBuf);
@@ -376,8 +421,11 @@
final int toBuf = nextVar++;
mv.visitTypeInsn(NEW, indexKeyBuilder.getInternalName());
mv.visitInsn(DUP);
- mv.visitMethodInsn(INVOKESPECIAL, indexKeyBuilder.getInternalName(),
- "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ indexKeyBuilder.getInternalName(),
+ "<init>",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
mv.visitVarInsn(ASTORE, toBuf);
cgs = new QueryCGS(mv, pTypes, pCols, pVars, toBuf);
@@ -388,17 +436,23 @@
//
mv.visitVarInsn(ALOAD, 0);
if (needsIndexFunction(info)) {
- mv.visitFieldInsn(GETSTATIC, implTypeName, "index_" + info.getName(),
- indexFunction.getDescriptor());
+ mv.visitFieldInsn(
+ GETSTATIC, implTypeName, "index_" + info.getName(), indexFunction.getDescriptor());
}
mv.visitVarInsn(ALOAD, fromBuf);
- mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
- "toByteArray", Type.getMethodDescriptor(byteArray, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ indexKeyBuilder.getInternalName(),
+ "toByteArray",
+ Type.getMethodDescriptor(byteArray, new Type[] {}));
mv.visitVarInsn(ALOAD, toBuf);
- mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
- "toByteArray", Type.getMethodDescriptor(byteArray, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ indexKeyBuilder.getInternalName(),
+ "toByteArray",
+ Type.getMethodDescriptor(byteArray, new Type[] {}));
// Set the limit on the number of results.
//
@@ -417,16 +471,22 @@
cgs.push(info.hasOrderBy() ? 1 : 0);
if (needsIndexFunction(info)) {
- mv.visitMethodInsn(INVOKEVIRTUAL, accessType.getInternalName(),
- "scanIndex", Type.getMethodDescriptor(resultSet, new Type[] {
- indexFunction, byteArray, byteArray, Type.INT_TYPE,
- Type.BOOLEAN_TYPE}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ accessType.getInternalName(),
+ "scanIndex",
+ Type.getMethodDescriptor(
+ resultSet,
+ new Type[] {indexFunction, byteArray, byteArray, Type.INT_TYPE, Type.BOOLEAN_TYPE}));
} else {
// No where and no order by clause? Use the primary key instead.
//
- mv.visitMethodInsn(INVOKEVIRTUAL, accessType.getInternalName(),
- "scanPrimaryKey", Type.getMethodDescriptor(resultSet, new Type[] {
- byteArray, byteArray, Type.INT_TYPE, Type.BOOLEAN_TYPE}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ accessType.getInternalName(),
+ "scanPrimaryKey",
+ Type.getMethodDescriptor(
+ resultSet, new Type[] {byteArray, byteArray, Type.INT_TYPE, Type.BOOLEAN_TYPE}));
}
mv.visitInsn(ARETURN);
@@ -438,8 +498,9 @@
return info.hasWhere() || info.hasOrderBy();
}
- private void encodeFields(QueryModel qm, List<Tree> query, MethodVisitor mv,
- QueryCGS cgs, boolean fromKey) throws OrmException {
+ private void encodeFields(
+ QueryModel qm, List<Tree> query, MethodVisitor mv, QueryCGS cgs, boolean fromKey)
+ throws OrmException {
final boolean toKey = !fromKey;
Tree lastNode = null;
@@ -490,9 +551,13 @@
break;
default:
- throw new OrmException("Unsupported query token in "
- + model.getMethodName() + "." + qm.getName() + ": "
- + node.toStringTree());
+ throw new OrmException(
+ "Unsupported query token in "
+ + model.getMethodName()
+ + "."
+ + qm.getName()
+ + ": "
+ + node.toStringTree());
}
cgs.nextParameter();
@@ -501,13 +566,16 @@
private void checkLastNode(QueryModel qm, Tree lastNode) throws OrmException {
if (lastNode != null) {
- throw new OrmException(lastNode.getText() + " must be last operator in "
- + model.getMethodName() + "." + qm.getName());
+ throw new OrmException(
+ lastNode.getText()
+ + " must be last operator in "
+ + model.getMethodName()
+ + "."
+ + qm.getName());
}
}
- private void encodeField(Tree node, MethodVisitor mv, QueryCGS cgs)
- throws OrmException {
+ private void encodeField(Tree node, MethodVisitor mv, QueryCGS cgs) throws OrmException {
ColumnModel f = ((QueryParser.Column) node.getChild(0)).getField();
IndexFunctionGen.encodeField(new QueryModel.OrderBy(f, false), mv, cgs);
}
@@ -520,29 +588,31 @@
switch (node.getType()) {
case 0: // nil node used to join other nodes together
case QueryParser.WHERE:
- case QueryParser.AND: {
- List<Tree> res = new ArrayList<>();
- for (int i = 0; i < node.getChildCount(); i++) {
- res.addAll(compareOpsOnly(node.getChild(i)));
+ case QueryParser.AND:
+ {
+ List<Tree> res = new ArrayList<>();
+ for (int i = 0; i < node.getChildCount(); i++) {
+ res.addAll(compareOpsOnly(node.getChild(i)));
+ }
+ return res;
}
- return res;
- }
case QueryParser.GT:
case QueryParser.GE:
case QueryParser.EQ:
case QueryParser.LE:
- case QueryParser.LT: {
- final Tree lhs = node.getChild(0);
- final Tree rhs = node.getChild(1);
- if (lhs.getType() != QueryParser.ID) {
- throw new OrmException("Unsupported query token");
+ case QueryParser.LT:
+ {
+ final Tree lhs = node.getChild(0);
+ final Tree rhs = node.getChild(1);
+ if (lhs.getType() != QueryParser.ID) {
+ throw new OrmException("Unsupported query token");
+ }
+ if (rhs.getType() == QueryParser.PLACEHOLDER) {
+ return Collections.singletonList(node);
+ }
+ break;
}
- if (rhs.getType() == QueryParser.PLACEHOLDER) {
- return Collections.singletonList(node);
- }
- break;
- }
case QueryParser.ORDER:
case QueryParser.LIMIT:
@@ -561,8 +631,8 @@
private final int bufvar;
private int currentp;
- private QueryCGS(MethodVisitor method, Type[] pTypes,
- List<ColumnModel> pCols, int[] pVars, int bufvar) {
+ private QueryCGS(
+ MethodVisitor method, Type[] pTypes, List<ColumnModel> pCols, int[] pVars, int bufvar) {
super(method);
this.pTypes = pTypes;
this.pCols = pCols;
diff --git a/src/main/java/com/google/gwtorm/nosql/CounterShard.java b/src/main/java/com/google/gwtorm/nosql/CounterShard.java
index 4761bce..5c5ccb3 100644
--- a/src/main/java/com/google/gwtorm/nosql/CounterShard.java
+++ b/src/main/java/com/google/gwtorm/nosql/CounterShard.java
@@ -20,20 +20,18 @@
/**
* A single slice of an incrementing counter.
- * <p>
- * <b>This shard class is not thread safe.</b> Implementors using this type must
- * perform synchronization through external mechanisms such as a row-level lock.
- * <p>
- * NoSQL implementations can use this object to store counters and keep track of
- * their values within {@code nextLong(String)}. To improve allocation
- * performance counters may be sliced into shards, with allocation coming out of
- * a randomly selected shard, and each shard being replenished from a master
- * shard when it {@link #isEmpty()}.
+ *
+ * <p><b>This shard class is not thread safe.</b> Implementors using this type must perform
+ * synchronization through external mechanisms such as a row-level lock.
+ *
+ * <p>NoSQL implementations can use this object to store counters and keep track of their values
+ * within {@code nextLong(String)}. To improve allocation performance counters may be sliced into
+ * shards, with allocation coming out of a randomly selected shard, and each shard being replenished
+ * from a master shard when it {@link #isEmpty()}.
*/
public class CounterShard {
/** Standard encoder/decoder for this class. */
- public static final ProtobufCodec<CounterShard> CODEC =
- CodecFactory.encoder(CounterShard.class);
+ public static final ProtobufCodec<CounterShard> CODEC = CodecFactory.encoder(CounterShard.class);
/** Current value in this shard, this is the next to assign out. */
@Column(id = 1)
@@ -43,8 +41,7 @@
@Column(id = 2)
protected long max;
- protected CounterShard() {
- }
+ protected CounterShard() {}
/**
* Create a new shard with a specific starting value, with no maximum.
@@ -59,8 +56,8 @@
* Create a new shard with a specific starting point and maximum.
*
* @param next the first value this shard will hand out.
- * @param max the highest value the shard will stop at. The shard will not
- * actually hand out this value.
+ * @param max the highest value the shard will stop at. The shard will not actually hand out this
+ * value.
*/
public CounterShard(long next, long max) {
this.current = next;
@@ -76,8 +73,7 @@
* Obtain the next value from this shard.
*
* @return the next value
- * @throws IllegalStateException the shard {@link #isEmpty()} and cannot hand
- * out any more values.
+ * @throws IllegalStateException the shard {@link #isEmpty()} and cannot hand out any more values.
*/
public long next() {
if (isEmpty()) {
diff --git a/src/main/java/com/google/gwtorm/nosql/IndexFunction.java b/src/main/java/com/google/gwtorm/nosql/IndexFunction.java
index edc83b9..951bb70 100644
--- a/src/main/java/com/google/gwtorm/nosql/IndexFunction.java
+++ b/src/main/java/com/google/gwtorm/nosql/IndexFunction.java
@@ -16,13 +16,12 @@
/**
* A function to produce a NoSQL secondary index key from an object.
- * <p>
- * An index function computes a row key for a secondary index table by appending
- * the relevant values to the builder's internal buffer in the order they are
- * referenced in the query.
- * <p>
- * Typically an IndexFunction is automatically code generated at runtime by
- * {@link IndexFunctionGen}.
+ *
+ * <p>An index function computes a row key for a secondary index table by appending the relevant
+ * values to the builder's internal buffer in the order they are referenced in the query.
+ *
+ * <p>Typically an IndexFunction is automatically code generated at runtime by {@link
+ * IndexFunctionGen}.
*
* @param <T> type of the object the index record references.
*/
@@ -32,10 +31,10 @@
/**
* Should this object exist in the index?
- * <p>
- * Objects that shouldn't appear in this index are skipped because field
- * values are currently {@code null}, or because one or more field values do
- * not match the constants used in the query that defines the index.
+ *
+ * <p>Objects that shouldn't appear in this index are skipped because field values are currently
+ * {@code null}, or because one or more field values do not match the constants used in the query
+ * that defines the index.
*
* @param object the object to read fields from.
* @return true if the object should be indexed by this index.
diff --git a/src/main/java/com/google/gwtorm/nosql/IndexFunctionGen.java b/src/main/java/com/google/gwtorm/nosql/IndexFunctionGen.java
index ecded5d..73ab914 100644
--- a/src/main/java/com/google/gwtorm/nosql/IndexFunctionGen.java
+++ b/src/main/java/com/google/gwtorm/nosql/IndexFunctionGen.java
@@ -21,14 +21,6 @@
import com.google.gwtorm.server.CodeGenSupport;
import com.google.gwtorm.server.GeneratedClassLoader;
import com.google.gwtorm.server.OrmException;
-
-import org.antlr.runtime.tree.Tree;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -36,13 +28,18 @@
import java.util.Iterator;
import java.util.List;
import java.util.Set;
+import org.antlr.runtime.tree.Tree;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
/** Generates {@link IndexFunction} implementations. */
class IndexFunctionGen<T> implements Opcodes {
private static final Type string = Type.getType(String.class);
private static final Type object = Type.getType(Object.class);
- private static final Type indexKeyBuilder =
- Type.getType(IndexKeyBuilder.class);
+ private static final Type indexKeyBuilder = Type.getType(IndexKeyBuilder.class);
private final GeneratedClassLoader classLoader;
private final QueryModel query;
@@ -55,8 +52,7 @@
private String implClassName;
private String implTypeName;
- IndexFunctionGen(final GeneratedClassLoader loader, final QueryModel qm,
- final Class<T> t) {
+ IndexFunctionGen(final GeneratedClassLoader loader, final QueryModel qm, final Class<T> t) {
classLoader = loader;
query = qm;
@@ -149,21 +145,23 @@
private void init() {
superTypeName = Type.getInternalName(IndexFunction.class);
implClassName =
- pojo.getName() + "_IndexFunction_" + query.getName() + "_"
- + Util.createRandomName();
+ pojo.getName() + "_IndexFunction_" + query.getName() + "_" + Util.createRandomName();
implTypeName = implClassName.replace('.', '/');
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- cw.visit(V1_3, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, implTypeName, null,
- superTypeName, new String[] {});
+ cw.visit(
+ V1_3,
+ ACC_PUBLIC | ACC_FINAL | ACC_SUPER,
+ implTypeName,
+ null,
+ superTypeName,
+ new String[] {});
}
private void implementConstructor() {
final String consName = "<init>";
- final String consDesc =
- Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {});
- final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
+ final String consDesc = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {});
+ final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
@@ -176,9 +174,12 @@
private void implementGetName() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getName", Type
- .getMethodDescriptor(Type.getType(String.class), new Type[] {}),
- null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "getName",
+ Type.getMethodDescriptor(Type.getType(String.class), new Type[] {}),
+ null,
+ null);
mv.visitCode();
mv.visitLdcInsn(query.getName());
mv.visitInsn(ARETURN);
@@ -188,8 +189,12 @@
private void implementIncludes() throws OrmException {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, "includes", Type.getMethodDescriptor(
- Type.BOOLEAN_TYPE, new Type[] {object}), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC,
+ "includes",
+ Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {object}),
+ null,
+ null);
mv.visitCode();
final IncludeCGS cgs = new IncludeCGS(mv);
cgs.setEntityType(pojoType);
@@ -219,8 +224,8 @@
mv.visitEnd();
}
- private static void checkNotNullFields(Collection<ColumnModel> myFields,
- Set<ColumnModel> checked, MethodVisitor mv, IncludeCGS cgs)
+ private static void checkNotNullFields(
+ Collection<ColumnModel> myFields, Set<ColumnModel> checked, MethodVisitor mv, IncludeCGS cgs)
throws OrmException {
for (ColumnModel f : myFields) {
if (f.isNested()) {
@@ -231,8 +236,8 @@
}
}
- private static void checkNotNullScalar(MethodVisitor mv,
- Set<ColumnModel> checked, IncludeCGS cgs, ColumnModel f)
+ private static void checkNotNullScalar(
+ MethodVisitor mv, Set<ColumnModel> checked, IncludeCGS cgs, ColumnModel f)
throws OrmException {
checkParentNotNull(f.getParent(), checked, mv, cgs);
cgs.setFieldReference(f);
@@ -247,36 +252,40 @@
break;
case Type.ARRAY:
- case Type.OBJECT: {
- if (f.getPrimitiveType() == byte[].class) {
- cgs.pushFieldValue();
- mv.visitJumpInsn(IFNULL, cgs.no);
+ case Type.OBJECT:
+ {
+ if (f.getPrimitiveType() == byte[].class) {
+ cgs.pushFieldValue();
+ mv.visitJumpInsn(IFNULL, cgs.no);
- } else if (f.getPrimitiveType() == String.class) {
- cgs.pushFieldValue();
- mv.visitJumpInsn(IFNULL, cgs.no);
+ } else if (f.getPrimitiveType() == String.class) {
+ cgs.pushFieldValue();
+ mv.visitJumpInsn(IFNULL, cgs.no);
- } else if (f.getPrimitiveType() == java.sql.Timestamp.class
- || f.getPrimitiveType() == java.util.Date.class
- || f.getPrimitiveType() == java.sql.Date.class) {
- cgs.pushFieldValue();
- mv.visitJumpInsn(IFNULL, cgs.no);
+ } else if (f.getPrimitiveType() == java.sql.Timestamp.class
+ || f.getPrimitiveType() == java.util.Date.class
+ || f.getPrimitiveType() == java.sql.Date.class) {
+ cgs.pushFieldValue();
+ mv.visitJumpInsn(IFNULL, cgs.no);
- } else {
- throw new OrmException("Type " + f.getPrimitiveType()
- + " not supported for field " + f.getPathToFieldName());
+ } else {
+ throw new OrmException(
+ "Type "
+ + f.getPrimitiveType()
+ + " not supported for field "
+ + f.getPathToFieldName());
+ }
+ break;
}
- break;
- }
default:
- throw new OrmException("Type " + f.getPrimitiveType()
- + " not supported for field " + f.getPathToFieldName());
+ throw new OrmException(
+ "Type " + f.getPrimitiveType() + " not supported for field " + f.getPathToFieldName());
}
}
- private static void checkParentNotNull(ColumnModel f,
- Set<ColumnModel> checked, MethodVisitor mv, IncludeCGS cgs) {
+ private static void checkParentNotNull(
+ ColumnModel f, Set<ColumnModel> checked, MethodVisitor mv, IncludeCGS cgs) {
if (f != null && checked.add(f)) {
checkParentNotNull(f.getParent(), checked, mv, cgs);
cgs.setFieldReference(f);
@@ -285,10 +294,9 @@
}
}
- private void checkConstants(Tree node, MethodVisitor mv, IncludeCGS cgs)
- throws OrmException {
+ private void checkConstants(Tree node, MethodVisitor mv, IncludeCGS cgs) throws OrmException {
switch (node.getType()) {
- // These don't impact the constant evaluation
+ // These don't impact the constant evaluation
case QueryParser.ORDER:
case QueryParser.LIMIT:
break;
@@ -305,52 +313,55 @@
case QueryParser.LE:
case QueryParser.GT:
case QueryParser.GE:
- case QueryParser.EQ: {
- final Tree lhs = node.getChild(0);
- final Tree rhs = node.getChild(1);
- if (lhs.getType() != QueryParser.ID) {
- throw new OrmException("Unsupported query token");
- }
+ case QueryParser.EQ:
+ {
+ final Tree lhs = node.getChild(0);
+ final Tree rhs = node.getChild(1);
+ if (lhs.getType() != QueryParser.ID) {
+ throw new OrmException("Unsupported query token");
+ }
- cgs.setFieldReference(((QueryParser.Column) lhs).getField());
- switch (rhs.getType()) {
- case QueryParser.PLACEHOLDER:
- // Parameter evaluated at runtime
- break;
+ cgs.setFieldReference(((QueryParser.Column) lhs).getField());
+ switch (rhs.getType()) {
+ case QueryParser.PLACEHOLDER:
+ // Parameter evaluated at runtime
+ break;
- case QueryParser.TRUE:
- cgs.pushFieldValue();
- mv.visitJumpInsn(IFEQ, cgs.no);
- break;
-
- case QueryParser.FALSE:
- cgs.pushFieldValue();
- mv.visitJumpInsn(IFNE, cgs.no);
- break;
-
- case QueryParser.CONSTANT_INTEGER:
- cgs.pushFieldValue();
- cgs.push(Integer.parseInt(rhs.getText()));
- mv.visitJumpInsn(IF_ICMPNE, cgs.no);
- break;
-
- case QueryParser.CONSTANT_STRING:
- if (cgs.getFieldReference().getPrimitiveType() == Character.TYPE) {
- cgs.push(dequote(rhs.getText()).charAt(0));
+ case QueryParser.TRUE:
cgs.pushFieldValue();
- mv.visitJumpInsn(IF_ICMPNE, cgs.no);
- } else {
- mv.visitLdcInsn(dequote(rhs.getText()));
- cgs.pushFieldValue();
- mv.visitMethodInsn(INVOKEVIRTUAL, string.getInternalName(),
- "equals", Type.getMethodDescriptor(Type.BOOLEAN_TYPE,
- new Type[] {object}));
mv.visitJumpInsn(IFEQ, cgs.no);
- }
- break;
+ break;
+
+ case QueryParser.FALSE:
+ cgs.pushFieldValue();
+ mv.visitJumpInsn(IFNE, cgs.no);
+ break;
+
+ case QueryParser.CONSTANT_INTEGER:
+ cgs.pushFieldValue();
+ cgs.push(Integer.parseInt(rhs.getText()));
+ mv.visitJumpInsn(IF_ICMPNE, cgs.no);
+ break;
+
+ case QueryParser.CONSTANT_STRING:
+ if (cgs.getFieldReference().getPrimitiveType() == Character.TYPE) {
+ cgs.push(dequote(rhs.getText()).charAt(0));
+ cgs.pushFieldValue();
+ mv.visitJumpInsn(IF_ICMPNE, cgs.no);
+ } else {
+ mv.visitLdcInsn(dequote(rhs.getText()));
+ cgs.pushFieldValue();
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ string.getInternalName(),
+ "equals",
+ Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {object}));
+ mv.visitJumpInsn(IFEQ, cgs.no);
+ }
+ break;
+ }
+ break;
}
- break;
- }
default:
throw new OrmException("Unsupported query token " + node.toStringTree());
@@ -363,8 +374,12 @@
private void implementEncode() throws OrmException {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, "encode", Type.getMethodDescriptor(
- Type.VOID_TYPE, new Type[] {indexKeyBuilder, object}), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC,
+ "encode",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {indexKeyBuilder, object}),
+ null,
+ null);
mv.visitCode();
final EncodeCGS cgs = new EncodeCGS(mv);
cgs.setEntityType(pojoType);
@@ -380,8 +395,9 @@
mv.visitEnd();
}
- static void encodeFields(Collection<QueryModel.OrderBy> myFields,
- final MethodVisitor mv, final EncodeCGS cgs) throws OrmException {
+ static void encodeFields(
+ Collection<QueryModel.OrderBy> myFields, final MethodVisitor mv, final EncodeCGS cgs)
+ throws OrmException {
Iterator<QueryModel.OrderBy> i = myFields.iterator();
while (i.hasNext()) {
QueryModel.OrderBy f = i.next();
@@ -392,8 +408,8 @@
}
}
- static void encodeField(QueryModel.OrderBy f, final MethodVisitor mv,
- final EncodeCGS cgs) throws OrmException {
+ static void encodeField(QueryModel.OrderBy f, final MethodVisitor mv, final EncodeCGS cgs)
+ throws OrmException {
if (f.column.isNested()) {
encodeFields(orderByLeaves(Collections.singletonList(f)), mv, cgs);
} else {
@@ -401,8 +417,8 @@
}
}
- private static void encodeScalar(QueryModel.OrderBy f, final MethodVisitor mv,
- final EncodeCGS cgs) throws OrmException {
+ private static void encodeScalar(
+ QueryModel.OrderBy f, final MethodVisitor mv, final EncodeCGS cgs) throws OrmException {
String method = f.descending ? "desc" : "add";
ColumnModel c = f.column;
cgs.setFieldReference(c);
@@ -416,56 +432,73 @@
cgs.pushBuilder();
cgs.pushFieldValue();
mv.visitInsn(I2L);
- mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
- method, Type.getMethodDescriptor(Type.VOID_TYPE,
- new Type[] {Type.LONG_TYPE}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ indexKeyBuilder.getInternalName(),
+ method,
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.LONG_TYPE}));
break;
case Type.LONG:
cgs.pushBuilder();
cgs.pushFieldValue();
- mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
- method, Type.getMethodDescriptor(Type.VOID_TYPE,
- new Type[] {Type.LONG_TYPE}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ indexKeyBuilder.getInternalName(),
+ method,
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.LONG_TYPE}));
break;
case Type.ARRAY:
- case Type.OBJECT: {
- if (c.getPrimitiveType() == byte[].class) {
- cgs.pushBuilder();
- cgs.pushFieldValue();
- mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
- method, Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type
- .getType(byte[].class)}));
+ case Type.OBJECT:
+ {
+ if (c.getPrimitiveType() == byte[].class) {
+ cgs.pushBuilder();
+ cgs.pushFieldValue();
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ indexKeyBuilder.getInternalName(),
+ method,
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.getType(byte[].class)}));
- } else if (c.getPrimitiveType() == String.class) {
- cgs.pushBuilder();
- cgs.pushFieldValue();
- mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
- method, Type.getMethodDescriptor(Type.VOID_TYPE,
- new Type[] {string}));
+ } else if (c.getPrimitiveType() == String.class) {
+ cgs.pushBuilder();
+ cgs.pushFieldValue();
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ indexKeyBuilder.getInternalName(),
+ method,
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {string}));
- } else if (c.getPrimitiveType() == java.sql.Timestamp.class
- || c.getPrimitiveType() == java.util.Date.class
- || c.getPrimitiveType() == java.sql.Date.class) {
- cgs.pushBuilder();
- cgs.pushFieldValue();
- String tsType = Type.getType(c.getPrimitiveType()).getInternalName();
- mv.visitMethodInsn(INVOKEVIRTUAL, tsType, "getTime", Type
- .getMethodDescriptor(Type.LONG_TYPE, new Type[] {}));
- mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
- method, Type.getMethodDescriptor(Type.VOID_TYPE,
- new Type[] {Type.LONG_TYPE}));
- } else {
- throw new OrmException("Type " + c.getPrimitiveType()
- + " not supported for field " + c.getPathToFieldName());
+ } else if (c.getPrimitiveType() == java.sql.Timestamp.class
+ || c.getPrimitiveType() == java.util.Date.class
+ || c.getPrimitiveType() == java.sql.Date.class) {
+ cgs.pushBuilder();
+ cgs.pushFieldValue();
+ String tsType = Type.getType(c.getPrimitiveType()).getInternalName();
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ tsType,
+ "getTime",
+ Type.getMethodDescriptor(Type.LONG_TYPE, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ indexKeyBuilder.getInternalName(),
+ method,
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.LONG_TYPE}));
+ } else {
+ throw new OrmException(
+ "Type "
+ + c.getPrimitiveType()
+ + " not supported for field "
+ + c.getPathToFieldName());
+ }
+ break;
}
- break;
- }
default:
- throw new OrmException("Type " + c.getPrimitiveType()
- + " not supported for field " + c.getPathToFieldName());
+ throw new OrmException(
+ "Type " + c.getPrimitiveType() + " not supported for field " + c.getPathToFieldName());
}
}
@@ -489,20 +522,29 @@
void infinity() {
pushBuilder();
- mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
- "infinity", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ indexKeyBuilder.getInternalName(),
+ "infinity",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
}
void delimiter() {
pushBuilder();
- mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
- "delimiter", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ indexKeyBuilder.getInternalName(),
+ "delimiter",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
}
void nul() {
pushBuilder();
- mv.visitMethodInsn(INVOKEVIRTUAL, indexKeyBuilder.getInternalName(),
- "nul", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ indexKeyBuilder.getInternalName(),
+ "nul",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
}
void pushBuilder() {
diff --git a/src/main/java/com/google/gwtorm/nosql/IndexKeyBuilder.java b/src/main/java/com/google/gwtorm/nosql/IndexKeyBuilder.java
index 2bed6ce..6df8866 100644
--- a/src/main/java/com/google/gwtorm/nosql/IndexKeyBuilder.java
+++ b/src/main/java/com/google/gwtorm/nosql/IndexKeyBuilder.java
@@ -14,46 +14,41 @@
package com.google.gwtorm.nosql;
-
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
/**
* Encoder support for {@link IndexFunction} computed strings.
- * <p>
- * This class provides a string that may contain multiple values, using
- * delimiters between fields and big-endian encoded numerics. Sorting the
- * resulting strings using unsigned byte orderings produces a stable sorting.
- * <p>
- * The encoding used by this class relies on having 258 tokens. To get the extra
- * 2 tokens within a 256 byte range, escapes are used according to the following
- * simple table:
+ *
+ * <p>This class provides a string that may contain multiple values, using delimiters between fields
+ * and big-endian encoded numerics. Sorting the resulting strings using unsigned byte orderings
+ * produces a stable sorting.
+ *
+ * <p>The encoding used by this class relies on having 258 tokens. To get the extra 2 tokens within
+ * a 256 byte range, escapes are used according to the following simple table:
+ *
* <ul>
- * <li>delimiter = \x00\x01
- * <li>byte \x00 = \x00\xff
- * <li>byte \xff = \xff\x00
- * <li>infinity = \xff\xff
+ * <li>delimiter = \x00\x01
+ * <li>byte \x00 = \x00\xff
+ * <li>byte \xff = \xff\x00
+ * <li>infinity = \xff\xff
* </ul>
- * <p>
- * Integers are encoded as variable length big-endian values, skipping leading
- * zero bytes, prefixed by the number of bytes used to encode them. Therefore 0
- * is encoded as "\x00", and 256 is encoded as "\x02\x01\x00". Negative values
- * are encoded in their twos complement encoding and therefore sort after the
- * maximum positive value.
- * <p>
- * Strings and byte arrays supplied by the caller have their \x00 and \xff
- * values escaped according to the table above, but are otherwise written as-is
- * without a length prefix.
- * <p>
- * Callers are responsible for inserting {@link #delimiter()} markers at the
- * appropriate positions in the sequence.
+ *
+ * <p>Integers are encoded as variable length big-endian values, skipping leading zero bytes,
+ * prefixed by the number of bytes used to encode them. Therefore 0 is encoded as "\x00", and 256 is
+ * encoded as "\x02\x01\x00". Negative values are encoded in their twos complement encoding and
+ * therefore sort after the maximum positive value.
+ *
+ * <p>Strings and byte arrays supplied by the caller have their \x00 and \xff values escaped
+ * according to the table above, but are otherwise written as-is without a length prefix.
+ *
+ * <p>Callers are responsible for inserting {@link #delimiter()} markers at the appropriate
+ * positions in the sequence.
*/
public class IndexKeyBuilder {
private final ByteArrayOutputStream buf = new ByteArrayOutputStream();
- /**
- * Add a delimiter marker to the string.
- */
+ /** Add a delimiter marker to the string. */
public void delimiter() {
buf.write(0x00);
buf.write(0x01);
@@ -61,8 +56,8 @@
/**
* Add the special infinity symbol to the string.
- * <p>
- * The infinity symbol sorts after all other values in the same position.
+ *
+ * <p>The infinity symbol sorts after all other values in the same position.
*/
public void infinity() {
buf.write(0xff);
@@ -71,9 +66,8 @@
/**
* Add \0 to the string.
- * <p>
- * \0 can be used during searches to enforce greater then or less then clauses
- * in a query.
+ *
+ * <p>\0 can be used during searches to enforce greater then or less then clauses in a query.
*/
public void nul() {
buf.write(0x00);
@@ -81,9 +75,9 @@
/**
* Add a raw sequence of bytes.
- * <p>
- * The bytes 0x00 and 0xff are escaped by this method according to the
- * encoding table described in the class documentation.
+ *
+ * <p>The bytes 0x00 and 0xff are escaped by this method according to the encoding table described
+ * in the class documentation.
*
* @param bin array to copy from.
* @param pos first index to copy.
@@ -125,9 +119,9 @@
/**
* Add a raw sequence of bytes.
- * <p>
- * The bytes 0x00 and 0xff are escaped by this method according to the
- * encoding table described in the class documentation.
+ *
+ * <p>The bytes 0x00 and 0xff are escaped by this method according to the encoding table described
+ * in the class documentation.
*
* @param bin the complete array to copy.
*/
@@ -204,9 +198,9 @@
/**
* Add a byte array as-is, without escaping.
- * <p>
- * This should only be used the byte array came from a prior index key and the
- * caller is trying to create a new key with this key embedded at the end.
+ *
+ * <p>This should only be used the byte array came from a prior index key and the caller is trying
+ * to create a new key with this key embedded at the end.
*
* @param bin the binary to append as-is, without further escaping.
*/
diff --git a/src/main/java/com/google/gwtorm/nosql/IndexRow.java b/src/main/java/com/google/gwtorm/nosql/IndexRow.java
index 4986e3a..b4fa059 100644
--- a/src/main/java/com/google/gwtorm/nosql/IndexRow.java
+++ b/src/main/java/com/google/gwtorm/nosql/IndexRow.java
@@ -20,20 +20,17 @@
/**
* Data value stored in a NoSQL secondary index row.
- * <p>
- * Instances of this object can be used inside of the data portion of a
- * secondary index row, and may either contain the key of the primary data row,
- * or a copy of the primary object data.
- * <p>
- * The {@link #timestamp} field can be used to fossil collect secondary index
- * rows that no longer match the primary data row and which are older than the
- * longest expected transaction. These fossil rows may have occurred due to an
- * aborted, but partially applied transaction.
+ *
+ * <p>Instances of this object can be used inside of the data portion of a secondary index row, and
+ * may either contain the key of the primary data row, or a copy of the primary object data.
+ *
+ * <p>The {@link #timestamp} field can be used to fossil collect secondary index rows that no longer
+ * match the primary data row and which are older than the longest expected transaction. These
+ * fossil rows may have occurred due to an aborted, but partially applied transaction.
*/
public class IndexRow {
/** Standard encoder/decoder for this class. */
- public static final ProtobufCodec<IndexRow> CODEC =
- CodecFactory.encoder(IndexRow.class);
+ public static final ProtobufCodec<IndexRow> CODEC = CodecFactory.encoder(IndexRow.class);
/**
* Create an index row to reference the primary data row by key.
@@ -51,9 +48,9 @@
/**
* Clock of the last time this index row was touched.
- * <p>
- * Invalid rows older than a certain time interval may be subject to automatic
- * background pruning during data retrieval operations.
+ *
+ * <p>Invalid rows older than a certain time interval may be subject to automatic background
+ * pruning during data retrieval operations.
*/
@Column(id = 1)
protected long timestamp;
diff --git a/src/main/java/com/google/gwtorm/nosql/NoSqlAccess.java b/src/main/java/com/google/gwtorm/nosql/NoSqlAccess.java
index 9ca1423..c43deaf 100644
--- a/src/main/java/com/google/gwtorm/nosql/NoSqlAccess.java
+++ b/src/main/java/com/google/gwtorm/nosql/NoSqlAccess.java
@@ -22,53 +22,51 @@
import com.google.gwtorm.server.ResultSet;
/** Internal base class for implementations of {@link Access}. */
-public abstract class NoSqlAccess<T, K extends Key<?>> extends
- AbstractAccess<T, K> {
- protected NoSqlAccess(final NoSqlSchema s) {
- }
+public abstract class NoSqlAccess<T, K extends Key<?>> extends AbstractAccess<T, K> {
+ protected NoSqlAccess(final NoSqlSchema s) {}
/**
* Scan a range of keys from the data rows and return any matching objects.
- * <p>
- * All NoSQL implementations must provide their own variant of this method.
- * <p>
- * To fetch a single record with a scan, set {@code toKey} to the same array
- * as {@code fromKey}, but append a trailing NUL byte (0x00). The caller
- * should validate that the returned ResultSet contains no more than 1 row.
+ *
+ * <p>All NoSQL implementations must provide their own variant of this method.
+ *
+ * <p>To fetch a single record with a scan, set {@code toKey} to the same array as {@code
+ * fromKey}, but append a trailing NUL byte (0x00). The caller should validate that the returned
+ * ResultSet contains no more than 1 row.
*
* @param fromKey key to start the scan on. This is inclusive.
* @param toKey key to stop the scan on. This is exclusive.
* @param limit maximum number of results to return, 0 for unlimited.
- * @param order if true the order will be preserved, false if the result order
- * order can be arbitrary.
- * @return result set for the requested range. The result set may be lazily
- * filled, or filled completely.
+ * @param order if true the order will be preserved, false if the result order order can be
+ * arbitrary.
+ * @return result set for the requested range. The result set may be lazily filled, or filled
+ * completely.
* @throws OrmException an error occurred preventing the scan from completing.
*/
- protected abstract ResultSet<T> scanPrimaryKey(byte[] fromKey, byte[] toKey,
- int limit, boolean order) throws OrmException;
+ protected abstract ResultSet<T> scanPrimaryKey(
+ byte[] fromKey, byte[] toKey, int limit, boolean order) throws OrmException;
/**
* Scan a range of keys and return any matching objects.
- * <p>
- * All NoSQL implementations must provide their own variant of this method.
- * <p>
- * To fetch a single record with a scan, set {@code toKey} to the same array
- * as {@code fromKey}, but append a trailing NUL byte (0x00). The caller
- * should validate that the returned ResultSet contains no more than 1 row.
+ *
+ * <p>All NoSQL implementations must provide their own variant of this method.
+ *
+ * <p>To fetch a single record with a scan, set {@code toKey} to the same array as {@code
+ * fromKey}, but append a trailing NUL byte (0x00). The caller should validate that the returned
+ * ResultSet contains no more than 1 row.
*
* @param index definition of the index the scan occurs over.
* @param fromKey key to start the scan on. This is inclusive.
* @param toKey key to stop the scan on. This is exclusive.
* @param limit maximum number of results to return, 0 for unlimited.
- * @param order if true the order will be preserved, false if the result order
- * order can be arbitrary.
- * @return result set for the requested range. The result set may be lazily
- * filled, or filled completely.
+ * @param order if true the order will be preserved, false if the result order order can be
+ * arbitrary.
+ * @return result set for the requested range. The result set may be lazily filled, or filled
+ * completely.
* @throws OrmException an error occurred preventing the scan from completing.
*/
- protected abstract ResultSet<T> scanIndex(IndexFunction<T> index,
- byte[] fromKey, byte[] toKey, int limit, boolean order)
+ protected abstract ResultSet<T> scanIndex(
+ IndexFunction<T> index, byte[] fromKey, byte[] toKey, int limit, boolean order)
throws OrmException;
// -- These are all provided by AccessGen when it builds a subclass --
@@ -78,10 +76,9 @@
/**
* Get the indexes that support query functions.
- * <p>
- * This array may be a subset of the total query functions. This can occur
- * when two or more queries can be efficiently answered by performing a range
- * scan over the same index.
+ *
+ * <p>This array may be a subset of the total query functions. This can occur when two or more
+ * queries can be efficiently answered by performing a range scan over the same index.
*
* @return indexes needed to support queries.
*/
diff --git a/src/main/java/com/google/gwtorm/nosql/NoSqlDatabase.java b/src/main/java/com/google/gwtorm/nosql/NoSqlDatabase.java
index 927df32..414e297 100644
--- a/src/main/java/com/google/gwtorm/nosql/NoSqlDatabase.java
+++ b/src/main/java/com/google/gwtorm/nosql/NoSqlDatabase.java
@@ -28,20 +28,19 @@
/**
* Base class for NoSQL typed databases.
- * <p>
- * Applications should use the database class to create instances of their
- * Schema extension interface, and thus open and connect to the data store.
- * <p>
- * Creating a new database instance is expensive, due to the type analysis and
- * code generation performed to implement the Schema and Access interfaces.
- * Applications should create and cache their database instance for the life of
- * the application.
- * <p>
- * Database instances are thread-safe, but returned Schema instances are not.
- * <p>
- * This class must be further extended by the NoSQL implementation to configure
- * the connectivity with the data store and supply the correct subclass of
- * {@link NoSqlSchema} that knows how to interact with the data store.
+ *
+ * <p>Applications should use the database class to create instances of their Schema extension
+ * interface, and thus open and connect to the data store.
+ *
+ * <p>Creating a new database instance is expensive, due to the type analysis and code generation
+ * performed to implement the Schema and Access interfaces. Applications should create and cache
+ * their database instance for the life of the application.
+ *
+ * <p>Database instances are thread-safe, but returned Schema instances are not.
+ *
+ * <p>This class must be further extended by the NoSQL implementation to configure the connectivity
+ * with the data store and supply the correct subclass of {@link NoSqlSchema} that knows how to
+ * interact with the data store.
*
* @param <T> type of the application's Schema.
* @param <S> type of the implementation's base for Schema implementations.
@@ -60,18 +59,17 @@
/**
* Initialize a new database and generate the implementation.
*
- * @param schemaBaseType class that the generated Schema implementation should
- * extend in order to provide data store connectivity.
- * @param accessBaseType class that the generated Access implementations
- * should extend in order to provide single-relation access for each
- * schema instance.
- * @param appSchema the application schema interface that must be implemented
- * and constructed on demand.
- * @throws OrmException the schema cannot be created because of an annotation
- * error in the interface definitions.
+ * @param schemaBaseType class that the generated Schema implementation should extend in order to
+ * provide data store connectivity.
+ * @param accessBaseType class that the generated Access implementations should extend in order to
+ * provide single-relation access for each schema instance.
+ * @param appSchema the application schema interface that must be implemented and constructed on
+ * demand.
+ * @throws OrmException the schema cannot be created because of an annotation error in the
+ * interface definitions.
*/
- protected NoSqlDatabase(final Class<S> schemaBaseType,
- final Class<A> accessBaseType, final Class<T> appSchema)
+ protected NoSqlDatabase(
+ final Class<S> schemaBaseType, final Class<A> accessBaseType, final Class<T> appSchema)
throws OrmException {
schemaModel = new JavaSchemaModel(appSchema);
final GeneratedClassLoader loader = newLoader(appSchema);
@@ -90,18 +88,24 @@
}
@SuppressWarnings("unchecked")
- private Class<T> generate(final Class<S> schemaBaseType,
- final Class<A> accessBaseType, final GeneratedClassLoader loader)
+ private Class<T> generate(
+ final Class<S> schemaBaseType,
+ final Class<A> accessBaseType,
+ final GeneratedClassLoader loader)
throws OrmException {
- return new SchemaGen(loader, schemaModel, getClass(), schemaBaseType,
- new SchemaGen.AccessGenerator() {
- @Override
- public Class<?> create(GeneratedClassLoader loader, RelationModel rm)
- throws OrmException {
- return new AccessGen(loader, rm, schemaBaseType, accessBaseType)
- .create();
- }
- }).create();
+ return new SchemaGen(
+ loader,
+ schemaModel,
+ getClass(),
+ schemaBaseType,
+ new SchemaGen.AccessGenerator() {
+ @Override
+ public Class<?> create(GeneratedClassLoader loader, RelationModel rm)
+ throws OrmException {
+ return new AccessGen(loader, rm, schemaBaseType, accessBaseType).create();
+ }
+ })
+ .create();
}
private static <T> GeneratedClassLoader newLoader(final Class<T> schema) {
diff --git a/src/main/java/com/google/gwtorm/nosql/NoSqlSchema.java b/src/main/java/com/google/gwtorm/nosql/NoSqlSchema.java
index 349f5b5..f6203d1 100644
--- a/src/main/java/com/google/gwtorm/nosql/NoSqlSchema.java
+++ b/src/main/java/com/google/gwtorm/nosql/NoSqlSchema.java
@@ -21,8 +21,7 @@
/** Internal base class for implementations of {@link Schema}. */
public abstract class NoSqlSchema extends AbstractSchema {
- protected NoSqlSchema(final NoSqlDatabase<?, ?, ?> d) {
- }
+ protected NoSqlSchema(final NoSqlDatabase<?, ?, ?> d) {}
@Override
public void pruneSchema(StatementExecutor e) throws OrmException {
diff --git a/src/main/java/com/google/gwtorm/nosql/RelationCodec.java b/src/main/java/com/google/gwtorm/nosql/RelationCodec.java
index 84add28..d2585a6 100644
--- a/src/main/java/com/google/gwtorm/nosql/RelationCodec.java
+++ b/src/main/java/com/google/gwtorm/nosql/RelationCodec.java
@@ -19,7 +19,6 @@
import com.google.protobuf.CodedOutputStream;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.WireFormat;
-
import java.io.EOFException;
import java.io.IOException;
@@ -28,10 +27,9 @@
/**
* Pop the field number from the stream and return it.
*
- * @param in the stream to pop the field number from. The caller is
- * responsible for making sure the underlying stream had a mark set for
- * at least 8 bytes so the tag can be examined, reset, and later read
- * again during mergeFrom or decode.
+ * @param in the stream to pop the field number from. The caller is responsible for making sure
+ * the underlying stream had a mark set for at least 8 bytes so the tag can be examined,
+ * reset, and later read again during mergeFrom or decode.
* @return the field number of the relation.
* @throws IOException the stream cannot be read.
*/
@@ -71,7 +69,7 @@
@Override
public void mergeFrom(CodedInputStream in, T obj) throws IOException {
boolean found = false;
- for (;;) {
+ for (; ; ) {
int tag = in.readTag();
if (tag == 0) {
if (found) {
@@ -91,8 +89,8 @@
in.popLimit(oldLimit);
found = true;
} else {
- throw new InvalidProtocolBufferException("Field " + fieldId
- + " should be length delimited (wire type 2)");
+ throw new InvalidProtocolBufferException(
+ "Field " + fieldId + " should be length delimited (wire type 2)");
}
} else {
in.skipField(tag);
diff --git a/src/main/java/com/google/gwtorm/nosql/generic/GenericAccess.java b/src/main/java/com/google/gwtorm/nosql/generic/GenericAccess.java
index ecfef33..fe2b3bd 100644
--- a/src/main/java/com/google/gwtorm/nosql/generic/GenericAccess.java
+++ b/src/main/java/com/google/gwtorm/nosql/generic/GenericAccess.java
@@ -28,7 +28,6 @@
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.protobuf.ByteString;
-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -38,8 +37,7 @@
import java.util.Map.Entry;
/** Base implementation for {@link Access} in a {@link GenericDatabase}. */
-public abstract class GenericAccess<T, K extends Key<?>> extends
- NoSqlAccess<T, K> {
+public abstract class GenericAccess<T, K extends Key<?>> extends NoSqlAccess<T, K> {
/** Maximum number of results to cache to improve updates on upsert. */
private static final int MAX_SZ = 64;
@@ -54,12 +52,13 @@
@SuppressWarnings("serial")
protected LinkedHashMap<K, byte[]> cache() {
if (cache == null) {
- cache = new LinkedHashMap<K, byte[]>(8) {
- @Override
- protected boolean removeEldestEntry(Entry<K, byte[]> entry) {
- return MAX_SZ <= size();
- }
- };
+ cache =
+ new LinkedHashMap<K, byte[]>(8) {
+ @Override
+ protected boolean removeEldestEntry(Entry<K, byte[]> entry) {
+ return MAX_SZ <= size();
+ }
+ };
}
return cache;
}
@@ -70,8 +69,7 @@
* @param key the primary key instance; must not be null.
* @return the entity; null if no entity has this key.
* @throws OrmException the data lookup failed.
- * @throws OrmDuplicateKeyException more than one row was identified in the
- * key scan.
+ * @throws OrmDuplicateKeyException more than one row was identified in the key scan.
*/
@Override
public T get(K key) throws OrmException, OrmDuplicateKeyException {
@@ -87,29 +85,31 @@
@Override
public ResultSet<T> get(final Iterable<K> keys) throws OrmException {
- final ResultSet<Row> rs = db.fetchRows(new Iterable<byte[]>() {
- @Override
- public Iterator<byte[]> iterator() {
- return new Iterator<byte[]>() {
- private final Iterator<K> i = keys.iterator();
+ final ResultSet<Row> rs =
+ db.fetchRows(
+ new Iterable<byte[]>() {
+ @Override
+ public Iterator<byte[]> iterator() {
+ return new Iterator<byte[]>() {
+ private final Iterator<K> i = keys.iterator();
- @Override
- public boolean hasNext() {
- return i.hasNext();
- }
+ @Override
+ public boolean hasNext() {
+ return i.hasNext();
+ }
- @Override
- public byte[] next() {
- return dataRowKey(i.next());
- }
+ @Override
+ public byte[] next() {
+ return dataRowKey(i.next());
+ }
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
- };
- }
- });
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+ });
final Iterator<Row> i = rs.iterator();
return new AbstractResultSet<T>() {
@@ -139,15 +139,15 @@
* @param fromKey key to start the scan on. This is inclusive.
* @param toKey key to stop the scan on. This is exclusive.
* @param limit maximum number of results to return.
- * @param order if true the order will be preserved, false if the result order
- * order can be arbitrary.
- * @return result set for the requested range. The result set may be lazily
- * filled, or filled completely.
+ * @param order if true the order will be preserved, false if the result order order can be
+ * arbitrary.
+ * @return result set for the requested range. The result set may be lazily filled, or filled
+ * completely.
* @throws OrmException an error occurred preventing the scan from completing.
*/
@Override
- protected ResultSet<T> scanPrimaryKey(byte[] fromKey, byte[] toKey,
- int limit, boolean order) throws OrmException {
+ protected ResultSet<T> scanPrimaryKey(byte[] fromKey, byte[] toKey, int limit, boolean order)
+ throws OrmException {
IndexKeyBuilder b;
b = new IndexKeyBuilder();
@@ -193,15 +193,16 @@
* @param fromKey key to start the scan on. This is inclusive.
* @param toKey key to stop the scan on. This is exclusive.
* @param limit maximum number of results to return.
- * @param order if true the order will be preserved, false if the result order
- * order can be arbitrary.
- * @return result set for the requested range. The result set may be lazily
- * filled, or filled completely.
+ * @param order if true the order will be preserved, false if the result order order can be
+ * arbitrary.
+ * @return result set for the requested range. The result set may be lazily filled, or filled
+ * completely.
* @throws OrmException an error occurred preventing the scan from completing.
*/
@Override
- protected ResultSet<T> scanIndex(IndexFunction<T> idx, byte[] fromKey,
- byte[] toKey, int limit, boolean order) throws OrmException {
+ protected ResultSet<T> scanIndex(
+ IndexFunction<T> idx, byte[] fromKey, byte[] toKey, int limit, boolean order)
+ throws OrmException {
final long now = System.currentTimeMillis();
IndexKeyBuilder b;
@@ -224,7 +225,8 @@
final ArrayList<T> res = new ArrayList<>();
byte[] lastKey = fromKey;
- SCAN: for (;;) {
+ SCAN:
+ for (; ; ) {
List<CandidateRow> scanned;
if (0 < limit) {
scanned = new ArrayList<>(limit);
@@ -275,7 +277,9 @@
// drop the row out of the index.
//
if (!idxRow.hasData()) {
- db.maybeFossilCollectIndexRow(now, idxRow.getIndexKey(), //
+ db.maybeFossilCollectIndexRow(
+ now,
+ idxRow.getIndexKey(), //
idxRow.getIndexRow());
continue;
}
@@ -293,7 +297,9 @@
break SCAN;
}
} else {
- db.maybeFossilCollectIndexRow(now, idxRow.getIndexKey(), //
+ db.maybeFossilCollectIndexRow(
+ now,
+ idxRow.getIndexKey(), //
idxRow.getIndexRow());
}
}
@@ -387,15 +393,14 @@
/**
* Insert secondary index rows for an object about to be written.
- * <p>
- * Insert or update operations should invoke this method before the main data
- * row is written, allowing the secondary index rows to be put into the data
- * store before the main data row arrives. Compatible scan implementations
- * (such as {@link #scanIndex(IndexFunction, byte[], byte[], int, boolean)}
- * above) will ignore these rows for a short time period.
*
- * @param oldObj an old copy of the object; if non-null this may be used to
- * avoid writing unnecessary secondary index rows that already exist.
+ * <p>Insert or update operations should invoke this method before the main data row is written,
+ * allowing the secondary index rows to be put into the data store before the main data row
+ * arrives. Compatible scan implementations (such as {@link #scanIndex(IndexFunction, byte[],
+ * byte[], int, boolean)} above) will ignore these rows for a short time period.
+ *
+ * @param oldObj an old copy of the object; if non-null this may be used to avoid writing
+ * unnecessary secondary index rows that already exist.
* @param newObj the new (or updated) object being stored. Must not be null.
* @throws OrmException the data store is unable to update an index row.
*/
@@ -414,11 +419,10 @@
/**
* Remove old secondary index rows that are no longer valid for an object.
*
- * @param oldObj an old copy of the object, prior to the current update taking
- * place. If null the method does nothing and simply returns.
- * @param newObj the new copy of the object. Index rows that are still valid
- * for {@code #newObj} are left alone. If null, all index rows for
- * {@code oldObj} are removed.
+ * @param oldObj an old copy of the object, prior to the current update taking place. If null the
+ * method does nothing and simply returns.
+ * @param newObj the new copy of the object. Index rows that are still valid for {@code #newObj}
+ * are left alone. If null, all index rows for {@code oldObj} are removed.
* @throws OrmException the data store is unable to remove an index row.
*/
protected void pruneOldIndexes(final T oldObj, T newObj) throws OrmException {
@@ -445,8 +449,7 @@
}
@Override
- public T atomicUpdate(K key, final AtomicUpdate<T> update)
- throws OrmException {
+ public T atomicUpdate(K key, final AtomicUpdate<T> update) throws OrmException {
final IndexKeyBuilder b = new IndexKeyBuilder();
b.add(getRelationName());
b.delimiter();
@@ -455,28 +458,30 @@
try {
@SuppressWarnings("unchecked")
final T[] res = (T[]) new Object[3];
- db.atomicUpdate(b.toByteArray(), new AtomicUpdate<byte[]>() {
- @Override
- public byte[] update(byte[] data) {
- if (data != null) {
- final T oldObj = getObjectCodec().decode(data);
- final T newObj = getObjectCodec().decode(data);
- res[0] = update.update(newObj);
- res[1] = oldObj;
- res[2] = newObj;
- try {
- writeNewIndexes(oldObj, newObj);
- } catch (OrmException err) {
- throw new IndexException(err);
- }
- return getObjectCodec().encodeToByteString(newObj).toByteArray();
+ db.atomicUpdate(
+ b.toByteArray(),
+ new AtomicUpdate<byte[]>() {
+ @Override
+ public byte[] update(byte[] data) {
+ if (data != null) {
+ final T oldObj = getObjectCodec().decode(data);
+ final T newObj = getObjectCodec().decode(data);
+ res[0] = update.update(newObj);
+ res[1] = oldObj;
+ res[2] = newObj;
+ try {
+ writeNewIndexes(oldObj, newObj);
+ } catch (OrmException err) {
+ throw new IndexException(err);
+ }
+ return getObjectCodec().encodeToByteString(newObj).toByteArray();
- } else {
- res[0] = null;
- return null;
- }
- }
- });
+ } else {
+ res[0] = null;
+ return null;
+ }
+ }
+ });
if (res[0] != null) {
pruneOldIndexes(res[1], res[2]);
}
@@ -488,10 +493,10 @@
/**
* Determine if an object still matches the index row.
- * <p>
- * This method checks that the object's fields still match the criteria
- * necessary for it to be part of the index defined by {@code f}. It also
- * formats the index key and validates it is still identical to {@code exp}.
+ *
+ * <p>This method checks that the object's fields still match the criteria necessary for it to be
+ * part of the index defined by {@code f}. It also formats the index key and validates it is still
+ * identical to {@code exp}.
*
* @param f the function that defines the index.
* @param obj the object instance being tested; must not be null.
@@ -504,9 +509,9 @@
/**
* Generate the row key for the object's primary data row.
- * <p>
- * The default implementation uses the relation name, a delimiter, and then
- * the encoded primary key.
+ *
+ * <p>The default implementation uses the relation name, a delimiter, and then the encoded primary
+ * key.
*
* @param key key of the object.
* @return the object's data row key.
@@ -521,14 +526,13 @@
/**
* Generate the row key for an object's secondary index row.
- * <p>
- * The default implementation uses the relation name, '.', the index name, a
- * delimiter, the indexed fields encoded, a delimiter, and then the encoded
- * primary key (without the relation name prefix).
- * <p>
- * The object's primary key is always appended onto the end of the secondary
- * index row key to ensure that objects with the same field values still get
- * distinct rows in the secondary index.
+ *
+ * <p>The default implementation uses the relation name, '.', the index name, a delimiter, the
+ * indexed fields encoded, a delimiter, and then the encoded primary key (without the relation
+ * name prefix).
+ *
+ * <p>The object's primary key is always appended onto the end of the secondary index row key to
+ * ensure that objects with the same field values still get distinct rows in the secondary index.
*
* @param idx function that describes the index.
* @param obj the object the index record should reference.
@@ -548,9 +552,9 @@
/**
* Generate the data to store in a secondary index row for an object.
- * <p>
- * The default implementation of this method stores the encoded primary key,
- * and the current system timestamp.
+ *
+ * <p>The default implementation of this method stores the encoded primary key, and the current
+ * system timestamp.
*
* @param obj the object the index record should reference.
* @return the encoded secondary index row data.
diff --git a/src/main/java/com/google/gwtorm/nosql/generic/GenericDatabase.java b/src/main/java/com/google/gwtorm/nosql/generic/GenericDatabase.java
index 7b946e2..42b6a23 100644
--- a/src/main/java/com/google/gwtorm/nosql/generic/GenericDatabase.java
+++ b/src/main/java/com/google/gwtorm/nosql/generic/GenericDatabase.java
@@ -18,68 +18,65 @@
import com.google.gwtorm.nosql.NoSqlSchema;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.Schema;
-
import java.util.concurrent.TimeUnit;
/**
* Base class for generic NoSQL typed databases.
- * <p>
- * The generic types provide basic NoSQL implementation assuming a handful of
- * primitive operations are available inside of the implementation's extension
- * of {@link GenericSchema}. All relations are stored within the same key space,
- * using the relation name as a prefix for the row's primary or secondary key.
- * <p>
- * Applications should use the database class to create instances of their
- * Schema extension interface, and thus open and connect to the data store.
- * <p>
- * Creating a new database instance is expensive, due to the type analysis and
- * code generation performed to implement the Schema and Access interfaces.
- * Applications should create and cache their database instance for the life of
- * the application.
- * <p>
- * Database instances are thread-safe, but returned Schema instances are not.
- * <p>
- * This class must be further extended by the NoSQL implementation to configure
- * the connectivity with the data store and supply the correct subclass of
- * {@link NoSqlSchema} that knows how to interact with the data store.
+ *
+ * <p>The generic types provide basic NoSQL implementation assuming a handful of primitive
+ * operations are available inside of the implementation's extension of {@link GenericSchema}. All
+ * relations are stored within the same key space, using the relation name as a prefix for the row's
+ * primary or secondary key.
+ *
+ * <p>Applications should use the database class to create instances of their Schema extension
+ * interface, and thus open and connect to the data store.
+ *
+ * <p>Creating a new database instance is expensive, due to the type analysis and code generation
+ * performed to implement the Schema and Access interfaces. Applications should create and cache
+ * their database instance for the life of the application.
+ *
+ * <p>Database instances are thread-safe, but returned Schema instances are not.
+ *
+ * <p>This class must be further extended by the NoSQL implementation to configure the connectivity
+ * with the data store and supply the correct subclass of {@link NoSqlSchema} that knows how to
+ * interact with the data store.
*
* @param <T> type of the application's Schema.
* @param <S> type of the implementation's base for Schema implementations.
* @param <A> type of the implementation's base for Access implementations.
*/
@SuppressWarnings("rawtypes")
-public abstract class GenericDatabase<T extends Schema, S extends GenericSchema, A extends GenericAccess>
+public abstract class GenericDatabase<
+ T extends Schema, S extends GenericSchema, A extends GenericAccess>
extends NoSqlDatabase<T, S, A> {
- private static final long DEFAULT_FOSSIL_AGE =
- TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES);
+ private static final long DEFAULT_FOSSIL_AGE = TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES);
/**
* Initialize a new database and generate the implementation.
*
- * @param schemaBaseType class that the generated Schema implementation should
- * extend in order to provide data store connectivity.
- * @param accessBaseType class that the generated Access implementations
- * should extend in order to provide single-relation access for each
- * schema instance.
- * @param appSchema the application schema interface that must be implemented
- * and constructed on demand.
- * @throws OrmException the schema cannot be created because of an annotation
- * error in the interface definitions.
+ * @param schemaBaseType class that the generated Schema implementation should extend in order to
+ * provide data store connectivity.
+ * @param accessBaseType class that the generated Access implementations should extend in order to
+ * provide single-relation access for each schema instance.
+ * @param appSchema the application schema interface that must be implemented and constructed on
+ * demand.
+ * @throws OrmException the schema cannot be created because of an annotation error in the
+ * interface definitions.
*/
- protected GenericDatabase(final Class<S> schemaBaseType,
- final Class<A> accessBaseType, final Class<T> appSchema)
+ protected GenericDatabase(
+ final Class<S> schemaBaseType, final Class<A> accessBaseType, final Class<T> appSchema)
throws OrmException {
super(schemaBaseType, accessBaseType, appSchema);
}
/**
* Default number of milliseconds a transaction can appear to be open.
- * <p>
- * Secondary index rows that don't match their primary data object and that
- * are older than this age are removed from the system during a scan.
*
- * @return milliseconds before considering a fossil index record is garbage
- * and should be pruned. By default, 5 minutes.
+ * <p>Secondary index rows that don't match their primary data object and that are older than this
+ * age are removed from the system during a scan.
+ *
+ * @return milliseconds before considering a fossil index record is garbage and should be pruned.
+ * By default, 5 minutes.
*/
public long getMaxFossilAge() {
return DEFAULT_FOSSIL_AGE;
diff --git a/src/main/java/com/google/gwtorm/nosql/generic/GenericSchema.java b/src/main/java/com/google/gwtorm/nosql/generic/GenericSchema.java
index 1493c1c..f983d3e 100644
--- a/src/main/java/com/google/gwtorm/nosql/generic/GenericSchema.java
+++ b/src/main/java/com/google/gwtorm/nosql/generic/GenericSchema.java
@@ -25,18 +25,16 @@
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.gwtorm.server.Schema;
-
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Base implementation for {@link Schema} in a {@link GenericDatabase}.
- * <p>
- * NoSQL implementors must extend this class and provide implementations for the
- * abstract methods declared here. Each schema instance will wrap one thread's
- * connection to the data store. Therefore, unlike database, this class does not
- * need to be thread-safe.
+ *
+ * <p>NoSQL implementors must extend this class and provide implementations for the abstract methods
+ * declared here. Each schema instance will wrap one thread's connection to the data store.
+ * Therefore, unlike database, this class does not need to be thread-safe.
*/
public abstract class GenericSchema extends NoSqlSchema {
private final GenericDatabase<?, ?, ?> db;
@@ -46,8 +44,7 @@
db = d;
}
- public void flush() {
- }
+ public void flush() {}
/** @return the database that created this schema instance. */
public GenericDatabase<?, ?, ?> getDatabase() {
@@ -56,18 +53,17 @@
/**
* Allocate a new unique value from a pool of values.
- * <p>
- * This method is only required to return a unique value per invocation.
- * Implementors may override the method to provide an implementation that
- * returns values out of order.
- * <p>
- * The default implementation of this method stores a {@link CounterShard}
- * under the row key {@code ".sequence." + poolName}, and updates it through
- * the atomic semantics of {@link #atomicUpdate(byte[], AtomicUpdate)}. If the
- * row does not yet exist, it is initialized and the value 1 is returned.
*
- * @param poolName name of the value pool to allocate from. This is typically
- * the name of a sequence in the schema.
+ * <p>This method is only required to return a unique value per invocation. Implementors may
+ * override the method to provide an implementation that returns values out of order.
+ *
+ * <p>The default implementation of this method stores a {@link CounterShard} under the row key
+ * {@code ".sequence." + poolName}, and updates it through the atomic semantics of {@link
+ * #atomicUpdate(byte[], AtomicUpdate)}. If the row does not yet exist, it is initialized and the
+ * value 1 is returned.
+ *
+ * @param poolName name of the value pool to allocate from. This is typically the name of a
+ * sequence in the schema.
* @return a new unique value.
* @throws OrmException a unique value cannot be obtained.
*/
@@ -78,35 +74,36 @@
b.delimiter();
try {
final long[] res = new long[1];
- atomicUpdate(b.toByteArray(), new AtomicUpdate<byte[]>() {
- @Override
- public byte[] update(byte[] val) {
- CounterShard ctr;
- if (val != null) {
- ctr = CounterShard.CODEC.decode(val);
- } else {
- long start = 1;
- for (SequenceModel s : getDatabase().getSchemaModel()
- .getSequences()) {
- if (poolName.equals(s.getSequenceName())) {
- start = s.getSequence().startWith();
- if (start == 0) {
- start = 1;
+ atomicUpdate(
+ b.toByteArray(),
+ new AtomicUpdate<byte[]>() {
+ @Override
+ public byte[] update(byte[] val) {
+ CounterShard ctr;
+ if (val != null) {
+ ctr = CounterShard.CODEC.decode(val);
+ } else {
+ long start = 1;
+ for (SequenceModel s : getDatabase().getSchemaModel().getSequences()) {
+ if (poolName.equals(s.getSequenceName())) {
+ start = s.getSequence().startWith();
+ if (start == 0) {
+ start = 1;
+ }
+ break;
+ }
}
- break;
+ ctr = new CounterShard(start, Long.MAX_VALUE);
}
+
+ if (ctr.isEmpty()) {
+ throw new NoMoreValues();
+ }
+
+ res[0] = ctr.next();
+ return CounterShard.CODEC.encodeToByteString(ctr).toByteArray();
}
- ctr = new CounterShard(start, Long.MAX_VALUE);
- }
-
- if (ctr.isEmpty()) {
- throw new NoMoreValues();
- }
-
- res[0] = ctr.next();
- return CounterShard.CODEC.encodeToByteString(ctr).toByteArray();
- }
- });
+ });
return res[0];
} catch (NoMoreValues err) {
throw new OrmException("Counter '" + poolName + "' out of values");
@@ -115,21 +112,18 @@
/**
* Fetch one row's data.
- * <p>
- * The default implementation of this method creates a pair of keys and passes
- * them to {@link #scan(byte[], byte[], int, boolean)}. The {@code fromKey} is
- * the supplied {@code key}, while the {@code toKey} has '\0' appended onto
- * {@code key}. If more than one row matches in that range, the method throws
- * an exception.
+ *
+ * <p>The default implementation of this method creates a pair of keys and passes them to {@link
+ * #scan(byte[], byte[], int, boolean)}. The {@code fromKey} is the supplied {@code key}, while
+ * the {@code toKey} has '\0' appended onto {@code key}. If more than one row matches in that
+ * range, the method throws an exception.
*
* @param key key of the row to fetch and return.
* @return the data stored under {@code key}; null if no row exists.
- * @throws OrmDuplicateKeyException more than one row was identified in the
- * key scan.
+ * @throws OrmDuplicateKeyException more than one row was identified in the key scan.
* @throws OrmException the data store cannot process the request.
*/
- public byte[] fetchRow(byte[] key) throws OrmDuplicateKeyException,
- OrmException {
+ public byte[] fetchRow(byte[] key) throws OrmDuplicateKeyException, OrmException {
final byte[] fromKey = key;
final byte[] toKey = new byte[key.length + 1];
System.arraycopy(key, 0, toKey, 0, key.length);
@@ -153,9 +147,9 @@
/**
* Fetch multiple rows at once.
- * <p>
- * The default implementation of this method is a simple iteration over each
- * key and executes a sequential fetch with {@link #fetchRow(byte[])}.
+ *
+ * <p>The default implementation of this method is a simple iteration over each key and executes a
+ * sequential fetch with {@link #fetchRow(byte[])}.
*
* @param keys keys to fetch and return.
* @return iteration over the rows that exist and appear in {@code keys}.
@@ -174,54 +168,55 @@
/**
* Scan a range of keys and return any matching objects.
- * <p>
- * To fetch a single record with a scan, set {@code toKey} to the same array
- * as {@code fromKey}, but append a trailing NUL byte (0x00). The caller
- * should validate that the returned ResultSet contains no more than 1 row.
- * <p>
- * The resulting iteration does not support remove.
- * <p>
- * Each iteration element is a map entry, describing the row key and the row
- * value. The map entry's value cannot be changed.
+ *
+ * <p>To fetch a single record with a scan, set {@code toKey} to the same array as {@code
+ * fromKey}, but append a trailing NUL byte (0x00). The caller should validate that the returned
+ * ResultSet contains no more than 1 row.
+ *
+ * <p>The resulting iteration does not support remove.
+ *
+ * <p>Each iteration element is a map entry, describing the row key and the row value. The map
+ * entry's value cannot be changed.
*
* @param fromKey key to start the scan on. This is inclusive.
* @param toKey key to stop the scan on. This is exclusive.
* @param limit maximum number of results to return.
- * @param order if true the order will be preserved, false if the result order
- * order can be arbitrary.
- * @return result iteration for the requested range. The result set may be
- * lazily filled, or filled completely.
+ * @param order if true the order will be preserved, false if the result order order can be
+ * arbitrary.
+ * @return result iteration for the requested range. The result set may be lazily filled, or
+ * filled completely.
* @throws OrmException an error occurred preventing the scan from completing.
*/
- public abstract ResultSet<Row> scan(byte[] fromKey, byte[] toKey, int limit,
- boolean order) throws OrmException;
+ public abstract ResultSet<Row> scan(byte[] fromKey, byte[] toKey, int limit, boolean order)
+ throws OrmException;
/**
* Atomically insert one row, failing if the row already exists.
- * <p>
- * The default implementation of this method relies upon the atomic nature of
- * the {@link #atomicUpdate(byte[], AtomicUpdate)} primitive to test for the
- * row's existence, and create the row only if it is not found.
+ *
+ * <p>The default implementation of this method relies upon the atomic nature of the {@link
+ * #atomicUpdate(byte[], AtomicUpdate)} primitive to test for the row's existence, and create the
+ * row only if it is not found.
*
* @param key key of the new row to insert.
* @param newData data of the new row.
- * @throws OrmDuplicateKeyException another row already exists with the
- * specified key.
- * @throws OrmException the data store cannot process the request right now,
- * for example due to a network connectivity problem.
+ * @throws OrmDuplicateKeyException another row already exists with the specified key.
+ * @throws OrmException the data store cannot process the request right now, for example due to a
+ * network connectivity problem.
*/
public void insert(byte[] key, final byte[] newData)
throws OrmDuplicateKeyException, OrmException {
try {
- atomicUpdate(key, new AtomicUpdate<byte[]>() {
- @Override
- public byte[] update(byte[] oldData) {
- if (oldData != null) {
- throw new KeyExists();
- }
- return newData;
- }
- });
+ atomicUpdate(
+ key,
+ new AtomicUpdate<byte[]>() {
+ @Override
+ public byte[] update(byte[] oldData) {
+ if (oldData != null) {
+ throw new KeyExists();
+ }
+ return newData;
+ }
+ });
} catch (KeyExists err) {
throw new OrmDuplicateKeyException("Duplicate key");
}
@@ -229,22 +224,22 @@
/**
* Update a single row, inserting it if it does not exist.
- * <p>
- * Unlike insert, this method always succeeds.
+ *
+ * <p>Unlike insert, this method always succeeds.
*
* @param key key of the row to update, or insert if missing.
* @param data data to store at this row.
- * @throws OrmException the data store cannot process the request, for example
- * due to a network connectivity problem.
+ * @throws OrmException the data store cannot process the request, for example due to a network
+ * connectivity problem.
*/
public abstract void upsert(byte[] key, byte[] data) throws OrmException;
/**
* Delete the row stored under the given key.
- * <p>
- * If the row does not exist, this method must complete successfully anyway.
- * The intent of the caller is to ensure the row does not exist when the
- * method completes, and a row that did not exist satisfies that intent.
+ *
+ * <p>If the row does not exist, this method must complete successfully anyway. The intent of the
+ * caller is to ensure the row does not exist when the method completes, and a row that did not
+ * exist satisfies that intent.
*
* @param key the key to delete.
* @throws OrmException the data store cannot perform the removal.
@@ -253,10 +248,10 @@
/**
* Atomically read and update a single row.
- * <p>
- * Unlike schema's atomicUpdate() method, this method must handle missing
- * rows. Implementations must be logically equivalent to the following, but
- * performed atomically within the scope of the single row key:
+ *
+ * <p>Unlike schema's atomicUpdate() method, this method must handle missing rows. Implementations
+ * must be logically equivalent to the following, but performed atomically within the scope of the
+ * single row key:
*
* <pre>
* byte[] oldData = get(key);
@@ -268,32 +263,29 @@
* }
* return data;
* </pre>
- * <p>
- * Secondary index row updates are assumed to never be part of the atomic
- * update transaction. This is an intentional design decision to fit with many
- * NoSQL product's limitations to support only single-row atomic updates.
- * <p>
- * The {@code update} method may be invoked multiple times before the
- * operation is considered successful. This permits an implementation to
- * perform an opportunistic update attempt, and retry the update if the same
- * row was modified by another concurrent worker.
+ *
+ * <p>Secondary index row updates are assumed to never be part of the atomic update transaction.
+ * This is an intentional design decision to fit with many NoSQL product's limitations to support
+ * only single-row atomic updates.
+ *
+ * <p>The {@code update} method may be invoked multiple times before the operation is considered
+ * successful. This permits an implementation to perform an opportunistic update attempt, and
+ * retry the update if the same row was modified by another concurrent worker.
*
* @param key the row key to read, update and return.
- * @param update action to perform on the row's data element. The action may
- * be passed null if the row doesn't exist.
+ * @param update action to perform on the row's data element. The action may be passed null if the
+ * row doesn't exist.
* @throws OrmException the database cannot perform the update.
*/
- public abstract void atomicUpdate(byte[] key, AtomicUpdate<byte[]> update)
- throws OrmException;
+ public abstract void atomicUpdate(byte[] key, AtomicUpdate<byte[]> update) throws OrmException;
/**
* Check (and delete) an index row if its a fossil.
- * <p>
- * As index rows are written ahead of the main data row being written out,
- * scans sometimes see an index row that does not match the data row. These
- * are ignored for a short period ({@link GenericDatabase#getMaxFossilAge()})
- * to allow the primary data row to eventually get written out. If however the
- * writer never finished the update, these index rows are stale and need to be
+ *
+ * <p>As index rows are written ahead of the main data row being written out, scans sometimes see
+ * an index row that does not match the data row. These are ignored for a short period ({@link
+ * GenericDatabase#getMaxFossilAge()}) to allow the primary data row to eventually get written
+ * out. If however the writer never finished the update, these index rows are stale and need to be
* pruned. Any index row older than the fossil age is removed by this method.
*
* @param now timestamp when the current scan started.
@@ -308,13 +300,12 @@
/**
* Delete the given fossil index row.
- * <p>
- * This method is logically the same as {@link #delete(byte[])}, but its
- * separated out to permit asynchronous delivery of the delete events since
- * these are arriving during an index scan and are less time-critical than
- * other delete operations.
- * <p>
- * The default implementation of this method calls {@link #delete(byte[])}.
+ *
+ * <p>This method is logically the same as {@link #delete(byte[])}, but its separated out to
+ * permit asynchronous delivery of the delete events since these are arriving during an index scan
+ * and are less time-critical than other delete operations.
+ *
+ * <p>The default implementation of this method calls {@link #delete(byte[])}.
*
* @param key index key to remove.
* @param row the index row data.
@@ -328,10 +319,8 @@
}
@SuppressWarnings("serial")
- private static class KeyExists extends RuntimeException {
- }
+ private static class KeyExists extends RuntimeException {}
@SuppressWarnings("serial")
- private static class NoMoreValues extends RuntimeException {
- }
+ private static class NoMoreValues extends RuntimeException {}
}
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/FileDatabase.java b/src/main/java/com/google/gwtorm/nosql/heap/FileDatabase.java
index 1799865..66a96cf 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/FileDatabase.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/FileDatabase.java
@@ -16,7 +16,6 @@
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.Schema;
-
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
@@ -32,19 +31,18 @@
/**
* Tiny NoSQL database stored on the local filesystem.
- * <p>
- * This is a simple NoSQL implementation intended only for development/debugging
- * purposes. It is not capable of supporting any production traffic. Large data
- * sets will cause the implementation to fall over, as all records are stored in
- * memory.
- * <p>
- * Although some effort is made to persist data to disk during updates, and
- * reload it during construction, durability of stored data is not guaranteed.
+ *
+ * <p>This is a simple NoSQL implementation intended only for development/debugging purposes. It is
+ * not capable of supporting any production traffic. Large data sets will cause the implementation
+ * to fall over, as all records are stored in memory.
+ *
+ * <p>Although some effort is made to persist data to disk during updates, and reload it during
+ * construction, durability of stored data is not guaranteed.
*
* @param <T> type of the application schema.
*/
-public class FileDatabase<T extends Schema> extends
- TreeMapDatabase<T, FileDatabase.LoggingSchema, FileDatabase.LoggingAccess> {
+public class FileDatabase<T extends Schema>
+ extends TreeMapDatabase<T, FileDatabase.LoggingSchema, FileDatabase.LoggingAccess> {
private static final int MAX_LOG_SIZE = 50000;
private final File heapFile;
@@ -56,14 +54,13 @@
/**
* Create the database and implement the application's schema interface.
*
- * @param path path prefix for the data files. File suffixes will be added to
- * this name to name the database's various files.
+ * @param path path prefix for the data files. File suffixes will be added to this name to name
+ * the database's various files.
* @param schema the application schema this database will open.
- * @throws OrmException the schema cannot be queried, or the existing database
- * files are not readable.
+ * @throws OrmException the schema cannot be queried, or the existing database files are not
+ * readable.
*/
- public FileDatabase(final File path, final Class<T> schema)
- throws OrmException {
+ public FileDatabase(final File path, final Class<T> schema) throws OrmException {
super(LoggingSchema.class, LoggingAccess.class, schema);
heapFile = new File(path.getAbsolutePath() + ".nosql_db");
@@ -105,9 +102,10 @@
final DataInputStream in;
try {
- in = new DataInputStream( //
- new BufferedInputStream( //
- new FileInputStream(heapFile)));
+ in =
+ new DataInputStream( //
+ new BufferedInputStream( //
+ new FileInputStream(heapFile)));
} catch (FileNotFoundException e) {
return;
}
@@ -136,36 +134,39 @@
final DataInputStream in;
try {
- in = new DataInputStream( //
- new BufferedInputStream( //
- new FileInputStream(logFile)));
+ in =
+ new DataInputStream( //
+ new BufferedInputStream( //
+ new FileInputStream(logFile)));
} catch (FileNotFoundException e) {
return;
}
try {
- for (;; logRecords++) {
+ for (; ; logRecords++) {
final int op = in.read();
if (op < 0) {
break;
}
switch (op) {
- case 0: {
- final byte[] key = new byte[in.readInt()];
- in.readFully(key);
- table.remove(key);
- break;
- }
+ case 0:
+ {
+ final byte[] key = new byte[in.readInt()];
+ in.readFully(key);
+ table.remove(key);
+ break;
+ }
- case 1: {
- final byte[] key = new byte[in.readInt()];
- final byte[] val = new byte[in.readInt()];
- in.readFully(key);
- in.readFully(val);
- table.put(key, val);
- break;
- }
+ case 1:
+ {
+ final byte[] key = new byte[in.readInt()];
+ final byte[] val = new byte[in.readInt()];
+ in.readFully(key);
+ in.readFully(val);
+ table.put(key, val);
+ break;
+ }
default:
throw new OrmException("Unknown log command " + op);
@@ -220,9 +221,10 @@
final File tmp = newTempFile();
boolean ok = false;
try {
- DataOutputStream out = new DataOutputStream( //
- new BufferedOutputStream( //
- new FileOutputStream(tmp)));
+ DataOutputStream out =
+ new DataOutputStream( //
+ new BufferedOutputStream( //
+ new FileOutputStream(tmp)));
try {
out.writeInt(table.size());
for (Map.Entry<byte[], byte[]> ent : table.entrySet()) {
@@ -270,7 +272,7 @@
return File.createTempFile("heap_", "_db", heapFile.getParentFile());
}
- public static abstract class LoggingSchema extends TreeMapSchema {
+ public abstract static class LoggingSchema extends TreeMapSchema {
private final FileDatabase<?> db;
protected LoggingSchema(FileDatabase<?> db) {
@@ -302,7 +304,7 @@
}
@SuppressWarnings("rawtypes")
- public static abstract class LoggingAccess extends TreeMapAccess {
+ public abstract static class LoggingAccess extends TreeMapAccess {
protected LoggingAccess(LoggingSchema s) {
super(s);
}
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/HeapKeyComparator.java b/src/main/java/com/google/gwtorm/nosql/heap/HeapKeyComparator.java
index 33aded6..4ef4533 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/HeapKeyComparator.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/HeapKeyComparator.java
@@ -19,8 +19,7 @@
class HeapKeyComparator implements Comparator<byte[]> {
static final HeapKeyComparator INSTANCE = new HeapKeyComparator();
- private HeapKeyComparator() {
- }
+ private HeapKeyComparator() {}
@Override
public int compare(byte[] a, byte[] b) {
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/MemoryDatabase.java b/src/main/java/com/google/gwtorm/nosql/heap/MemoryDatabase.java
index 5c8aaab..47e5bdc 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/MemoryDatabase.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/MemoryDatabase.java
@@ -19,18 +19,17 @@
/**
* Toy in-memory implementation of a NoSQL database.
- * <p>
- * Implements a simple NoSQL database with a standard {@link java.util.TreeMap}
- * held inside of this JVM process. All operations occur on the TreeMap, with no
- * durability across database restarts. Therefore this implementation is only
- * suitable for simple tests.
+ *
+ * <p>Implements a simple NoSQL database with a standard {@link java.util.TreeMap} held inside of
+ * this JVM process. All operations occur on the TreeMap, with no durability across database
+ * restarts. Therefore this implementation is only suitable for simple tests.
*
* @param <T> type of the application schema.
* @see FileDatabase
*/
@SuppressWarnings("rawtypes")
-public class MemoryDatabase<T extends Schema> extends
- TreeMapDatabase<T, TreeMapSchema, TreeMapAccess> {
+public class MemoryDatabase<T extends Schema>
+ extends TreeMapDatabase<T, TreeMapSchema, TreeMapAccess> {
/**
* Create the database and implement the application's schema interface.
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapAccess.java b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapAccess.java
index aa58c1e..6f82d12 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapAccess.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapAccess.java
@@ -19,8 +19,7 @@
import com.google.gwtorm.server.Access;
/** Base implementation for {@link Access} in a {@link TreeMapDatabase}. */
-public abstract class TreeMapAccess<T, K extends Key<?>> extends
- GenericAccess<T, K> {
+public abstract class TreeMapAccess<T, K extends Key<?>> extends GenericAccess<T, K> {
protected TreeMapAccess(final TreeMapSchema s) {
super(s);
}
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapDatabase.java b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapDatabase.java
index fca8470..e36da61 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapDatabase.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapDatabase.java
@@ -19,7 +19,6 @@
import com.google.gwtorm.server.Schema;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.UnknownFieldSet;
-
import java.io.PrintWriter;
import java.util.Map;
import java.util.SortedMap;
@@ -29,11 +28,10 @@
/**
* Toy in-memory implementation of a NoSQL database.
- * <p>
- * Implements a simple NoSQL database with a standard {@link java.util.TreeMap}
- * held inside of this JVM process. All operations occur on the TreeMap, with no
- * durability across database restarts. Therefore this implementation is only
- * suitable for simple tests.
+ *
+ * <p>Implements a simple NoSQL database with a standard {@link java.util.TreeMap} held inside of
+ * this JVM process. All operations occur on the TreeMap, with no durability across database
+ * restarts. Therefore this implementation is only suitable for simple tests.
*
* @param <T> type of the application schema.
*/
@@ -50,18 +48,17 @@
/**
* Initialize a new database and generate the implementation.
*
- * @param schemaBaseType class that the generated Schema implementation should
- * extend in order to provide data store connectivity.
- * @param accessBaseType class that the generated Access implementations
- * should extend in order to provide single-relation access for each
- * schema instance.
- * @param appSchema the application schema interface that must be implemented
- * and constructed on demand.
- * @throws OrmException the schema cannot be created because of an annotation
- * error in the interface definitions.
+ * @param schemaBaseType class that the generated Schema implementation should extend in order to
+ * provide data store connectivity.
+ * @param accessBaseType class that the generated Access implementations should extend in order to
+ * provide single-relation access for each schema instance.
+ * @param appSchema the application schema interface that must be implemented and constructed on
+ * demand.
+ * @throws OrmException the schema cannot be created because of an annotation error in the
+ * interface definitions.
*/
- protected TreeMapDatabase(final Class<S> schemaBaseType,
- final Class<A> accessBaseType, final Class<T> appSchema)
+ protected TreeMapDatabase(
+ final Class<S> schemaBaseType, final Class<A> accessBaseType, final Class<T> appSchema)
throws OrmException {
super(schemaBaseType, accessBaseType, appSchema);
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapSchema.java b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapSchema.java
index ed73f2d..4d47d75 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapSchema.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapSchema.java
@@ -21,12 +21,11 @@
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.gwtorm.server.Schema;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.Map.Entry;
+import java.util.Set;
/** Base implementation for {@link Schema} in a {@link TreeMapDatabase}. */
public abstract class TreeMapSchema extends GenericSchema {
@@ -48,8 +47,7 @@
}
@Override
- public ResultSet<Row> scan(byte[] fromKey, byte[] toKey, int limit,
- boolean order) {
+ public ResultSet<Row> scan(byte[] fromKey, byte[] toKey, int limit, boolean order) {
db.lock.lock();
try {
final List<Row> res = new ArrayList<>();
@@ -91,8 +89,7 @@
}
@Override
- public void atomicUpdate(byte[] key, AtomicUpdate<byte[]> update)
- throws OrmException {
+ public void atomicUpdate(byte[] key, AtomicUpdate<byte[]> update) throws OrmException {
db.lock.lock();
try {
final byte[] oldData = fetchRow(key);
diff --git a/src/main/java/com/google/gwtorm/protobuf/CodecFactory.java b/src/main/java/com/google/gwtorm/protobuf/CodecFactory.java
index 070ce78..cedfc65 100644
--- a/src/main/java/com/google/gwtorm/protobuf/CodecFactory.java
+++ b/src/main/java/com/google/gwtorm/protobuf/CodecFactory.java
@@ -17,7 +17,6 @@
import com.google.gwtorm.client.Column;
import com.google.gwtorm.server.GeneratedClassLoader;
import com.google.gwtorm.server.OrmException;
-
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
@@ -29,18 +28,17 @@
/**
* Create an implementation to encode/decode an arbitrary object.
- * <p>
- * The object must use the {@link Column} annotations to denote the fields
- * that should be encoded or decoded.
+ *
+ * <p>The object must use the {@link Column} annotations to denote the fields that should be
+ * encoded or decoded.
*
* @param <T> type of the object to be supported.
* @param type the object type.
* @return an encoder for this object type.
- * @throws IllegalArgumentException the object's fields aren't declared
- * properly. This is a programming error that cannot be recovered.
+ * @throws IllegalArgumentException the object's fields aren't declared properly. This is a
+ * programming error that cannot be recovered.
*/
- public static <T> ProtobufCodec<T> encoder(Class<T> type)
- throws IllegalStateException {
+ public static <T> ProtobufCodec<T> encoder(Class<T> type) throws IllegalStateException {
final GeneratedClassLoader loader = newLoader(type);
ProtobufCodec<T> encoder = null;
String cacheName = encoders.get(type);
@@ -52,8 +50,8 @@
try {
encoder = gen.create();
} catch (OrmException e) {
- throw new IllegalArgumentException("Class " + type.getName()
- + " cannot be supported on protobuf", e);
+ throw new IllegalArgumentException(
+ "Class " + type.getName() + " cannot be supported on protobuf", e);
}
encoders.put(type, encoder.getClass().getName());
}
@@ -77,6 +75,5 @@
}
}
- private CodecFactory() {
- }
+ private CodecFactory() {}
}
diff --git a/src/main/java/com/google/gwtorm/protobuf/CodecGen.java b/src/main/java/com/google/gwtorm/protobuf/CodecGen.java
index 1eb6fde..a726ad6 100644
--- a/src/main/java/com/google/gwtorm/protobuf/CodecGen.java
+++ b/src/main/java/com/google/gwtorm/protobuf/CodecGen.java
@@ -25,13 +25,6 @@
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
import com.google.protobuf.WireFormat;
-
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
@@ -42,22 +35,23 @@
import java.util.HashSet;
import java.util.Map;
import java.util.TreeSet;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
/** Generates {@link ProtobufCodec} implementations. */
class CodecGen<T> implements Opcodes {
- private static final Type illegalStateException =
- Type.getType(IllegalStateException.class);
- private static final Type collection =
- Type.getType(java.util.Collection.class);
+ private static final Type illegalStateException = Type.getType(IllegalStateException.class);
+ private static final Type collection = Type.getType(java.util.Collection.class);
private static final Type iterator = Type.getType(java.util.Iterator.class);
private static final Type string = Type.getType(String.class);
private static final Type enumType = Type.getType(Enum.class);
private static final Type byteString = Type.getType(ByteString.class);
private static final Type object = Type.getType(Object.class);
- private static final Type codedOutputStream =
- Type.getType(CodedOutputStream.class);
- private static final Type codedInputStream =
- Type.getType(CodedInputStream.class);
+ private static final Type codedOutputStream = Type.getType(CodedOutputStream.class);
+ private static final Type codedInputStream = Type.getType(CodedInputStream.class);
private final GeneratedClassLoader classLoader;
private final Class<T> pojo;
private final Type pojoType;
@@ -122,21 +116,21 @@
in = in.getSuperclass();
}
if (col.isEmpty()) {
- throw new OrmException(
- "Cannot create new encoder, no @Column fields found");
+ throw new OrmException("Cannot create new encoder, no @Column fields found");
}
return sort(col);
}
- private static JavaColumnModel[] sort(
- final Collection<? extends ColumnModel> col) {
+ private static JavaColumnModel[] sort(final Collection<? extends ColumnModel> col) {
JavaColumnModel[] out = col.toArray(new JavaColumnModel[col.size()]);
- Arrays.sort(out, new Comparator<JavaColumnModel>() {
- @Override
- public int compare(JavaColumnModel o1, JavaColumnModel o2) {
- return o1.getColumnID() - o2.getColumnID();
- }
- });
+ Arrays.sort(
+ out,
+ new Comparator<JavaColumnModel>() {
+ @Override
+ public int compare(JavaColumnModel o1, JavaColumnModel o2) {
+ return o1.getColumnID() - o2.getColumnID();
+ }
+ });
return out;
}
@@ -151,30 +145,46 @@
implTypeName = implClassName.replace('.', '/');
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- cw.visit(V1_3, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, implTypeName, null,
- superTypeName, new String[] {});
+ cw.visit(
+ V1_3,
+ ACC_PUBLIC | ACC_FINAL | ACC_SUPER,
+ implTypeName,
+ null,
+ superTypeName,
+ new String[] {});
}
private void implementCodecFields() {
for (NestedCodec other : nestedCodecs.values()) {
- cw.visitField(ACC_PRIVATE | ACC_STATIC | ACC_FINAL, other.field,
- other.codecType.getDescriptor(), null, null).visitEnd();
+ cw.visitField(
+ ACC_PRIVATE | ACC_STATIC | ACC_FINAL,
+ other.field,
+ other.codecType.getDescriptor(),
+ null,
+ null)
+ .visitEnd();
}
}
private void implementStaticInit() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "<clinit>", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {}), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_STATIC,
+ "<clinit>",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}),
+ null,
+ null);
mv.visitCode();
for (NestedCodec other : nestedCodecs.values()) {
mv.visitTypeInsn(NEW, other.codecType.getInternalName());
mv.visitInsn(DUP);
- mv.visitMethodInsn(INVOKESPECIAL, other.codecType.getInternalName(),
- "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
- mv.visitFieldInsn(PUTSTATIC, implTypeName, other.field, other.codecType
- .getDescriptor());
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ other.codecType.getInternalName(),
+ "<init>",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+ mv.visitFieldInsn(PUTSTATIC, implTypeName, other.field, other.codecType.getDescriptor());
}
mv.visitInsn(RETURN);
@@ -184,10 +194,8 @@
private void implementConstructor() {
final String consName = "<init>";
- final String consDesc =
- Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {});
- final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
+ final String consDesc = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {});
+ final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
@@ -200,13 +208,20 @@
private void implementNewInstanceObject() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, "newInstance", Type.getMethodDescriptor(
- object, new Type[] {}), null, new String[] {});
+ cw.visitMethod(
+ ACC_PUBLIC,
+ "newInstance",
+ Type.getMethodDescriptor(object, new Type[] {}),
+ null,
+ new String[] {});
mv.visitCode();
mv.visitTypeInsn(NEW, pojoType.getInternalName());
mv.visitInsn(DUP);
- mv.visitMethodInsn(INVOKESPECIAL, pojoType.getInternalName(), "<init>",
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ pojoType.getInternalName(),
+ "<init>",
Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
mv.visitInsn(ARETURN);
@@ -216,13 +231,20 @@
private void implementNewInstanceSelf() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, "newInstance", Type.getMethodDescriptor(
- pojoType, new Type[] {}), null, new String[] {});
+ cw.visitMethod(
+ ACC_PUBLIC,
+ "newInstance",
+ Type.getMethodDescriptor(pojoType, new Type[] {}),
+ null,
+ new String[] {});
mv.visitCode();
mv.visitTypeInsn(NEW, pojoType.getInternalName());
mv.visitInsn(DUP);
- mv.visitMethodInsn(INVOKESPECIAL, pojoType.getInternalName(), "<init>",
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ pojoType.getInternalName(),
+ "<init>",
Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
mv.visitInsn(ARETURN);
@@ -232,8 +254,12 @@
private void implementSizeofObject() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, "sizeof", Type.getMethodDescriptor(
- Type.INT_TYPE, new Type[] {object}), null, new String[] {});
+ cw.visitMethod(
+ ACC_PUBLIC,
+ "sizeof",
+ Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {object}),
+ null,
+ new String[] {});
mv.visitCode();
final SizeofCGS cgs = new SizeofCGS(mv);
cgs.sizeVar = cgs.newLocal();
@@ -242,8 +268,11 @@
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
mv.visitTypeInsn(CHECKCAST, pojoType.getInternalName());
- mv.visitMethodInsn(INVOKEVIRTUAL, implTypeName, "sizeof", Type
- .getMethodDescriptor(Type.INT_TYPE, new Type[] {pojoType}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ implTypeName,
+ "sizeof",
+ Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {pojoType}));
mv.visitInsn(IRETURN);
mv.visitMaxs(-1, -1);
@@ -252,8 +281,12 @@
private void implementSizeofSelf() throws OrmException {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, "sizeof", Type.getMethodDescriptor(
- Type.INT_TYPE, new Type[] {pojoType}), null, new String[] {});
+ cw.visitMethod(
+ ACC_PUBLIC,
+ "sizeof",
+ Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {pojoType}),
+ null,
+ new String[] {});
mv.visitCode();
final SizeofCGS cgs = new SizeofCGS(mv);
cgs.sizeVar = cgs.newLocal();
@@ -269,8 +302,9 @@
mv.visitEnd();
}
- private void sizeofMessage(final JavaColumnModel[] myFields,
- final MethodVisitor mv, final SizeofCGS cgs) throws OrmException {
+ private void sizeofMessage(
+ final JavaColumnModel[] myFields, final MethodVisitor mv, final SizeofCGS cgs)
+ throws OrmException {
for (final JavaColumnModel f : myFields) {
if (f.isNested()) {
final NestedCodec n = nestedFor(f);
@@ -280,12 +314,13 @@
mv.visitJumpInsn(IFNULL, end);
final int msgSizeVar = cgs.newLocal();
- mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
- .getDescriptor());
+ mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
cgs.pushFieldValue();
- mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
- "sizeof", Type.getMethodDescriptor(Type.INT_TYPE,
- new Type[] {n.pojoType}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ n.codecType.getInternalName(),
+ "sizeof",
+ Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {n.pojoType}));
mv.visitVarInsn(ISTORE, msgSizeVar);
cgs.preinc();
@@ -336,41 +371,42 @@
return n;
}
- private void sizeofCollection(final JavaColumnModel f,
- final MethodVisitor mv, final SizeofCGS cgs) throws OrmException {
+ private void sizeofCollection(
+ final JavaColumnModel f, final MethodVisitor mv, final SizeofCGS cgs) throws OrmException {
final int itr = cgs.newLocal();
final int val = cgs.newLocal();
final Class<?> valClazz = (Class<?>) f.getArgumentTypes()[0];
final Type valType = Type.getType(valClazz);
final JavaColumnModel col = collectionColumn(f, valClazz);
- final SizeofCGS ng = new SizeofCGS(mv) {
- {
- sizeVar = cgs.sizeVar;
- setEntityType(valType);
- }
+ final SizeofCGS ng =
+ new SizeofCGS(mv) {
+ {
+ sizeVar = cgs.sizeVar;
+ setEntityType(valType);
+ }
- @Override
- public void pushEntity() {
- mv.visitVarInsn(ALOAD, val);
- }
+ @Override
+ public void pushEntity() {
+ mv.visitVarInsn(ALOAD, val);
+ }
- @Override
- protected void appendGetField(final ColumnModel c) {
- if (c != col) {
- super.appendGetField(c);
- }
- }
+ @Override
+ protected void appendGetField(final ColumnModel c) {
+ if (c != col) {
+ super.appendGetField(c);
+ }
+ }
- @Override
- public int newLocal() {
- return cgs.newLocal();
- }
+ @Override
+ public int newLocal() {
+ return cgs.newLocal();
+ }
- @Override
- public void freeLocal(int index) {
- cgs.freeLocal(index);
- }
- };
+ @Override
+ public void freeLocal(int index) {
+ cgs.freeLocal(index);
+ }
+ };
final Label end = new Label();
cgs.setFieldReference(f);
@@ -379,19 +415,28 @@
cgs.setFieldReference(f);
cgs.pushFieldValue();
- mv.visitMethodInsn(INVOKEINTERFACE, collection.getInternalName(),
- "iterator", Type.getMethodDescriptor(iterator, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ collection.getInternalName(),
+ "iterator",
+ Type.getMethodDescriptor(iterator, new Type[] {}));
mv.visitVarInsn(ASTORE, itr);
final Label doloop = new Label();
mv.visitLabel(doloop);
mv.visitVarInsn(ALOAD, itr);
- mv.visitMethodInsn(INVOKEINTERFACE, iterator.getInternalName(), "hasNext",
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ iterator.getInternalName(),
+ "hasNext",
Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {}));
mv.visitJumpInsn(IFEQ, end);
mv.visitVarInsn(ALOAD, itr);
- mv.visitMethodInsn(INVOKEINTERFACE, iterator.getInternalName(), "next",
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ iterator.getInternalName(),
+ "next",
Type.getMethodDescriptor(object, new Type[] {}));
mv.visitTypeInsn(CHECKCAST, valType.getInternalName());
mv.visitVarInsn(ASTORE, val);
@@ -404,8 +449,8 @@
cgs.freeLocal(val);
}
- private JavaColumnModel collectionColumn(final JavaColumnModel f,
- final Class<?> valClazz) throws OrmException {
+ private JavaColumnModel collectionColumn(final JavaColumnModel f, final Class<?> valClazz)
+ throws OrmException {
return new JavaColumnModel( //
f.getField(), //
f.getPathToFieldName(), //
@@ -413,8 +458,8 @@
valClazz);
}
- private void sizeofScalar(final MethodVisitor mv, final SizeofCGS cgs,
- final JavaColumnModel f) throws OrmException {
+ private void sizeofScalar(final MethodVisitor mv, final SizeofCGS cgs, final JavaColumnModel f)
+ throws OrmException {
cgs.setFieldReference(f);
switch (Type.getType(f.getPrimitiveType()).getSort()) {
@@ -463,70 +508,82 @@
break;
case Type.ARRAY:
- case Type.OBJECT: {
- final Label end = new Label();
- cgs.pushFieldValue();
- mv.visitJumpInsn(IFNULL, end);
-
- if (f.getPrimitiveType() == byte[].class) {
- cgs.preinc();
- cgs.push(f.getColumnID());
- cgs.doinc("computeTagSize", Type.INT_TYPE);
-
- cgs.preinc();
+ case Type.OBJECT:
+ {
+ final Label end = new Label();
cgs.pushFieldValue();
- mv.visitInsn(ARRAYLENGTH);
- cgs.doinc("computeRawVarint32Size", Type.INT_TYPE);
+ mv.visitJumpInsn(IFNULL, end);
- cgs.preinc();
- cgs.pushFieldValue();
- mv.visitInsn(ARRAYLENGTH);
- cgs.doinc();
+ if (f.getPrimitiveType() == byte[].class) {
+ cgs.preinc();
+ cgs.push(f.getColumnID());
+ cgs.doinc("computeTagSize", Type.INT_TYPE);
- } else if (f.getPrimitiveType() == String.class) {
- cgs.preinc();
- cgs.push(f.getColumnID());
- cgs.pushFieldValue();
- cgs.doinc("computeStringSize", Type.INT_TYPE, string);
+ cgs.preinc();
+ cgs.pushFieldValue();
+ mv.visitInsn(ARRAYLENGTH);
+ cgs.doinc("computeRawVarint32Size", Type.INT_TYPE);
- } else if (f.getPrimitiveType() == java.sql.Timestamp.class
- || f.getPrimitiveType() == java.util.Date.class
- || f.getPrimitiveType() == java.sql.Date.class) {
- cgs.preinc();
- cgs.push(f.getColumnID());
- cgs.pushFieldValue();
- String tsType = Type.getType(f.getPrimitiveType()).getInternalName();
- mv.visitMethodInsn(INVOKEVIRTUAL, tsType, "getTime", Type
- .getMethodDescriptor(Type.LONG_TYPE, new Type[] {}));
- cgs.doinc("computeFixed64Size", Type.INT_TYPE, Type.LONG_TYPE);
+ cgs.preinc();
+ cgs.pushFieldValue();
+ mv.visitInsn(ARRAYLENGTH);
+ cgs.doinc();
- } else if (f.getPrimitiveType().isEnum()) {
- cgs.preinc();
- cgs.push(f.getColumnID());
- cgs.pushFieldValue();
- mv.visitMethodInsn(INVOKEVIRTUAL, enumType.getInternalName(),
- "ordinal", //
- Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {}));
- cgs.doinc("computeEnumSize", Type.INT_TYPE, Type.INT_TYPE);
+ } else if (f.getPrimitiveType() == String.class) {
+ cgs.preinc();
+ cgs.push(f.getColumnID());
+ cgs.pushFieldValue();
+ cgs.doinc("computeStringSize", Type.INT_TYPE, string);
- } else {
- throw new OrmException("Type " + f.getPrimitiveType()
- + " not supported for field " + f.getPathToFieldName());
+ } else if (f.getPrimitiveType() == java.sql.Timestamp.class
+ || f.getPrimitiveType() == java.util.Date.class
+ || f.getPrimitiveType() == java.sql.Date.class) {
+ cgs.preinc();
+ cgs.push(f.getColumnID());
+ cgs.pushFieldValue();
+ String tsType = Type.getType(f.getPrimitiveType()).getInternalName();
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ tsType,
+ "getTime",
+ Type.getMethodDescriptor(Type.LONG_TYPE, new Type[] {}));
+ cgs.doinc("computeFixed64Size", Type.INT_TYPE, Type.LONG_TYPE);
+
+ } else if (f.getPrimitiveType().isEnum()) {
+ cgs.preinc();
+ cgs.push(f.getColumnID());
+ cgs.pushFieldValue();
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ enumType.getInternalName(),
+ "ordinal", //
+ Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {}));
+ cgs.doinc("computeEnumSize", Type.INT_TYPE, Type.INT_TYPE);
+
+ } else {
+ throw new OrmException(
+ "Type "
+ + f.getPrimitiveType()
+ + " not supported for field "
+ + f.getPathToFieldName());
+ }
+ mv.visitLabel(end);
+ break;
}
- mv.visitLabel(end);
- break;
- }
default:
- throw new OrmException("Type " + f.getPrimitiveType()
- + " not supported for field " + f.getPathToFieldName());
+ throw new OrmException(
+ "Type " + f.getPrimitiveType() + " not supported for field " + f.getPathToFieldName());
}
}
private void implementEncodeObject() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, "encode", Type.getMethodDescriptor(
- Type.VOID_TYPE, new Type[] {object, codedOutputStream}), null,
+ cw.visitMethod(
+ ACC_PUBLIC,
+ "encode",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {object, codedOutputStream}),
+ null,
new String[] {});
mv.visitCode();
final EncodeCGS cgs = new EncodeCGS(mv);
@@ -536,9 +593,11 @@
mv.visitVarInsn(ALOAD, 1);
mv.visitTypeInsn(CHECKCAST, pojoType.getInternalName());
mv.visitVarInsn(ALOAD, 2);
- mv.visitMethodInsn(INVOKEVIRTUAL, implTypeName, "encode", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {pojoType,
- codedOutputStream}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ implTypeName,
+ "encode",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {pojoType, codedOutputStream}));
mv.visitInsn(RETURN);
mv.visitMaxs(-1, -1);
@@ -547,8 +606,11 @@
private void implementEncodeSelf() throws OrmException {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, "encode", Type.getMethodDescriptor(
- Type.VOID_TYPE, new Type[] {pojoType, codedOutputStream}), null,
+ cw.visitMethod(
+ ACC_PUBLIC,
+ "encode",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {pojoType, codedOutputStream}),
+ null,
new String[] {});
mv.visitCode();
final EncodeCGS cgs = new EncodeCGS(mv);
@@ -561,8 +623,9 @@
mv.visitEnd();
}
- private void encodeMessage(final JavaColumnModel[] myFields,
- final MethodVisitor mv, final EncodeCGS cgs) throws OrmException {
+ private void encodeMessage(
+ final JavaColumnModel[] myFields, final MethodVisitor mv, final EncodeCGS cgs)
+ throws OrmException {
for (final JavaColumnModel f : myFields) {
if (f.isNested()) {
final NestedCodec n = nestedFor(f);
@@ -573,34 +636,40 @@
mv.visitJumpInsn(IFNULL, end);
final int msgSizeVar = cgs.newLocal();
- mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
- .getDescriptor());
+ mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
cgs.pushFieldValue();
- mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
- "sizeof", Type.getMethodDescriptor(Type.INT_TYPE,
- new Type[] {n.pojoType}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ n.codecType.getInternalName(),
+ "sizeof",
+ Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {n.pojoType}));
mv.visitVarInsn(ISTORE, msgSizeVar);
cgs.pushCodedOutputStream();
cgs.push(f.getColumnID());
cgs.push(WireFormat.FieldType.MESSAGE.getWireType());
- mv.visitMethodInsn(INVOKEVIRTUAL, codedOutputStream.getInternalName(),
- "writeTag", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
- Type.INT_TYPE, Type.INT_TYPE}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ codedOutputStream.getInternalName(),
+ "writeTag",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE, Type.INT_TYPE}));
cgs.pushCodedOutputStream();
mv.visitVarInsn(ILOAD, msgSizeVar);
- mv.visitMethodInsn(INVOKEVIRTUAL, codedOutputStream.getInternalName(),
- "writeRawVarint32", Type.getMethodDescriptor(Type.VOID_TYPE,
- new Type[] {Type.INT_TYPE}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ codedOutputStream.getInternalName(),
+ "writeRawVarint32",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE}));
- mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
- .getDescriptor());
+ mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
cgs.pushFieldValue();
cgs.pushCodedOutputStream();
- mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
- "encode", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
- n.pojoType, codedOutputStream}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ n.codecType.getInternalName(),
+ "encode",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {n.pojoType, codedOutputStream}));
cgs.freeLocal(msgSizeVar);
mv.visitLabel(end);
@@ -614,41 +683,42 @@
}
}
- private void encodeCollection(final JavaColumnModel f,
- final MethodVisitor mv, final EncodeCGS cgs) throws OrmException {
+ private void encodeCollection(
+ final JavaColumnModel f, final MethodVisitor mv, final EncodeCGS cgs) throws OrmException {
final int itr = cgs.newLocal();
final int val = cgs.newLocal();
final Class<?> valClazz = (Class<?>) f.getArgumentTypes()[0];
final Type valType = Type.getType(valClazz);
final JavaColumnModel col = collectionColumn(f, valClazz);
- final EncodeCGS ng = new EncodeCGS(mv) {
- {
- sizeVar = cgs.sizeVar;
- setEntityType(valType);
- }
+ final EncodeCGS ng =
+ new EncodeCGS(mv) {
+ {
+ sizeVar = cgs.sizeVar;
+ setEntityType(valType);
+ }
- @Override
- public void pushEntity() {
- mv.visitVarInsn(ALOAD, val);
- }
+ @Override
+ public void pushEntity() {
+ mv.visitVarInsn(ALOAD, val);
+ }
- @Override
- protected void appendGetField(final ColumnModel c) {
- if (c != col) {
- super.appendGetField(c);
- }
- }
+ @Override
+ protected void appendGetField(final ColumnModel c) {
+ if (c != col) {
+ super.appendGetField(c);
+ }
+ }
- @Override
- public int newLocal() {
- return cgs.newLocal();
- }
+ @Override
+ public int newLocal() {
+ return cgs.newLocal();
+ }
- @Override
- public void freeLocal(int index) {
- cgs.freeLocal(index);
- }
- };
+ @Override
+ public void freeLocal(int index) {
+ cgs.freeLocal(index);
+ }
+ };
final Label end = new Label();
cgs.setFieldReference(f);
@@ -657,19 +727,28 @@
cgs.setFieldReference(f);
cgs.pushFieldValue();
- mv.visitMethodInsn(INVOKEINTERFACE, collection.getInternalName(),
- "iterator", Type.getMethodDescriptor(iterator, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ collection.getInternalName(),
+ "iterator",
+ Type.getMethodDescriptor(iterator, new Type[] {}));
mv.visitVarInsn(ASTORE, itr);
final Label doloop = new Label();
mv.visitLabel(doloop);
mv.visitVarInsn(ALOAD, itr);
- mv.visitMethodInsn(INVOKEINTERFACE, iterator.getInternalName(), "hasNext",
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ iterator.getInternalName(),
+ "hasNext",
Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {}));
mv.visitJumpInsn(IFEQ, end);
mv.visitVarInsn(ALOAD, itr);
- mv.visitMethodInsn(INVOKEINTERFACE, iterator.getInternalName(), "next",
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ iterator.getInternalName(),
+ "next",
Type.getMethodDescriptor(object, new Type[] {}));
mv.visitTypeInsn(CHECKCAST, valType.getInternalName());
mv.visitVarInsn(ASTORE, val);
@@ -682,8 +761,8 @@
cgs.freeLocal(val);
}
- private void encodeScalar(final MethodVisitor mv, final EncodeCGS cgs,
- final JavaColumnModel f) throws OrmException {
+ private void encodeScalar(final MethodVisitor mv, final EncodeCGS cgs, final JavaColumnModel f)
+ throws OrmException {
cgs.setFieldReference(f);
switch (Type.getType(f.getPrimitiveType()).getSort()) {
@@ -732,77 +811,92 @@
break;
case Type.ARRAY:
- case Type.OBJECT: {
- final Label end = new Label();
- cgs.pushFieldValue();
- mv.visitJumpInsn(IFNULL, end);
-
- if (f.getPrimitiveType() == byte[].class) {
- cgs.pushCodedOutputStream();
- cgs.push(f.getColumnID());
- cgs.push(WireFormat.FieldType.BYTES.getWireType());
- mv.visitMethodInsn(INVOKEVIRTUAL,
- codedOutputStream.getInternalName(), "writeTag", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {
- Type.INT_TYPE, Type.INT_TYPE}));
-
- cgs.pushCodedOutputStream();
+ case Type.OBJECT:
+ {
+ final Label end = new Label();
cgs.pushFieldValue();
- mv.visitInsn(ARRAYLENGTH);
- mv.visitMethodInsn(INVOKEVIRTUAL,
- codedOutputStream.getInternalName(), "writeRawVarint32", Type
- .getMethodDescriptor(Type.VOID_TYPE,
- new Type[] {Type.INT_TYPE}));
+ mv.visitJumpInsn(IFNULL, end);
- cgs.pushCodedOutputStream();
- cgs.pushFieldValue();
- mv.visitMethodInsn(INVOKEVIRTUAL,
- codedOutputStream.getInternalName(), "writeRawBytes", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type
- .getType(byte[].class)}));
+ if (f.getPrimitiveType() == byte[].class) {
+ cgs.pushCodedOutputStream();
+ cgs.push(f.getColumnID());
+ cgs.push(WireFormat.FieldType.BYTES.getWireType());
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ codedOutputStream.getInternalName(),
+ "writeTag",
+ Type.getMethodDescriptor(
+ Type.VOID_TYPE, new Type[] {Type.INT_TYPE, Type.INT_TYPE}));
- } else {
- cgs.pushCodedOutputStream();
- cgs.push(f.getColumnID());
- cgs.pushFieldValue();
+ cgs.pushCodedOutputStream();
+ cgs.pushFieldValue();
+ mv.visitInsn(ARRAYLENGTH);
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ codedOutputStream.getInternalName(),
+ "writeRawVarint32",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE}));
- if (f.getPrimitiveType() == String.class) {
- cgs.write("writeString", string);
-
- } else if (f.getPrimitiveType() == java.sql.Timestamp.class
- || f.getPrimitiveType() == java.util.Date.class
- || f.getPrimitiveType() == java.sql.Date.class) {
- String tsType =
- Type.getType(f.getPrimitiveType()).getInternalName();
- mv.visitMethodInsn(INVOKEVIRTUAL, tsType, "getTime", Type
- .getMethodDescriptor(Type.LONG_TYPE, new Type[] {}));
- cgs.write("writeFixed64", Type.LONG_TYPE);
-
- } else if (f.getPrimitiveType().isEnum()) {
- mv.visitMethodInsn(INVOKEVIRTUAL, enumType.getInternalName(),
- "ordinal", //
- Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {}));
- cgs.write("writeEnum", Type.INT_TYPE);
+ cgs.pushCodedOutputStream();
+ cgs.pushFieldValue();
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ codedOutputStream.getInternalName(),
+ "writeRawBytes",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.getType(byte[].class)}));
} else {
- throw new OrmException("Type " + f.getPrimitiveType()
- + " not supported for field " + f.getPathToFieldName());
+ cgs.pushCodedOutputStream();
+ cgs.push(f.getColumnID());
+ cgs.pushFieldValue();
+
+ if (f.getPrimitiveType() == String.class) {
+ cgs.write("writeString", string);
+
+ } else if (f.getPrimitiveType() == java.sql.Timestamp.class
+ || f.getPrimitiveType() == java.util.Date.class
+ || f.getPrimitiveType() == java.sql.Date.class) {
+ String tsType = Type.getType(f.getPrimitiveType()).getInternalName();
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ tsType,
+ "getTime",
+ Type.getMethodDescriptor(Type.LONG_TYPE, new Type[] {}));
+ cgs.write("writeFixed64", Type.LONG_TYPE);
+
+ } else if (f.getPrimitiveType().isEnum()) {
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ enumType.getInternalName(),
+ "ordinal", //
+ Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {}));
+ cgs.write("writeEnum", Type.INT_TYPE);
+
+ } else {
+ throw new OrmException(
+ "Type "
+ + f.getPrimitiveType()
+ + " not supported for field "
+ + f.getPathToFieldName());
+ }
}
+ mv.visitLabel(end);
+ break;
}
- mv.visitLabel(end);
- break;
- }
default:
- throw new OrmException("Type " + f.getPrimitiveType()
- + " not supported for field " + f.getPathToFieldName());
+ throw new OrmException(
+ "Type " + f.getPrimitiveType() + " not supported for field " + f.getPathToFieldName());
}
}
private void implementMergeFromObject() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, "mergeFrom", Type.getMethodDescriptor(
- Type.VOID_TYPE, new Type[] {codedInputStream, object}), null,
+ cw.visitMethod(
+ ACC_PUBLIC,
+ "mergeFrom",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {codedInputStream, object}),
+ null,
new String[] {});
mv.visitCode();
@@ -810,9 +904,11 @@
mv.visitVarInsn(ALOAD, 1);
mv.visitVarInsn(ALOAD, 2);
mv.visitTypeInsn(CHECKCAST, pojoType.getInternalName());
- mv.visitMethodInsn(INVOKEVIRTUAL, implTypeName, "mergeFrom", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {codedInputStream,
- pojoType}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ implTypeName,
+ "mergeFrom",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {codedInputStream, pojoType}));
mv.visitInsn(RETURN);
mv.visitMaxs(-1, -1);
@@ -821,8 +917,11 @@
private void implementMergeFromSelf() throws OrmException {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, "mergeFrom", Type.getMethodDescriptor(
- Type.VOID_TYPE, new Type[] {codedInputStream, pojoType}), null,
+ cw.visitMethod(
+ ACC_PUBLIC,
+ "mergeFrom",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {codedInputStream, pojoType}),
+ null,
new String[] {});
mv.visitCode();
final DecodeCGS cgs = new DecodeCGS(mv);
@@ -837,8 +936,9 @@
mv.visitEnd();
}
- private void decodeMessage(final JavaColumnModel[] myFields,
- final MethodVisitor mv, final DecodeCGS cgs) throws OrmException {
+ private void decodeMessage(
+ final JavaColumnModel[] myFields, final MethodVisitor mv, final DecodeCGS cgs)
+ throws OrmException {
final Label nextField = new Label();
final Label end = new Label();
mv.visitLabel(nextField);
@@ -902,8 +1002,8 @@
cgs.ncallInt("checkLastTagWas", Type.VOID_TYPE);
}
- private void decodeField(final MethodVisitor mv, final DecodeCGS cgs,
- final JavaColumnModel f) throws OrmException {
+ private void decodeField(final MethodVisitor mv, final DecodeCGS cgs, final JavaColumnModel f)
+ throws OrmException {
if (f.isNested()) {
final NestedCodec n = nestedFor(f);
final Label load = new Label();
@@ -914,13 +1014,14 @@
// Since the field isn't initialized, construct it
//
cgs.fieldSetBegin();
- mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
- .getDescriptor());
- mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
- "newInstance", Type.getMethodDescriptor(n.pojoType, new Type[] {}));
+ mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ n.codecType.getInternalName(),
+ "newInstance",
+ Type.getMethodDescriptor(n.pojoType, new Type[] {}));
if (object.equals(n.pojoType)) {
- mv.visitTypeInsn(CHECKCAST, Type.getType(f.getNestedClass())
- .getInternalName());
+ mv.visitTypeInsn(CHECKCAST, Type.getType(f.getNestedClass()).getInternalName());
}
cgs.fieldSetEnd();
@@ -934,13 +1035,14 @@
cgs.ncallInt("pushLimit", Type.INT_TYPE);
mv.visitVarInsn(ISTORE, limitVar);
- mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
- .getDescriptor());
+ mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
cgs.pushCodedInputStream();
cgs.pushFieldValue();
- mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
- "mergeFrom", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
- codedInputStream, n.pojoType}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ n.codecType.getInternalName(),
+ "mergeFrom",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {codedInputStream, n.pojoType}));
cgs.pushCodedInputStream();
mv.visitVarInsn(ILOAD, limitVar);
@@ -955,55 +1057,58 @@
}
}
- private void decodeCollection(final MethodVisitor mv, final DecodeCGS cgs,
- final JavaColumnModel f) throws OrmException {
+ private void decodeCollection(
+ final MethodVisitor mv, final DecodeCGS cgs, final JavaColumnModel f) throws OrmException {
final Class<?> valClazz = (Class<?>) f.getArgumentTypes()[0];
final Type valType = Type.getType(valClazz);
final JavaColumnModel col = collectionColumn(f, valClazz);
- final DecodeCGS ng = new DecodeCGS(mv) {
- {
- tagVar = cgs.tagVar;
- setEntityType(valType);
- }
+ final DecodeCGS ng =
+ new DecodeCGS(mv) {
+ {
+ tagVar = cgs.tagVar;
+ setEntityType(valType);
+ }
- @Override
- public int newLocal() {
- return cgs.newLocal();
- }
+ @Override
+ public int newLocal() {
+ return cgs.newLocal();
+ }
- @Override
- public void freeLocal(int index) {
- cgs.freeLocal(index);
- }
+ @Override
+ public void freeLocal(int index) {
+ cgs.freeLocal(index);
+ }
- @Override
- protected void appendGetField(final ColumnModel c) {
- if (c != col) {
- super.appendGetField(c);
- }
- }
+ @Override
+ protected void appendGetField(final ColumnModel c) {
+ if (c != col) {
+ super.appendGetField(c);
+ }
+ }
- @Override
- public void fieldSetBegin() {
- if (col.isNested()) {
- super.fieldSetBegin();
- } else {
- cgs.pushFieldValue();
- }
- }
+ @Override
+ public void fieldSetBegin() {
+ if (col.isNested()) {
+ super.fieldSetBegin();
+ } else {
+ cgs.pushFieldValue();
+ }
+ }
- @Override
- public void fieldSetEnd() {
- if (col.isNested()) {
- super.fieldSetEnd();
- } else {
- mv.visitMethodInsn(INVOKEINTERFACE, collection.getInternalName(),
- "add", Type.getMethodDescriptor(Type.BOOLEAN_TYPE,
- new Type[] {object}));
- mv.visitInsn(POP);
- }
- }
- };
+ @Override
+ public void fieldSetEnd() {
+ if (col.isNested()) {
+ super.fieldSetEnd();
+ } else {
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ collection.getInternalName(),
+ "add",
+ Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {object}));
+ mv.visitInsn(POP);
+ }
+ }
+ };
final Label notnull = new Label();
cgs.setFieldReference(f);
@@ -1031,9 +1136,11 @@
mv.visitTypeInsn(NEW, illegalStateException.getInternalName());
mv.visitInsn(DUP);
mv.visitLdcInsn("Field " + f.getPathToFieldName() + " not initialized");
- mv.visitMethodInsn(INVOKESPECIAL,
- illegalStateException.getInternalName(), "<init>", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {string}));
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ illegalStateException.getInternalName(),
+ "<init>",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {string}));
mv.visitInsn(ATHROW);
concreteType = null;
}
@@ -1041,8 +1148,11 @@
cgs.fieldSetBegin();
mv.visitTypeInsn(NEW, concreteType.getInternalName());
mv.visitInsn(DUP);
- mv.visitMethodInsn(INVOKESPECIAL, concreteType.getInternalName(),
- "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ concreteType.getInternalName(),
+ "<init>",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
cgs.fieldSetEnd();
}
mv.visitLabel(notnull);
@@ -1052,10 +1162,12 @@
//
final NestedCodec n = nestedFor(col);
ng.objVar = cgs.newLocal();
- mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
- .getDescriptor());
- mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
- "newInstance", Type.getMethodDescriptor(n.pojoType, new Type[] {}));
+ mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ n.codecType.getInternalName(),
+ "newInstance",
+ Type.getMethodDescriptor(n.pojoType, new Type[] {}));
mv.visitVarInsn(ASTORE, ng.objVar);
// read the length, set a new limit, decode the message, validate
@@ -1067,13 +1179,14 @@
cgs.ncallInt("pushLimit", Type.INT_TYPE);
mv.visitVarInsn(ISTORE, limitVar);
- mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType
- .getDescriptor());
+ mv.visitFieldInsn(GETSTATIC, implTypeName, n.field, n.codecType.getDescriptor());
cgs.pushCodedInputStream();
mv.visitVarInsn(ALOAD, ng.objVar);
- mv.visitMethodInsn(INVOKEVIRTUAL, n.codecType.getInternalName(),
- "mergeFrom", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
- codedInputStream, n.pojoType}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ n.codecType.getInternalName(),
+ "mergeFrom",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {codedInputStream, n.pojoType}));
cgs.pushCodedInputStream();
mv.visitVarInsn(ILOAD, limitVar);
@@ -1082,22 +1195,25 @@
cgs.pushFieldValue();
mv.visitVarInsn(ALOAD, ng.objVar);
- mv.visitMethodInsn(INVOKEINTERFACE, collection.getInternalName(), "add",
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ collection.getInternalName(),
+ "add",
Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {object}));
mv.visitInsn(POP);
cgs.freeLocal(ng.objVar);
} else if (col.isCollection()) {
- throw new OrmException("Cannot nest collection as member of another"
- + " collection: " + f.getPathToFieldName());
+ throw new OrmException(
+ "Cannot nest collection as member of another" + " collection: " + f.getPathToFieldName());
} else {
decodeScalar(mv, ng, col);
}
}
- private static void decodeScalar(final MethodVisitor mv, final DecodeCGS cgs,
- final JavaColumnModel f) throws OrmException {
+ private static void decodeScalar(
+ final MethodVisitor mv, final DecodeCGS cgs, final JavaColumnModel f) throws OrmException {
cgs.setFieldReference(f);
cgs.fieldSetBegin();
switch (Type.getType(f.getPrimitiveType()).getSort()) {
@@ -1130,9 +1246,11 @@
default:
if (f.getPrimitiveType() == byte[].class) {
cgs.call("readBytes", byteString);
- mv.visitMethodInsn(INVOKEVIRTUAL, byteString.getInternalName(),
- "toByteArray", Type.getMethodDescriptor(Type
- .getType(byte[].class), new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ byteString.getInternalName(),
+ "toByteArray",
+ Type.getMethodDescriptor(Type.getType(byte[].class), new Type[] {}));
} else if (f.getPrimitiveType() == String.class) {
cgs.call("readString", string);
@@ -1144,21 +1262,28 @@
mv.visitTypeInsn(NEW, tsType);
mv.visitInsn(DUP);
cgs.call("readFixed64", Type.LONG_TYPE);
- mv.visitMethodInsn(INVOKESPECIAL, tsType, "<init>", //
- Type.getMethodDescriptor(Type.VOID_TYPE,
- new Type[] {Type.LONG_TYPE}));
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ tsType,
+ "<init>", //
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.LONG_TYPE}));
} else if (f.getPrimitiveType().isEnum()) {
Type et = Type.getType(f.getPrimitiveType());
- mv.visitMethodInsn(INVOKESTATIC, et.getInternalName(), "values", Type
- .getMethodDescriptor(Type.getType("[" + et.getDescriptor()),
- new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ et.getInternalName(),
+ "values",
+ Type.getMethodDescriptor(Type.getType("[" + et.getDescriptor()), new Type[] {}));
cgs.call("readEnum", Type.INT_TYPE);
mv.visitInsn(AALOAD);
} else {
- throw new OrmException("Type " + f.getPrimitiveType()
- + " not supported for field " + f.getPathToFieldName());
+ throw new OrmException(
+ "Type "
+ + f.getPrimitiveType()
+ + " not supported for field "
+ + f.getPathToFieldName());
}
break;
}
@@ -1173,8 +1298,11 @@
}
void doinc(String name, Type... args) {
- mv.visitMethodInsn(INVOKESTATIC, codedOutputStream.getInternalName(),
- name, Type.getMethodDescriptor(Type.INT_TYPE, args));
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ codedOutputStream.getInternalName(),
+ name,
+ Type.getMethodDescriptor(Type.INT_TYPE, args));
doinc();
}
@@ -1203,9 +1331,11 @@
}
void write(String name, Type arg) {
- mv.visitMethodInsn(INVOKEVIRTUAL, codedOutputStream.getInternalName(),
- name, Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
- Type.INT_TYPE, arg}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ codedOutputStream.getInternalName(),
+ name,
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE, arg}));
}
}
@@ -1224,13 +1354,19 @@
void call(String name, Type ret) {
pushCodedInputStream();
- mv.visitMethodInsn(INVOKEVIRTUAL, codedInputStream.getInternalName(),
- name, Type.getMethodDescriptor(ret, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ codedInputStream.getInternalName(),
+ name,
+ Type.getMethodDescriptor(ret, new Type[] {}));
}
void ncallInt(String name, Type ret) {
- mv.visitMethodInsn(INVOKEVIRTUAL, codedInputStream.getInternalName(),
- name, Type.getMethodDescriptor(ret, new Type[] {Type.INT_TYPE}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ codedInputStream.getInternalName(),
+ name,
+ Type.getMethodDescriptor(ret, new Type[] {Type.INT_TYPE}));
}
@Override
diff --git a/src/main/java/com/google/gwtorm/protobuf/CustomCodec.java b/src/main/java/com/google/gwtorm/protobuf/CustomCodec.java
index 3462a3c..8a25690 100644
--- a/src/main/java/com/google/gwtorm/protobuf/CustomCodec.java
+++ b/src/main/java/com/google/gwtorm/protobuf/CustomCodec.java
@@ -21,11 +21,10 @@
/**
* Identity of a custom {@link ProtobufCodec} for a {@code Column}.
- * <p>
- * Additional annotation tagged onto a {@code Column} field that carries the
- * name of a custom {@link ProtobufCodec} that should be used to handle that
- * field. The field data will be treated as an opaque binary sequence, so its
- * {@link ProtobufCodec#sizeof(Object)} method must be accurate.
+ *
+ * <p>Additional annotation tagged onto a {@code Column} field that carries the name of a custom
+ * {@link ProtobufCodec} that should be used to handle that field. The field data will be treated as
+ * an opaque binary sequence, so its {@link ProtobufCodec#sizeof(Object)} method must be accurate.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
diff --git a/src/main/java/com/google/gwtorm/protobuf/ProtobufCodec.java b/src/main/java/com/google/gwtorm/protobuf/ProtobufCodec.java
index 43202b1..aa5d5d1 100644
--- a/src/main/java/com/google/gwtorm/protobuf/ProtobufCodec.java
+++ b/src/main/java/com/google/gwtorm/protobuf/ProtobufCodec.java
@@ -19,7 +19,6 @@
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
import com.google.protobuf.InvalidProtocolBufferException;
-
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -27,9 +26,9 @@
/**
* Encode and decode an arbitrary Java object as a Protobuf message.
- * <p>
- * The object must use the {@link Column} annotations to denote the fields that
- * should be encoded or decoded.
+ *
+ * <p>The object must use the {@link Column} annotations to denote the fields that should be encoded
+ * or decoded.
*/
public abstract class ProtobufCodec<T> {
/** Encode the object into an immutable byte string. */
@@ -71,10 +70,11 @@
/** Encode the object into a ByteBuffer. */
public void encode(T obj, ByteBuffer buf) {
if (buf.hasArray()) {
- CodedOutputStream out = CodedOutputStream.newInstance( //
- buf.array(), //
- buf.position(), //
- buf.remaining());
+ CodedOutputStream out =
+ CodedOutputStream.newInstance( //
+ buf.array(), //
+ buf.position(), //
+ buf.remaining());
try {
encode(obj, out);
out.flush();
@@ -96,8 +96,8 @@
/**
* Encodes the object, prefixed by its encoded length.
- * <p>
- * The length is encoded as a raw varint with no tag.
+ *
+ * <p>The length is encoded as a raw varint with no tag.
*
* @param obj the object to encode.
* @param out stream that will receive the object's data.
@@ -116,10 +116,10 @@
/**
* Encode the object to the supplied output stream.
- * <p>
- * The stream {@code out} is not flushed by this method. Callers that need the
- * entire byte representation after invoking encode must flush the stream to
- * ensure its intermediate buffers have been written to the backing store.
+ *
+ * <p>The stream {@code out} is not flushed by this method. Callers that need the entire byte
+ * representation after invoking encode must flush the stream to ensure its intermediate buffers
+ * have been written to the backing store.
*
* @param obj the object to encode.
* @param out the stream to encode the object onto.
@@ -205,10 +205,11 @@
/** Decode a byte buffer into an existing object instance. */
public void mergeFrom(ByteBuffer buf, T obj) {
if (buf.hasArray()) {
- CodedInputStream in = CodedInputStream.newInstance( //
- buf.array(), //
- buf.position(), //
- buf.remaining());
+ CodedInputStream in =
+ CodedInputStream.newInstance( //
+ buf.array(), //
+ buf.position(), //
+ buf.remaining());
try {
mergeFrom(in, obj);
} catch (IOException err) {
diff --git a/src/main/java/com/google/gwtorm/schema/ColumnModel.java b/src/main/java/com/google/gwtorm/schema/ColumnModel.java
index 066b363..c9a88d2 100644
--- a/src/main/java/com/google/gwtorm/schema/ColumnModel.java
+++ b/src/main/java/com/google/gwtorm/schema/ColumnModel.java
@@ -16,7 +16,6 @@
import com.google.gwtorm.client.Column;
import com.google.gwtorm.server.OrmException;
-
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
@@ -36,14 +35,13 @@
protected boolean notNull;
protected ColumnModel() {
- nestedColumns = Collections.<ColumnModel> emptyList();
+ nestedColumns = Collections.<ColumnModel>emptyList();
}
- protected void initName(final String fieldName, final Column col)
- throws OrmException {
+ protected void initName(final String fieldName, final Column col) throws OrmException {
if (col == null) {
- throw new OrmException("Field " + fieldName + " is missing "
- + Column.class.getName() + " annotation");
+ throw new OrmException(
+ "Field " + fieldName + " is missing " + Column.class.getName() + " annotation");
}
column = col;
origName = Util.any(column.name(), Util.makeSqlFriendly(fieldName));
@@ -71,8 +69,8 @@
Set<Integer> ids = new HashSet<>();
for (final ColumnModel c : nestedColumns) {
if (!ids.add(c.columnId)) {
- throw new OrmException("Duplicate @Column id " + c.columnId + " in "
- + c.getPathToFieldName());
+ throw new OrmException(
+ "Duplicate @Column id " + c.columnId + " in " + c.getPathToFieldName());
}
}
}
diff --git a/src/main/java/com/google/gwtorm/schema/QueryModel.java b/src/main/java/com/google/gwtorm/schema/QueryModel.java
index 149e3d7..f8141ee 100644
--- a/src/main/java/com/google/gwtorm/schema/QueryModel.java
+++ b/src/main/java/com/google/gwtorm/schema/QueryModel.java
@@ -19,36 +19,33 @@
import com.google.gwtorm.schema.sql.SqlDialect;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.Query;
-
-import org.antlr.runtime.CommonToken;
-import org.antlr.runtime.tree.CommonTree;
-import org.antlr.runtime.tree.Tree;
-
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import org.antlr.runtime.CommonToken;
+import org.antlr.runtime.tree.CommonTree;
+import org.antlr.runtime.tree.Tree;
public class QueryModel {
private final RelationModel model;
private final String name;
private final Tree parsedQuery;
- public QueryModel(final RelationModel rel, final String queryName,
- final Query q) throws OrmException {
+ public QueryModel(final RelationModel rel, final String queryName, final Query q)
+ throws OrmException {
this(rel, queryName, queryTextOf(queryName, q));
}
- private static String queryTextOf(String queryName, Query q)
- throws OrmException {
+ private static String queryTextOf(String queryName, Query q) throws OrmException {
if (q == null) {
- throw new OrmException("Query " + queryName + " is missing "
- + Query.class.getName() + " annotation");
+ throw new OrmException(
+ "Query " + queryName + " is missing " + Query.class.getName() + " annotation");
}
return q.value();
}
- public QueryModel(final RelationModel rel, final String queryName,
- final String queryText) throws OrmException {
+ public QueryModel(final RelationModel rel, final String queryName, final String queryText)
+ throws OrmException {
model = rel;
name = queryName;
@@ -107,9 +104,9 @@
for (int i = 0; i < node.getChildCount(); i++) {
Tree sortOrder = node.getChild(i);
Tree id = sortOrder.getChild(0);
- r.add(new OrderBy(
- ((QueryParser.Column) id).getField(),
- sortOrder.getType() == QueryParser.DESC));
+ r.add(
+ new OrderBy(
+ ((QueryParser.Column) id).getField(), sortOrder.getType() == QueryParser.DESC));
}
}
}
@@ -164,8 +161,7 @@
public boolean hasLimitParameter() {
final Tree limit = findLimit(parsedQuery);
- return limit != null
- && limit.getChild(0).getType() == QueryParser.PLACEHOLDER;
+ return limit != null && limit.getChild(0).getType() == QueryParser.PLACEHOLDER;
}
public int getStaticLimit() {
@@ -273,29 +269,30 @@
format(fmt, node.getChild(1));
break;
- case QueryParser.ID: {
- final ColumnModel col = ((QueryParser.Column) node).getField();
- if (!col.isSqlPrimitive()) {
- throw new IllegalStateException("Unexpanded nested field");
+ case QueryParser.ID:
+ {
+ final ColumnModel col = ((QueryParser.Column) node).getField();
+ if (!col.isSqlPrimitive()) {
+ throw new IllegalStateException("Unexpanded nested field");
+ }
+ fmt.buf.append(fmt.tableAlias);
+ fmt.buf.append('.');
+ fmt.buf.append(col.getColumnName());
+ break;
}
- fmt.buf.append(fmt.tableAlias);
- fmt.buf.append('.');
- fmt.buf.append(col.getColumnName());
- break;
- }
case QueryParser.PLACEHOLDER:
fmt.buf.append(fmt.dialect.getParameterPlaceHolder(fmt.nthParam++));
break;
case QueryParser.TRUE:
- fmt.buf.append(((SqlBooleanTypeInfo) fmt.dialect
- .getSqlTypeInfo(Boolean.TYPE)).getTrueLiteralValue());
+ fmt.buf.append(
+ ((SqlBooleanTypeInfo) fmt.dialect.getSqlTypeInfo(Boolean.TYPE)).getTrueLiteralValue());
break;
case QueryParser.FALSE:
- fmt.buf.append(((SqlBooleanTypeInfo) fmt.dialect
- .getSqlTypeInfo(Boolean.TYPE)).getFalseLiteralValue());
+ fmt.buf.append(
+ ((SqlBooleanTypeInfo) fmt.dialect.getSqlTypeInfo(Boolean.TYPE)).getFalseLiteralValue());
break;
case QueryParser.CONSTANT_INTEGER:
@@ -313,8 +310,9 @@
}
final ColumnModel col = ((QueryParser.Column) id).getField();
if (col.isNested()) {
- for (final Iterator<ColumnModel> cItr =
- col.getAllLeafColumns().iterator(); cItr.hasNext();) {
+ for (final Iterator<ColumnModel> cItr = col.getAllLeafColumns().iterator();
+ cItr.hasNext();
+ ) {
fmt.buf.append(fmt.tableAlias);
fmt.buf.append('.');
fmt.buf.append(cItr.next().getColumnName());
@@ -363,24 +361,25 @@
case QueryParser.LE:
case QueryParser.GT:
case QueryParser.GE:
- case QueryParser.EQ: {
- final Column qpc = (QueryParser.Column) node.getChild(0);
- final ColumnModel f = qpc.getField();
- if (f.isNested()) {
- final CommonTree join;
+ case QueryParser.EQ:
+ {
+ final Column qpc = (QueryParser.Column) node.getChild(0);
+ final ColumnModel f = qpc.getField();
+ if (f.isNested()) {
+ final CommonTree join;
- join = new CommonTree(new CommonToken(QueryParser.AND));
- for (final ColumnModel c : f.getAllLeafColumns()) {
- final Tree op;
+ join = new CommonTree(new CommonToken(QueryParser.AND));
+ for (final ColumnModel c : f.getAllLeafColumns()) {
+ final Tree op;
- op = node.dupNode();
- op.addChild(new QueryParser.Column(qpc, c));
- op.addChild(node.getChild(1).dupNode());
- join.addChild(op);
+ op = node.dupNode();
+ op.addChild(new QueryParser.Column(qpc, c));
+ op.addChild(node.getChild(1).dupNode());
+ join.addChild(op);
+ }
+ return join;
}
- return join;
}
- }
}
final Tree r = node.dupNode();
diff --git a/src/main/java/com/google/gwtorm/schema/RelationModel.java b/src/main/java/com/google/gwtorm/schema/RelationModel.java
index ebfb050..8f1f555 100644
--- a/src/main/java/com/google/gwtorm/schema/RelationModel.java
+++ b/src/main/java/com/google/gwtorm/schema/RelationModel.java
@@ -20,7 +20,6 @@
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.PrimaryKey;
import com.google.gwtorm.server.Relation;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -46,11 +45,10 @@
queries = Lists.newArrayList();
}
- protected void initName(final String method, final Relation rel)
- throws OrmException {
+ protected void initName(final String method, final Relation rel) throws OrmException {
if (rel == null) {
- throw new OrmException("Method " + method + " is missing "
- + Relation.class.getName() + " annotation");
+ throw new OrmException(
+ "Method " + method + " is missing " + Relation.class.getName() + " annotation");
}
relation = rel;
methodName = method;
@@ -64,8 +62,8 @@
throw new OrmException("Duplicate fields " + field.getFieldName());
}
if (columnsById.put(field.getColumnID(), field) != null) {
- throw new OrmException("Duplicate @Column id " + field.getColumnID()
- + " in " + field.getPathToFieldName());
+ throw new OrmException(
+ "Duplicate @Column id " + field.getColumnID() + " in " + field.getPathToFieldName());
}
if (field.isNested()) {
@@ -81,9 +79,16 @@
private void registerColumn(final ColumnModel nc) throws OrmException {
final ColumnModel name = columnsByColumnName.put(nc.getColumnName(), nc);
if (name != null) {
- throw new OrmException("Duplicate columns " + nc.getColumnName() + " in "
- + getMethodName() + ":\n" + "prior " + name.getPathToFieldName()
- + "\n next " + nc.getPathToFieldName());
+ throw new OrmException(
+ "Duplicate columns "
+ + nc.getColumnName()
+ + " in "
+ + getMethodName()
+ + ":\n"
+ + "prior "
+ + name.getPathToFieldName()
+ + "\n next "
+ + nc.getPathToFieldName());
}
}
@@ -95,8 +100,7 @@
final ColumnModel field = getField(annotation.value());
if (field == null) {
- throw new OrmException("Field " + annotation.value() + " not in "
- + getEntityTypeClassName());
+ throw new OrmException("Field " + annotation.value() + " not in " + getEntityTypeClassName());
}
primaryKey = new KeyModel(name, field);
@@ -108,14 +112,16 @@
protected void addQuery(final QueryModel q) throws OrmException {
for (QueryModel e : queries) {
if (e.getName().equals(q.getName())) {
- throw new OrmException("Duplicate query " + q.getName() //
- + " in " + getAccessInterfaceName());
+ throw new OrmException(
+ "Duplicate query "
+ + q.getName() //
+ + " in "
+ + getAccessInterfaceName());
}
}
queries.add(q);
}
-
public String getMethodName() {
return methodName;
}
@@ -176,7 +182,7 @@
if (getPrimaryKey() != null) {
return getPrimaryKey().getAllLeafColumns();
}
- return Collections.<ColumnModel> emptyList();
+ return Collections.<ColumnModel>emptyList();
}
public Collection<QueryModel> getQueries() {
@@ -211,14 +217,13 @@
r.append(relationName);
r.append(" (\n");
- for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext();) {
+ for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext(); ) {
final ColumnModel col = i.next();
r.append(col.getColumnName());
r.append(" ");
r.append(dialect.getSqlTypeInfo(col).getSqlType(col, dialect));
- String check =
- dialect.getSqlTypeInfo(col).getCheckConstraint(col, dialect);
+ String check = dialect.getSqlTypeInfo(col).getCheckConstraint(col, dialect);
if (check != null) {
r.append(' ');
r.append(check);
@@ -231,8 +236,7 @@
if (!getPrimaryKeyColumns().isEmpty()) {
r.append(",PRIMARY KEY(");
- for (final Iterator<ColumnModel> i = getPrimaryKeyColumns().iterator(); i
- .hasNext();) {
+ for (final Iterator<ColumnModel> i = getPrimaryKeyColumns().iterator(); i.hasNext(); ) {
final ColumnModel col = i.next();
r.append(col.getColumnName());
if (i.hasNext()) {
@@ -250,7 +254,7 @@
public String getSelectSql(final SqlDialect dialect, final String tableAlias) {
final StringBuilder r = new StringBuilder();
r.append("SELECT ");
- for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext();) {
+ for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext(); ) {
final ColumnModel col = i.next();
r.append(tableAlias);
r.append('.');
@@ -271,7 +275,7 @@
r.append("INSERT INTO ");
r.append(relationName);
r.append("(");
- for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext();) {
+ for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext(); ) {
final ColumnModel col = i.next();
r.append(col.getColumnName());
if (i.hasNext()) {
@@ -280,7 +284,7 @@
}
r.append(")VALUES(");
int nth = 1;
- for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext();) {
+ for (final Iterator<ColumnModel> i = getColumns().iterator(); i.hasNext(); ) {
i.next();
r.append(dialect.getParameterPlaceHolder(nth++));
if (i.hasNext()) {
@@ -302,7 +306,7 @@
cols = new ArrayList<>();
cols.addAll(getDependentColumns());
cols.addAll(getRowVersionColumns());
- for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext();) {
+ for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext(); ) {
final ColumnModel col = i.next();
r.append(col.getColumnName());
r.append("=");
@@ -316,7 +320,7 @@
cols = new ArrayList<>();
cols.addAll(getPrimaryKeyColumns());
cols.addAll(getRowVersionColumns());
- for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext();) {
+ for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext(); ) {
final ColumnModel col = i.next();
r.append(col.getColumnName());
r.append("=");
@@ -337,7 +341,7 @@
final List<ColumnModel> cols = new ArrayList<>();
cols.addAll(getPrimaryKeyColumns());
cols.addAll(getRowVersionColumns());
- for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext();) {
+ for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext(); ) {
final ColumnModel col = i.next();
r.append(col.getColumnName());
r.append("=");
diff --git a/src/main/java/com/google/gwtorm/schema/SchemaModel.java b/src/main/java/com/google/gwtorm/schema/SchemaModel.java
index b8ed338..3f188c1 100644
--- a/src/main/java/com/google/gwtorm/schema/SchemaModel.java
+++ b/src/main/java/com/google/gwtorm/schema/SchemaModel.java
@@ -16,7 +16,6 @@
import com.google.gwtorm.schema.sql.SqlDialect;
import com.google.gwtorm.server.OrmException;
-
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
diff --git a/src/main/java/com/google/gwtorm/schema/SequenceModel.java b/src/main/java/com/google/gwtorm/schema/SequenceModel.java
index e8a128e..0b56f85 100644
--- a/src/main/java/com/google/gwtorm/schema/SequenceModel.java
+++ b/src/main/java/com/google/gwtorm/schema/SequenceModel.java
@@ -24,15 +24,14 @@
protected Sequence sequence;
protected Class<?> returnType;
- public SequenceModel(final String method, final Sequence seq,
- final Class<?> type) throws OrmException {
+ public SequenceModel(final String method, final Sequence seq, final Class<?> type)
+ throws OrmException {
if (seq == null) {
- throw new OrmException("Method " + method + " is missing "
- + Sequence.class.getName() + " annotation");
+ throw new OrmException(
+ "Method " + method + " is missing " + Sequence.class.getName() + " annotation");
}
if (type != Integer.TYPE && type != Long.TYPE) {
- throw new OrmException("Sequence method " + method
- + " must return int or long");
+ throw new OrmException("Sequence method " + method + " must return int or long");
}
sequence = seq;
diff --git a/src/main/java/com/google/gwtorm/schema/Util.java b/src/main/java/com/google/gwtorm/schema/Util.java
index 6a55c72..287e573 100644
--- a/src/main/java/com/google/gwtorm/schema/Util.java
+++ b/src/main/java/com/google/gwtorm/schema/Util.java
@@ -14,7 +14,6 @@
package com.google.gwtorm.schema;
-
public class Util {
private static int nameCounter;
@@ -43,14 +42,13 @@
}
String friendlyName = r.toString();
if (friendlyName.length() > 30) {
- throw new IllegalArgumentException(String.format(
- "Identifier '%s' for name '%s' is greater than 30 characters",
- friendlyName, name));
+ throw new IllegalArgumentException(
+ String.format(
+ "Identifier '%s' for name '%s' is greater than 30 characters", friendlyName, name));
}
return friendlyName;
}
-
public static String any(final String a, final String b) {
if (a != null && a.length() > 0) {
return a;
@@ -92,6 +90,5 @@
return false;
}
- private Util() {
- }
+ private Util() {}
}
diff --git a/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java b/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java
index 9e2b30c..f3d9102 100644
--- a/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java
+++ b/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java
@@ -20,7 +20,6 @@
import com.google.gwtorm.schema.ColumnModel;
import com.google.gwtorm.schema.Util;
import com.google.gwtorm.server.OrmException;
-
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
@@ -29,7 +28,6 @@
import java.util.Arrays;
import java.util.List;
-
public class JavaColumnModel extends ColumnModel {
public static List<Field> getDeclaredFields(Class<?> in) {
return sort(Arrays.asList(in.getDeclaredFields()));
@@ -69,25 +67,38 @@
initName(fieldName, field.getAnnotation(Column.class));
if (Modifier.isPrivate(field.getModifiers())) {
- throw new OrmException("Field " + field.getName() + " of "
- + field.getDeclaringClass().getName() + " must not be private");
+ throw new OrmException(
+ "Field "
+ + field.getName()
+ + " of "
+ + field.getDeclaringClass().getName()
+ + " must not be private");
}
if (Modifier.isFinal(field.getModifiers())) {
- throw new OrmException("Field " + field.getName() + " of "
- + field.getDeclaringClass().getName() + " must not be final");
+ throw new OrmException(
+ "Field "
+ + field.getName()
+ + " of "
+ + field.getDeclaringClass().getName()
+ + " must not be final");
}
rowVersion = field.getAnnotation(RowVersion.class) != null;
if (rowVersion && field.getType() != Integer.TYPE) {
- throw new OrmException("Field " + field.getName() + " of "
- + field.getDeclaringClass().getName() + " must have type 'int'");
+ throw new OrmException(
+ "Field "
+ + field.getName()
+ + " of "
+ + field.getDeclaringClass().getName()
+ + " must have type 'int'");
}
initNested();
}
- public JavaColumnModel(Field f, final String fieldPath, final int columnId,
- final Class<?> columnType) throws OrmException {
+ public JavaColumnModel(
+ Field f, final String fieldPath, final int columnId, final Class<?> columnType)
+ throws OrmException {
this.field = f;
this.fieldName = fieldPath;
this.columnName = fieldPath;
diff --git a/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java b/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java
index 3a06407..b2b8f16 100644
--- a/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java
+++ b/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java
@@ -23,7 +23,6 @@
import com.google.gwtorm.server.Query;
import com.google.gwtorm.server.Relation;
import com.google.gwtorm.server.ResultSet;
-
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
@@ -41,21 +40,23 @@
initName(method.getName(), m.getAnnotation(Relation.class));
accessType = method.getReturnType();
- if (accessType.getInterfaces().length != 1
- || accessType.getInterfaces()[0] != Access.class) {
- throw new OrmException("Method " + method.getName() + " in "
- + method.getDeclaringClass().getName()
- + " must return a direct extension of " + Access.class);
+ if (accessType.getInterfaces().length != 1 || accessType.getInterfaces()[0] != Access.class) {
+ throw new OrmException(
+ "Method "
+ + method.getName()
+ + " in "
+ + method.getDeclaringClass().getName()
+ + " must return a direct extension of "
+ + Access.class);
}
final Type gt = accessType.getGenericInterfaces()[0];
if (!(gt instanceof ParameterizedType)) {
- throw new OrmException(accessType.getName()
- + " must specify entity type parameter for " + Access.class);
+ throw new OrmException(
+ accessType.getName() + " must specify entity type parameter for " + Access.class);
}
- entityType =
- (Class<?>) ((ParameterizedType) gt).getActualTypeArguments()[0];
+ entityType = (Class<?>) ((ParameterizedType) gt).getActualTypeArguments()[0];
initColumns();
initQueriesAndKeys();
@@ -82,18 +83,18 @@
continue;
}
if (m.getReturnType() != entityType) {
- throw new OrmException("PrimaryKey " + m.getName() + " must return "
- + entityType.getName());
+ throw new OrmException(
+ "PrimaryKey " + m.getName() + " must return " + entityType.getName());
}
initPrimaryKey(m.getName(), m.getAnnotation(PrimaryKey.class));
} else if (m.getAnnotation(Query.class) != null) {
if (!ResultSet.class.isAssignableFrom(m.getReturnType())
|| !(m.getGenericReturnType() instanceof ParameterizedType)
- || ((ParameterizedType) m.getGenericReturnType())
- .getActualTypeArguments()[0] != entityType) {
- throw new OrmException("Query " + m.getName() + " must return"
- + " ResultSet<" + entityType.getName() + ">");
+ || ((ParameterizedType) m.getGenericReturnType()).getActualTypeArguments()[0]
+ != entityType) {
+ throw new OrmException(
+ "Query " + m.getName() + " must return" + " ResultSet<" + entityType.getName() + ">");
}
addQuery(new QueryModel(this, m.getName(), m.getAnnotation(Query.class)));
}
diff --git a/src/main/java/com/google/gwtorm/schema/java/JavaSchemaModel.java b/src/main/java/com/google/gwtorm/schema/java/JavaSchemaModel.java
index cbec78b..a3a2c0b 100644
--- a/src/main/java/com/google/gwtorm/schema/java/JavaSchemaModel.java
+++ b/src/main/java/com/google/gwtorm/schema/java/JavaSchemaModel.java
@@ -21,11 +21,9 @@
import com.google.gwtorm.server.Relation;
import com.google.gwtorm.server.Schema;
import com.google.gwtorm.server.Sequence;
-
import java.io.PrintWriter;
import java.lang.reflect.Method;
-
public class JavaSchemaModel extends SchemaModel {
private final Class<?> schema;
@@ -33,14 +31,12 @@
schema = schemaInterface;
if (!schema.isInterface()) {
- throw new OrmException("Schema " + schema.getName()
- + " must be an interface");
+ throw new OrmException("Schema " + schema.getName() + " must be an interface");
}
- if (schema.getInterfaces().length != 1
- || schema.getInterfaces()[0] != Schema.class) {
- throw new OrmException("Schema " + schema.getName()
- + " must only extend " + Schema.class.getName());
+ if (schema.getInterfaces().length != 1 || schema.getInterfaces()[0] != Schema.class) {
+ throw new OrmException(
+ "Schema " + schema.getName() + " must only extend " + Schema.class.getName());
}
for (final Method m : schema.getDeclaredMethods()) {
diff --git a/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java b/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java
index 900ce02..986d72e 100644
--- a/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java
+++ b/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java
@@ -18,9 +18,6 @@
import com.google.gwtorm.schema.ColumnModel;
import com.google.gwtorm.schema.RelationModel;
import com.google.gwtorm.schema.Util;
-
-import org.objectweb.asm.Type;
-
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
@@ -28,6 +25,7 @@
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
+import org.objectweb.asm.Type;
class ProtoFileGenerator {
private static final Comparator<ColumnModel> COLUMN_COMPARATOR =
@@ -86,18 +84,28 @@
out.print("message Any" + schemaName + "PrimaryKey {\n");
for (RelationModel r : sortRelations(rels)) {
ColumnModel pk = r.getPrimaryKey().getField();
- out.print("\toptional " + getType(pk) + " "
- + r.getRelationName().toLowerCase() + " = " + r.getRelationID()
- + ";\n");
+ out.print(
+ "\toptional "
+ + getType(pk)
+ + " "
+ + r.getRelationName().toLowerCase()
+ + " = "
+ + r.getRelationID()
+ + ";\n");
}
out.print("}\n");
out.print("\n");
out.print("message Any" + schemaName + " {\n");
for (RelationModel r : sortRelations(rels)) {
- out.print("\toptional " + getMessageName(r) + " "
- + r.getRelationName().toLowerCase() + " = " + r.getRelationID()
- + ";\n");
+ out.print(
+ "\toptional "
+ + getMessageName(r)
+ + " "
+ + r.getRelationName().toLowerCase()
+ + " = "
+ + r.getRelationID()
+ + ";\n");
}
out.print("}\n");
}
@@ -121,8 +129,7 @@
out.print("}\n\n");
}
- private void generateMessage(ColumnModel parent, PrintWriter out,
- boolean required) {
+ private void generateMessage(ColumnModel parent, PrintWriter out, boolean required) {
// Handle base cases
if (!parent.isNested()) {
return;
@@ -186,8 +193,7 @@
return list;
}
- private static List<RelationModel> sortRelations(
- Collection<RelationModel> rels) {
+ private static List<RelationModel> sortRelations(Collection<RelationModel> rels) {
ArrayList<RelationModel> list = new ArrayList<>(rels);
Collections.sort(list, RELATION_COMPARATOR);
return list;
@@ -210,22 +216,21 @@
case Type.LONG:
return "int64";
case Type.ARRAY:
- case Type.OBJECT: {
- if (clazz == byte[].class) {
- return "bytes";
- } else if (clazz == String.class) {
- return "string";
- } else if (clazz == java.sql.Timestamp.class) {
- return "fixed64";
- } else {
- throw new RuntimeException("Type " + clazz
- + " not supported on protobuf!");
+ case Type.OBJECT:
+ {
+ if (clazz == byte[].class) {
+ return "bytes";
+ } else if (clazz == String.class) {
+ return "string";
+ } else if (clazz == java.sql.Timestamp.class) {
+ return "fixed64";
+ } else {
+ throw new RuntimeException("Type " + clazz + " not supported on protobuf!");
+ }
}
- }
default:
- throw new RuntimeException("Type " + clazz
- + " not supported on protobuf!");
+ throw new RuntimeException("Type " + clazz + " not supported on protobuf!");
}
}
}
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectDB2.java b/src/main/java/com/google/gwtorm/schema/sql/DialectDB2.java
index b45da82..5b26cd6 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectDB2.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectDB2.java
@@ -18,7 +18,6 @@
import com.google.gwtorm.server.OrmDuplicateKeyException;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.StatementExecutor;
-
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -41,8 +40,7 @@
}
@Override
- public OrmException convertError(String op, String entity,
- SQLException err) {
+ public OrmException convertError(String op, String entity, SQLException err) {
switch (getSQLStateInt(err)) {
case 23505: // DUPLICATE_KEY_1
return new OrmDuplicateKeyException(entity, err);
@@ -62,9 +60,8 @@
Statement s = db.createStatement();
try {
ResultSet rs =
- s.executeQuery("SELECT SEQNAME"
- + " FROM SYSCAT.SEQUENCES"
- + " WHERE SEQSCHEMA = CURRENT_SCHEMA");
+ s.executeQuery(
+ "SELECT SEQNAME" + " FROM SYSCAT.SEQUENCES" + " WHERE SEQSCHEMA = CURRENT_SCHEMA");
try {
HashSet<String> sequences = new HashSet<>();
while (rs.next()) {
@@ -83,9 +80,9 @@
public Set<String> listTables(Connection db) throws SQLException {
Statement s = db.createStatement();
try {
- ResultSet rs = s.executeQuery("SELECT TABNAME"
- + " FROM SYSCAT.TABLES"
- + " WHERE TABSCHEMA = CURRENT_SCHEMA");
+ ResultSet rs =
+ s.executeQuery(
+ "SELECT TABNAME" + " FROM SYSCAT.TABLES" + " WHERE TABSCHEMA = CURRENT_SCHEMA");
try {
Set<String> tables = new HashSet<>();
while (rs.next()) {
@@ -101,10 +98,11 @@
}
@Override
- public Set<String> listIndexes(final Connection db, String tableName)
- throws SQLException {
- PreparedStatement s = db.prepareStatement("SELECT distinct INDNAME"
- + " FROM syscat.indexes WHERE TABNAME = ? AND TABSCHEMA = CURRENT_SCHEMA");
+ public Set<String> listIndexes(final Connection db, String tableName) throws SQLException {
+ PreparedStatement s =
+ db.prepareStatement(
+ "SELECT distinct INDNAME"
+ + " FROM syscat.indexes WHERE TABNAME = ? AND TABSCHEMA = CURRENT_SCHEMA");
try {
s.setString(1, tableName.toUpperCase());
ResultSet rs = s.executeQuery();
@@ -123,8 +121,7 @@
}
@Override
- public void renameTable(StatementExecutor e, String from, String to)
- throws OrmException {
+ public void renameTable(StatementExecutor e, String from, String to) throws OrmException {
StringBuilder r = new StringBuilder();
r.append("RENAME TABLE ");
r.append(from);
@@ -134,8 +131,9 @@
}
@Override
- public void renameColumn(StatementExecutor stmt, String tableName,
- String fromColumn, ColumnModel col) throws OrmException {
+ public void renameColumn(
+ StatementExecutor stmt, String tableName, String fromColumn, ColumnModel col)
+ throws OrmException {
StringBuilder r = new StringBuilder();
r.append("ALTER TABLE ");
r.append(tableName);
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectDerby.java b/src/main/java/com/google/gwtorm/schema/sql/DialectDerby.java
index 690ed94..e8cd2ce 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectDerby.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectDerby.java
@@ -18,7 +18,6 @@
import com.google.gwtorm.server.OrmDuplicateKeyException;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.StatementExecutor;
-
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -70,8 +69,9 @@
}
@Override
- public void renameColumn(StatementExecutor e, String tableName,
- String fromColumn, ColumnModel col) throws OrmException {
+ public void renameColumn(
+ StatementExecutor e, String tableName, String fromColumn, ColumnModel col)
+ throws OrmException {
StringBuffer sb = new StringBuffer();
sb.append("RENAME COLUMN ");
sb.append(tableName);
@@ -83,8 +83,7 @@
}
@Override
- public void renameTable(StatementExecutor e, String from, String to)
- throws OrmException {
+ public void renameTable(StatementExecutor e, String from, String to) throws OrmException {
final StringBuilder r = new StringBuilder();
r.append("RENAME TABLE ");
r.append(from);
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectH2.java b/src/main/java/com/google/gwtorm/schema/sql/DialectH2.java
index c676715..4af606c 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectH2.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectH2.java
@@ -18,7 +18,6 @@
import com.google.gwtorm.server.OrmDuplicateKeyException;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.StatementExecutor;
-
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -34,8 +33,7 @@
}
@Override
- public OrmException convertError(final String op, final String entity,
- final SQLException err) {
+ public OrmException convertError(final String op, final String entity, final SQLException err) {
switch (getSQLStateInt(err)) {
case 23001: // UNIQUE CONSTRAINT VIOLATION
case 23505: // DUPLICATE_KEY_1
@@ -56,9 +54,10 @@
Statement s = db.createStatement();
try {
ResultSet rs =
- s.executeQuery("SELECT SEQUENCE_NAME"
- + " FROM INFORMATION_SCHEMA.SEQUENCES"
- + " WHERE SEQUENCE_SCHEMA = 'PUBLIC'");
+ s.executeQuery(
+ "SELECT SEQUENCE_NAME"
+ + " FROM INFORMATION_SCHEMA.SEQUENCES"
+ + " WHERE SEQUENCE_SCHEMA = 'PUBLIC'");
try {
HashSet<String> sequences = new HashSet<>();
while (rs.next()) {
@@ -74,8 +73,8 @@
}
@Override
- public void addColumn(StatementExecutor stmt, String tableName,
- ColumnModel col) throws OrmException {
+ public void addColumn(StatementExecutor stmt, String tableName, ColumnModel col)
+ throws OrmException {
final StringBuilder r = new StringBuilder();
r.append("ALTER TABLE ");
r.append(tableName);
@@ -99,8 +98,9 @@
}
@Override
- public void renameColumn(StatementExecutor stmt, String tableName,
- String fromColumn, ColumnModel col) throws OrmException {
+ public void renameColumn(
+ StatementExecutor stmt, String tableName, String fromColumn, ColumnModel col)
+ throws OrmException {
final StringBuilder r = new StringBuilder();
r.append("ALTER TABLE ");
r.append(tableName);
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectHANA.java b/src/main/java/com/google/gwtorm/schema/sql/DialectHANA.java
index c67fca7..db2fbf7 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectHANA.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectHANA.java
@@ -19,7 +19,6 @@
import com.google.gwtorm.server.OrmDuplicateKeyException;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.StatementExecutor;
-
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -33,40 +32,44 @@
public class DialectHANA extends SqlDialect {
public DialectHANA() {
- types.put(String.class, new SqlStringTypeInfo() {
- @Override
- public String getSqlType(ColumnModel col, SqlDialect dialect) {
- Column column = col.getColumnAnnotation();
- StringBuilder r = new StringBuilder();
+ types.put(
+ String.class,
+ new SqlStringTypeInfo() {
+ @Override
+ public String getSqlType(ColumnModel col, SqlDialect dialect) {
+ Column column = col.getColumnAnnotation();
+ StringBuilder r = new StringBuilder();
- if (column.length() <= 0) {
- r.append("NVARCHAR(255)");
- if (col.isNotNull()) {
- r.append(" DEFAULT ''");
+ if (column.length() <= 0) {
+ r.append("NVARCHAR(255)");
+ if (col.isNotNull()) {
+ r.append(" DEFAULT ''");
+ }
+ } else if (column.length() <= 5000) {
+ r.append("NVARCHAR(" + column.length() + ")");
+ if (col.isNotNull()) {
+ r.append(" DEFAULT ''");
+ }
+ } else {
+ r.append("NCLOB");
+ }
+
+ if (col.isNotNull()) {
+ r.append(" NOT NULL");
+ }
+
+ return r.toString();
}
- } else if (column.length() <= 5000) {
- r.append("NVARCHAR(" + column.length() + ")");
- if (col.isNotNull()) {
- r.append(" DEFAULT ''");
+ });
+ types.put(
+ Boolean.TYPE,
+ new SqlBooleanTypeInfo() {
+ @Override
+ public String getCheckConstraint(ColumnModel column, SqlDialect dialect) {
+ // check constraints are not supported by HANA
+ return null;
}
- } else {
- r.append("NCLOB");
- }
-
- if (col.isNotNull()) {
- r.append(" NOT NULL");
- }
-
- return r.toString();
- }
- });
- types.put(Boolean.TYPE, new SqlBooleanTypeInfo() {
- @Override
- public String getCheckConstraint(ColumnModel column, SqlDialect dialect) {
- // check constraints are not supported by HANA
- return null;
- }
- });
+ });
typeNames.put(Types.INTEGER, "INTEGER");
}
@@ -85,8 +88,7 @@
}
@Override
- public void dropColumn(StatementExecutor e, String tableName, String column)
- throws OrmException {
+ public void dropColumn(StatementExecutor e, String tableName, String column) throws OrmException {
StringBuilder r = new StringBuilder();
r.append("ALTER TABLE ");
r.append(tableName);
@@ -112,14 +114,12 @@
}
@Override
- public Set<String> listIndexes(Connection db, String tableName)
- throws SQLException {
+ public Set<String> listIndexes(Connection db, String tableName) throws SQLException {
return listNamesFromSystemTable(db, "INDEX_NAME", "INDEXES");
}
@Override
- public Set<String> listColumns(Connection db, String tableName)
- throws SQLException {
+ public Set<String> listColumns(Connection db, String tableName) throws SQLException {
String sql =
"SELECT COLUMN_NAME FROM TABLE_COLUMNS"
+ " WHERE SCHEMA_NAME = CURRENT_SCHEMA AND TABLE_NAME = ?";
@@ -144,8 +144,8 @@
return names;
}
- private static Set<String> listNamesFromSystemTable(Connection db,
- String columnName, String tableName) throws SQLException {
+ private static Set<String> listNamesFromSystemTable(
+ Connection db, String columnName, String tableName) throws SQLException {
StringBuilder r = new StringBuilder();
r.append("SELECT ");
r.append(columnName);
@@ -159,8 +159,7 @@
}
@Override
- public void renameTable(StatementExecutor e, String from, String to)
- throws OrmException {
+ public void renameTable(StatementExecutor e, String from, String to) throws OrmException {
StringBuilder r = new StringBuilder();
r.append("RENAME TABLE ");
r.append(from);
@@ -188,8 +187,9 @@
}
@Override
- public void renameColumn(StatementExecutor e, String tableName,
- String fromColumn, ColumnModel col) throws OrmException {
+ public void renameColumn(
+ StatementExecutor e, String tableName, String fromColumn, ColumnModel col)
+ throws OrmException {
StringBuilder s = new StringBuilder();
s.append("RENAME COLUMN ");
s.append(tableName).append(".").append(fromColumn);
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectMaxDB.java b/src/main/java/com/google/gwtorm/schema/sql/DialectMaxDB.java
index df3ac31..1234a48 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectMaxDB.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectMaxDB.java
@@ -18,7 +18,6 @@
import com.google.gwtorm.server.OrmDuplicateKeyException;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.StatementExecutor;
-
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -56,8 +55,7 @@
final Statement s = conn.createStatement();
try {
// lists sequences from schema associated with the current connection only
- final ResultSet rs =
- s.executeQuery("SELECT sequence_name FROM sequences");
+ final ResultSet rs = s.executeQuery("SELECT sequence_name FROM sequences");
try {
HashSet<String> sequences = new HashSet<>();
while (rs.next()) {
@@ -73,8 +71,9 @@
}
@Override
- public void renameColumn(StatementExecutor e, String tableName,
- String fromColumn, ColumnModel col) throws OrmException {
+ public void renameColumn(
+ StatementExecutor e, String tableName, String fromColumn, ColumnModel col)
+ throws OrmException {
final StringBuilder s = new StringBuilder();
s.append("RENAME COLUMN ");
s.append(tableName).append(".").append(fromColumn);
@@ -106,8 +105,7 @@
}
@Override
- public void renameTable(StatementExecutor e, String from, String to)
- throws OrmException {
+ public void renameTable(StatementExecutor e, String from, String to) throws OrmException {
final StringBuilder r = new StringBuilder();
r.append("RENAME TABLE ");
r.append(from);
@@ -115,5 +113,4 @@
r.append(to);
e.execute(r.toString());
}
-
}
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java b/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java
index 521a88f..a233dce 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java
@@ -20,7 +20,6 @@
import com.google.gwtorm.server.OrmDuplicateKeyException;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.StatementExecutor;
-
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
@@ -34,46 +33,50 @@
/** Dialect for <a href="http://www.mysql.com/">MySQL</a> */
public class DialectMySQL extends SqlDialect {
public DialectMySQL() {
- types.put(String.class, new SqlStringTypeInfo() {
- @Override
- public String getSqlType(final ColumnModel col, final SqlDialect dialect) {
- final Column column = col.getColumnAnnotation();
- final StringBuilder r = new StringBuilder();
+ types.put(
+ String.class,
+ new SqlStringTypeInfo() {
+ @Override
+ public String getSqlType(final ColumnModel col, final SqlDialect dialect) {
+ final Column column = col.getColumnAnnotation();
+ final StringBuilder r = new StringBuilder();
- if (column.length() <= 0) {
- r.append("VARCHAR(255) BINARY");
- if (col.isNotNull()) {
- r.append(" DEFAULT ''");
+ if (column.length() <= 0) {
+ r.append("VARCHAR(255) BINARY");
+ if (col.isNotNull()) {
+ r.append(" DEFAULT ''");
+ }
+ } else if (column.length() <= 255) {
+ r.append("VARCHAR(" + column.length() + ") BINARY");
+ if (col.isNotNull()) {
+ r.append(" DEFAULT ''");
+ }
+ } else {
+ r.append(dialect.getSqlTypeName(Types.LONGVARCHAR));
+ }
+
+ if (col.isNotNull()) {
+ r.append(" NOT NULL");
+ }
+
+ return r.toString();
}
- } else if (column.length() <= 255) {
- r.append("VARCHAR(" + column.length() + ") BINARY");
- if (col.isNotNull()) {
- r.append(" DEFAULT ''");
+ });
+ types.put(
+ Timestamp.class,
+ new SqlTimestampTypeInfo() {
+ @Override
+ public String getSqlType(ColumnModel col, SqlDialect dialect) {
+ final StringBuilder r = new StringBuilder();
+ r.append(dialect.getSqlTypeName(getSqlTypeConstant()));
+ if (col.isNotNull()) {
+ r.append(" NOT NULL");
+ } else {
+ r.append(" NULL DEFAULT NULL");
+ }
+ return r.toString();
}
- } else {
- r.append(dialect.getSqlTypeName(Types.LONGVARCHAR));
- }
-
- if (col.isNotNull()) {
- r.append(" NOT NULL");
- }
-
- return r.toString();
- }
- });
- types.put(Timestamp.class, new SqlTimestampTypeInfo() {
- @Override
- public String getSqlType(ColumnModel col, SqlDialect dialect) {
- final StringBuilder r = new StringBuilder();
- r.append(dialect.getSqlTypeName(getSqlTypeConstant()));
- if (col.isNotNull()) {
- r.append(" NOT NULL");
- } else {
- r.append(" NULL DEFAULT NULL");
- }
- return r.toString();
- }
- });
+ });
}
@Override
@@ -106,13 +109,11 @@
}
@Override
- public long nextLong(final Connection conn, final String seqname)
- throws OrmException {
+ public long nextLong(final Connection conn, final String seqname) throws OrmException {
try {
final Statement st = conn.createStatement();
try {
- st.execute("INSERT INTO " + seqname + "(s)VALUES(NULL)",
- Statement.RETURN_GENERATED_KEYS);
+ st.execute("INSERT INTO " + seqname + "(s)VALUES(NULL)", Statement.RETURN_GENERATED_KEYS);
final long r;
final ResultSet rs = st.getGeneratedKeys();
try {
@@ -168,8 +169,7 @@
}
}
- private boolean isSequence(Connection db, String tableName)
- throws SQLException {
+ private boolean isSequence(Connection db, String tableName) throws SQLException {
final DatabaseMetaData meta = db.getMetaData();
if (meta.storesUpperCaseIdentifiers()) {
tableName = tableName.toUpperCase();
@@ -195,8 +195,7 @@
}
@Override
- public void renameTable(StatementExecutor e, String from,
- String to) throws OrmException {
+ public void renameTable(StatementExecutor e, String from, String to) throws OrmException {
final StringBuilder r = new StringBuilder();
r.append("RENAME TABLE ");
r.append(from);
@@ -207,8 +206,9 @@
}
@Override
- public void renameColumn(StatementExecutor stmt, String tableName,
- String fromColumn, ColumnModel col) throws OrmException {
+ public void renameColumn(
+ StatementExecutor stmt, String tableName, String fromColumn, ColumnModel col)
+ throws OrmException {
StringBuffer r = new StringBuffer();
r.append("ALTER TABLE ");
r.append(tableName);
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectOracle.java b/src/main/java/com/google/gwtorm/schema/sql/DialectOracle.java
index b96081a..bb44604 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectOracle.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectOracle.java
@@ -18,7 +18,6 @@
import com.google.gwtorm.server.OrmDuplicateKeyException;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.StatementExecutor;
-
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -44,6 +43,7 @@
public boolean canDetermineIndividualBatchUpdateCounts() {
return false;
}
+
@Override
public boolean canDetermineTotalBatchUpdateCount() {
return false;
@@ -69,10 +69,10 @@
}
@Override
- public Set<String> listIndexes(final Connection db, String tableName)
- throws SQLException {
- PreparedStatement s = db.prepareStatement("SELECT distinct index_name"
- + " FROM user_indexes WHERE table_name = ?");
+ public Set<String> listIndexes(final Connection db, String tableName) throws SQLException {
+ PreparedStatement s =
+ db.prepareStatement(
+ "SELECT distinct index_name" + " FROM user_indexes WHERE table_name = ?");
try {
s.setString(1, tableName.toUpperCase());
ResultSet rs = s.executeQuery();
@@ -110,8 +110,8 @@
}
@Override
- public void addColumn(StatementExecutor stmt, String tableName,
- ColumnModel col) throws OrmException {
+ public void addColumn(StatementExecutor stmt, String tableName, ColumnModel col)
+ throws OrmException {
final StringBuilder r = new StringBuilder();
r.append("ALTER TABLE ");
r.append(tableName);
@@ -123,8 +123,9 @@
}
@Override
- public void renameColumn(StatementExecutor e, String tableName,
- String fromColumn, ColumnModel col) throws OrmException {
+ public void renameColumn(
+ StatementExecutor e, String tableName, String fromColumn, ColumnModel col)
+ throws OrmException {
StringBuffer sb = new StringBuffer();
sb.append("ALTER TABLE ");
sb.append(tableName);
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectPostgreSQL.java b/src/main/java/com/google/gwtorm/schema/sql/DialectPostgreSQL.java
index fb8a75e..b04ba19 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectPostgreSQL.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectPostgreSQL.java
@@ -19,7 +19,6 @@
import com.google.gwtorm.server.OrmDuplicateKeyException;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.StatementExecutor;
-
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -51,8 +50,7 @@
}
@Override
- public OrmException convertError(final String op, final String entity,
- final SQLException err) {
+ public OrmException convertError(final String op, final String entity, final SQLException err) {
switch (getSQLStateInt(err)) {
case 23505: // UNIQUE CONSTRAINT VIOLATION
return new OrmDuplicateKeyException(entity, err);
@@ -72,14 +70,15 @@
}
@Override
- public void appendCreateTableStorage(final StringBuilder sqlBuffer,
- final RelationModel relationModel) {
+ public void appendCreateTableStorage(
+ final StringBuilder sqlBuffer, final RelationModel relationModel) {
sqlBuffer.append("WITH (OIDS = FALSE)");
}
@Override
- public void renameColumn(StatementExecutor stmt, String tableName,
- String fromColumn, ColumnModel col) throws OrmException {
+ public void renameColumn(
+ StatementExecutor stmt, String tableName, String fromColumn, ColumnModel col)
+ throws OrmException {
final StringBuilder r = new StringBuilder();
r.append("ALTER TABLE ");
r.append(tableName);
@@ -94,8 +93,7 @@
public Set<String> listSequences(Connection db) throws SQLException {
Statement s = db.createStatement();
try {
- ResultSet rs =
- s.executeQuery("SELECT relname FROM pg_class WHERE relkind = 'S'");
+ ResultSet rs = s.executeQuery("SELECT relname FROM pg_class WHERE relkind = 'S'");
try {
HashSet<String> sequences = new HashSet<>();
while (rs.next()) {
@@ -112,8 +110,8 @@
private static class Pre82 extends DialectPostgreSQL {
@Override
- public void appendCreateTableStorage(final StringBuilder sqlBuffer,
- final RelationModel relationModel) {
+ public void appendCreateTableStorage(
+ final StringBuilder sqlBuffer, final RelationModel relationModel) {
sqlBuffer.append("WITHOUT OIDS");
}
}
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlBooleanTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlBooleanTypeInfo.java
index cf6e54f..437a2b9 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlBooleanTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlBooleanTypeInfo.java
@@ -16,13 +16,11 @@
import com.google.gwtorm.schema.ColumnModel;
import com.google.gwtorm.server.CodeGenSupport;
-
+import java.sql.Types;
import org.objectweb.asm.Label;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
-import java.sql.Types;
-
public class SqlBooleanTypeInfo extends SqlTypeInfo {
@Override
public String getSqlType(final ColumnModel column, final SqlDialect dialect) {
@@ -37,8 +35,7 @@
}
@Override
- public String getCheckConstraint(final ColumnModel column,
- final SqlDialect dialect) {
+ public String getCheckConstraint(final ColumnModel column, final SqlDialect dialect) {
final String name = column.getColumnName();
final String t = getTrueLiteralValue();
final String f = getFalseLiteralValue();
@@ -95,9 +92,11 @@
cgs.pushSqlHandle();
cgs.pushColumnIndex();
cgs.invokeResultSetGet(getJavaSqlTypeAlias());
- cgs.mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type
- .getInternalName(String.class), "equals", Type.getMethodDescriptor(
- Type.BOOLEAN_TYPE, new Type[] {Type.getType(Object.class)}));
+ cgs.mv.visitMethodInsn(
+ Opcodes.INVOKEVIRTUAL,
+ Type.getInternalName(String.class),
+ "equals",
+ Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {Type.getType(Object.class)}));
cgs.fieldSetEnd();
}
}
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlByteArrayTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlByteArrayTypeInfo.java
index eb0f840..b99094e 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlByteArrayTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlByteArrayTypeInfo.java
@@ -16,10 +16,6 @@
import com.google.gwtorm.schema.ColumnModel;
import com.google.gwtorm.server.CodeGenSupport;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -28,6 +24,8 @@
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
public class SqlByteArrayTypeInfo extends SqlTypeInfo {
@Override
@@ -56,11 +54,15 @@
cgs.pushSqlHandle();
cgs.pushColumnIndex();
cgs.pushFieldValue();
- cgs.mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type
- .getInternalName(SqlByteArrayTypeInfo.class), "toPreparedStatement",
- Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
- Type.getType(PreparedStatement.class), Type.INT_TYPE,
- Type.getType(byte[].class)}));
+ cgs.mv.visitMethodInsn(
+ Opcodes.INVOKESTATIC,
+ Type.getInternalName(SqlByteArrayTypeInfo.class),
+ "toPreparedStatement",
+ Type.getMethodDescriptor(
+ Type.VOID_TYPE,
+ new Type[] {
+ Type.getType(PreparedStatement.class), Type.INT_TYPE, Type.getType(byte[].class)
+ }));
}
@Override
@@ -68,15 +70,16 @@
cgs.fieldSetBegin();
cgs.pushSqlHandle();
cgs.pushColumnIndex();
- cgs.mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type
- .getInternalName(SqlByteArrayTypeInfo.class), "fromResultSet", Type
- .getMethodDescriptor(Type.getType(byte[].class), new Type[] {
- Type.getType(ResultSet.class), Type.INT_TYPE}));
+ cgs.mv.visitMethodInsn(
+ Opcodes.INVOKESTATIC,
+ Type.getInternalName(SqlByteArrayTypeInfo.class),
+ "fromResultSet",
+ Type.getMethodDescriptor(
+ Type.getType(byte[].class), new Type[] {Type.getType(ResultSet.class), Type.INT_TYPE}));
cgs.fieldSetEnd();
}
- public static byte[] fromResultSet(final ResultSet rs, final int col)
- throws SQLException {
+ public static byte[] fromResultSet(final ResultSet rs, final int col) throws SQLException {
final InputStream r = rs.getBinaryStream(col);
if (r == null) {
return null;
@@ -98,8 +101,8 @@
}
}
- public static void toPreparedStatement(final PreparedStatement ps,
- final int col, final byte[] raw) throws SQLException {
+ public static void toPreparedStatement(
+ final PreparedStatement ps, final int col, final byte[] raw) throws SQLException {
if (raw != null) {
ps.setBinaryStream(col, new ByteArrayInputStream(raw), raw.length);
} else {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlCharTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlCharTypeInfo.java
index 510993a..b82b7dd 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlCharTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlCharTypeInfo.java
@@ -16,12 +16,10 @@
import com.google.gwtorm.schema.ColumnModel;
import com.google.gwtorm.server.CodeGenSupport;
-
+import java.sql.Types;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
-import java.sql.Types;
-
public class SqlCharTypeInfo extends SqlTypeInfo {
@Override
public String getSqlType(final ColumnModel column, final SqlDialect dialect) {
@@ -49,10 +47,11 @@
cgs.pushSqlHandle();
cgs.pushColumnIndex();
cgs.pushFieldValue();
- cgs.mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type
- .getInternalName(Character.class), "toString", Type
- .getMethodDescriptor(Type.getType(String.class),
- new Type[] {Type.CHAR_TYPE}));
+ cgs.mv.visitMethodInsn(
+ Opcodes.INVOKESTATIC,
+ Type.getInternalName(Character.class),
+ "toString",
+ Type.getMethodDescriptor(Type.getType(String.class), new Type[] {Type.CHAR_TYPE}));
cgs.invokePreparedStatementSet(getJavaSqlTypeAlias());
}
@@ -63,9 +62,11 @@
cgs.pushColumnIndex();
cgs.invokeResultSetGet(getJavaSqlTypeAlias());
cgs.push(0);
- cgs.mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type
- .getInternalName(String.class), "charAt", Type.getMethodDescriptor(
- Type.CHAR_TYPE, new Type[] {Type.INT_TYPE}));
+ cgs.mv.visitMethodInsn(
+ Opcodes.INVOKEVIRTUAL,
+ Type.getInternalName(String.class),
+ "charAt",
+ Type.getMethodDescriptor(Type.CHAR_TYPE, new Type[] {Type.INT_TYPE}));
cgs.fieldSetEnd();
}
}
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlDateTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlDateTypeInfo.java
index 127befe..52c7bdc 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlDateTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlDateTypeInfo.java
@@ -15,7 +15,6 @@
package com.google.gwtorm.schema.sql;
import com.google.gwtorm.schema.ColumnModel;
-
import java.sql.Types;
public class SqlDateTypeInfo extends SqlTypeInfo {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java b/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java
index 17c1e88..be46505 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java
@@ -20,7 +20,6 @@
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.Sequence;
import com.google.gwtorm.server.StatementExecutor;
-
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
@@ -36,8 +35,7 @@
import java.util.concurrent.CopyOnWriteArrayList;
public abstract class SqlDialect {
- private static final List<SqlDialect> DIALECTS =
- new CopyOnWriteArrayList<>();
+ private static final List<SqlDialect> DIALECTS = new CopyOnWriteArrayList<>();
static {
DIALECTS.add(new DialectDB2());
@@ -55,8 +53,7 @@
DIALECTS.add(0, dialect);
}
- public static SqlDialect getDialectFor(Connection c)
- throws SQLException, OrmException {
+ public static SqlDialect getDialectFor(Connection c) throws SQLException, OrmException {
String url = c.getMetaData().getURL();
for (SqlDialect d : DIALECTS) {
if (d.handles(url, c)) {
@@ -93,13 +90,14 @@
public abstract boolean handles(String url, Connection c) throws SQLException;
- /** Select a better dialect definition for this connection.
+ /**
+ * Select a better dialect definition for this connection.
*
* @param c the connection
* @return a dialect instance
* @throws SQLException
*/
- public SqlDialect refine(final Connection c) throws SQLException {
+ public SqlDialect refine(final Connection c) throws SQLException {
return this;
}
@@ -154,16 +152,14 @@
* @param err the driver specific exception.
* @return an OrmException the caller can throw.
*/
- public OrmException convertError(final String op, final String entity,
- final SQLException err) {
+ public OrmException convertError(final String op, final String entity, final SQLException err) {
if (err.getCause() == null && err.getNextException() != null) {
err.initCause(err.getNextException());
}
return new OrmException(op + " failure on " + entity, err);
}
- public long nextLong(final Connection conn, final String poolName)
- throws OrmException {
+ public long nextLong(final Connection conn, final String poolName) throws OrmException {
final String query = getNextSequenceValueSql(poolName);
try {
final Statement st = conn.createStatement();
@@ -217,13 +213,12 @@
/**
* Append driver specific storage parameters to a CREATE TABLE statement.
*
- * @param sqlBuffer buffer holding the CREATE TABLE, just after the closing
- * parenthesis after the column list.
+ * @param sqlBuffer buffer holding the CREATE TABLE, just after the closing parenthesis after the
+ * column list.
* @param relationModel the model of the table being generated.
*/
- public void appendCreateTableStorage(final StringBuilder sqlBuffer,
- final RelationModel relationModel) {
- }
+ public void appendCreateTableStorage(
+ final StringBuilder sqlBuffer, final RelationModel relationModel) {}
/**
* List all tables in the current database schema.
@@ -254,8 +249,7 @@
* @param to destination table name
* @throws OrmException the table could not be renamed.
*/
- public void renameTable(StatementExecutor e, String from,
- String to) throws OrmException {
+ public void renameTable(StatementExecutor e, String from, String to) throws OrmException {
final StringBuilder r = new StringBuilder();
r.append("ALTER TABLE ");
r.append(from);
@@ -273,8 +267,7 @@
* @return set of declared indexes, in lowercase.
* @throws SQLException the indexes cannot be listed.
*/
- public Set<String> listIndexes(final Connection db, String tableName)
- throws SQLException {
+ public Set<String> listIndexes(final Connection db, String tableName) throws SQLException {
final DatabaseMetaData meta = db.getMetaData();
if (meta.storesUpperCaseIdentifiers()) {
tableName = tableName.toUpperCase();
@@ -301,8 +294,7 @@
* @return set of declared sequences, in lowercase.
* @throws SQLException the sequence objects cannot be listed.
*/
- public abstract Set<String> listSequences(final Connection db)
- throws SQLException;
+ public abstract Set<String> listSequences(final Connection db) throws SQLException;
/**
* List all columns in the given table name.
@@ -312,8 +304,7 @@
* @return set of declared columns, in lowercase.
* @throws SQLException the columns cannot be listed from the relation.
*/
- public Set<String> listColumns(final Connection db, String tableName)
- throws SQLException {
+ public Set<String> listColumns(final Connection db, String tableName) throws SQLException {
final DatabaseMetaData meta = db.getMetaData();
if (meta.storesUpperCaseIdentifiers()) {
tableName = tableName.toUpperCase();
@@ -366,8 +357,7 @@
* @param column name of the column to drop.
* @throws OrmException the column could not be added.
*/
- public void dropColumn(StatementExecutor e, String tableName, String column)
- throws OrmException {
+ public void dropColumn(StatementExecutor e, String tableName, String column) throws OrmException {
final StringBuilder r = new StringBuilder();
r.append("ALTER TABLE ");
r.append(tableName);
@@ -385,8 +375,9 @@
* @param col destination column definition
* @throws OrmException the column could not be renamed.
*/
- public abstract void renameColumn(StatementExecutor e, String tableName,
- String fromColumn, ColumnModel col) throws OrmException;
+ public abstract void renameColumn(
+ StatementExecutor e, String tableName, String fromColumn, ColumnModel col)
+ throws OrmException;
/**
* Drop one index from a table.
@@ -396,8 +387,7 @@
* @param name index name.
* @throws OrmException the index could not be renamed.
*/
- public void dropIndex(StatementExecutor e, String tableName, String name)
- throws OrmException {
+ public void dropIndex(StatementExecutor e, String tableName, String name) throws OrmException {
e.execute(getDropIndexSql(tableName, name));
}
@@ -408,25 +398,22 @@
protected abstract String getNextSequenceValueSql(String seqname);
/**
- * Does the array returned by the PreparedStatement.executeBatch method return
- * the exact number of rows updated for every row in the batch?
+ * Does the array returned by the PreparedStatement.executeBatch method return the exact number of
+ * rows updated for every row in the batch?
*
- * @return <code>true</code> if the executeBatch method returns the number of
- * rows affected for every row in the batch; <code>false</code> if it
- * may return Statement.SUCESS_NO_INFO
+ * @return <code>true</code> if the executeBatch method returns the number of rows affected for
+ * every row in the batch; <code>false</code> if it may return Statement.SUCESS_NO_INFO
*/
public boolean canDetermineIndividualBatchUpdateCounts() {
return true;
-
}
/**
- * Can the total number of rows updated by the PreparedStatement.executeBatch
- * be determined exactly by the SQLDialect.executeBatch method?
+ * Can the total number of rows updated by the PreparedStatement.executeBatch be determined
+ * exactly by the SQLDialect.executeBatch method?
*
- * @return <code>true</code> if the SQlDialect.executeBatch method can exactly
- * determine the total number of rows updated by a batch;
- * <code>false</code> otherwise
+ * @return <code>true</code> if the SQlDialect.executeBatch method can exactly determine the total
+ * number of rows updated by a batch; <code>false</code> otherwise
* @see #executeBatch(PreparedStatement)
*/
public boolean canDetermineTotalBatchUpdateCount() {
@@ -434,11 +421,11 @@
}
/**
- * Executes a prepared statement batch and returns the total number of rows
- * successfully updated or inserted. This method is intended to be overridden.
+ * Executes a prepared statement batch and returns the total number of rows successfully updated
+ * or inserted. This method is intended to be overridden.
*
- * If the canDetermineTotalBatchUpdateCount returns false for a particular
- * SQLDialect, this method should throw an UnsupportedOperationException.
+ * <p>If the canDetermineTotalBatchUpdateCount returns false for a particular SQLDialect, this
+ * method should throw an UnsupportedOperationException.
*
* @param ps the prepared statement with the batch to be executed
* @return the total number of rows affected
@@ -462,8 +449,7 @@
/**
* Some databases don't support delimiters (semicolons) in scripts.
*
- * @return <code>true</code> statement delimiter is accepted,
- * <code>false</code> otherwise
+ * @return <code>true</code> statement delimiter is accepted, <code>false</code> otherwise
*/
public boolean isStatementDelimiterSupported() {
return true;
@@ -471,6 +457,7 @@
/**
* Get the SQL LIMIT command segment in the given dialect
+ *
* @param limit the limit to apply to the result set (either a number or ?)
* @return the SQL LIMIT command segment in the given dialect
*/
@@ -479,9 +466,8 @@
}
/**
- * Get the driver specific 'table type' to be used in a CREATE TABLE
- * statement. When creating a CREATE TABLE statement the 'table type' is
- * appended after a blank following the CREATE keyword.
+ * Get the driver specific 'table type' to be used in a CREATE TABLE statement. When creating a
+ * CREATE TABLE statement the 'table type' is appended after a blank following the CREATE keyword.
*/
public String getTableTypeSql() {
return "TABLE";
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlIntTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlIntTypeInfo.java
index 23c89da..eace44d 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlIntTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlIntTypeInfo.java
@@ -15,7 +15,6 @@
package com.google.gwtorm.schema.sql;
import com.google.gwtorm.schema.ColumnModel;
-
import java.sql.Types;
public class SqlIntTypeInfo extends SqlTypeInfo {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlLongTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlLongTypeInfo.java
index 940c7fc..0b25b52 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlLongTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlLongTypeInfo.java
@@ -15,7 +15,6 @@
package com.google.gwtorm.schema.sql;
import com.google.gwtorm.schema.ColumnModel;
-
import java.sql.Types;
public class SqlLongTypeInfo extends SqlTypeInfo {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlShortTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlShortTypeInfo.java
index c2f895e..6894a47 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlShortTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlShortTypeInfo.java
@@ -15,7 +15,6 @@
package com.google.gwtorm.schema.sql;
import com.google.gwtorm.schema.ColumnModel;
-
import java.sql.Types;
public class SqlShortTypeInfo extends SqlTypeInfo {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlStringTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlStringTypeInfo.java
index 2c32f1e..d6cbda0 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlStringTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlStringTypeInfo.java
@@ -17,10 +17,6 @@
import com.google.gwtorm.client.Column;
import com.google.gwtorm.schema.ColumnModel;
import com.google.gwtorm.server.CodeGenSupport;
-
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
@@ -29,6 +25,8 @@
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
public class SqlStringTypeInfo extends SqlTypeInfo {
@Override
@@ -70,11 +68,15 @@
cgs.pushSqlHandle();
cgs.pushColumnIndex();
cgs.pushFieldValue();
- cgs.mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type
- .getInternalName(SqlStringTypeInfo.class), "toPreparedStatement",
- Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {
- Type.getType(PreparedStatement.class), Type.INT_TYPE,
- Type.getType(String.class)}));
+ cgs.mv.visitMethodInsn(
+ Opcodes.INVOKESTATIC,
+ Type.getInternalName(SqlStringTypeInfo.class),
+ "toPreparedStatement",
+ Type.getMethodDescriptor(
+ Type.VOID_TYPE,
+ new Type[] {
+ Type.getType(PreparedStatement.class), Type.INT_TYPE, Type.getType(String.class)
+ }));
}
}
@@ -86,16 +88,18 @@
cgs.fieldSetBegin();
cgs.pushSqlHandle();
cgs.pushColumnIndex();
- cgs.mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type
- .getInternalName(SqlStringTypeInfo.class), "fromResultSet", Type
- .getMethodDescriptor(Type.getType(String.class), new Type[] {
- Type.getType(ResultSet.class), Type.INT_TYPE}));
+ cgs.mv.visitMethodInsn(
+ Opcodes.INVOKESTATIC,
+ Type.getInternalName(SqlStringTypeInfo.class),
+ "fromResultSet",
+ Type.getMethodDescriptor(
+ Type.getType(String.class),
+ new Type[] {Type.getType(ResultSet.class), Type.INT_TYPE}));
cgs.fieldSetEnd();
}
}
- public static String fromResultSet(final ResultSet rs, final int col)
- throws SQLException {
+ public static String fromResultSet(final ResultSet rs, final int col) throws SQLException {
final Reader r = rs.getCharacterStream(col);
if (r == null) {
return null;
@@ -117,8 +121,8 @@
}
}
- public static void toPreparedStatement(final PreparedStatement ps,
- final int col, final String txt) throws SQLException {
+ public static void toPreparedStatement(
+ final PreparedStatement ps, final int col, final String txt) throws SQLException {
if (txt != null) {
ps.setCharacterStream(col, new StringReader(txt), txt.length());
} else {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlTimestampTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlTimestampTypeInfo.java
index ef60d29..1fb4bb0 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlTimestampTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlTimestampTypeInfo.java
@@ -15,7 +15,6 @@
package com.google.gwtorm.schema.sql;
import com.google.gwtorm.schema.ColumnModel;
-
import java.sql.Types;
public class SqlTimestampTypeInfo extends SqlTypeInfo {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlTypeInfo.java b/src/main/java/com/google/gwtorm/schema/sql/SqlTypeInfo.java
index f238541..5832c18 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlTypeInfo.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlTypeInfo.java
@@ -16,21 +16,16 @@
import com.google.gwtorm.schema.ColumnModel;
import com.google.gwtorm.server.CodeGenSupport;
-
+import java.sql.PreparedStatement;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
-import java.sql.PreparedStatement;
-
-
public abstract class SqlTypeInfo {
- protected SqlTypeInfo() {
- }
+ protected SqlTypeInfo() {}
public abstract String getSqlType(ColumnModel column, SqlDialect dialect);
- public String getCheckConstraint(final ColumnModel column,
- final SqlDialect dialect) {
+ public String getCheckConstraint(final ColumnModel column, final SqlDialect dialect) {
return null;
}
@@ -49,10 +44,11 @@
cgs.pushSqlHandle();
cgs.pushColumnIndex();
cgs.push(getSqlTypeConstant());
- cgs.mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, Type
- .getInternalName(PreparedStatement.class), "setNull", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE,
- Type.INT_TYPE}));
+ cgs.mv.visitMethodInsn(
+ Opcodes.INVOKEINTERFACE,
+ Type.getInternalName(PreparedStatement.class),
+ "setNull",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type.INT_TYPE, Type.INT_TYPE}));
}
public void generateResultSetGet(final CodeGenSupport cgs) {
diff --git a/src/main/java/com/google/gwtorm/server/AbstractAccess.java b/src/main/java/com/google/gwtorm/server/AbstractAccess.java
index a814ec8..21988f2 100644
--- a/src/main/java/com/google/gwtorm/server/AbstractAccess.java
+++ b/src/main/java/com/google/gwtorm/server/AbstractAccess.java
@@ -17,14 +17,12 @@
import com.google.common.util.concurrent.CheckedFuture;
import com.google.common.util.concurrent.Futures;
import com.google.gwtorm.client.Key;
-
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-public abstract class AbstractAccess<E, K extends Key<?>>
- implements Access<E, K> {
+public abstract class AbstractAccess<E, K extends Key<?>> implements Access<E, K> {
private static final int MAX_TRIES = 10;
@Override
@@ -69,9 +67,8 @@
}
@Override
- public E atomicUpdate(final K key, final AtomicUpdate<E> update)
- throws OrmException {
- for (int attempts = 1;; attempts++) {
+ public E atomicUpdate(final K key, final AtomicUpdate<E> update) throws OrmException {
+ for (int attempts = 1; ; attempts++) {
try {
final E obj = get(key);
if (obj == null) {
diff --git a/src/main/java/com/google/gwtorm/server/AbstractResultSet.java b/src/main/java/com/google/gwtorm/server/AbstractResultSet.java
index f3cf5ce..a6e5c74 100644
--- a/src/main/java/com/google/gwtorm/server/AbstractResultSet.java
+++ b/src/main/java/com/google/gwtorm/server/AbstractResultSet.java
@@ -14,7 +14,6 @@
package com.google.gwtorm.server;
-
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
diff --git a/src/main/java/com/google/gwtorm/server/AbstractSchema.java b/src/main/java/com/google/gwtorm/server/AbstractSchema.java
index 87ced82..83ce259 100644
--- a/src/main/java/com/google/gwtorm/server/AbstractSchema.java
+++ b/src/main/java/com/google/gwtorm/server/AbstractSchema.java
@@ -14,7 +14,6 @@
package com.google.gwtorm.server;
-
/** Base implementation any generated schema must implement. */
public abstract class AbstractSchema implements Schema {
@Override
@@ -29,16 +28,15 @@
/**
* Obtain the next unique value from a pool of available numbers.
- * <p>
- * Frequently the next number will be just an increment of a global counter,
- * but may be spread across multiple counter ranges to increase concurrency.
*
- * @param poolName unique name of the counter within the schema. The
- * underlying storage system should use this to identify the counter
- * pool to obtain the next value from.
+ * <p>Frequently the next number will be just an increment of a global counter, but may be spread
+ * across multiple counter ranges to increase concurrency.
+ *
+ * @param poolName unique name of the counter within the schema. The underlying storage system
+ * should use this to identify the counter pool to obtain the next value from.
* @return a new unique value.
- * @throws OrmException a value cannot be reserved for the caller, or the pool
- * has been exhausted and no new values are available.
+ * @throws OrmException a value cannot be reserved for the caller, or the pool has been exhausted
+ * and no new values are available.
*/
protected abstract long nextLong(String poolName) throws OrmException;
}
diff --git a/src/main/java/com/google/gwtorm/server/Access.java b/src/main/java/com/google/gwtorm/server/Access.java
index 019249b..0126054 100644
--- a/src/main/java/com/google/gwtorm/server/Access.java
+++ b/src/main/java/com/google/gwtorm/server/Access.java
@@ -17,38 +17,34 @@
import com.google.common.util.concurrent.CheckedFuture;
import com.google.gwtorm.client.Column;
import com.google.gwtorm.client.Key;
-
import java.util.Map;
/**
* Data access interface for an entity type.
- * <p>
- * Applications should extend this interface for each entity type they need to
- * access. At runtime the application extension will be automatically
- * implemented with a generated class, providing concrete implementations for
- * all methods.
- * <p>
- * Instances should be acquired through the application's extension interface of
- * {@link Schema}.
- * <p>
- * Applications should implement a query method using the {@link PrimaryKey}
- * annotation, for example:
+ *
+ * <p>Applications should extend this interface for each entity type they need to access. At runtime
+ * the application extension will be automatically implemented with a generated class, providing
+ * concrete implementations for all methods.
+ *
+ * <p>Instances should be acquired through the application's extension interface of {@link Schema}.
+ *
+ * <p>Applications should implement a query method using the {@link PrimaryKey} annotation, for
+ * example:
*
* <pre>
* public interface FooAccess extends Access<Foo, Foo.Key> {
* @PrimaryKey("key")
* Foo byKey(Foo.Key k) throws OrmException;
* }
- *</pre>
- *<p>
- * otherwise the primaryKey, get, update and delete operations declared by this
- * interface will be unsupported.
+ * </pre>
*
- * @param <T> type of the entity. Any object type is suitable, so long as at
- * least one field uses a {@link Column} annotation.
- * @param <K> type of the primary key of entity. If the primary key is a
- * primitive type then use Key directly, otherwise use a Key
- * implementation. Entity specific key subclasses are recommended.
+ * <p>otherwise the primaryKey, get, update and delete operations declared by this interface will be
+ * unsupported.
+ *
+ * @param <T> type of the entity. Any object type is suitable, so long as at least one field uses a
+ * {@link Column} annotation.
+ * @param <K> type of the primary key of entity. If the primary key is a primitive type then use Key
+ * directly, otherwise use a Key implementation. Entity specific key subclasses are recommended.
*/
public interface Access<T extends Object, K extends Key<?>> {
/** @return the name of this relation. */
@@ -68,8 +64,8 @@
* Obtain the primary key of an entity instance.
*
* @param entity the entity to get the key of; must not be null.
- * @return the primary key. Null if this entity has no primary key declared,
- * or if the primary key does not implement the Key interface.
+ * @return the primary key. Null if this entity has no primary key declared, or if the primary key
+ * does not implement the Key interface.
*/
K primaryKey(T entity);
@@ -83,10 +79,10 @@
/**
* Lookup a single entity via its primary key.
- * <p>
- * This method is only implemented if the entity's primary key is defined to
- * be an implementation of the {@link Key} interface. Otherwise the method
- * throws {@link UnsupportedOperationException}.
+ *
+ * <p>This method is only implemented if the entity's primary key is defined to be an
+ * implementation of the {@link Key} interface. Otherwise the method throws {@link
+ * UnsupportedOperationException}.
*
* @param key the primary key instance; must not be null.
* @return the entity; null if no entity has this key.
@@ -97,33 +93,31 @@
/**
* Lookup a single entity asynchronously via its primary key.
- * <p>
- * This method is only implemented if the entity's primary key is defined to
- * be an implementation of the {@link Key} interface. Otherwise the method
- * throws {@link UnsupportedOperationException}.
+ *
+ * <p>This method is only implemented if the entity's primary key is defined to be an
+ * implementation of the {@link Key} interface. Otherwise the method throws {@link
+ * UnsupportedOperationException}.
*
* @param key the primary key instance; must not be null.
- * @return a {@link CheckedFuture} for the entity; the
- * {@link CheckedFuture#get()} will return null if no entity has
- * this key.
+ * @return a {@link CheckedFuture} for the entity; the {@link CheckedFuture#get()} will return
+ * null if no entity has this key.
* @throws UnsupportedOperationException the key type doesn't implement Key.
*/
CheckedFuture<T, OrmException> getAsync(K key);
/**
* Lookup multiple entities via their primary key.
- * <p>
- * This method is only implemented if the entity's primary key is defined to
- * be an implementation of the {@link Key} interface. Otherwise the method
- * throws {@link UnsupportedOperationException}.
- * <p>
- * This method is a batch form of {@link #get(Key)} and may be optimized to
- * reduce round-trips to the data store.
+ *
+ * <p>This method is only implemented if the entity's primary key is defined to be an
+ * implementation of the {@link Key} interface. Otherwise the method throws {@link
+ * UnsupportedOperationException}.
+ *
+ * <p>This method is a batch form of {@link #get(Key)} and may be optimized to reduce round-trips
+ * to the data store.
*
* @param keys collection of zero or more keys to perform lookup with.
- * @return collection of all matching entities; this may be a smaller result
- * than the keys supplied if one or more of the keys does not match an
- * existing entity.
+ * @return collection of all matching entities; this may be a smaller result than the keys
+ * supplied if one or more of the keys does not match an existing entity.
* @throws OrmException the data lookup failed.
* @throws UnsupportedOperationException the key type doesn't implement Key.
*/
@@ -183,14 +177,13 @@
/**
* Atomically update a single entity.
- * <p>
- * If the entity does not exist, the method returns {@code null} without
- * invoking {@code update}.
- * <p>
- * If the entity exists, the method invokes {@code update} with a current copy
- * of the entity. The update function should edit the passed instance
- * in-place. The return value will be returned to the caller, but is otherwise
- * ignored by this update function.
+ *
+ * <p>If the entity does not exist, the method returns {@code null} without invoking {@code
+ * update}.
+ *
+ * <p>If the entity exists, the method invokes {@code update} with a current copy of the entity.
+ * The update function should edit the passed instance in-place. The return value will be returned
+ * to the caller, but is otherwise ignored by this update function.
*
* @param key key which identifies the entity.
* @param update the update function.
diff --git a/src/main/java/com/google/gwtorm/server/AtomicUpdate.java b/src/main/java/com/google/gwtorm/server/AtomicUpdate.java
index 26bb894..75d107d 100644
--- a/src/main/java/com/google/gwtorm/server/AtomicUpdate.java
+++ b/src/main/java/com/google/gwtorm/server/AtomicUpdate.java
@@ -14,20 +14,17 @@
package com.google.gwtorm.server;
-/**
- * Atomically updates exactly one entity.
- */
+/** Atomically updates exactly one entity. */
public interface AtomicUpdate<T> {
/**
* Update the one object, in place.
- * <p>
- * This method may be called multiple times, up until the retry limit.
*
- * @param row a fresh copy of the object. The updater should modify it in
- * place and return, the caller will attempt to rewrite it into the
- * database.
- * @return return value for the application code calling the atomic update;
- * should be either {@code instance} or {@code null}.
+ * <p>This method may be called multiple times, up until the retry limit.
+ *
+ * @param row a fresh copy of the object. The updater should modify it in place and return, the
+ * caller will attempt to rewrite it into the database.
+ * @return return value for the application code calling the atomic update; should be either
+ * {@code instance} or {@code null}.
*/
T update(T row);
}
diff --git a/src/main/java/com/google/gwtorm/server/CodeGenSupport.java b/src/main/java/com/google/gwtorm/server/CodeGenSupport.java
index df75300..c14cdc7 100644
--- a/src/main/java/com/google/gwtorm/server/CodeGenSupport.java
+++ b/src/main/java/com/google/gwtorm/server/CodeGenSupport.java
@@ -15,16 +15,14 @@
package com.google.gwtorm.server;
import com.google.gwtorm.schema.ColumnModel;
-
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
import java.lang.reflect.Method;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
public class CodeGenSupport implements Opcodes {
public final MethodVisitor mv;
@@ -128,17 +126,20 @@
final Method m;
try {
m =
- PreparedStatement.class.getMethod("set" + sqlTypeName, Integer.TYPE,
- ResultSet.class.getMethod("get" + sqlTypeName, Integer.TYPE)
- .getReturnType());
+ PreparedStatement.class.getMethod(
+ "set" + sqlTypeName,
+ Integer.TYPE,
+ ResultSet.class.getMethod("get" + sqlTypeName, Integer.TYPE).getReturnType());
} catch (SecurityException e) {
throw new RuntimeException("java.sql has no " + sqlTypeName);
} catch (NoSuchMethodException e) {
throw new RuntimeException("java.sql has no " + sqlTypeName, e);
}
- mv.visitMethodInsn(INVOKEINTERFACE, Type
- .getInternalName(PreparedStatement.class), m.getName(), Type
- .getMethodDescriptor(m));
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ Type.getInternalName(PreparedStatement.class),
+ m.getName(),
+ Type.getMethodDescriptor(m));
}
public void invokeResultSetGet(final String sqlTypeName) {
@@ -150,8 +151,11 @@
} catch (NoSuchMethodException e) {
throw new RuntimeException("java.sql has no " + sqlTypeName, e);
}
- mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(ResultSet.class),
- m.getName(), Type.getMethodDescriptor(m));
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ Type.getInternalName(ResultSet.class),
+ m.getName(),
+ Type.getMethodDescriptor(m));
}
public void fieldSetBegin() {
@@ -167,8 +171,8 @@
mv.visitInsn(DUP);
mv.visitVarInsn(ASTORE, dupOnSet);
}
- mv.visitFieldInsn(PUTFIELD, c.getInternalName(), col.getFieldName(),
- toType(col).getDescriptor());
+ mv.visitFieldInsn(
+ PUTFIELD, c.getInternalName(), col.getFieldName(), toType(col).getDescriptor());
}
public void setDupOnFieldSetEnd(final int varIdx) {
@@ -185,8 +189,7 @@
appendGetField(c.getParent());
}
final Type t = containerClass(c);
- mv.visitFieldInsn(GETFIELD, t.getInternalName(), c.getFieldName(),
- toType(c).getDescriptor());
+ mv.visitFieldInsn(GETFIELD, t.getInternalName(), c.getFieldName(), toType(c).getDescriptor());
}
private Type containerClass(final ColumnModel c) {
diff --git a/src/main/java/com/google/gwtorm/server/GeneratedClassLoader.java b/src/main/java/com/google/gwtorm/server/GeneratedClassLoader.java
index 8d9e774..567b83f 100644
--- a/src/main/java/com/google/gwtorm/server/GeneratedClassLoader.java
+++ b/src/main/java/com/google/gwtorm/server/GeneratedClassLoader.java
@@ -14,7 +14,6 @@
package com.google.gwtorm.server;
-
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -23,12 +22,11 @@
/**
* Hacked ClassLoader to inject generated code into the parent.
- * <p>
- * This ClassLoader allows our code generators to inject their generated classes
- * into the parent ClassLoader, which should be the same ClassLoader that
- * defined the application's Schema interface extension. This is necessary to
- * ensure the generated classes can access protected and default-access fields
- * within the entities.
+ *
+ * <p>This ClassLoader allows our code generators to inject their generated classes into the parent
+ * ClassLoader, which should be the same ClassLoader that defined the application's Schema interface
+ * extension. This is necessary to ensure the generated classes can access protected and
+ * default-access fields within the entities.
*/
public class GeneratedClassLoader extends ClassLoader {
private static final boolean debugCodeGen;
@@ -41,8 +39,8 @@
Method m;
try {
m =
- ClassLoader.class.getDeclaredMethod("defineClass", String.class,
- byte[].class, Integer.TYPE, Integer.TYPE);
+ ClassLoader.class.getDeclaredMethod(
+ "defineClass", String.class, byte[].class, Integer.TYPE, Integer.TYPE);
m.setAccessible(true);
} catch (SecurityException e) {
throw new LinkageError("No defineClass in ClassLoader");
@@ -56,11 +54,9 @@
super(parent);
}
- public void defineClass(final String name, final byte[] code)
- throws OrmException {
+ public void defineClass(final String name, final byte[] code) throws OrmException {
if (debugCodeGen) {
- final File outClassFile =
- new File("generated_classes/" + name.replace('.', '/') + ".class");
+ final File outClassFile = new File("generated_classes/" + name.replace('.', '/') + ".class");
outClassFile.getParentFile().mkdirs();
try {
final FileOutputStream out = new FileOutputStream(outClassFile);
@@ -75,8 +71,7 @@
}
try {
- defineClass.invoke(getParent(), name, code, Integer.valueOf(0), Integer
- .valueOf(code.length));
+ defineClass.invoke(getParent(), name, code, Integer.valueOf(0), Integer.valueOf(code.length));
} catch (IllegalArgumentException e) {
throw new OrmException("Unable to inject class " + name, e);
} catch (SecurityException e) {
diff --git a/src/main/java/com/google/gwtorm/server/ListResultSet.java b/src/main/java/com/google/gwtorm/server/ListResultSet.java
index 019d976..dac3e64 100644
--- a/src/main/java/com/google/gwtorm/server/ListResultSet.java
+++ b/src/main/java/com/google/gwtorm/server/ListResultSet.java
@@ -14,7 +14,6 @@
package com.google.gwtorm.server;
-
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
diff --git a/src/main/java/com/google/gwtorm/server/OrmException.java b/src/main/java/com/google/gwtorm/server/OrmException.java
index a5acd32..24325b0 100644
--- a/src/main/java/com/google/gwtorm/server/OrmException.java
+++ b/src/main/java/com/google/gwtorm/server/OrmException.java
@@ -14,9 +14,7 @@
package com.google.gwtorm.server;
-/**
- * Any data store read or write error.
- */
+/** Any data store read or write error. */
@SuppressWarnings("serial")
public class OrmException extends Exception {
public OrmException(final String message) {
diff --git a/src/main/java/com/google/gwtorm/server/OrmRuntimeException.java b/src/main/java/com/google/gwtorm/server/OrmRuntimeException.java
index 5220a3b..e3fbc4c 100644
--- a/src/main/java/com/google/gwtorm/server/OrmRuntimeException.java
+++ b/src/main/java/com/google/gwtorm/server/OrmRuntimeException.java
@@ -14,9 +14,7 @@
package com.google.gwtorm.server;
-/**
- * Any data store read or write error.
- */
+/** Any data store read or write error. */
@SuppressWarnings("serial")
public class OrmRuntimeException extends RuntimeException {
public OrmRuntimeException(final String message) {
diff --git a/src/main/java/com/google/gwtorm/server/PrimaryKey.java b/src/main/java/com/google/gwtorm/server/PrimaryKey.java
index 73ae5b7..07c2eb6 100644
--- a/src/main/java/com/google/gwtorm/server/PrimaryKey.java
+++ b/src/main/java/com/google/gwtorm/server/PrimaryKey.java
@@ -14,7 +14,6 @@
package com.google.gwtorm.server;
-
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -28,8 +27,6 @@
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PrimaryKey {
- /**
- * @return name of the field in the entity which contains the primary key.
- */
+ /** @return name of the field in the entity which contains the primary key. */
String value();
}
diff --git a/src/main/java/com/google/gwtorm/server/Query.java b/src/main/java/com/google/gwtorm/server/Query.java
index d7d0f9b..563c846 100644
--- a/src/main/java/com/google/gwtorm/server/Query.java
+++ b/src/main/java/com/google/gwtorm/server/Query.java
@@ -14,7 +14,6 @@
package com.google.gwtorm.server;
-
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -22,17 +21,17 @@
/**
* Annotation marking a method in an {@link Access} interface as a query.
- * <p>
- * Query methods must return a parameterized {@link ResultSet}, for example:
+ *
+ * <p>Query methods must return a parameterized {@link ResultSet}, for example:
*
* <pre>
* public interface FooAccess extends Access<Foo, Foo.Key> {
* @Query("WHERE a=?")
* ResultSet<Foo> find(int a) throws OrmException;
* }
- *</pre>
- *<p>
- * Query strings must conform to the following grammar:
+ * </pre>
+ *
+ * <p>Query strings must conform to the following grammar:
*
* <pre>
* [WHERE <condition> [AND <condition> ...]]
@@ -42,16 +41,13 @@
* <condition> := <property> { < | <= | > | >= | = } <value>
* <value> := { ? | true | false | <int> | <string> }
* </pre>
- * <p>
- * Method parameters are bound in order to the placeholders (?) declared in the
- * query conditions. The type of the limit placeholder parameter (if used in the
- * query) must be <code>int</code>.
+ *
+ * <p>Method parameters are bound in order to the placeholders (?) declared in the query conditions.
+ * The type of the limit placeholder parameter (if used in the query) must be <code>int</code>.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Query {
- /**
- * @return the query clause. Defaults to "", matching all entities, no order.
- */
+ /** @return the query clause. Defaults to "", matching all entities, no order. */
String value() default "";
}
diff --git a/src/main/java/com/google/gwtorm/server/Relation.java b/src/main/java/com/google/gwtorm/server/Relation.java
index f4141c6..40d652d 100644
--- a/src/main/java/com/google/gwtorm/server/Relation.java
+++ b/src/main/java/com/google/gwtorm/server/Relation.java
@@ -14,7 +14,6 @@
package com.google.gwtorm.server;
-
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -22,9 +21,8 @@
/**
* Annotation marking a method in a {@link Schema} interface as entity access.
- * <p>
- * Access methods must return an interface extending {@link Access}, for
- * example:
+ *
+ * <p>Access methods must return an interface extending {@link Access}, for example:
*
* <pre>
* public interface FooAccess extends Access<Foo, Foo.Key> {
@@ -35,22 +33,20 @@
* FooAccess foos();
* }
* </pre>
- * <p>
- * The table name within the data store will be derived from the relation
- * annotation, or the method name.
+ *
+ * <p>The table name within the data store will be derived from the relation annotation, or the
+ * method name.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Relation {
- /**
- * @return the name of the data store table. Defaults to the method name.
- */
+ /** @return the name of the data store table. Defaults to the method name. */
String name() default "";
/**
- * @return the unique ID for this relation. Must be unique among all
- * relations, and conform to Protobuf message ID rules. The ID must be
- * in the range [1,2^29-1] except 19000 through 19999.
+ * @return the unique ID for this relation. Must be unique among all relations, and conform to
+ * Protobuf message ID rules. The ID must be in the range [1,2^29-1] except 19000 through
+ * 19999.
*/
int id();
}
diff --git a/src/main/java/com/google/gwtorm/server/ResultSet.java b/src/main/java/com/google/gwtorm/server/ResultSet.java
index 18f8c75..25ea15e 100644
--- a/src/main/java/com/google/gwtorm/server/ResultSet.java
+++ b/src/main/java/com/google/gwtorm/server/ResultSet.java
@@ -25,19 +25,18 @@
public interface ResultSet<T> extends Iterable<T> {
/**
* Obtain an iterator to loop through the results.
- * <p>
- * The iterator can be obtained only once. When the iterator completes (
- * <code>hasNext()</code> returns false) {@link #close()} will be
- * automatically called.
+ *
+ * <p>The iterator can be obtained only once. When the iterator completes ( <code>hasNext()</code>
+ * returns false) {@link #close()} will be automatically called.
*/
@Override
Iterator<T> iterator();
/**
* Materialize all results as a single list.
- * <p>
- * Prior to returning {@link #close()} is invoked. This method must not be
- * combined with {@link #iterator()} on the same instance.
+ *
+ * <p>Prior to returning {@link #close()} is invoked. This method must not be combined with {@link
+ * #iterator()} on the same instance.
*
* @return mutable list of the complete results.
*/
@@ -45,9 +44,9 @@
/**
* Close the result, discarding any further results.
- * <p>
- * This method may be invoked more than once. Its main use is to stop
- * obtaining results before the iterator has finished.
+ *
+ * <p>This method may be invoked more than once. Its main use is to stop obtaining results before
+ * the iterator has finished.
*/
void close();
}
diff --git a/src/main/java/com/google/gwtorm/server/Schema.java b/src/main/java/com/google/gwtorm/server/Schema.java
index 2357a89..026bb1d 100644
--- a/src/main/java/com/google/gwtorm/server/Schema.java
+++ b/src/main/java/com/google/gwtorm/server/Schema.java
@@ -14,32 +14,28 @@
package com.google.gwtorm.server;
-
/**
* Application database definition and top-level schema access.
- * <p>
- * Applications should extend this interface and declare relation methods for
- * each entity/table used. Relation methods must be marked with the
- * {@link Relation} annotation and return an interface extending {@link Access}.
- * At runtime the application extension of Schema will be automatically
- * implemented with a generated class, providing implementations of the Access
+ *
+ * <p>Applications should extend this interface and declare relation methods for each entity/table
+ * used. Relation methods must be marked with the {@link Relation} annotation and return an
+ * interface extending {@link Access}. At runtime the application extension of Schema will be
+ * automatically implemented with a generated class, providing implementations of the Access
* extensions from each of the declared relation methods.
- * <p>
- * Instances of a schema should be obtained through the
- * {@link com.google.gwtorm.jdbc.Database} class on a pure-JDBC implementation
- * and through <code>GWT.create()</code> on the GWT client side.
- * <p>
- * In the JDBC implementation each Schema instance wraps around a single JDBC
- * Connection object. Therefore a Schema instance has a 1:1 relationship with an
- * active database handle.
- * <p>
- * A Schema instance (as well as its returned Access instances) is not thread
- * safe. Applications must provide their own synchronization, or ensure that at
- * most 1 thread access a Schema instance (or any returned Access instance) at a
- * time. The safest mapping is 1 schema instance per thread, never shared.
- * <p>
- * For example the OurDb schema creates two tables (identical structure) named
- * <code>someFoos</code> and <code>otherFoos</code>:
+ *
+ * <p>Instances of a schema should be obtained through the {@link com.google.gwtorm.jdbc.Database}
+ * class on a pure-JDBC implementation and through <code>GWT.create()</code> on the GWT client side.
+ *
+ * <p>In the JDBC implementation each Schema instance wraps around a single JDBC Connection object.
+ * Therefore a Schema instance has a 1:1 relationship with an active database handle.
+ *
+ * <p>A Schema instance (as well as its returned Access instances) is not thread safe. Applications
+ * must provide their own synchronization, or ensure that at most 1 thread access a Schema instance
+ * (or any returned Access instance) at a time. The safest mapping is 1 schema instance per thread,
+ * never shared.
+ *
+ * <p>For example the OurDb schema creates two tables (identical structure) named <code>someFoos
+ * </code> and <code>otherFoos</code>:
*
* <pre>
* public interface FooAccess extends Access<Foo, Foo.Key> {
@@ -64,10 +60,10 @@
/**
* Add any missing columns, create any missing tables or sequences.
- * <p>
- * This method does not drop any unused columns or tables, leaving them intact
- * for applications to continue to query after the update. Any unused columns
- * that are NOT NULL are altered to accept NULL.
+ *
+ * <p>This method does not drop any unused columns or tables, leaving them intact for applications
+ * to continue to query after the update. Any unused columns that are NOT NULL are altered to
+ * accept NULL.
*
* @param e executor to perform (or log) the statements.
* @throws OrmException one or more objects could not be added to the schema.
@@ -76,8 +72,8 @@
/**
* Drop any unused columns, tables, or sequences.
- * <p>
- * This method destroys data, as columns may be removed entirely.
+ *
+ * <p>This method destroys data, as columns may be removed entirely.
*
* @param e executor to perform (or log) the statements.
* @throws OrmException one or more drops could not be completed.
diff --git a/src/main/java/com/google/gwtorm/server/SchemaConstructorGen.java b/src/main/java/com/google/gwtorm/server/SchemaConstructorGen.java
index 95ea82a..175b212 100644
--- a/src/main/java/com/google/gwtorm/server/SchemaConstructorGen.java
+++ b/src/main/java/com/google/gwtorm/server/SchemaConstructorGen.java
@@ -15,15 +15,13 @@
package com.google.gwtorm.server;
import com.google.gwtorm.schema.Util;
-
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-
/** Generates a factory to efficiently create new Schema instances. */
public class SchemaConstructorGen<T extends Schema> implements Opcodes {
private static final String CTX = "schemaArg";
@@ -35,8 +33,7 @@
private String implClassName;
private String implTypeName;
- public SchemaConstructorGen(final GeneratedClassLoader loader,
- final Class<T> c, final Object f) {
+ public SchemaConstructorGen(final GeneratedClassLoader loader, final Class<T> c, final Object f) {
classLoader = loader;
schemaImpl = c;
schemaArg = f;
@@ -51,7 +48,6 @@
classLoader.defineClass(implClassName, cw.toByteArray());
}
-
public SchemaFactory<T> create() throws OrmException {
defineClass();
try {
@@ -77,34 +73,43 @@
}
private void init() {
- implClassName =
- schemaImpl.getName() + "_Factory_" + Util.createRandomName();
+ implClassName = schemaImpl.getName() + "_Factory_" + Util.createRandomName();
implTypeName = implClassName.replace('.', '/');
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- cw.visit(V1_3, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, implTypeName, null, Type
- .getInternalName(Object.class), new String[] {Type
- .getInternalName(SchemaFactory.class)});
+ cw.visit(
+ V1_3,
+ ACC_PUBLIC | ACC_FINAL | ACC_SUPER,
+ implTypeName,
+ null,
+ Type.getInternalName(Object.class),
+ new String[] {Type.getInternalName(SchemaFactory.class)});
}
private void declareFactoryField() {
- cw.visitField(ACC_PRIVATE | ACC_FINAL, CTX,
- Type.getType(schemaArg.getClass()).getDescriptor(), null, null)
+ cw.visitField(
+ ACC_PRIVATE | ACC_FINAL,
+ CTX,
+ Type.getType(schemaArg.getClass()).getDescriptor(),
+ null,
+ null)
.visitEnd();
}
private void implementConstructor() {
final Type ft = Type.getType(schemaArg.getClass());
final String consName = "<init>";
- final String consDesc =
- Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {ft});
+ final String consDesc = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {ft});
final MethodVisitor mv;
mv = cw.visitMethod(ACC_PUBLIC, consName, consDesc, null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(Object.class),
- consName, Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ Type.getInternalName(Object.class),
+ consName,
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {}));
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
@@ -119,9 +124,12 @@
final Type ft = Type.getType(schemaArg.getClass());
final String typeName = Type.getType(schemaImpl).getInternalName();
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "open", Type
- .getMethodDescriptor(Type.getType(Schema.class), new Type[] {}),
- null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "open",
+ Type.getMethodDescriptor(Type.getType(Schema.class), new Type[] {}),
+ null,
+ null);
mv.visitCode();
Constructor<?> c = schemaImpl.getDeclaredConstructors()[0];
@@ -131,8 +139,11 @@
mv.visitInsn(DUP);
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, implTypeName, CTX, ft.getDescriptor());
- mv.visitMethodInsn(INVOKESPECIAL, typeName, "<init>", Type
- .getMethodDescriptor(Type.VOID_TYPE, new Type[] {argType}));
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ typeName,
+ "<init>",
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {argType}));
mv.visitInsn(ARETURN);
mv.visitMaxs(-1, -1);
mv.visitEnd();
diff --git a/src/main/java/com/google/gwtorm/server/SchemaFactory.java b/src/main/java/com/google/gwtorm/server/SchemaFactory.java
index 2cc6d35..3909fca 100644
--- a/src/main/java/com/google/gwtorm/server/SchemaFactory.java
+++ b/src/main/java/com/google/gwtorm/server/SchemaFactory.java
@@ -14,7 +14,6 @@
package com.google.gwtorm.server;
-
/**
* Creates new application Schema instances on demand.
*
@@ -25,9 +24,8 @@
* Open a new connection to the database and get a Schema wrapper.
*
* @return a new connection, wrapped up in the application's Schema.
- * @throws OrmException the connection could not be opened to the database.
- * The exception detail should be examined to determine the root cause
- * of the connection failure.
+ * @throws OrmException the connection could not be opened to the database. The exception detail
+ * should be examined to determine the root cause of the connection failure.
*/
S open() throws OrmException;
}
diff --git a/src/main/java/com/google/gwtorm/server/SchemaGen.java b/src/main/java/com/google/gwtorm/server/SchemaGen.java
index b0a44de..cbee521 100644
--- a/src/main/java/com/google/gwtorm/server/SchemaGen.java
+++ b/src/main/java/com/google/gwtorm/server/SchemaGen.java
@@ -18,22 +18,19 @@
import com.google.gwtorm.schema.SchemaModel;
import com.google.gwtorm.schema.SequenceModel;
import com.google.gwtorm.schema.Util;
-
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
/** Generates a concrete implementation of a {@link Schema} extension. */
public class SchemaGen<S extends AbstractSchema> implements Opcodes {
public interface AccessGenerator {
- Class<?> create(GeneratedClassLoader loader, RelationModel rm)
- throws OrmException;
+ Class<?> create(GeneratedClassLoader loader, RelationModel rm) throws OrmException;
}
private final GeneratedClassLoader classLoader;
@@ -46,9 +43,12 @@
private String implClassName;
private String implTypeName;
- public SchemaGen(final GeneratedClassLoader loader,
- final SchemaModel schemaModel, final Class<?> databaseType,
- final Class<S> superType, final AccessGenerator ag) {
+ public SchemaGen(
+ final GeneratedClassLoader loader,
+ final SchemaModel schemaModel,
+ final Class<?> databaseType,
+ final Class<S> superType,
+ final AccessGenerator ag) {
classLoader = loader;
schema = schemaModel;
databaseClass = databaseType;
@@ -100,16 +100,18 @@
relations.add(new RelationGen(rel, a));
}
- Collections.sort(relations, new Comparator<RelationGen>() {
- @Override
- public int compare(RelationGen a, RelationGen b) {
- int cmp = a.model.getRelationID() - b.model.getRelationID();
- if (cmp == 0) {
- cmp = a.model.getRelationName().compareTo(b.model.getRelationName());
- }
- return cmp;
- }
- });
+ Collections.sort(
+ relations,
+ new Comparator<RelationGen>() {
+ @Override
+ public int compare(RelationGen a, RelationGen b) {
+ int cmp = a.model.getRelationID() - b.model.getRelationID();
+ if (cmp == 0) {
+ cmp = a.model.getRelationName().compareTo(b.model.getRelationName());
+ }
+ return cmp;
+ }
+ });
}
private void init() {
@@ -117,9 +119,13 @@
implTypeName = implClassName.replace('.', '/');
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- cw.visit(V1_3, ACC_PUBLIC | ACC_FINAL | ACC_SUPER, implTypeName, null, Type
- .getInternalName(schemaSuperClass), new String[] {getSchemaClassName()
- .replace('.', '/')});
+ cw.visit(
+ V1_3,
+ ACC_PUBLIC | ACC_FINAL | ACC_SUPER,
+ implTypeName,
+ null,
+ Type.getInternalName(schemaSuperClass),
+ new String[] {getSchemaClassName().replace('.', '/')});
}
private void implementRelationFields() {
@@ -134,27 +140,41 @@
final Type dbType = Type.getType(databaseClass);
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC, consName, Type.getMethodDescriptor(
- Type.VOID_TYPE, new Type[] {dbType}), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC,
+ consName,
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {dbType}),
+ null,
+ null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
- mv.visitMethodInsn(INVOKESPECIAL, superType.getInternalName(), consName,
- Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {Type
- .getType(schemaSuperClass.getDeclaredConstructors()[0]
- .getParameterTypes()[0])}));
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ superType.getInternalName(),
+ consName,
+ Type.getMethodDescriptor(
+ Type.VOID_TYPE,
+ new Type[] {
+ Type.getType(schemaSuperClass.getDeclaredConstructors()[0].getParameterTypes()[0])
+ }));
for (final RelationGen info : relations) {
mv.visitVarInsn(ALOAD, 0);
mv.visitTypeInsn(NEW, info.accessType.getInternalName());
mv.visitInsn(DUP);
mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKESPECIAL, info.accessType.getInternalName(),
- consName, Type.getMethodDescriptor(Type.VOID_TYPE,
- new Type[] {superType}));
- mv.visitFieldInsn(PUTFIELD, implTypeName, info
- .getAccessInstanceFieldName(), info.accessType.getDescriptor());
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ info.accessType.getInternalName(),
+ consName,
+ Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {superType}));
+ mv.visitFieldInsn(
+ PUTFIELD,
+ implTypeName,
+ info.getAccessInstanceFieldName(),
+ info.accessType.getDescriptor());
}
mv.visitInsn(RETURN);
@@ -166,18 +186,22 @@
for (final SequenceModel seq : schema.getSequences()) {
final Type retType = Type.getType(seq.getResultType());
final MethodVisitor mv =
- cw
- .visitMethod(ACC_PUBLIC, seq.getMethodName(), Type
- .getMethodDescriptor(retType, new Type[] {}), null,
- new String[] {Type.getType(OrmException.class)
- .getInternalName()});
+ cw.visitMethod(
+ ACC_PUBLIC,
+ seq.getMethodName(),
+ Type.getMethodDescriptor(retType, new Type[] {}),
+ null,
+ new String[] {Type.getType(OrmException.class).getInternalName()});
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitLdcInsn(seq.getSequenceName());
- mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(schemaSuperClass),
- "nextLong", Type.getMethodDescriptor(Type.getType(Long.TYPE),
- new Type[] {Type.getType(String.class)}));
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ Type.getInternalName(schemaSuperClass),
+ "nextLong",
+ Type.getMethodDescriptor(
+ Type.getType(Long.TYPE), new Type[] {Type.getType(String.class)}));
if (retType.getSize() == 1) {
mv.visitInsn(L2I);
mv.visitInsn(IRETURN);
@@ -197,9 +221,12 @@
private void implementAllRelationsMethod() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "allRelations", Type
- .getMethodDescriptor(Type.getType(Access[].class), new Type[] {}),
- null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL,
+ "allRelations",
+ Type.getMethodDescriptor(Type.getType(Access[].class), new Type[] {}),
+ null,
+ null);
mv.visitCode();
final int r = 1;
@@ -214,8 +241,8 @@
cgs.push(index++);
mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKEVIRTUAL, getImplTypeName(), info.model
- .getMethodName(), info.getDescriptor());
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL, getImplTypeName(), info.model.getMethodName(), info.getDescriptor());
mv.visitInsn(AASTORE);
}
@@ -236,8 +263,13 @@
}
void implementField() {
- cw.visitField(ACC_PRIVATE | ACC_FINAL, getAccessInstanceFieldName(),
- accessType.getDescriptor(), null, null).visitEnd();
+ cw.visitField(
+ ACC_PRIVATE | ACC_FINAL,
+ getAccessInstanceFieldName(),
+ accessType.getDescriptor(),
+ null,
+ null)
+ .visitEnd();
}
String getAccessInstanceFieldName() {
@@ -246,20 +278,20 @@
void implementMethod() {
final MethodVisitor mv =
- cw.visitMethod(ACC_PUBLIC | ACC_FINAL, model.getMethodName(),
- getDescriptor(), null, null);
+ cw.visitMethod(
+ ACC_PUBLIC | ACC_FINAL, model.getMethodName(), getDescriptor(), null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, implTypeName, getAccessInstanceFieldName(),
- accessType.getDescriptor());
+ mv.visitFieldInsn(
+ GETFIELD, implTypeName, getAccessInstanceFieldName(), accessType.getDescriptor());
mv.visitInsn(ARETURN);
mv.visitMaxs(-1, -1);
mv.visitEnd();
}
String getDescriptor() {
- return Type.getMethodDescriptor(Type.getObjectType(model
- .getAccessInterfaceName().replace('.', '/')), new Type[] {});
+ return Type.getMethodDescriptor(
+ Type.getObjectType(model.getAccessInterfaceName().replace('.', '/')), new Type[] {});
}
}
}
diff --git a/src/main/java/com/google/gwtorm/server/Sequence.java b/src/main/java/com/google/gwtorm/server/Sequence.java
index 5be3371..45acf3f 100644
--- a/src/main/java/com/google/gwtorm/server/Sequence.java
+++ b/src/main/java/com/google/gwtorm/server/Sequence.java
@@ -14,7 +14,6 @@
package com.google.gwtorm.server;
-
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -22,9 +21,8 @@
/**
* Annotation marking a method in {@link Schema} interface as number generator.
- * <p>
- * Sequence methods must return a primitive <code>int</code> or
- * <code>long</code> type.
+ *
+ * <p>Sequence methods must return a primitive <code>int</code> or <code>long</code> type.
*
* <pre>
* public interface BarSchema extends Schema {
@@ -32,31 +30,27 @@
* int nextId();
* }
* </pre>
- * <p>
- * The sequence name will be taken from the method name, after removing the
- * optional prefix "next".
+ *
+ * <p>The sequence name will be taken from the method name, after removing the optional prefix
+ * "next".
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Sequence {
- /**
- * @return the name of the sequence. Defaults to the method name.
- */
+ /** @return the name of the sequence. Defaults to the method name. */
String name() default "";
/**
- * @return the initial value of the sequence. Defaults to 1, or whatever the
- * database dialect defaults to if the sequence starting value is not
- * supplied in the sequence declaration.
+ * @return the initial value of the sequence. Defaults to 1, or whatever the database dialect
+ * defaults to if the sequence starting value is not supplied in the sequence declaration.
*/
long startWith() default 0;
/**
- * @return maximum number of values to cache in memory from the sequence.
- * Defaults to -1, indicating a default caching level should be
- * determined by the database. Cached values may be lost (never
- * returned by the sequence, creating gaps) if the application or the
- * database is shutdown and restarted.
+ * @return maximum number of values to cache in memory from the sequence. Defaults to -1,
+ * indicating a default caching level should be determined by the database. Cached values may
+ * be lost (never returned by the sequence, creating gaps) if the application or the database
+ * is shutdown and restarted.
*/
int cache() default -1;
}
diff --git a/src/main/java/com/google/gwtorm/server/StandardKeyEncoder.java b/src/main/java/com/google/gwtorm/server/StandardKeyEncoder.java
index c9076e8..1339542 100644
--- a/src/main/java/com/google/gwtorm/server/StandardKeyEncoder.java
+++ b/src/main/java/com/google/gwtorm/server/StandardKeyEncoder.java
@@ -15,14 +15,13 @@
package com.google.gwtorm.server;
import com.google.gwtorm.client.KeyUtil.Encoder;
-
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class StandardKeyEncoder extends Encoder {
- private static final char[] hexc =
- {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
- 'E', 'F'};
+ private static final char[] hexc = {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
+ };
private static final char safe[];
private static final byte hexb[];
@@ -39,21 +38,15 @@
safe[')'] = ')';
safe['/'] = '/';
safe[' '] = '+';
- for (char c = '0'; c <= '9'; c++)
- safe[c] = c;
- for (char c = 'A'; c <= 'Z'; c++)
- safe[c] = c;
- for (char c = 'a'; c <= 'z'; c++)
- safe[c] = c;
+ for (char c = '0'; c <= '9'; c++) safe[c] = c;
+ for (char c = 'A'; c <= 'Z'; c++) safe[c] = c;
+ for (char c = 'a'; c <= 'z'; c++) safe[c] = c;
hexb = new byte['f' + 1];
Arrays.fill(hexb, (byte) -1);
- for (char i = '0'; i <= '9'; i++)
- hexb[i] = (byte) (i - '0');
- for (char i = 'A'; i <= 'F'; i++)
- hexb[i] = (byte) ((i - 'A') + 10);
- for (char i = 'a'; i <= 'f'; i++)
- hexb[i] = (byte) ((i - 'a') + 10);
+ for (char i = '0'; i <= '9'; i++) hexb[i] = (byte) (i - '0');
+ for (char i = 'A'; i <= 'F'; i++) hexb[i] = (byte) ((i - 'A') + 10);
+ for (char i = 'a'; i <= 'f'; i++) hexb[i] = (byte) ((i - 'a') + 10);
}
@Override
@@ -89,7 +82,7 @@
final byte[] b = new byte[e.length()];
int bPtr = 0;
try {
- for (int i = 0; i < e.length();) {
+ for (int i = 0; i < e.length(); ) {
final char c = e.charAt(i);
if (c == '%' && i + 2 < e.length()) {
final int v = (hexb[e.charAt(i + 1)] << 4) | hexb[e.charAt(i + 2)];
@@ -115,4 +108,4 @@
throw new RuntimeException("No UTF-8 support", e1);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/test/java/com/google/gwtorm/client/IntKeyTestCase.java b/src/test/java/com/google/gwtorm/client/IntKeyTestCase.java
index e985f5b..104068a 100644
--- a/src/test/java/com/google/gwtorm/client/IntKeyTestCase.java
+++ b/src/test/java/com/google/gwtorm/client/IntKeyTestCase.java
@@ -14,16 +14,15 @@
package com.google.gwtorm.client;
-import com.google.gwtorm.server.StandardKeyEncoder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
+import com.google.gwtorm.server.StandardKeyEncoder;
import org.junit.Before;
import org.junit.Test;
-
public class IntKeyTestCase {
@SuppressWarnings("serial")
private abstract static class IntKeyImpl<T extends Key<?>> extends IntKey<T> {
diff --git a/src/test/java/com/google/gwtorm/client/LongKeyTestCase.java b/src/test/java/com/google/gwtorm/client/LongKeyTestCase.java
index 1e46753..17b298b 100644
--- a/src/test/java/com/google/gwtorm/client/LongKeyTestCase.java
+++ b/src/test/java/com/google/gwtorm/client/LongKeyTestCase.java
@@ -20,15 +20,12 @@
import static org.junit.Assert.assertTrue;
import com.google.gwtorm.server.StandardKeyEncoder;
-
import org.junit.Before;
import org.junit.Test;
-
public class LongKeyTestCase {
@SuppressWarnings("serial")
- private abstract static class LongKeyImpl<T extends Key<?>> extends
- LongKey<T> {
+ private abstract static class LongKeyImpl<T extends Key<?>> extends LongKey<T> {
@Column(id = 1)
long id;
diff --git a/src/test/java/com/google/gwtorm/client/StringKeyTestCase.java b/src/test/java/com/google/gwtorm/client/StringKeyTestCase.java
index 0833347..731cf8c 100644
--- a/src/test/java/com/google/gwtorm/client/StringKeyTestCase.java
+++ b/src/test/java/com/google/gwtorm/client/StringKeyTestCase.java
@@ -20,15 +20,12 @@
import static org.junit.Assert.assertTrue;
import com.google.gwtorm.server.StandardKeyEncoder;
-
import org.junit.Before;
import org.junit.Test;
-
public class StringKeyTestCase {
@SuppressWarnings("serial")
- private abstract static class StringKeyImpl<T extends Key<?>> extends
- StringKey<T> {
+ private abstract static class StringKeyImpl<T extends Key<?>> extends StringKey<T> {
@Column(id = 1)
String name;
diff --git a/src/test/java/com/google/gwtorm/data/Address.java b/src/test/java/com/google/gwtorm/data/Address.java
index cc4c907..4bdae52 100644
--- a/src/test/java/com/google/gwtorm/data/Address.java
+++ b/src/test/java/com/google/gwtorm/data/Address.java
@@ -60,8 +60,7 @@
@Column(id = 3, notNull = false)
protected byte[] photo;
- protected Address() {
- }
+ protected Address() {}
public Address(final Address.Key city, final String where) {
this.city = city;
diff --git a/src/test/java/com/google/gwtorm/data/Person.java b/src/test/java/com/google/gwtorm/data/Person.java
index 13ff465..2bf0a80 100644
--- a/src/test/java/com/google/gwtorm/data/Person.java
+++ b/src/test/java/com/google/gwtorm/data/Person.java
@@ -17,15 +17,13 @@
import com.google.gwtorm.client.Column;
import com.google.gwtorm.client.StringKey;
-
public class Person {
@SuppressWarnings("serial")
public static class Key extends StringKey<com.google.gwtorm.client.Key<?>> {
@Column(id = 1, length = 20)
protected String name;
- protected Key() {
- }
+ protected Key() {}
public Key(final String name) {
this.name = name;
@@ -51,8 +49,7 @@
@Column(id = 3)
protected boolean registered;
- protected Person() {
- }
+ protected Person() {}
public Person(final Key key, final int age) {
this.name = key;
diff --git a/src/test/java/com/google/gwtorm/data/Person2.java b/src/test/java/com/google/gwtorm/data/Person2.java
index ab363e7..07a14a5 100644
--- a/src/test/java/com/google/gwtorm/data/Person2.java
+++ b/src/test/java/com/google/gwtorm/data/Person2.java
@@ -16,7 +16,6 @@
import com.google.gwtorm.client.Column;
-
public class Person2 {
@Column(id = 1)
protected Person.Key name;
diff --git a/src/test/java/com/google/gwtorm/data/PersonAccess.java b/src/test/java/com/google/gwtorm/data/PersonAccess.java
index af36e7a..c80cce6 100644
--- a/src/test/java/com/google/gwtorm/data/PersonAccess.java
+++ b/src/test/java/com/google/gwtorm/data/PersonAccess.java
@@ -32,8 +32,7 @@
ResultSet<Person> olderThan(int age) throws OrmException;
@Query("WHERE age > ? ORDER BY name DESC")
- ResultSet<Person> olderThanDescByName(int age)
- throws OrmException;
+ ResultSet<Person> olderThanDescByName(int age) throws OrmException;
@Query("WHERE name = 'bob' LIMIT ?")
ResultSet<Person> firstNBob(int n) throws OrmException;
diff --git a/src/test/java/com/google/gwtorm/jdbc/AbstractTestJdbcAccess.java b/src/test/java/com/google/gwtorm/jdbc/AbstractTestJdbcAccess.java
index 267bfcc..74e703c 100644
--- a/src/test/java/com/google/gwtorm/jdbc/AbstractTestJdbcAccess.java
+++ b/src/test/java/com/google/gwtorm/jdbc/AbstractTestJdbcAccess.java
@@ -14,7 +14,6 @@
package com.google.gwtorm.jdbc;
-
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.doNothing;
@@ -32,13 +31,6 @@
import com.google.gwtorm.server.OrmConcurrencyException;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-import org.mockito.stubbing.OngoingStubbing;
-
import java.sql.BatchUpdateException;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -47,6 +39,11 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.mockito.stubbing.OngoingStubbing;
@RunWith(Parameterized.class)
public abstract class AbstractTestJdbcAccess {
@@ -67,7 +64,7 @@
protected SQLException sqlException = null;
- static abstract class IterableProvider<T> {
+ abstract static class IterableProvider<T> {
abstract Iterable<T> createIterable(T... ts);
}
@@ -102,12 +99,13 @@
@Parameters
public static Collection<Object[]> data() {
- return Arrays.asList(new Object[][] { {LIST_PROVIDER},
- {UNMODIFIABLE_LIST_PROVIDER}, {LIST_RESULT_SET_PROVIDER},});
+ return Arrays.asList(
+ new Object[][] {
+ {LIST_PROVIDER}, {UNMODIFIABLE_LIST_PROVIDER}, {LIST_RESULT_SET_PROVIDER},
+ });
}
- public AbstractTestJdbcAccess(IterableProvider<Data> dataProvider)
- throws SQLException {
+ public AbstractTestJdbcAccess(IterableProvider<Data> dataProvider) throws SQLException {
noData = dataProvider.createIterable();
oneRow = dataProvider.createIterable(new Data(1));
twoRows = dataProvider.createIterable(new Data(1), new Data(2));
@@ -119,8 +117,8 @@
protected abstract SqlDialect createDialect() throws SQLException;
- private PreparedStatement stubStatementWithUpdateCounts(String command,
- final int... updateCounts) throws SQLException {
+ private PreparedStatement stubStatementWithUpdateCounts(String command, final int... updateCounts)
+ throws SQLException {
PreparedStatement ps = mock(PreparedStatement.class);
// batching
@@ -162,8 +160,7 @@
return classUnderTest;
}
- private static JdbcSchema setupSchema(final SqlDialect dialect,
- final Connection conn) {
+ private static JdbcSchema setupSchema(final SqlDialect dialect, final Connection conn) {
@SuppressWarnings("rawtypes")
Database db = mock(Database.class);
try {
@@ -186,8 +183,8 @@
assertExpectedIdsUsed(ps, ids);
}
- protected static void assertUsedNonBatchingOnly(PreparedStatement ps,
- int... ids) throws SQLException {
+ protected static void assertUsedNonBatchingOnly(PreparedStatement ps, int... ids)
+ throws SQLException {
verify(ps, never()).addBatch();
verify(ps, never()).executeBatch();
verify(ps, times(ids.length)).executeUpdate();
@@ -198,14 +195,13 @@
verifyZeroInteractions(insert);
}
- protected abstract void assertCorrectUpdating(PreparedStatement ps,
- int... ids) throws SQLException;
+ protected abstract void assertCorrectUpdating(PreparedStatement ps, int... ids)
+ throws SQLException;
- protected abstract void assertCorrectAttempting(PreparedStatement ps,
- int... ids) throws SQLException;
+ protected abstract void assertCorrectAttempting(PreparedStatement ps, int... ids)
+ throws SQLException;
- private static void assertExpectedIdsUsed(PreparedStatement ps, int... ids)
- throws SQLException {
+ private static void assertExpectedIdsUsed(PreparedStatement ps, int... ids) throws SQLException {
for (int id : ids) {
verify(ps).setInt(1, id);
}
@@ -228,8 +224,7 @@
@Test
public void testInsertOneException() throws SQLException {
sqlException = new BatchUpdateException();
- PreparedStatement insert =
- stubStatementThrowExceptionOnExecute(INSERT, sqlException);
+ PreparedStatement insert = stubStatementThrowExceptionOnExecute(INSERT, sqlException);
try {
classUnderTest.insert(oneRow);
fail("missingException");
@@ -258,8 +253,7 @@
@Test
public void testUpdateOneException() throws SQLException {
sqlException = new BatchUpdateException();
- PreparedStatement update =
- stubStatementThrowExceptionOnExecute(UPDATE, sqlException);
+ PreparedStatement update = stubStatementThrowExceptionOnExecute(UPDATE, sqlException);
try {
classUnderTest.update(oneRow);
fail("missingException");
@@ -272,8 +266,7 @@
}
@Test
- public void testUpdateTwoConcurrentlyModifiedException() throws SQLException,
- OrmException {
+ public void testUpdateTwoConcurrentlyModifiedException() throws SQLException, OrmException {
PreparedStatement update = stubStatementWithUpdateCounts(UPDATE, 0, 0);
try {
classUnderTest.update(twoRows);
@@ -303,8 +296,7 @@
@Test
public void upsertOneException() throws SQLException {
SQLException exception = new BatchUpdateException();
- PreparedStatement update =
- stubStatementThrowExceptionOnExecute(UPDATE, exception);
+ PreparedStatement update = stubStatementThrowExceptionOnExecute(UPDATE, exception);
try {
classUnderTest.upsert(oneRow);
fail("missingException");
@@ -328,8 +320,7 @@
}
@Test
- public void testUpsertTwoNotExistingZeroLengthArray() throws SQLException,
- OrmException {
+ public void testUpsertTwoNotExistingZeroLengthArray() throws SQLException, OrmException {
PreparedStatement update = stubStatementWithUpdateCounts(UPDATE);
PreparedStatement insert = stubStatementWithUpdateCounts(INSERT, 1, 1);
@@ -373,8 +364,7 @@
}
@Test
- public void testUpsertTwoUpdateCountsAreNull() throws SQLException,
- OrmException {
+ public void testUpsertTwoUpdateCountsAreNull() throws SQLException, OrmException {
PreparedStatement update = stubStatementWithUpdateCounts(UPDATE, null);
PreparedStatement insert = stubStatementWithUpdateCounts(INSERT, 1, 1);
@@ -427,7 +417,6 @@
public Access<?, ?>[] allRelations() {
throw new UnsupportedOperationException();
}
-
}
static class Data {
@@ -449,9 +438,7 @@
public void fromString(String in) {
throw new UnsupportedOperationException();
}
-
}
-
}
private static class DataJdbcAccess extends JdbcAccess<Data, Data.DataKey> {
@@ -496,26 +483,22 @@
}
@Override
- protected void bindOneInsert(PreparedStatement ps, Data entity)
- throws SQLException {
+ protected void bindOneInsert(PreparedStatement ps, Data entity) throws SQLException {
ps.setInt(1, entity.id);
}
@Override
- protected void bindOneUpdate(PreparedStatement ps, Data entity)
- throws SQLException {
+ protected void bindOneUpdate(PreparedStatement ps, Data entity) throws SQLException {
ps.setInt(1, entity.id);
}
@Override
- protected void bindOneDelete(PreparedStatement ps, Data entity)
- throws SQLException {
+ protected void bindOneDelete(PreparedStatement ps, Data entity) throws SQLException {
ps.setInt(1, entity.id);
}
@Override
- protected void bindOneFetch(java.sql.ResultSet rs, Data entity)
- throws SQLException {
+ protected void bindOneFetch(java.sql.ResultSet rs, Data entity) throws SQLException {
throw new UnsupportedOperationException();
}
@@ -528,7 +511,5 @@
public ResultSet<Data> iterateAllEntities() throws OrmException {
throw new UnsupportedOperationException();
}
-
}
-
}
diff --git a/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessBatching.java b/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessBatching.java
index 0d687d6..7e3ca88 100644
--- a/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessBatching.java
+++ b/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessBatching.java
@@ -18,30 +18,25 @@
import static org.mockito.Mockito.mock;
import com.google.gwtorm.schema.sql.SqlDialect;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
import java.sql.PreparedStatement;
import java.sql.SQLException;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class TestJdbcAccessBatching extends AbstractTestJdbcAccess {
- public TestJdbcAccessBatching(IterableProvider<Data> dataProvider)
- throws SQLException {
+ public TestJdbcAccessBatching(IterableProvider<Data> dataProvider) throws SQLException {
super(dataProvider);
}
@Override
- protected void assertCorrectUpdating(PreparedStatement ps,
- int ... ids) throws SQLException {
+ protected void assertCorrectUpdating(PreparedStatement ps, int... ids) throws SQLException {
assertUsedBatchingOnly(ps, ids);
}
@Override
- protected void assertCorrectAttempting(PreparedStatement ps,
- int ... ids) throws SQLException {
+ protected void assertCorrectAttempting(PreparedStatement ps, int... ids) throws SQLException {
assertUsedBatchingOnly(ps, ids);
}
@@ -49,5 +44,4 @@
protected SqlDialect createDialect() {
return mock(SqlDialect.class, CALLS_REAL_METHODS);
}
-
}
diff --git a/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessNonBatching.java b/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessNonBatching.java
index 7ab5b80..50297ac 100644
--- a/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessNonBatching.java
+++ b/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessNonBatching.java
@@ -20,30 +20,25 @@
import static org.mockito.Mockito.when;
import com.google.gwtorm.schema.sql.SqlDialect;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
import java.sql.PreparedStatement;
import java.sql.SQLException;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class TestJdbcAccessNonBatching extends AbstractTestJdbcAccess {
- public TestJdbcAccessNonBatching(IterableProvider<Data> dataProvider)
- throws SQLException {
+ public TestJdbcAccessNonBatching(IterableProvider<Data> dataProvider) throws SQLException {
super(dataProvider);
}
@Override
- protected void assertCorrectUpdating(PreparedStatement ps, int... ids)
- throws SQLException {
+ protected void assertCorrectUpdating(PreparedStatement ps, int... ids) throws SQLException {
assertUsedNonBatchingOnly(ps, ids);
}
@Override
- protected void assertCorrectAttempting(PreparedStatement ps, int... ids)
- throws SQLException {
+ protected void assertCorrectAttempting(PreparedStatement ps, int... ids) throws SQLException {
assertUsedNonBatchingOnly(ps, ids);
}
@@ -51,10 +46,8 @@
protected SqlDialect createDialect() {
final SqlDialect dialect = mock(SqlDialect.class);
when(dialect.canDetermineIndividualBatchUpdateCounts()).thenReturn(FALSE);
- when(
- dialect.convertError(any(String.class), any(String.class),
- any(SQLException.class))).thenCallRealMethod();
+ when(dialect.convertError(any(String.class), any(String.class), any(SQLException.class)))
+ .thenCallRealMethod();
return dialect;
}
-
}
diff --git a/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessTotalUpdateCount.java b/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessTotalUpdateCount.java
index 9e329aa..9df4d8a 100644
--- a/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessTotalUpdateCount.java
+++ b/src/test/java/com/google/gwtorm/jdbc/TestJdbcAccessTotalUpdateCount.java
@@ -22,32 +22,27 @@
import static org.mockito.Mockito.when;
import com.google.gwtorm.schema.sql.SqlDialect;
-
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-
@RunWith(Parameterized.class)
public class TestJdbcAccessTotalUpdateCount extends AbstractTestJdbcAccess {
- public TestJdbcAccessTotalUpdateCount(IterableProvider<Data> dataProvider)
- throws SQLException {
+ public TestJdbcAccessTotalUpdateCount(IterableProvider<Data> dataProvider) throws SQLException {
super(dataProvider);
}
@Override
- protected void assertCorrectUpdating(PreparedStatement ps, int... ids)
- throws SQLException {
+ protected void assertCorrectUpdating(PreparedStatement ps, int... ids) throws SQLException {
verify(dialect).executeBatch(ps);
}
@Override
- protected void assertCorrectAttempting(PreparedStatement ps, int... ids)
- throws SQLException {
+ protected void assertCorrectAttempting(PreparedStatement ps, int... ids) throws SQLException {
assertUsedNonBatchingOnly(ps, ids);
}
@@ -56,25 +51,24 @@
SqlDialect dialect = mock(SqlDialect.class);
when(dialect.canDetermineIndividualBatchUpdateCounts()).thenReturn(FALSE);
when(dialect.canDetermineTotalBatchUpdateCount()).thenReturn(TRUE);
- when(dialect.executeBatch(any(PreparedStatement.class))).thenAnswer(
- new Answer<Integer>() {
+ when(dialect.executeBatch(any(PreparedStatement.class)))
+ .thenAnswer(
+ new Answer<Integer>() {
- @Override
- public Integer answer(InvocationOnMock invocation) throws Throwable {
- if (sqlException != null) {
- throw sqlException;
- }
- if (totalUpdateCount == null) {
- throw new IllegalStateException("totalCount is not set");
- }
- return totalUpdateCount;
- }
- });
- when(
- dialect.convertError(any(String.class), any(String.class),
- any(SQLException.class))).thenCallRealMethod();
+ @Override
+ public Integer answer(InvocationOnMock invocation) throws Throwable {
+ if (sqlException != null) {
+ throw sqlException;
+ }
+ if (totalUpdateCount == null) {
+ throw new IllegalStateException("totalCount is not set");
+ }
+ return totalUpdateCount;
+ }
+ });
+ when(dialect.convertError(any(String.class), any(String.class), any(SQLException.class)))
+ .thenCallRealMethod();
return dialect;
}
-
}
diff --git a/src/test/java/com/google/gwtorm/nosql/IndexFunctionTest.java b/src/test/java/com/google/gwtorm/nosql/IndexFunctionTest.java
index 4db5e85..28d8fbb 100644
--- a/src/test/java/com/google/gwtorm/nosql/IndexFunctionTest.java
+++ b/src/test/java/com/google/gwtorm/nosql/IndexFunctionTest.java
@@ -25,7 +25,6 @@
import com.google.gwtorm.schema.java.JavaSchemaModel;
import com.google.gwtorm.server.GeneratedClassLoader;
import com.google.gwtorm.server.OrmException;
-
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -76,8 +75,7 @@
@Test
public void testPersonByNameAge_OrderByName() throws Exception {
- IndexFunction<Person> idx =
- index("nameAge", "WHERE name=? AND age=? ORDER BY name");
+ IndexFunction<Person> idx = index("nameAge", "WHERE name=? AND age=? ORDER BY name");
Assert.assertEquals("nameAge", idx.getName());
IndexKeyBuilder b;
@@ -92,8 +90,7 @@
@Test
public void testPersonByNameAge_OrderByRegistered() throws Exception {
- IndexFunction<Person> idx =
- index("nameAge", "WHERE name=? AND age=? ORDER BY registered");
+ IndexFunction<Person> idx = index("nameAge", "WHERE name=? AND age=? ORDER BY registered");
Assert.assertEquals("nameAge", idx.getName());
IndexKeyBuilder b;
@@ -104,16 +101,24 @@
p.register();
assertTrue(idx.includes(p));
idx.encode(b, p);
- assertEqualToBuilderResult(new byte[] {'q', 0x00, 0x01, // name
- 0x01, 42, 0x00, 0x01, // age
- 0x01, 0x01 // registered
- }, b);
+ assertEqualToBuilderResult(
+ new byte[] {
+ 'q',
+ 0x00,
+ 0x01, // name
+ 0x01,
+ 42,
+ 0x00,
+ 0x01, // age
+ 0x01,
+ 0x01 // registered
+ },
+ b);
}
@Test
public void testPersonByNameRange_OrderByName() throws Exception {
- IndexFunction<Person> idx =
- index("nameSuggest", "WHERE name >= ? AND name <= ? ORDER BY name");
+ IndexFunction<Person> idx = index("nameSuggest", "WHERE name >= ? AND name <= ? ORDER BY name");
assertEquals("nameSuggest", idx.getName());
IndexKeyBuilder b;
@@ -128,8 +133,7 @@
@Test
public void testOnlyRegistered() throws Exception {
- IndexFunction<Person> idx =
- index("isregistered", "WHERE registered = true ORDER BY name");
+ IndexFunction<Person> idx = index("isregistered", "WHERE registered = true ORDER BY name");
assertEquals("isregistered", idx.getName());
IndexKeyBuilder b;
@@ -147,8 +151,7 @@
@Test
public void testOnlyAge42() throws Exception {
- IndexFunction<Person> idx =
- index("isOldEnough", "WHERE age = 42 ORDER BY name");
+ IndexFunction<Person> idx = index("isOldEnough", "WHERE age = 42 ORDER BY name");
assertEquals("isOldEnough", idx.getName());
IndexKeyBuilder b;
@@ -185,11 +188,11 @@
}
@SuppressWarnings("rawtypes")
- private IndexFunction<Person> index(String name, String query)
- throws OrmException {
+ private IndexFunction<Person> index(String name, String query) throws OrmException {
final QueryModel qm = new QueryModel(people, name, query);
- return new IndexFunctionGen(new GeneratedClassLoader(Person.class
- .getClassLoader()), qm, Person.class).create();
+ return new IndexFunctionGen(
+ new GeneratedClassLoader(Person.class.getClassLoader()), qm, Person.class)
+ .create();
}
private static void assertEqualToBuilderResult(byte[] exp, IndexKeyBuilder ic) {
@@ -205,7 +208,8 @@
return dst.toString();
}
- private static final char[] hexchar =
- {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', //
- 'a', 'b', 'c', 'd', 'e', 'f'};
+ private static final char[] hexchar = {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', //
+ 'a', 'b', 'c', 'd', 'e', 'f'
+ };
}
diff --git a/src/test/java/com/google/gwtorm/nosql/IndexKeyBuilderTest.java b/src/test/java/com/google/gwtorm/nosql/IndexKeyBuilderTest.java
index e08059f..804802a 100644
--- a/src/test/java/com/google/gwtorm/nosql/IndexKeyBuilderTest.java
+++ b/src/test/java/com/google/gwtorm/nosql/IndexKeyBuilderTest.java
@@ -18,7 +18,7 @@
import org.junit.Test;
-public class IndexKeyBuilderTest {
+public class IndexKeyBuilderTest {
@Test
public void testInt() {
@@ -85,7 +85,8 @@
return dst.toString();
}
- private static final char[] hexchar =
- {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', //
- 'a', 'b', 'c', 'd', 'e', 'f'};
+ private static final char[] hexchar = {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', //
+ 'a', 'b', 'c', 'd', 'e', 'f'
+ };
}
diff --git a/src/test/java/com/google/gwtorm/nosql/NoSqlPhoneBookTest.java b/src/test/java/com/google/gwtorm/nosql/NoSqlPhoneBookTest.java
index a89627c..cfd7293 100644
--- a/src/test/java/com/google/gwtorm/nosql/NoSqlPhoneBookTest.java
+++ b/src/test/java/com/google/gwtorm/nosql/NoSqlPhoneBookTest.java
@@ -28,16 +28,14 @@
import com.google.gwtorm.server.Access;
import com.google.gwtorm.server.OrmConcurrencyException;
import com.google.gwtorm.server.OrmException;
-
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-public class NoSqlPhoneBookTest {
+public class NoSqlPhoneBookTest {
protected MemoryDatabase<PhoneBookDb> db;
private List<PhoneBookDb> openSchemas;
@@ -166,8 +164,7 @@
final Person p1 = new Person(new Person.Key("Bob"), 18);
sp.insert(Collections.singleton(p1));
- final List<Person> list =
- sp.get(Collections.singleton(sp.primaryKey(p1))).toList();
+ final List<Person> list = sp.get(Collections.singleton(sp.primaryKey(p1))).toList();
assertNotNull(list);
assertEquals(1, list.size());
@@ -237,8 +234,7 @@
final Person bob1 = new Person(new Person.Key("Bob"), 18);
schema.people().insert(Collections.singleton(bob1));
- final Person bob2 =
- schema.people().get(new Person.Key(bob1.name()));
+ final Person bob2 = schema.people().get(new Person.Key(bob1.name()));
assertNotNull(bob2);
assertNotSame(bob1, bob2);
assertEquals(bob1.name(), bob2.name());
@@ -267,19 +263,16 @@
final Person bob = new Person(new Person.Key("Bob"), 18);
schema.people().insert(Collections.singleton(bob));
- assertEquals(bob.isRegistered(), schema.people().all().toList().get(0)
- .isRegistered());
+ assertEquals(bob.isRegistered(), schema.people().all().toList().get(0).isRegistered());
bob.register();
schema.people().update(Collections.singleton(bob));
- assertEquals(bob.isRegistered(), schema.people().all().toList().get(0)
- .isRegistered());
+ assertEquals(bob.isRegistered(), schema.people().all().toList().get(0).isRegistered());
bob.unregister();
schema.people().update(Collections.singleton(bob));
- assertEquals(bob.isRegistered(), schema.people().all().toList().get(0)
- .isRegistered());
+ assertEquals(bob.isRegistered(), schema.people().all().toList().get(0).isRegistered());
}
}
diff --git a/src/test/java/com/google/gwtorm/protobuf/ProtobufEncoderTest.java b/src/test/java/com/google/gwtorm/protobuf/ProtobufEncoderTest.java
index 78f1938..15e1aea 100644
--- a/src/test/java/com/google/gwtorm/protobuf/ProtobufEncoderTest.java
+++ b/src/test/java/com/google/gwtorm/protobuf/ProtobufEncoderTest.java
@@ -26,9 +26,6 @@
import com.google.gwtorm.data.Person;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
-
-import org.junit.Test;
-
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -38,19 +35,32 @@
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
+import org.junit.Test;
public class ProtobufEncoderTest {
- private static final byte[] testingBin = new byte[] {
- //
- // name
- 0x0a, 0x09,
- // name.name
- 0x0a, 0x07, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, //
- // age
- 0x10, (byte) 75, //
- // registered (true)
- 0x18, 0x01 //
- //
+ private static final byte[] testingBin =
+ new byte[] {
+ //
+ // name
+ 0x0a,
+ 0x09,
+ // name.name
+ 0x0a,
+ 0x07,
+ 0x74,
+ 0x65,
+ 0x73,
+ 0x74,
+ 0x69,
+ 0x6e,
+ 0x67, //
+ // age
+ 0x10,
+ (byte) 75, //
+ // registered (true)
+ 0x18,
+ 0x01 //
+ //
};
@SuppressWarnings("cast")
@@ -72,8 +82,7 @@
@Test
public void testAddress() {
- final ProtobufCodec<Address> e =
- CodecFactory.encoder(Address.class);
+ final ProtobufCodec<Address> e = CodecFactory.encoder(Address.class);
Address a = e.decode(new byte[0]);
assertNotNull(a);
assertNull(a.location());
@@ -122,8 +131,7 @@
}
@Test
- public void testEncodeNonArrayByteBuffer()
- throws UnsupportedEncodingException {
+ public void testEncodeNonArrayByteBuffer() throws UnsupportedEncodingException {
ProtobufCodec<Person> e = CodecFactory.encoder(Person.class);
Person p = new Person(new Person.Key("testing"), 75);
@@ -159,11 +167,24 @@
StringList other = e.decode(act);
assertNotNull(other.list);
assertEquals(list.list, other.list);
- assertEquals(asString(new byte[] { //
- //
- 0x12, 0x03, 'm', 'o', 'e', //
- 0x12, 0x05, 'l', 'a', 'r', 'r', 'y' //
- }), asString(act));
+ assertEquals(
+ asString(
+ new byte[] { //
+ //
+ 0x12,
+ 0x03,
+ 'm',
+ 'o',
+ 'e', //
+ 0x12,
+ 0x05,
+ 'l',
+ 'a',
+ 'r',
+ 'r',
+ 'y' //
+ }),
+ asString(act));
}
@Test
@@ -179,11 +200,24 @@
StringSet other = e.decode(act);
assertNotNull(other.list);
assertEquals(list.list, other.list);
- assertEquals(asString(new byte[] { //
- //
- 0x0a, 0x05, 'l', 'a', 'r', 'r', 'y', //
- 0x0a, 0x03, 'm', 'o', 'e' //
- }), asString(act));
+ assertEquals(
+ asString(
+ new byte[] { //
+ //
+ 0x0a,
+ 0x05,
+ 'l',
+ 'a',
+ 'r',
+ 'r',
+ 'y', //
+ 0x0a,
+ 0x03,
+ 'm',
+ 'o',
+ 'e' //
+ }),
+ asString(act));
}
@Test
@@ -235,7 +269,7 @@
}
@Test
- public void testEncodeToStream()throws IOException {
+ public void testEncodeToStream() throws IOException {
ProtobufCodec<ThingWithEnum> e = CodecFactory.encoder(ThingWithEnum.class);
ThingWithEnum thing = new ThingWithEnum();
@@ -255,8 +289,7 @@
assertSame(thing.type, other.type);
}
- private static String asString(byte[] bin)
- throws UnsupportedEncodingException {
+ private static String asString(byte[] bin) throws UnsupportedEncodingException {
return new String(bin, "ISO-8859-1");
}
@@ -275,8 +308,7 @@
SortedSet<String> list;
}
- static class Item {
- }
+ static class Item {}
static class ItemCodec extends ProtobufCodec<Item> {
@Override
@@ -308,7 +340,8 @@
static class ThingWithEnum {
static enum Type {
- A, B;
+ A,
+ B;
}
@Column(id = 1)
diff --git a/src/test/java/com/google/gwtorm/schema/QueryModelTest.java b/src/test/java/com/google/gwtorm/schema/QueryModelTest.java
index 13e914c..72c9441 100644
--- a/src/test/java/com/google/gwtorm/schema/QueryModelTest.java
+++ b/src/test/java/com/google/gwtorm/schema/QueryModelTest.java
@@ -22,12 +22,10 @@
import com.google.gwtorm.schema.java.JavaSchemaModel;
import com.google.gwtorm.schema.sql.DialectH2;
import com.google.gwtorm.server.OrmException;
-
+import java.util.List;
import org.junit.Before;
import org.junit.Test;
-import java.util.List;
-
public class QueryModelTest {
private RelationModel people;
diff --git a/src/test/java/com/google/gwtorm/schema/QueryParserTest.java b/src/test/java/com/google/gwtorm/schema/QueryParserTest.java
index ad90e0a..471de76 100644
--- a/src/test/java/com/google/gwtorm/schema/QueryParserTest.java
+++ b/src/test/java/com/google/gwtorm/schema/QueryParserTest.java
@@ -20,13 +20,11 @@
import static org.junit.Assert.assertTrue;
import com.google.gwtorm.server.OrmException;
-
-import org.antlr.runtime.tree.Tree;
-import org.junit.Test;
-
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
+import org.antlr.runtime.tree.Tree;
+import org.junit.Test;
public class QueryParserTest {
private final class DummyColumn extends ColumnModel {
@@ -65,30 +63,31 @@
}
protected Tree parse(final String str) throws QueryParseException {
- final RelationModel dummy = new RelationModel() {
- {
- final Collection<ColumnModel> c = new ArrayList<>();
- try {
- c.add(new DummyColumn(1, "name"));
- c.add(new DummyColumn(2, "a"));
- c.add(new DummyColumn(3, "b"));
- c.add(new DummyColumn(4, "c"));
- initColumns(c);
- } catch (OrmException e) {
- throw new RuntimeException("init columns failure", e);
- }
- }
+ final RelationModel dummy =
+ new RelationModel() {
+ {
+ final Collection<ColumnModel> c = new ArrayList<>();
+ try {
+ c.add(new DummyColumn(1, "name"));
+ c.add(new DummyColumn(2, "a"));
+ c.add(new DummyColumn(3, "b"));
+ c.add(new DummyColumn(4, "c"));
+ initColumns(c);
+ } catch (OrmException e) {
+ throw new RuntimeException("init columns failure", e);
+ }
+ }
- @Override
- public String getAccessInterfaceName() {
- return getClass().getName();
- }
+ @Override
+ public String getAccessInterfaceName() {
+ return getClass().getName();
+ }
- @Override
- public String getEntityTypeClassName() {
- return getClass().getName();
- }
- };
+ @Override
+ public String getEntityTypeClassName() {
+ return getClass().getName();
+ }
+ };
return QueryParser.parse(dummy, str);
}
diff --git a/src/test/java/com/google/gwtorm/schema/java/DeclaredFieldsOrderTest.java b/src/test/java/com/google/gwtorm/schema/java/DeclaredFieldsOrderTest.java
index c38399f..c32870b 100644
--- a/src/test/java/com/google/gwtorm/schema/java/DeclaredFieldsOrderTest.java
+++ b/src/test/java/com/google/gwtorm/schema/java/DeclaredFieldsOrderTest.java
@@ -14,16 +14,14 @@
package com.google.gwtorm.schema.java;
-import static com.google.gwtorm.schema.java.JavaColumnModel.sort;
import static com.google.common.collect.Collections2.permutations;
+import static com.google.gwtorm.schema.java.JavaColumnModel.sort;
import static org.junit.Assert.assertEquals;
import com.google.gwtorm.client.Column;
-
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
-
import org.junit.Test;
public class DeclaredFieldsOrderTest {
@@ -31,15 +29,19 @@
private static class C {
@Column(id = 1)
private String c;
+
@Column(id = 2)
private String b;
+
@Column(id = 3)
private String a;
@SuppressWarnings("unused")
private String d;
+
@SuppressWarnings("unused")
private String e;
+
@SuppressWarnings("unused")
private String f;
}
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectDB2Test.java b/src/test/java/com/google/gwtorm/schema/sql/DialectDB2Test.java
index 82e2330..13566bf 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectDB2Test.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectDB2Test.java
@@ -28,19 +28,18 @@
import com.google.gwtorm.jdbc.JdbcSchema;
import com.google.gwtorm.jdbc.SimpleDataSource;
import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Properties;
import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
public class DialectDB2Test extends SqlDialectTest {
- private final static String DB2_DRIVER = "com.ibm.db2.jcc.DB2Driver";
+ private static final String DB2_DRIVER = "com.ibm.db2.jcc.DB2Driver";
+
@Before
public void setUp() throws Exception {
try {
@@ -53,8 +52,7 @@
final String user = "gwtorm"; // user
final String pass = "gwtorm"; // pwd
- db = DriverManager.getConnection("jdbc:db2://127.0.0.1:50001/"
- + database, user, pass);
+ db = DriverManager.getConnection("jdbc:db2://127.0.0.1:50001/" + database, user, pass);
executor = new JdbcExecutor(db);
dialect = new DialectDB2().refine(db);
@@ -63,10 +61,8 @@
p.setProperty("url", db.getMetaData().getURL());
p.setProperty("user", user);
p.setProperty("password", pass);
- phoneBook =
- new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
- phoneBook2 =
- new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+ phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+ phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
}
@After
@@ -196,8 +192,7 @@
final Person bob = new Person(pk, nextAddressId);
p.people().insert(Collections.singleton(bob));
- final Address addr =
- new Address(new Address.Key(pk, "home"), "some place");
+ final Address addr = new Address(new Address.Key(pk, "home"), "some place");
p.addresses().insert(Collections.singleton(addr));
} finally {
p.close();
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectDerbyTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectDerbyTest.java
index bbf5c94..9275014 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectDerbyTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectDerbyTest.java
@@ -28,11 +28,6 @@
import com.google.gwtorm.jdbc.JdbcSchema;
import com.google.gwtorm.jdbc.SimpleDataSource;
import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -42,6 +37,9 @@
import java.util.List;
import java.util.Properties;
import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
public class DialectDerbyTest extends SqlDialectTest {
@@ -57,10 +55,8 @@
p.setProperty("driver", org.apache.derby.jdbc.EmbeddedDriver.class.getName());
p.setProperty("url", db.getMetaData().getURL());
- phoneBook =
- new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
- phoneBook2 =
- new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+ phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+ phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
}
@After
@@ -175,8 +171,7 @@
final Person bob = new Person(pk, p.nextAddressId());
p.people().insert(Collections.singleton(bob));
- final Address addr =
- new Address(new Address.Key(pk, "home"), "some place");
+ final Address addr = new Address(new Address.Key(pk, "home"), "some place");
p.addresses().insert(Collections.singleton(addr));
} finally {
p.close();
@@ -193,11 +188,11 @@
* for more information about the restriction of the RENAME COLUMN command.
*/
String sqlCatalog =
- "select c.constraintname, ch.checkdefinition"
- + " from sys.sysconstraints c, sys.systables t, sys.syschecks ch"
- + " WHERE c.tableid = t.tableid"
- + " and t.tablename = ?"
- + " and c.constraintid = ch.constraintid";
+ "select c.constraintname, ch.checkdefinition"
+ + " from sys.sysconstraints c, sys.systables t, sys.syschecks ch"
+ + " WHERE c.tableid = t.tableid"
+ + " and t.tablename = ?"
+ + " and c.constraintid = ch.constraintid";
PreparedStatement ps = db.prepareStatement(sqlCatalog);
String tableName = "PEOPLE";
ps.setString(1, tableName);
@@ -210,20 +205,19 @@
constraintNames.add(rs.getString(1));
checkDefs.add(rs.getString(2).replace("registered", "is_registered"));
break;
- }
+ }
}
rs.close();
ps.close();
if (constraintNames.isEmpty()) {
fail("Constraint not found");
}
- for (String c: constraintNames) {
+ for (String c : constraintNames) {
execute("alter table " + tableName + " drop check " + c);
}
- ((JdbcSchema) p2).renameField(executor, "people", "registered",
- "isRegistered");
- for (String cd: checkDefs) {
- execute("alter table " + tableName + " add check "+ cd);
+ ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
+ for (String cd : checkDefs) {
+ execute("alter table " + tableName + " add check " + cd);
}
} catch (OrmException e) {
fail(e.getMessage());
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java b/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java
index a94f641..6d927f2 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java
@@ -27,16 +27,14 @@
import com.google.gwtorm.jdbc.JdbcSchema;
import com.google.gwtorm.jdbc.SimpleDataSource;
import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Properties;
import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
public class DialectH2Test extends SqlDialectTest {
@Before
@@ -49,10 +47,8 @@
final Properties p = new Properties();
p.setProperty("driver", org.h2.Driver.class.getName());
p.setProperty("url", db.getMetaData().getURL());
- phoneBook =
- new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
- phoneBook2 =
- new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+ phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+ phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
}
@After
@@ -171,8 +167,7 @@
final Person bob = new Person(pk, p.nextAddressId());
p.people().insert(Collections.singleton(bob));
- final Address addr =
- new Address(new Address.Key(pk, "home"), "some place");
+ final Address addr = new Address(new Address.Key(pk, "home"), "some place");
p.addresses().insert(Collections.singleton(addr));
} finally {
p.close();
@@ -180,8 +175,7 @@
final PhoneBookDb2 p2 = phoneBook2.open();
try {
- ((JdbcSchema) p2).renameField(executor, "people", "registered",
- "isRegistered");
+ ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
} finally {
p2.close();
}
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectHANATest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectHANATest.java
index 83f34f4..0f3836b 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectHANATest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectHANATest.java
@@ -32,16 +32,14 @@
import com.google.gwtorm.jdbc.SimpleDataSource;
import com.google.gwtorm.server.OrmDuplicateKeyException;
import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Properties;
import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
public class DialectHANATest extends SqlDialectTest {
private static final String HANA_URL_KEY = "hana.url";
@@ -204,8 +202,7 @@
PhoneBookDb2 p2 = phoneBook2.open();
try {
- ((JdbcSchema) p2).renameField(executor, "people", "registered",
- "isRegistered");
+ ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
} finally {
p2.close();
}
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectMariaDBTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectMariaDBTest.java
index c73b1f5..b00ee5d 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectMariaDBTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectMariaDBTest.java
@@ -21,11 +21,9 @@
import com.google.gwtorm.jdbc.Database;
import com.google.gwtorm.jdbc.JdbcExecutor;
import com.google.gwtorm.jdbc.SimpleDataSource;
-
-import org.junit.Before;
-
import java.sql.DriverManager;
import java.util.Properties;
+import org.junit.Before;
public class DialectMariaDBTest extends DialectMySQLTest {
@Before
@@ -51,9 +49,7 @@
p.setProperty("url", db.getMetaData().getURL());
p.setProperty("user", user);
p.setProperty("password", pass);
- phoneBook =
- new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
- phoneBook2 =
- new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+ phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+ phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
}
}
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java
index 97937b2..5149707 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java
@@ -32,16 +32,14 @@
import com.google.gwtorm.jdbc.SimpleDataSource;
import com.google.gwtorm.server.OrmDuplicateKeyException;
import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Properties;
import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
public class DialectMaxDBTest extends SqlDialectTest {
private static final String MAXDB_URL_KEY = "maxdb.url";
@@ -70,10 +68,8 @@
p.setProperty("url", db.getMetaData().getURL());
p.setProperty("user", user);
p.setProperty("password", pass);
- phoneBook =
- new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
- phoneBook2 =
- new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+ phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+ phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
}
private void drop(String drop) {
@@ -198,8 +194,7 @@
final Person bob = new Person(pk, p.nextAddressId());
p.people().insert(asList(bob));
- final Address addr =
- new Address(new Address.Key(pk, "home"), "some place");
+ final Address addr = new Address(new Address.Key(pk, "home"), "some place");
p.addresses().insert(asList(addr));
} finally {
p.close();
@@ -207,8 +202,7 @@
final PhoneBookDb2 p2 = phoneBook2.open();
try {
- ((JdbcSchema) p2).renameField(executor, "people", "registered",
- "isRegistered");
+ ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
} finally {
p2.close();
}
@@ -271,8 +265,8 @@
Person joe = new Person(joePk, p.nextAddressId());
joe.setAge(40);
try {
- p.people().insert(asList(joe));
- fail();
+ p.people().insert(asList(joe));
+ fail();
} catch (OrmDuplicateKeyException duprec) {
fail();
} catch (OrmException noDuprec) {
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java
index 032bb33..8789122 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java
@@ -12,7 +12,6 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-
package com.google.gwtorm.schema.sql;
import static org.junit.Assert.assertEquals;
@@ -29,16 +28,14 @@
import com.google.gwtorm.jdbc.JdbcSchema;
import com.google.gwtorm.jdbc.SimpleDataSource;
import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Properties;
import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
public class DialectMySQLTest extends SqlDialectTest {
@Before
@@ -64,10 +61,8 @@
p.setProperty("url", db.getMetaData().getURL());
p.setProperty("user", user);
p.setProperty("password", pass);
- phoneBook =
- new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
- phoneBook2 =
- new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+ phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+ phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
}
@After
@@ -190,8 +185,7 @@
final Person bob = new Person(pk, p.nextAddressId());
p.people().insert(Collections.singleton(bob));
- final Address addr =
- new Address(new Address.Key(pk, "home"), "some place");
+ final Address addr = new Address(new Address.Key(pk, "home"), "some place");
p.addresses().insert(Collections.singleton(addr));
} finally {
p.close();
@@ -199,8 +193,7 @@
final PhoneBookDb2 p2 = phoneBook2.open();
try {
- ((JdbcSchema) p2).renameField(executor, "people", "registered",
- "isRegistered");
+ ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
} finally {
p2.close();
}
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java
index 8bb00ce..53369d8 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java
@@ -28,19 +28,17 @@
import com.google.gwtorm.jdbc.JdbcSchema;
import com.google.gwtorm.jdbc.SimpleDataSource;
import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Properties;
import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
public class DialectOracleSQLTest extends SqlDialectTest {
- private final static String ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver";
+ private static final String ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver";
@Before
public void setUp() throws Exception {
@@ -54,8 +52,7 @@
final String user = "gwtorm"; // Oracle schema=user name=database
final String pass = "gwtorm";
- db = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:"
- + sid, user, pass);
+ db = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:" + sid, user, pass);
executor = new JdbcExecutor(db);
dialect = new DialectOracle().refine(db);
@@ -64,10 +61,8 @@
p.setProperty("url", db.getMetaData().getURL());
p.setProperty("user", user);
p.setProperty("password", pass);
- phoneBook =
- new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
- phoneBook2 =
- new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+ phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+ phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
}
@After
@@ -192,8 +187,7 @@
final Person bob = new Person(pk, p.nextAddressId());
p.people().insert(Collections.singleton(bob));
- final Address addr =
- new Address(new Address.Key(pk, "home"), "some place");
+ final Address addr = new Address(new Address.Key(pk, "home"), "some place");
p.addresses().insert(Collections.singleton(addr));
} finally {
p.close();
@@ -201,8 +195,7 @@
final PhoneBookDb2 p2 = phoneBook2.open();
try {
- ((JdbcSchema) p2).renameField(executor, "people", "registered",
- "isRegistered");
+ ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
} finally {
p2.close();
}
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java
index cbdc050..fb256c5 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java
@@ -12,7 +12,6 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-
package com.google.gwtorm.schema.sql;
import static org.junit.Assert.assertEquals;
@@ -29,16 +28,14 @@
import com.google.gwtorm.jdbc.JdbcSchema;
import com.google.gwtorm.jdbc.SimpleDataSource;
import com.google.gwtorm.server.OrmException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Properties;
import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
public class DialectPostgreSQLTest extends SqlDialectTest {
@Before
@@ -62,10 +59,8 @@
p.setProperty("url", db.getMetaData().getURL());
p.setProperty("user", user);
p.setProperty("password", pass);
- phoneBook =
- new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
- phoneBook2 =
- new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
+ phoneBook = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+ phoneBook2 = new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
}
@After
@@ -189,8 +184,7 @@
final Person bob = new Person(pk, p.nextAddressId());
p.people().insert(Collections.singleton(bob));
- final Address addr =
- new Address(new Address.Key(pk, "home"), "some place");
+ final Address addr = new Address(new Address.Key(pk, "home"), "some place");
p.addresses().insert(Collections.singleton(addr));
} finally {
p.close();
@@ -198,8 +192,7 @@
final PhoneBookDb2 p2 = phoneBook2.open();
try {
- ((JdbcSchema) p2).renameField(executor, "people", "registered",
- "isRegistered");
+ ((JdbcSchema) p2).renameField(executor, "people", "registered", "isRegistered");
} finally {
p2.close();
}
diff --git a/src/test/java/com/google/gwtorm/schema/sql/SqlDialectTest.java b/src/test/java/com/google/gwtorm/schema/sql/SqlDialectTest.java
index 422ba0a..6306a66 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/SqlDialectTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/SqlDialectTest.java
@@ -28,14 +28,12 @@
import com.google.gwtorm.server.OrmConcurrencyException;
import com.google.gwtorm.server.OrmDuplicateKeyException;
import com.google.gwtorm.server.OrmException;
-
-import org.junit.Test;
-
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import org.junit.Test;
public abstract class SqlDialectTest {
protected JdbcExecutor executor;
@@ -84,8 +82,7 @@
}
@Test
- public void testThrowsOrmDuplicateKeyExceptionWhenTryingToInsertDuplicates()
- throws Exception {
+ public void testThrowsOrmDuplicateKeyExceptionWhenTryingToInsertDuplicates() throws Exception {
PhoneBookDb p = phoneBook.open();
try {
p.updateSchema(executor);
@@ -126,8 +123,7 @@
}
@Test
- public void testInsertExistingRowThrowsOrmDuplicateKeyException()
- throws Exception {
+ public void testInsertExistingRowThrowsOrmDuplicateKeyException() throws Exception {
PhoneBookDb p = phoneBook.open();
try {
p.updateSchema(executor);
@@ -147,8 +143,7 @@
}
@Test
- public void testInsertExistingRowInTransactionThrowsOrmDuplicateKeyException()
- throws Exception {
+ public void testInsertExistingRowInTransactionThrowsOrmDuplicateKeyException() throws Exception {
PhoneBookDb p = phoneBook.open();
try {
p.updateSchema(executor);
@@ -175,8 +170,7 @@
}
@Test
- public void testUpdateNonexistentRowThrowsOrmConcurrencyException()
- throws Exception {
+ public void testUpdateNonexistentRowThrowsOrmConcurrencyException() throws Exception {
PhoneBookDb p = phoneBook.open();
try {
p.updateSchema(executor);
@@ -222,8 +216,7 @@
}
@Test
- public void testDeleteNonexistentRowThrowsOrmConcurrencyException()
- throws Exception {
+ public void testDeleteNonexistentRowThrowsOrmConcurrencyException() throws Exception {
PhoneBookDb p = phoneBook.open();
try {
p.updateSchema(executor);
diff --git a/src/test/java/com/google/gwtorm/server/PhoneBookDbTestCase.java b/src/test/java/com/google/gwtorm/server/PhoneBookDbTestCase.java
index 4f99f61..7d151e9 100644
--- a/src/test/java/com/google/gwtorm/server/PhoneBookDbTestCase.java
+++ b/src/test/java/com/google/gwtorm/server/PhoneBookDbTestCase.java
@@ -29,11 +29,6 @@
import com.google.gwtorm.jdbc.JdbcExecutor;
import com.google.gwtorm.jdbc.JdbcSchema;
import com.google.gwtorm.jdbc.SimpleDataSource;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
@@ -41,6 +36,9 @@
import java.util.Collections;
import java.util.List;
import java.util.Properties;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
public class PhoneBookDbTestCase {
private static int runCount;
@@ -206,8 +204,7 @@
final Person p1 = new Person(new Person.Key("Bob"), 18);
sp.insert(Collections.singleton(p1));
- final List<Person> list =
- sp.get(Collections.singleton(sp.primaryKey(p1))).toList();
+ final List<Person> list = sp.get(Collections.singleton(sp.primaryKey(p1))).toList();
assertNotNull(list);
assertEquals(1, list.size());
@@ -304,8 +301,7 @@
final Person bob1 = new Person(new Person.Key("Bob"), 18);
schema.people().insert(Collections.singleton(bob1));
- final Person bob2 =
- schema.people().get(new Person.Key(bob1.name()));
+ final Person bob2 = schema.people().get(new Person.Key(bob1.name()));
assertNotNull(bob2);
assertNotSame(bob1, bob2);
assertEquals(bob1.name(), bob2.name());
@@ -337,8 +333,7 @@
all.add(new Person(new Person.Key("Zak"), 33));
schema.people().insert(all);
- final List<Person> r =
- schema.people().olderThanDescByName(18).toList();
+ final List<Person> r = schema.people().olderThanDescByName(18).toList();
assertEquals(2, r.size());
assertEquals(all.get(2).name(), r.get(0).name());
assertEquals(all.get(1).name(), r.get(1).name());
@@ -358,8 +353,7 @@
assertEquals("N", rs.getString(1));
assertFalse(rs.next());
rs.close();
- assertEquals(bob.isRegistered(), schema.people().all().toList().get(0)
- .isRegistered());
+ assertEquals(bob.isRegistered(), schema.people().all().toList().get(0).isRegistered());
bob.register();
schema.people().update(Collections.singleton(bob));
@@ -368,8 +362,7 @@
assertEquals("Y", rs.getString(1));
assertFalse(rs.next());
rs.close();
- assertEquals(bob.isRegistered(), schema.people().all().toList().get(0)
- .isRegistered());
+ assertEquals(bob.isRegistered(), schema.people().all().toList().get(0).isRegistered());
bob.unregister();
schema.people().update(Collections.singleton(bob));
@@ -378,8 +371,7 @@
assertEquals("N", rs.getString(1));
assertFalse(rs.next());
rs.close();
- assertEquals(bob.isRegistered(), schema.people().all().toList().get(0)
- .isRegistered());
+ assertEquals(bob.isRegistered(), schema.people().all().toList().get(0).isRegistered());
st.close();
}
diff --git a/src/test/java/com/google/gwtorm/server/PrintCreateTablesTestCase.java b/src/test/java/com/google/gwtorm/server/PrintCreateTablesTestCase.java
index 66a13d2..2b79b1b 100644
--- a/src/test/java/com/google/gwtorm/server/PrintCreateTablesTestCase.java
+++ b/src/test/java/com/google/gwtorm/server/PrintCreateTablesTestCase.java
@@ -17,7 +17,6 @@
import com.google.gwtorm.data.PhoneBookDb;
import com.google.gwtorm.schema.java.JavaSchemaModel;
import com.google.gwtorm.schema.sql.DialectH2;
-
import org.junit.Test;
public class PrintCreateTablesTestCase {