rowIds, CallingContext cc)
throws ODKEntityNotFoundException, ODKDatastoreException {
- Validate.notNull(table);
+ Validate.notNull(table, "table is null");
Validate.noNullElements(rowIds);
- Validate.notNull(cc);
+ Validate.notNull(cc, "cc is null");
Query query = table.query("DbTable.query", cc);
query.include(PersistConsts.URI_COLUMN_NAME, rowIds);
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableAcl.java b/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableAcl.java
index 98ff75fb1..f21a647d5 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableAcl.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableAcl.java
@@ -16,9 +16,6 @@
package org.opendatakit.aggregate.odktables.relation;
-import java.util.ArrayList;
-import java.util.List;
-
import org.opendatakit.common.ermodel.Entity;
import org.opendatakit.common.ermodel.Query;
import org.opendatakit.common.ermodel.Query.WebsafeQueryResult;
@@ -33,6 +30,9 @@
import org.opendatakit.common.persistence.exception.ODKOverQuotaException;
import org.opendatakit.common.web.CallingContext;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Unlike the other tables, this is not updated atomically through the use of
* the propertiesETag.
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableDefinitions.java b/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableDefinitions.java
index 61be05294..e554e3fa6 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableDefinitions.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableDefinitions.java
@@ -16,9 +16,6 @@
package org.opendatakit.aggregate.odktables.relation;
-import java.util.ArrayList;
-import java.util.List;
-
import org.apache.commons.logging.LogFactory;
import org.opendatakit.common.ermodel.Entity;
import org.opendatakit.common.ermodel.Query;
@@ -32,6 +29,9 @@
import org.opendatakit.common.persistence.exception.ODKOverQuotaException;
import org.opendatakit.common.web.CallingContext;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* This provides a concrete mapping of (tableId,schemaETag) to a database table
* name.
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableEntry.java b/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableEntry.java
index 4ff39c869..1b7606f27 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableEntry.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableEntry.java
@@ -16,9 +16,6 @@
package org.opendatakit.aggregate.odktables.relation;
-import java.util.ArrayList;
-import java.util.List;
-
import org.opendatakit.common.ermodel.Entity;
import org.opendatakit.common.ermodel.Query;
import org.opendatakit.common.ermodel.Relation;
@@ -30,6 +27,9 @@
import org.opendatakit.common.persistence.exception.ODKOverQuotaException;
import org.opendatakit.common.web.CallingContext;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Tracks the ETags associated with a given TableId. The TableId is the PK for
* this table.
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableFileInfo.java b/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableFileInfo.java
index e15063e16..c928d0724 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableFileInfo.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableFileInfo.java
@@ -16,10 +16,6 @@
package org.opendatakit.aggregate.odktables.relation;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
import org.opendatakit.aggregate.odktables.rest.TableConstants;
import org.opendatakit.common.ermodel.BlobEntitySet;
import org.opendatakit.common.ermodel.Entity;
@@ -35,6 +31,10 @@
import org.opendatakit.common.persistence.exception.ODKOverQuotaException;
import org.opendatakit.common.web.CallingContext;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
/**
* This is the table in the database that holds information about the files that
* have been uploaded to be associated with certain ODKTables tables.
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableInstanceFiles.java b/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableInstanceFiles.java
index c4f58efa8..ba66081b4 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableInstanceFiles.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableInstanceFiles.java
@@ -16,12 +16,12 @@
package org.opendatakit.aggregate.odktables.relation;
-import java.util.Locale;
-
import org.opendatakit.common.ermodel.AbstractBlobRelationSet;
import org.opendatakit.common.persistence.exception.ODKDatastoreException;
import org.opendatakit.common.web.CallingContext;
+import java.util.Locale;
+
/**
* This represents the datastore table that holds files for the instance data
* of a table. There is one of these for each table in order to simplify
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableInstanceManifestETags.java b/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableInstanceManifestETags.java
index 57fc2ceb4..18c573936 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableInstanceManifestETags.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/relation/DbTableInstanceManifestETags.java
@@ -16,10 +16,6 @@
package org.opendatakit.aggregate.odktables.relation;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
import org.opendatakit.common.ermodel.Entity;
import org.opendatakit.common.ermodel.Relation;
import org.opendatakit.common.persistence.DataField;
@@ -30,6 +26,10 @@
import org.opendatakit.common.persistence.exception.ODKOverQuotaException;
import org.opendatakit.common.web.CallingContext;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
/**
* Tracks the per-row attachment manifest ETags of a row.
*
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/relation/EntityConverter.java b/src/main/java/org/opendatakit/aggregate/odktables/relation/EntityConverter.java
index a697dee30..5825cde8b 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/relation/EntityConverter.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/relation/EntityConverter.java
@@ -16,9 +16,6 @@
package org.opendatakit.aggregate.odktables.relation;
-import java.util.ArrayList;
-import java.util.List;
-
import org.opendatakit.aggregate.odktables.relation.DbColumnDefinitions.DbColumnDefinitionsEntity;
import org.opendatakit.aggregate.odktables.relation.DbTableAcl.DbTableAclEntity;
import org.opendatakit.aggregate.odktables.relation.DbTableDefinitions.DbTableDefinitionsEntity;
@@ -39,6 +36,9 @@
import org.opendatakit.common.persistence.DataField;
import org.opendatakit.common.persistence.DataField.DataType;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Converts between datastore {@link Entity} objects and domain objects in
* org.opendatakit.aggregate.odktables.entity.
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/relation/EntityCreator.java b/src/main/java/org/opendatakit/aggregate/odktables/relation/EntityCreator.java
index a4bfd30a4..1ae597dd2 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/relation/EntityCreator.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/relation/EntityCreator.java
@@ -16,9 +16,6 @@
package org.opendatakit.aggregate.odktables.relation;
-import java.util.ArrayList;
-import java.util.List;
-
import org.apache.commons.lang3.Validate;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -40,6 +37,9 @@
import org.opendatakit.common.persistence.exception.ODKDatastoreException;
import org.opendatakit.common.web.CallingContext;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Creates and updates new Entity objects for relations.
*
@@ -76,10 +76,10 @@ public class EntityCreator {
*/
public DbTableEntryEntity newTableEntryEntity(String tableId, String pendingSchemaETag,
String aprioriDataSequenceValue, CallingContext cc) throws ODKDatastoreException {
- Validate.notNull(cc);
- Validate.notNull(tableId);
- Validate.notNull(pendingSchemaETag);
- Validate.notNull(aprioriDataSequenceValue);
+ Validate.notNull(cc, "cc cannot be null");
+ Validate.notNull(tableId, "tableId cannot be null");
+ Validate.notNull(pendingSchemaETag, "pendingSchemaETag cannot be null");
+ Validate.notNull(aprioriDataSequenceValue, "aprioriDataSequenceValue cannot be null");
DbTableEntryEntity entity = DbTableEntry.createNewEntity(tableId, cc);
entity.setPendingSchemaETag(pendingSchemaETag);
@@ -102,8 +102,8 @@ public DbColumnDefinitionsEntity newColumnEntity(String tableId, String schemaET
Column column, CallingContext cc) throws ODKDatastoreException {
Validate.notEmpty(tableId);
Validate.notEmpty(schemaETag);
- Validate.notNull(column);
- Validate.notNull(cc);
+ Validate.notNull(column, "column cannot be null");
+ Validate.notNull(cc, "cc cannot be null");
DbColumnDefinitionsEntity entity = DbColumnDefinitions.createNewEntity(cc);
entity.setTableId(tableId);
@@ -165,7 +165,7 @@ public DbTableDefinitionsEntity newTableDefinitionEntity(String tableId, String
Validate.notEmpty(tableId);
Validate.notEmpty(schemaETag);
Validate.notEmpty(dbTableName);
- Validate.notNull(cc);
+ Validate.notNull(cc, "cc cannot be null");
DbTableDefinitionsEntity definition = DbTableDefinitions.createNewEntity(cc);
definition.setTableId(tableId);
definition.setSchemaETag(schemaETag);
@@ -189,11 +189,11 @@ public DbTableDefinitionsEntity newTableDefinitionEntity(String tableId, String
public DbTableAclEntity newTableAclEntity(String tableId, Scope scope, TableRole role,
CallingContext cc) throws ODKDatastoreException {
Validate.notEmpty(tableId);
- Validate.notNull(scope);
+ Validate.notNull(scope, "scope cannot be null");
// can't have an empty scope type in an acl entity
- Validate.notNull(scope.getType());
- Validate.notNull(role);
- Validate.notNull(cc);
+ Validate.notNull(scope.getType(), "scope type cannot be null");
+ Validate.notNull(role, "role cannot be null");
+ Validate.notNull(cc, "cc cannot be null");
DbTableAclEntity tableAcl = DbTableAcl.createNewEntity(cc);
tableAcl.setTableId(tableId);
@@ -303,11 +303,11 @@ public Entity newLogEntity(DbLogTable logTable, String dataETagAtModification,
String previousRowETag, Entity row,
List columns, Sequencer sequencer, CallingContext cc)
throws ODKDatastoreException {
- Validate.notNull(logTable);
+ Validate.notNull(logTable, "logTable cannot be null");
Validate.notEmpty(dataETagAtModification);
- Validate.notNull(row);
+ Validate.notNull(row, "row cannot be null");
Validate.noNullElements(columns);
- Validate.notNull(cc);
+ Validate.notNull(cc, "cc cannot be null");
Entity entity = logTable.newEntity(row.getString(DbTable.ROW_ETAG), cc);
entity.set(DbLogTable.ROW_ID, row.getId());
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/RFC4180CsvReader.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/RFC4180CsvReader.java
index db8cd25ee..78cde6583 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/RFC4180CsvReader.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/RFC4180CsvReader.java
@@ -63,12 +63,6 @@ enum ParseState {
*
* @param reader
* the reader to an underlying CSV source.
- * @param separator
- * the delimiter to use for separating entries
- * @param quotechar
- * the character to use for quoted elements
- * @param escape
- * the character to use for escaping a separator or quote
*/
public RFC4180CsvReader(Reader reader) {
@@ -270,11 +264,11 @@ public String[] readNext() throws IOException {
// Excel for Mac silliness
br.reset();
}
- b.append((char) cr);
- b.append((char) lf);
+ b.append(cr);
+ b.append(lf);
} else if ( ch == lf ) {
- b.append((char) cr);
- b.append((char) lf);
+ b.append(cr);
+ b.append(lf);
} else {
b.append((char) ch);
}
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/TableConstants.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/TableConstants.java
index 3e8a39e33..17a511ec2 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/TableConstants.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/TableConstants.java
@@ -18,7 +18,13 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+import java.util.SimpleTimeZone;
/**
* Contains various things that are constant in tables and must be known and
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/AppNameList.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/AppNameList.java
index 584600129..704e4d410 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/AppNameList.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/AppNameList.java
@@ -16,11 +16,11 @@
package org.opendatakit.aggregate.odktables.rest.entity;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
import java.util.ArrayList;
import java.util.List;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
-
/**
* This holds a list of appNames.
*
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/ChangeSetList.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/ChangeSetList.java
index 5536857ab..f28a7d61b 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/ChangeSetList.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/ChangeSetList.java
@@ -16,14 +16,14 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.util.ArrayList;
-import java.util.Collections;
-
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.ArrayList;
+import java.util.Collections;
+
/**
* This holds a list of dataETag (changeSet) values.
* It also supplies a sequenceValue that can be used
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/ClientVersionList.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/ClientVersionList.java
index 8e5c6e429..a857b277b 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/ClientVersionList.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/ClientVersionList.java
@@ -16,11 +16,11 @@
package org.opendatakit.aggregate.odktables.rest.entity;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
import java.util.ArrayList;
import java.util.List;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
-
/**
* This holds the list of odkClientVersion values available on the server.
*
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/Column.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/Column.java
index ac7b7f0e8..4399fcc42 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/Column.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/Column.java
@@ -16,10 +16,10 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.io.Serializable;
-
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
/**
* The XML document that represents a column. This is the XML representation of
* a column definition as stored in the (keep this fully qualified!)
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/OdkTablesFileManifest.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/OdkTablesFileManifest.java
index 3def8e748..c441958d6 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/OdkTablesFileManifest.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/OdkTablesFileManifest.java
@@ -16,13 +16,13 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.util.ArrayList;
-import java.util.Collections;
-
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.ArrayList;
+import java.util.Collections;
+
/**
* This holds a list of {@link OdkTablesFileManifestEntry}.
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/PrivilegesInfo.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/PrivilegesInfo.java
index 7d6d82252..aac1a8486 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/PrivilegesInfo.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/PrivilegesInfo.java
@@ -16,14 +16,14 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.util.ArrayList;
-import java.util.Collections;
-
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.ArrayList;
+import java.util.Collections;
+
/**
* This contains the default group of the user and the list of
* groups and roles to which the currently authenticated user is
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/PropertyEntryXmlList.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/PropertyEntryXmlList.java
index d17d2acbb..e0a519967 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/PropertyEntryXmlList.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/PropertyEntryXmlList.java
@@ -16,15 +16,15 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.util.ArrayList;
-import java.util.Collections;
-
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.ArrayList;
+import java.util.Collections;
+
/**
* This holds a list of {@link PropertyEntryXml}.
* Proper XML documents can contain only one root node.
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/Row.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/Row.java
index 228cd2e7f..54b7df530 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/Row.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/Row.java
@@ -16,6 +16,11 @@
package org.opendatakit.aggregate.odktables.rest.entity;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -23,11 +28,6 @@
import java.util.HashMap;
import java.util.Map;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-
public class Row {
/**
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/RowList.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/RowList.java
index 3d35e9d18..50afeb781 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/RowList.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/RowList.java
@@ -16,13 +16,13 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.util.ArrayList;
-
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.ArrayList;
+
/**
* This holds a list of {@link Row}.
* Proper XML documents can contain only one root node.
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/RowOutcomeList.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/RowOutcomeList.java
index da24c02f7..77c229653 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/RowOutcomeList.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/RowOutcomeList.java
@@ -16,13 +16,13 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.util.ArrayList;
-
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.ArrayList;
+
/**
* This holds a list of {@link Row}.
* Proper XML documents can contain only one root node.
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/RowResourceList.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/RowResourceList.java
index 39059ca53..49641f772 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/RowResourceList.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/RowResourceList.java
@@ -16,13 +16,13 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.util.ArrayList;
-
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.ArrayList;
+
/**
* This holds a list of {@link RowResource}.
* Proper XML documents can contain only one root node.
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableAclResourceList.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableAclResourceList.java
index 59216231e..dbf3668d2 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableAclResourceList.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableAclResourceList.java
@@ -16,15 +16,15 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
/**
* This holds a list of {@link TableAclResource}.
* Proper XML documents can contain only one root node.
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableDefinition.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableDefinition.java
index ec4902704..b145ec94e 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableDefinition.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableDefinition.java
@@ -16,16 +16,16 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
/**
* Represents the XML format of a table definition. This is essentially all the
* necessary information for a table to be defined on the server in a way taht
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableDefinitionResource.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableDefinitionResource.java
index 6af3e0090..ea3c2a085 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableDefinitionResource.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableDefinitionResource.java
@@ -16,10 +16,10 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.util.ArrayList;
-
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.ArrayList;
+
@JacksonXmlRootElement(localName="tableDefinitionResource")
public class TableDefinitionResource extends TableDefinition {
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableResourceList.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableResourceList.java
index 403f3bef3..4984d9ff4 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableResourceList.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableResourceList.java
@@ -16,15 +16,15 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
/**
* This holds a list of {@link TableResource}. Proper XML documents can contain
* only one root node. This wrapping class provides that root node.
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableRole.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableRole.java
index 7c73254a1..9158e4307 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableRole.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/TableRole.java
@@ -16,12 +16,12 @@
package org.opendatakit.aggregate.odktables.rest.entity;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
public enum TableRole {
NONE("No permissions. Can not see that the table exists."),
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/UserInfo.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/UserInfo.java
index fde0a9c69..11adc4d5d 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/UserInfo.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/UserInfo.java
@@ -16,14 +16,14 @@
package org.opendatakit.aggregate.odktables.rest.entity;
-import java.util.ArrayList;
-import java.util.Collections;
-
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.ArrayList;
+import java.util.Collections;
+
/**
* Describes a user who can manipulate odkTables appName content.
* This user may not have synchronize permissions on the server
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/UserInfoList.java b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/UserInfoList.java
index 29d11af55..774918da8 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/UserInfoList.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/rest/entity/UserInfoList.java
@@ -16,11 +16,11 @@
package org.opendatakit.aggregate.odktables.rest.entity;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
import java.util.ArrayList;
import java.util.List;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
-
/**
* This holds the list of UserInfo structures describing
* the users that can manipulate odkTables appName data. This may
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/security/AuthFilter.java b/src/main/java/org/opendatakit/aggregate/odktables/security/AuthFilter.java
index 3ef43673f..9c18c9612 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/security/AuthFilter.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/security/AuthFilter.java
@@ -16,10 +16,6 @@
package org.opendatakit.aggregate.odktables.security;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
import org.apache.commons.lang3.Validate;
import org.opendatakit.aggregate.odktables.TableAclManager;
import org.opendatakit.aggregate.odktables.exception.PermissionDeniedException;
@@ -30,6 +26,10 @@
import org.opendatakit.common.persistence.exception.ODKEntityNotFoundException;
import org.opendatakit.common.web.CallingContext;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
public class AuthFilter {
private CallingContext cc;
@@ -104,8 +104,8 @@ public boolean hasPermission(TablePermission permission) throws ODKDatastoreExce
*/
public boolean hasFilterScope(TablePermission permission, String rowId, Scope filter)
throws ODKDatastoreException {
- Validate.notNull(permission);
- Validate.notNull(rowId);
+ Validate.notNull(permission, "permission is null");
+ Validate.notNull(rowId, "rowId is null");
// if (!permissions.contains(permission)) {
// if (filter == null || filter.equals(Scope.EMPTY_SCOPE)) {
diff --git a/src/main/java/org/opendatakit/aggregate/odktables/security/TablesUserPermissionsImpl.java b/src/main/java/org/opendatakit/aggregate/odktables/security/TablesUserPermissionsImpl.java
index 7a75cfb11..362e4a346 100644
--- a/src/main/java/org/opendatakit/aggregate/odktables/security/TablesUserPermissionsImpl.java
+++ b/src/main/java/org/opendatakit/aggregate/odktables/security/TablesUserPermissionsImpl.java
@@ -16,12 +16,6 @@
package org.opendatakit.aggregate.odktables.security;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
import org.opendatakit.aggregate.odktables.exception.PermissionDeniedException;
import org.opendatakit.aggregate.odktables.rest.entity.Scope;
import org.opendatakit.aggregate.odktables.rest.entity.Scope.Type;
@@ -32,6 +26,12 @@
import org.opendatakit.common.web.CallingContext;
import org.springframework.security.core.GrantedAuthority;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
public class TablesUserPermissionsImpl implements TablesUserPermissions {
private final CallingContext cc;
diff --git a/src/main/java/org/opendatakit/aggregate/parser/MultiPartFormData.java b/src/main/java/org/opendatakit/aggregate/parser/MultiPartFormData.java
index ee0e92000..8638e319b 100644
--- a/src/main/java/org/opendatakit/aggregate/parser/MultiPartFormData.java
+++ b/src/main/java/org/opendatakit/aggregate/parser/MultiPartFormData.java
@@ -17,6 +17,14 @@
package org.opendatakit.aggregate.parser;
+import org.apache.commons.fileupload.FileItemIterator;
+import org.apache.commons.fileupload.FileItemStream;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.opendatakit.aggregate.constants.ParserConsts;
+
+import javax.servlet.http.HttpServletRequest;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -27,15 +35,6 @@
import java.util.Map;
import java.util.Set;
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.fileupload.FileItemIterator;
-import org.apache.commons.fileupload.FileItemStream;
-import org.apache.commons.fileupload.FileUploadException;
-import org.apache.commons.fileupload.disk.DiskFileItemFactory;
-import org.apache.commons.fileupload.servlet.ServletFileUpload;
-import org.opendatakit.aggregate.constants.ParserConsts;
-
/**
* Parses a multi part form request into a set of multiPartFormItems. The
* information stored in items are indexed by either the field name or the file
diff --git a/src/main/java/org/opendatakit/aggregate/parser/NamingSet.java b/src/main/java/org/opendatakit/aggregate/parser/NamingSet.java
index 059c28ccc..eb42eac3d 100644
--- a/src/main/java/org/opendatakit/aggregate/parser/NamingSet.java
+++ b/src/main/java/org/opendatakit/aggregate/parser/NamingSet.java
@@ -13,6 +13,13 @@
*/
package org.opendatakit.aggregate.parser;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.opendatakit.common.persistence.Datastore;
+import org.opendatakit.common.persistence.exception.ODKDatastoreException;
+import org.opendatakit.common.security.User;
+import org.opendatakit.common.web.CallingContext;
+
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -21,13 +28,6 @@
import java.util.TreeSet;
import java.util.UUID;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.opendatakit.common.persistence.Datastore;
-import org.opendatakit.common.persistence.exception.ODKDatastoreException;
-import org.opendatakit.common.security.User;
-import org.opendatakit.common.web.CallingContext;
-
/**
* When a form is uploaded, the names for the columns and tables representing
* the form need to be determined. This is done in a three-step process. First,
diff --git a/src/main/java/org/opendatakit/aggregate/server/ServerPreferencesProperties.java b/src/main/java/org/opendatakit/aggregate/server/ServerPreferencesProperties.java
index 66cae6c6c..982316acb 100644
--- a/src/main/java/org/opendatakit/aggregate/server/ServerPreferencesProperties.java
+++ b/src/main/java/org/opendatakit/aggregate/server/ServerPreferencesProperties.java
@@ -16,9 +16,6 @@
package org.opendatakit.aggregate.server;
-import java.util.Date;
-import java.util.List;
-
import org.opendatakit.common.persistence.CommonFieldsBase;
import org.opendatakit.common.persistence.DataField;
import org.opendatakit.common.persistence.Datastore;
@@ -31,6 +28,9 @@
import org.opendatakit.common.utils.WebUtils;
import org.opendatakit.common.web.CallingContext;
+import java.util.Date;
+import java.util.List;
+
public class ServerPreferencesProperties extends CommonFieldsBase {
private static final String TABLE_NAME = "_server_preferences_properties";
diff --git a/src/main/java/org/opendatakit/aggregate/server/SitePreferencesBean.java b/src/main/java/org/opendatakit/aggregate/server/SitePreferencesBean.java
index 257bf6ec4..b80dc32ae 100644
--- a/src/main/java/org/opendatakit/aggregate/server/SitePreferencesBean.java
+++ b/src/main/java/org/opendatakit/aggregate/server/SitePreferencesBean.java
@@ -15,8 +15,6 @@
*/
package org.opendatakit.aggregate.server;
-import javax.servlet.ServletContext;
-
import org.opendatakit.common.persistence.Datastore;
import org.opendatakit.common.persistence.exception.ODKEntityNotFoundException;
import org.opendatakit.common.persistence.exception.ODKOverQuotaException;
@@ -25,6 +23,8 @@
import org.opendatakit.common.web.CallingContext;
import org.springframework.beans.factory.InitializingBean;
+import javax.servlet.ServletContext;
+
/**
* Simple class to retrieve the site key from ServerPreferencesProperties during
* start-up.
diff --git a/src/main/java/org/opendatakit/aggregate/server/UITrans.java b/src/main/java/org/opendatakit/aggregate/server/UITrans.java
index 615528aa7..b85e7930c 100644
--- a/src/main/java/org/opendatakit/aggregate/server/UITrans.java
+++ b/src/main/java/org/opendatakit/aggregate/server/UITrans.java
@@ -16,13 +16,13 @@
package org.opendatakit.aggregate.server;
-import java.util.HashMap;
-import java.util.Map;
-
import org.opendatakit.aggregate.constants.common.FilterOperation;
import org.opendatakit.aggregate.constants.common.Visibility;
import org.opendatakit.common.persistence.Query;
+import java.util.HashMap;
+import java.util.Map;
+
/**
* Translate enumerations between the UI layer and the rest of Aggregate
*
diff --git a/src/main/java/org/opendatakit/aggregate/servlet/AggregateHtmlServlet.java b/src/main/java/org/opendatakit/aggregate/servlet/AggregateHtmlServlet.java
index 10b3029ff..e0a9603be 100644
--- a/src/main/java/org/opendatakit/aggregate/servlet/AggregateHtmlServlet.java
+++ b/src/main/java/org/opendatakit/aggregate/servlet/AggregateHtmlServlet.java
@@ -16,14 +16,6 @@
package org.opendatakit.aggregate.servlet;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.net.URL;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opendatakit.aggregate.ContextFactory;
@@ -35,6 +27,13 @@
import org.opendatakit.common.web.constants.BasicConsts;
import org.opendatakit.common.web.constants.HtmlConsts;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URL;
+
/**
* Stupid class to wrap the Aggregate.html page that GWT uses for all its UI
* presentation. Needed so that access to the page can be managed by Spring
diff --git a/src/main/java/org/opendatakit/aggregate/servlet/ServletUtilBase.java b/src/main/java/org/opendatakit/aggregate/servlet/ServletUtilBase.java
index 487375c6b..c688af3d6 100644
--- a/src/main/java/org/opendatakit/aggregate/servlet/ServletUtilBase.java
+++ b/src/main/java/org/opendatakit/aggregate/servlet/ServletUtilBase.java
@@ -17,24 +17,22 @@
package org.opendatakit.aggregate.servlet;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.TimeZone;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
import org.opendatakit.aggregate.constants.ErrorConsts;
import org.opendatakit.aggregate.constants.ServletConsts;
import org.opendatakit.aggregate.odktables.rest.ApiConstants;
+import org.opendatakit.common.utils.HtmlUtil;
import org.opendatakit.common.web.CallingContext;
import org.opendatakit.common.web.constants.HtmlConsts;
import org.opendatakit.common.web.servlet.CommonServletBase;
-import org.opendatakit.common.utils.HtmlUtil;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
/**
* Base class for Servlets that contain useful utilities
diff --git a/src/main/java/org/opendatakit/aggregate/task/WatchdogWorkerImpl.java b/src/main/java/org/opendatakit/aggregate/task/WatchdogWorkerImpl.java
index 22ac4474e..4af4b6106 100644
--- a/src/main/java/org/opendatakit/aggregate/task/WatchdogWorkerImpl.java
+++ b/src/main/java/org/opendatakit/aggregate/task/WatchdogWorkerImpl.java
@@ -15,28 +15,18 @@
*/
package org.opendatakit.aggregate.task;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opendatakit.aggregate.constants.BeanDefs;
-import org.opendatakit.aggregate.constants.common.ExternalServiceType;
-import org.opendatakit.aggregate.constants.common.OperationalStatus;
-import org.opendatakit.aggregate.constants.common.UIConsts;
-import org.opendatakit.aggregate.datamodel.TopLevelDynamicBase;
import org.opendatakit.aggregate.exception.ODKExternalServiceException;
import org.opendatakit.aggregate.exception.ODKFormNotFoundException;
import org.opendatakit.aggregate.exception.ODKIncompleteSubmissionData;
import org.opendatakit.aggregate.util.BackendActionsTable;
-import org.opendatakit.common.persistence.PersistConsts;
-import org.opendatakit.common.persistence.QueryResumePoint;
import org.opendatakit.common.persistence.exception.ODKDatastoreException;
-import org.opendatakit.common.utils.WebUtils;
import org.opendatakit.common.web.CallingContext;
+import java.util.Date;
+
/**
* Common worker implementation for restarting stalled tasks.
*
diff --git a/src/main/java/org/opendatakit/aggregate/task/tomcat/AggregrateThreadExecutor.java b/src/main/java/org/opendatakit/aggregate/task/tomcat/AggregrateThreadExecutor.java
index b47bb0bad..a504fc0d5 100644
--- a/src/main/java/org/opendatakit/aggregate/task/tomcat/AggregrateThreadExecutor.java
+++ b/src/main/java/org/opendatakit/aggregate/task/tomcat/AggregrateThreadExecutor.java
@@ -15,11 +15,11 @@
*/
package org.opendatakit.aggregate.task.tomcat;
+import org.springframework.scheduling.TaskScheduler;
+
import java.util.Date;
import java.util.concurrent.ScheduledFuture;
-import org.springframework.scheduling.TaskScheduler;
-
/**
*
* @author wbrunette@gmail.com
diff --git a/src/main/java/org/opendatakit/aggregate/task/tomcat/WatchdogImpl.java b/src/main/java/org/opendatakit/aggregate/task/tomcat/WatchdogImpl.java
index 0e0a20916..257477285 100644
--- a/src/main/java/org/opendatakit/aggregate/task/tomcat/WatchdogImpl.java
+++ b/src/main/java/org/opendatakit/aggregate/task/tomcat/WatchdogImpl.java
@@ -15,12 +15,6 @@
*/
package org.opendatakit.aggregate.task.tomcat;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.concurrent.ScheduledFuture;
-
-import javax.servlet.ServletContext;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opendatakit.aggregate.constants.BeanDefs;
@@ -44,6 +38,11 @@
import org.springframework.scheduling.TaskScheduler;
import org.springframework.web.context.ServletContextAware;
+import javax.servlet.ServletContext;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.concurrent.ScheduledFuture;
+
/**
* Tomcat implementation of the watchdog -- as an executor
*
diff --git a/src/main/java/org/opendatakit/aggregate/util/BackendActionsTable.java b/src/main/java/org/opendatakit/aggregate/util/BackendActionsTable.java
index 8a2ec6392..7729a1438 100644
--- a/src/main/java/org/opendatakit/aggregate/util/BackendActionsTable.java
+++ b/src/main/java/org/opendatakit/aggregate/util/BackendActionsTable.java
@@ -15,10 +15,6 @@
*/
package org.opendatakit.aggregate.util;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opendatakit.aggregate.constants.BeanDefs;
@@ -34,6 +30,10 @@
import org.opendatakit.common.security.User;
import org.opendatakit.common.web.CallingContext;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
/**
* Implements the mechanisms used in GAE to launch Watchdog during periods of
* website activity ( triggerWatchdog ) and from within the Watchdog
diff --git a/src/main/java/org/opendatakit/common/datamodel/BinaryContentManipulator.java b/src/main/java/org/opendatakit/common/datamodel/BinaryContentManipulator.java
index 03a976898..6915b5ab7 100644
--- a/src/main/java/org/opendatakit/common/datamodel/BinaryContentManipulator.java
+++ b/src/main/java/org/opendatakit/common/datamodel/BinaryContentManipulator.java
@@ -13,14 +13,6 @@
*/
package org.opendatakit.common.datamodel;
-import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
import org.opendatakit.common.persistence.CommonFieldsBase;
import org.opendatakit.common.persistence.Datastore;
import org.opendatakit.common.persistence.EntityKey;
@@ -33,6 +25,14 @@
import org.opendatakit.common.security.User;
import org.opendatakit.common.web.CallingContext;
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
/**
* Manipulator class for handling binary attachments. To use, create an instance
* of the manipulator class specifying the URI of the entity having the
@@ -454,7 +454,7 @@ public BinaryContentManipulator.BlobSubmissionOutcome setValueFromByteArray(byte
if (matchedBc == null) {
// create the record...
- matchedBc = (BinaryContent) ds.createEntityUsingRelation(ctntRelation, user);
+ matchedBc = ds.createEntityUsingRelation(ctntRelation, user);
matchedBc.setTopLevelAuri(topLevelKey);
matchedBc.setParentAuri(parentKey);
matchedBc.setOrdinalNumber(internalGetAttachmentCount() + 1L);
@@ -491,7 +491,7 @@ public BinaryContentManipulator.BlobSubmissionOutcome setValueFromByteArray(byte
if (newBc) {
// Step (0)
// create the record...
- matchedBc = (BinaryContent) ds.createEntityUsingRelation(ctntRelation, user);
+ matchedBc = ds.createEntityUsingRelation(ctntRelation, user);
matchedBc.setTopLevelAuri(topLevelKey);
matchedBc.setParentAuri(parentKey);
matchedBc.setOrdinalNumber(internalGetAttachmentCount() + 1L);
diff --git a/src/main/java/org/opendatakit/common/datamodel/DeleteHelper.java b/src/main/java/org/opendatakit/common/datamodel/DeleteHelper.java
index c7f7cd702..5531c7794 100644
--- a/src/main/java/org/opendatakit/common/datamodel/DeleteHelper.java
+++ b/src/main/java/org/opendatakit/common/datamodel/DeleteHelper.java
@@ -15,12 +15,6 @@
*/
package org.opendatakit.common.datamodel;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opendatakit.aggregate.datamodel.TopLevelDynamicBase;
@@ -32,6 +26,12 @@
import org.opendatakit.common.persistence.exception.ODKEntityNotFoundException;
import org.opendatakit.common.web.CallingContext;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
public class DeleteHelper {
private DeleteHelper() {
diff --git a/src/main/java/org/opendatakit/common/datamodel/DynamicCommonFieldsBase.java b/src/main/java/org/opendatakit/common/datamodel/DynamicCommonFieldsBase.java
index 5f3633df9..61ffe5260 100644
--- a/src/main/java/org/opendatakit/common/datamodel/DynamicCommonFieldsBase.java
+++ b/src/main/java/org/opendatakit/common/datamodel/DynamicCommonFieldsBase.java
@@ -15,12 +15,12 @@
*/
package org.opendatakit.common.datamodel;
-import java.util.Comparator;
-
import org.opendatakit.common.persistence.CommonFieldsBase;
import org.opendatakit.common.persistence.DataField;
import org.opendatakit.common.security.User;
+import java.util.Comparator;
+
/**
* Common abstract class that unifies all TopLevelDynamic and Dynamic classes.
* Primarily so that Submission can derive from SubmissionSet. Useful for
diff --git a/src/main/java/org/opendatakit/common/ermodel/AbstractBlobRelationSet.java b/src/main/java/org/opendatakit/common/ermodel/AbstractBlobRelationSet.java
index b36ec11be..795100e87 100644
--- a/src/main/java/org/opendatakit/common/ermodel/AbstractBlobRelationSet.java
+++ b/src/main/java/org/opendatakit/common/ermodel/AbstractBlobRelationSet.java
@@ -13,9 +13,6 @@
*/
package org.opendatakit.common.ermodel;
-import java.util.Date;
-import java.util.List;
-
import org.opendatakit.common.datamodel.BinaryContent;
import org.opendatakit.common.datamodel.BinaryContentManipulator;
import org.opendatakit.common.datamodel.BinaryContentManipulator.BlobSubmissionOutcome;
@@ -30,6 +27,9 @@
import org.opendatakit.common.security.User;
import org.opendatakit.common.web.CallingContext;
+import java.util.Date;
+import java.util.List;
+
/**
* Base class for manipulating blob sets. The constructors assume that the base
* name of the table is UPPER_CASE only.
diff --git a/src/main/java/org/opendatakit/common/ermodel/BlobEntitySet.java b/src/main/java/org/opendatakit/common/ermodel/BlobEntitySet.java
index 617364244..cd2592d36 100644
--- a/src/main/java/org/opendatakit/common/ermodel/BlobEntitySet.java
+++ b/src/main/java/org/opendatakit/common/ermodel/BlobEntitySet.java
@@ -13,14 +13,14 @@
*/
package org.opendatakit.common.ermodel;
-import java.util.Date;
-
import org.opendatakit.common.datamodel.BinaryContentManipulator.BlobSubmissionOutcome;
import org.opendatakit.common.persistence.exception.ODKDatastoreException;
import org.opendatakit.common.persistence.exception.ODKEntityPersistException;
import org.opendatakit.common.persistence.exception.ODKOverQuotaException;
import org.opendatakit.common.web.CallingContext;
+import java.util.Date;
+
/**
* API for manipulating sets of blobs. Blobs themselves are stored using
* multiple entities (rows) across 3 linked relations (tables). The details of
diff --git a/src/main/java/org/opendatakit/common/ermodel/BlobRelationSet.java b/src/main/java/org/opendatakit/common/ermodel/BlobRelationSet.java
index 91043dea1..59f9d344e 100644
--- a/src/main/java/org/opendatakit/common/ermodel/BlobRelationSet.java
+++ b/src/main/java/org/opendatakit/common/ermodel/BlobRelationSet.java
@@ -13,13 +13,13 @@
*/
package org.opendatakit.common.ermodel;
-import java.util.List;
-
import org.opendatakit.common.persistence.exception.ODKDatastoreException;
import org.opendatakit.common.persistence.exception.ODKEntityPersistException;
import org.opendatakit.common.persistence.exception.ODKOverQuotaException;
import org.opendatakit.common.web.CallingContext;
+import java.util.List;
+
/**
* API for the manipulation of a Blob set (e.g., the set of 3 tables used to
* represent an artibrarily large binary object) in the datastore. See
diff --git a/src/main/java/org/opendatakit/common/ermodel/Entity.java b/src/main/java/org/opendatakit/common/ermodel/Entity.java
index 1c1418183..f4f13523c 100644
--- a/src/main/java/org/opendatakit/common/ermodel/Entity.java
+++ b/src/main/java/org/opendatakit/common/ermodel/Entity.java
@@ -16,8 +16,6 @@
package org.opendatakit.common.ermodel;
-import java.util.Date;
-
import org.opendatakit.common.persistence.DataField;
import org.opendatakit.common.persistence.WrappedBigDecimal;
import org.opendatakit.common.persistence.exception.ODKDatastoreException;
@@ -25,6 +23,8 @@
import org.opendatakit.common.persistence.exception.ODKOverQuotaException;
import org.opendatakit.common.web.CallingContext;
+import java.util.Date;
+
public interface Entity {
/**
diff --git a/src/main/java/org/opendatakit/common/ermodel/Query.java b/src/main/java/org/opendatakit/common/ermodel/Query.java
index 4a9230a6f..04569f0f0 100644
--- a/src/main/java/org/opendatakit/common/ermodel/Query.java
+++ b/src/main/java/org/opendatakit/common/ermodel/Query.java
@@ -16,11 +16,6 @@
package org.opendatakit.common.ermodel;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
import org.apache.commons.lang3.Validate;
import org.opendatakit.common.ermodel.Relation.RelationImpl;
import org.opendatakit.common.persistence.CommonFieldsBase;
@@ -31,6 +26,11 @@
import org.opendatakit.common.persistence.QueryResumePoint;
import org.opendatakit.common.persistence.exception.ODKDatastoreException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
/**
* Query is a query over a Relation.
*
@@ -69,8 +69,7 @@ public WebsafeQueryResult(List entities,
private org.opendatakit.common.persistence.Query query;
protected Query(Relation relation, org.opendatakit.common.persistence.Query query) {
- Validate.notNull(relation);
-
+ Validate.notNull(relation, "relation cannot be null");
this.relation = relation;
this.query = query;
}
@@ -258,7 +257,7 @@ public Query lessThanOrEqual(String fieldName, Object value) {
*/
public Query addFilter(String fieldName, FilterOperation op, Object value) {
Validate.notEmpty(fieldName);
- Validate.notNull(op);
+ Validate.notNull(op, "op cannot be null");
DataField field = relation.getDataField(fieldName);
query.addFilter(field, op, value);
return this;
@@ -278,8 +277,8 @@ public Query addFilter(String fieldName, FilterOperation op, Object value) {
* @return this Query, with the given filter added.
*/
public Query addFilter(DataField field, FilterOperation op, Object value) {
- Validate.notNull(field);
- Validate.notNull(op);
+ Validate.notNull(field, "field cannot be null");
+ Validate.notNull(op, "op cannot be null");
query.addFilter(relation.verify(field), op, value);
return this;
@@ -345,8 +344,8 @@ public Query sortDescending(String fieldName) {
* @return this Query, with the given sort added.
*/
public Query addSort(DataField field, Direction direction) {
- Validate.notNull(field);
- Validate.notNull(direction);
+ Validate.notNull(field, "field cannot be null");
+ Validate.notNull(direction, "direction cannot be null");
query.addSort(relation.verify(field), direction);
return this;
}
@@ -364,7 +363,7 @@ public Query addSort(DataField field, Direction direction) {
*/
public Query addSort(String fieldName, Direction direction) {
Validate.notEmpty(fieldName);
- Validate.notNull(direction);
+ Validate.notNull(direction, "direction cannot be null");
DataField field = relation.getDataField(fieldName);
query.addSort(field, direction);
return this;
@@ -385,7 +384,7 @@ public Query addSort(String fieldName, Direction direction) {
* not in values will be excluded from the query.
*/
public Query include(DataField field, Collection> values) {
- Validate.notNull(field);
+ Validate.notNull(field, "field cannot be null");
Validate.noNullElements(values);
query.addValueSetFilter(relation.verify(field), values);
return this;
@@ -507,7 +506,7 @@ public WebsafeQueryResult execute(QueryResumePoint startCursor, int fetchLimit)
* existing filter and sort criteria.
*/
public List> getDistinct(DataField field) {
- Validate.notNull(field);
+ Validate.notNull(field,"field cannot be null");
try {
return query.executeDistinctValueForDataField(relation.verify(field));
} catch (ODKDatastoreException e) {
diff --git a/src/main/java/org/opendatakit/common/ermodel/Relation.java b/src/main/java/org/opendatakit/common/ermodel/Relation.java
index d375ecc7a..3be5747c4 100644
--- a/src/main/java/org/opendatakit/common/ermodel/Relation.java
+++ b/src/main/java/org/opendatakit/common/ermodel/Relation.java
@@ -13,15 +13,6 @@
*/
package org.opendatakit.common.ermodel;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
import org.opendatakit.common.persistence.CommonFieldsBase;
import org.opendatakit.common.persistence.DataField;
import org.opendatakit.common.persistence.Datastore;
@@ -35,6 +26,15 @@
import org.opendatakit.common.utils.WebUtils;
import org.opendatakit.common.web.CallingContext;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
/**
* Base class for user-defined relations. The constructors assume that the name
* of the table is UPPER_CASE only, as are the names of the DataFields in the
diff --git a/src/main/java/org/opendatakit/common/persistence/CommonFieldsBase.java b/src/main/java/org/opendatakit/common/persistence/CommonFieldsBase.java
index 877ab11c5..7e4a53fc3 100644
--- a/src/main/java/org/opendatakit/common/persistence/CommonFieldsBase.java
+++ b/src/main/java/org/opendatakit/common/persistence/CommonFieldsBase.java
@@ -13,9 +13,13 @@
*/
package org.opendatakit.common.persistence;
+import org.opendatakit.common.persistence.DataField.DataType;
+import org.opendatakit.common.persistence.DataField.IndexType;
+import org.opendatakit.common.security.User;
+
import java.io.UnsupportedEncodingException;
-import java.math.BigDecimal;
import java.math.BigInteger;
+import java.math.RoundingMode;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
@@ -26,10 +30,6 @@
import java.util.Map;
import java.util.UUID;
-import org.opendatakit.common.persistence.DataField.DataType;
-import org.opendatakit.common.persistence.DataField.IndexType;
-import org.opendatakit.common.security.User;
-
/**
* Base class defining the audit fields for a table.
*
@@ -298,7 +298,7 @@ public final void setNumericField(DataField f, WrappedBigDecimal value) {
}
if ( !f.isDoublePrecision() && !value.isSpecialValue() ) {
// enforce scaling here...
- fieldValueMap.put(f, value.setScale(f.getNumericScale(), BigDecimal.ROUND_HALF_UP));
+ fieldValueMap.put(f, value.setScale(f.getNumericScale(), RoundingMode.HALF_UP));
} else {
fieldValueMap.put(f, value);
}
diff --git a/src/main/java/org/opendatakit/common/persistence/Datastore.java b/src/main/java/org/opendatakit/common/persistence/Datastore.java
index 6d01bcc1a..4e4ed9a70 100644
--- a/src/main/java/org/opendatakit/common/persistence/Datastore.java
+++ b/src/main/java/org/opendatakit/common/persistence/Datastore.java
@@ -13,15 +13,15 @@
*/
package org.opendatakit.common.persistence;
-import java.util.Collection;
-import java.util.List;
-
import org.opendatakit.common.persistence.exception.ODKDatastoreException;
import org.opendatakit.common.persistence.exception.ODKEntityNotFoundException;
import org.opendatakit.common.persistence.exception.ODKEntityPersistException;
import org.opendatakit.common.persistence.exception.ODKOverQuotaException;
import org.opendatakit.common.security.User;
+import java.util.Collection;
+import java.util.List;
+
/**
* The Datastore interface defines how to store, retrieve, and query data in ODK
* Aggregate. It is designed to be the sole point of interaction for code above
diff --git a/src/main/java/org/opendatakit/common/persistence/Query.java b/src/main/java/org/opendatakit/common/persistence/Query.java
index 186bb4532..ca6de5b65 100644
--- a/src/main/java/org/opendatakit/common/persistence/Query.java
+++ b/src/main/java/org/opendatakit/common/persistence/Query.java
@@ -13,13 +13,13 @@
*/
package org.opendatakit.common.persistence;
+import org.opendatakit.common.persistence.exception.ODKDatastoreException;
+import org.opendatakit.common.persistence.exception.ODKOverQuotaException;
+
import java.util.Collection;
import java.util.List;
import java.util.Set;
-import org.opendatakit.common.persistence.exception.ODKDatastoreException;
-import org.opendatakit.common.persistence.exception.ODKOverQuotaException;
-
/**
* The Query interface defines how persistence implementations should create query functionality.
*
diff --git a/src/main/java/org/opendatakit/common/persistence/WrappedBigDecimal.java b/src/main/java/org/opendatakit/common/persistence/WrappedBigDecimal.java
index fdb1c48d9..7c742836a 100644
--- a/src/main/java/org/opendatakit/common/persistence/WrappedBigDecimal.java
+++ b/src/main/java/org/opendatakit/common/persistence/WrappedBigDecimal.java
@@ -17,6 +17,7 @@
package org.opendatakit.common.persistence;
import java.math.BigDecimal;
+import java.math.RoundingMode;
/**
* Wrapper to encapsulate and pass through the special double values of NaN,
@@ -79,7 +80,7 @@ public boolean isSpecialValue() {
return (d != null);
}
- public WrappedBigDecimal setScale(int scale, int roundingMode) {
+ public WrappedBigDecimal setScale(int scale, RoundingMode roundingMode) {
if (isSpecialValue()) {
// immutable
return this;
diff --git a/src/main/java/org/opendatakit/common/persistence/engine/DatastoreAccessMetrics.java b/src/main/java/org/opendatakit/common/persistence/engine/DatastoreAccessMetrics.java
index efb5097b0..3e06823db 100644
--- a/src/main/java/org/opendatakit/common/persistence/engine/DatastoreAccessMetrics.java
+++ b/src/main/java/org/opendatakit/common/persistence/engine/DatastoreAccessMetrics.java
@@ -13,15 +13,15 @@
*/
package org.opendatakit.common.persistence.engine;
-import java.util.Map;
-import java.util.TreeMap;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opendatakit.common.persistence.CommonFieldsBase;
import org.opendatakit.common.persistence.EntityKey;
import org.opendatakit.common.utils.WebUtils;
+import java.util.Map;
+import java.util.TreeMap;
+
/**
* Tracks the access patterns for the datastore layer. Useful for identifying
* inefficient datastore access patterns and minimizing excessive read/write
diff --git a/src/main/java/org/opendatakit/common/persistence/engine/EngineUtils.java b/src/main/java/org/opendatakit/common/persistence/engine/EngineUtils.java
index 1c0ce0970..48efc45da 100644
--- a/src/main/java/org/opendatakit/common/persistence/engine/EngineUtils.java
+++ b/src/main/java/org/opendatakit/common/persistence/engine/EngineUtils.java
@@ -13,14 +13,14 @@
*/
package org.opendatakit.common.persistence.engine;
-import java.math.BigDecimal;
-import java.util.Date;
-
import org.opendatakit.common.persistence.CommonFieldsBase;
import org.opendatakit.common.persistence.DataField;
import org.opendatakit.common.persistence.WrappedBigDecimal;
import org.opendatakit.common.utils.WebUtils;
+import java.math.RoundingMode;
+import java.util.Date;
+
public class EngineUtils {
public static final Object getDominantSortAttributeValue( CommonFieldsBase odkEntity, DataField dominantAttr) {
@@ -174,7 +174,7 @@ public static final String getAttributeValueAsString(Object o, DataField dominan
value = null;
} else {
if ( !dominantAttr.isDoublePrecision() && !bd.isSpecialValue() ) {
- bd = bd.setScale(dominantAttr.getNumericScale(), BigDecimal.ROUND_HALF_UP);
+ bd = bd.setScale(dominantAttr.getNumericScale(), RoundingMode.HALF_UP);
}
value = bd.toString();
}
@@ -228,7 +228,7 @@ public static final Object getDominantSortAttributeValueFromString(String v, Dat
} else {
WrappedBigDecimal bd = new WrappedBigDecimal(v);
if ( !dominantAttr.isDoublePrecision() && !bd.isSpecialValue() ) {
- bd = bd.setScale(dominantAttr.getNumericScale(), BigDecimal.ROUND_HALF_UP);
+ bd = bd.setScale(dominantAttr.getNumericScale(), RoundingMode.HALF_UP);
}
value = bd;
}
diff --git a/src/main/java/org/opendatakit/common/persistence/engine/mysql/DatastoreImpl.java b/src/main/java/org/opendatakit/common/persistence/engine/mysql/DatastoreImpl.java
index e3955e312..28b937414 100644
--- a/src/main/java/org/opendatakit/common/persistence/engine/mysql/DatastoreImpl.java
+++ b/src/main/java/org/opendatakit/common/persistence/engine/mysql/DatastoreImpl.java
@@ -13,18 +13,6 @@
*/
package org.opendatakit.common.persistence.engine.mysql;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.sql.DataSource;
-
import org.apache.commons.logging.LogFactory;
import org.opendatakit.common.persistence.CommonFieldsBase;
import org.opendatakit.common.persistence.DataField;
@@ -52,6 +40,17 @@
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
+import javax.sql.DataSource;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
/**
*
* @author wbrunette@gmail.com
@@ -85,12 +84,6 @@ public void setDataSource(DataSource dataSource) {
// ignore this but log a brief info message
LogFactory.getLog(DatastoreImpl.class).info("Failed to load com.mysql.jdbc.Driver (did you download and install/copy MySQL Connector/J ?) Exception: " + e.toString());
}
- try {
- Class.forName("com.mysql.jdbc.GoogleDriver");
- } catch ( Exception e ) {
- // ignore this but log a brief info message
- LogFactory.getLog(DatastoreImpl.class).info("Failed to load com.mysql.jdbc.GoogleDriver Exception: " + e.toString());
- }
this.tm = new DataSourceTransactionManager(dataSource);
}
diff --git a/src/main/java/org/opendatakit/common/persistence/engine/mysql/QueryImpl.java b/src/main/java/org/opendatakit/common/persistence/engine/mysql/QueryImpl.java
index b9566bd8c..f0bfbf697 100644
--- a/src/main/java/org/opendatakit/common/persistence/engine/mysql/QueryImpl.java
+++ b/src/main/java/org/opendatakit/common/persistence/engine/mysql/QueryImpl.java
@@ -13,16 +13,6 @@
*/
package org.opendatakit.common.persistence.engine.mysql;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opendatakit.common.persistence.CommonFieldsBase;
@@ -37,6 +27,16 @@
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
/**
*
* @author wbrunette@gmail.com
@@ -264,7 +264,7 @@ public List extends CommonFieldsBase> executeQuery() throws ODKDatastoreExcept
try {
queryStringLogger.debug(query);
List extends CommonFieldsBase> l = dataStoreImpl.getJdbcConnection().query(query,
- bindValues.toArray(), rowMapper);
+ rowMapper, bindValues.toArray());
dataStoreImpl.recordQueryUsage(relation, l.size());
return l;
} catch (Exception e) {
@@ -282,8 +282,7 @@ public List> executeDistinctValueForDataField(DataField dataField) throws ODKD
List> keys = null;
try {
- keys = dataStoreImpl.getJdbcConnection().queryForList(query, bindValues.toArray(),
- String.class);
+ keys = dataStoreImpl.getJdbcConnection().queryForList(query, String.class,bindValues.toArray());
dataStoreImpl.recordQueryUsage(relation, keys.size());
} catch (Exception e) {
dataStoreImpl.recordQueryUsage(relation, 0);
@@ -421,7 +420,7 @@ public QueryResult executeQuery(QueryResumePoint startCursor, int fetchLimit)
CoreResult r;
try {
queryStringLogger.debug(query);
- r = dataStoreImpl.getJdbcConnection().query(query, values.toArray(), rse);
+ r = dataStoreImpl.getJdbcConnection().query(query, rse, values.toArray());
} finally {
dataStoreImpl.recordQueryUsage(relation, rse.getReadCount());
}
diff --git a/src/main/java/org/opendatakit/common/persistence/engine/mysql/RelationRowMapper.java b/src/main/java/org/opendatakit/common/persistence/engine/mysql/RelationRowMapper.java
index 1a6e5fcff..9e1e127e7 100644
--- a/src/main/java/org/opendatakit/common/persistence/engine/mysql/RelationRowMapper.java
+++ b/src/main/java/org/opendatakit/common/persistence/engine/mysql/RelationRowMapper.java
@@ -13,16 +13,16 @@
*/
package org.opendatakit.common.persistence.engine.mysql;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Date;
-
import org.opendatakit.common.persistence.CommonFieldsBase;
import org.opendatakit.common.persistence.DataField;
import org.opendatakit.common.persistence.WrappedBigDecimal;
import org.opendatakit.common.security.User;
import org.springframework.jdbc.core.RowMapper;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Date;
+
/**
*
* @author wbrunette@gmail.com
diff --git a/src/main/java/org/opendatakit/common/persistence/engine/mysql/TaskLockImpl.java b/src/main/java/org/opendatakit/common/persistence/engine/mysql/TaskLockImpl.java
index b134210a4..036293ffe 100644
--- a/src/main/java/org/opendatakit/common/persistence/engine/mysql/TaskLockImpl.java
+++ b/src/main/java/org/opendatakit/common/persistence/engine/mysql/TaskLockImpl.java
@@ -15,14 +15,6 @@
*/
package org.opendatakit.common.persistence.engine.mysql;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
import org.apache.commons.logging.LogFactory;
import org.opendatakit.common.persistence.CommonFieldsBase;
import org.opendatakit.common.persistence.DataField;
@@ -39,6 +31,14 @@
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcTemplate;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
/**
*
* @author wbrunette@gmail.com
@@ -338,7 +338,7 @@ public Object doInConnection(Connection conn) throws SQLException, DataAccessExc
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
String lastResult = null;
for (String s : stmts) {
- Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
if ( s.startsWith("SELECT") ) {
ResultSet rs = stmt.executeQuery(s);
if ( rs.first() ) {
@@ -375,7 +375,7 @@ public Object doInConnection(Connection conn) throws SQLException, DataAccessExc
throw new ODKTaskLockException(PERSISTENCE_LAYER_PROBLEM, e);
}
if ( success ) {
- return (TaskLockTable) datastore.getEntity(relation, uri, user);
+ return datastore.getEntity(relation, uri, user);
} else {
throw new ODKEntityNotFoundException();
}
diff --git a/src/main/java/org/opendatakit/common/persistence/engine/pgres/DatastoreImpl.java b/src/main/java/org/opendatakit/common/persistence/engine/pgres/DatastoreImpl.java
index 571d1d114..f919d40b5 100644
--- a/src/main/java/org/opendatakit/common/persistence/engine/pgres/DatastoreImpl.java
+++ b/src/main/java/org/opendatakit/common/persistence/engine/pgres/DatastoreImpl.java
@@ -13,19 +13,6 @@
*/
package org.opendatakit.common.persistence.engine.pgres;
-import java.math.BigDecimal;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.sql.DataSource;
-
import org.apache.commons.logging.LogFactory;
import org.opendatakit.common.persistence.CommonFieldsBase;
import org.opendatakit.common.persistence.DataField;
@@ -52,6 +39,19 @@
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
+import javax.sql.DataSource;
+import java.math.BigDecimal;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
/**
*
* @author wbrunette@gmail.com
@@ -406,7 +406,7 @@ private final boolean updateRelation(JdbcTemplate jc, CommonFieldsBase relation,
String qs = TableDefinition.TABLE_DEF_QUERY;
List> columns;
columns = jc.query(qs, new Object[] { relation.getSchemaName(), relation.getTableName() },
- tableDef);
+ new int[]{ Types.VARCHAR, Types.VARCHAR }, tableDef);
dam.recordQueryUsage(TableDefinition.INFORMATION_SCHEMA_COLUMNS, columns.size());
if (columns.size() > 0) {
@@ -703,7 +703,7 @@ public boolean hasRelation(String schema, String tableName, User user) {
dam.recordQueryUsage(TableDefinition.INFORMATION_SCHEMA_COLUMNS, 1);
String qs = TableDefinition.TABLE_EXISTS_QUERY;
Integer columnCount = getJdbcConnection().queryForObject(qs, new Object[] { schema, tableName },
- Integer.class);
+ new int[]{ Types.VARCHAR, Types.VARCHAR }, Integer.class);
return (columnCount != null && columnCount != 0);
}
diff --git a/src/main/java/org/opendatakit/common/persistence/engine/pgres/QueryImpl.java b/src/main/java/org/opendatakit/common/persistence/engine/pgres/QueryImpl.java
index c24946199..edcf5d542 100644
--- a/src/main/java/org/opendatakit/common/persistence/engine/pgres/QueryImpl.java
+++ b/src/main/java/org/opendatakit/common/persistence/engine/pgres/QueryImpl.java
@@ -13,16 +13,6 @@
*/
package org.opendatakit.common.persistence.engine.pgres;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opendatakit.common.persistence.CommonFieldsBase;
@@ -37,6 +27,16 @@
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
/**
*
* @author wbrunette@gmail.com
@@ -264,7 +264,7 @@ public List extends CommonFieldsBase> executeQuery() throws ODKDatastoreExcept
try {
queryStringLogger.debug(query);
List extends CommonFieldsBase> l = dataStoreImpl.getJdbcConnection().query(query,
- bindValues.toArray(), rowMapper);
+ rowMapper, bindValues.toArray());
dataStoreImpl.recordQueryUsage(relation, l.size());
return l;
} catch (Exception e) {
@@ -282,8 +282,7 @@ public List> executeDistinctValueForDataField(DataField dataField) throws ODKD
List> keys = null;
try {
- keys = dataStoreImpl.getJdbcConnection().queryForList(query, bindValues.toArray(),
- String.class);
+ keys = dataStoreImpl.getJdbcConnection().queryForList(query, String.class, bindValues.toArray());
dataStoreImpl.recordQueryUsage(relation, keys.size());
} catch (Exception e) {
dataStoreImpl.recordQueryUsage(relation, 0);
@@ -421,7 +420,7 @@ public QueryResult executeQuery(QueryResumePoint startCursor, int fetchLimit)
CoreResult r;
try {
queryStringLogger.debug(query);
- r = dataStoreImpl.getJdbcConnection().query(query, values.toArray(), rse);
+ r = dataStoreImpl.getJdbcConnection().query(query, rse, values.toArray());
} finally {
dataStoreImpl.recordQueryUsage(relation, rse.getReadCount());
}
diff --git a/src/main/java/org/opendatakit/common/persistence/engine/pgres/RelationRowMapper.java b/src/main/java/org/opendatakit/common/persistence/engine/pgres/RelationRowMapper.java
index 0658602da..fcfe20e83 100644
--- a/src/main/java/org/opendatakit/common/persistence/engine/pgres/RelationRowMapper.java
+++ b/src/main/java/org/opendatakit/common/persistence/engine/pgres/RelationRowMapper.java
@@ -13,16 +13,16 @@
*/
package org.opendatakit.common.persistence.engine.pgres;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Date;
-
import org.opendatakit.common.persistence.CommonFieldsBase;
import org.opendatakit.common.persistence.DataField;
import org.opendatakit.common.persistence.WrappedBigDecimal;
import org.opendatakit.common.security.User;
import org.springframework.jdbc.core.RowMapper;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Date;
+
/**
*
* @author wbrunette@gmail.com
diff --git a/src/main/java/org/opendatakit/common/persistence/engine/pgres/TaskLockImpl.java b/src/main/java/org/opendatakit/common/persistence/engine/pgres/TaskLockImpl.java
index 831a780b1..85226ece0 100644
--- a/src/main/java/org/opendatakit/common/persistence/engine/pgres/TaskLockImpl.java
+++ b/src/main/java/org/opendatakit/common/persistence/engine/pgres/TaskLockImpl.java
@@ -15,13 +15,6 @@
*/
package org.opendatakit.common.persistence.engine.pgres;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
import org.apache.commons.logging.LogFactory;
import org.opendatakit.common.persistence.CommonFieldsBase;
import org.opendatakit.common.persistence.DataField;
@@ -38,6 +31,13 @@
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcTemplate;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
/**
*
* @author wbrunette@gmail.com
@@ -256,7 +256,7 @@ public Object doInConnection(Connection conn) throws SQLException, DataAccessExc
} catch (Exception e) {
throw new ODKTaskLockException(PERSISTENCE_LAYER_PROBLEM, e);
}
- return (TaskLockTable) datastore.getEntity(relation, entity.getUri(), user);
+ return datastore.getEntity(relation, entity.getUri(), user);
}
@Override
diff --git a/src/main/java/org/opendatakit/common/persistence/engine/sqlserver/DatastoreImpl.java b/src/main/java/org/opendatakit/common/persistence/engine/sqlserver/DatastoreImpl.java
deleted file mode 100644
index b91a21b89..000000000
--- a/src/main/java/org/opendatakit/common/persistence/engine/sqlserver/DatastoreImpl.java
+++ /dev/null
@@ -1,1298 +0,0 @@
-/**
- * Copyright (C) 2010 University of Washington
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package org.opendatakit.common.persistence.engine.sqlserver;
-
-import java.math.BigDecimal;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-
-import javax.sql.DataSource;
-
-import org.apache.commons.logging.LogFactory;
-import org.opendatakit.common.persistence.CommonFieldsBase;
-import org.opendatakit.common.persistence.DataField;
-import org.opendatakit.common.persistence.DataField.DataType;
-import org.opendatakit.common.persistence.DataField.IndexType;
-import org.opendatakit.common.persistence.Datastore;
-import org.opendatakit.common.persistence.EntityKey;
-import org.opendatakit.common.persistence.PersistConsts;
-import org.opendatakit.common.persistence.Query;
-import org.opendatakit.common.persistence.Query.FilterOperation;
-import org.opendatakit.common.persistence.TaskLock;
-import org.opendatakit.common.persistence.WrappedBigDecimal;
-import org.opendatakit.common.persistence.engine.DatastoreAccessMetrics;
-import org.opendatakit.common.persistence.exception.ODKDatastoreException;
-import org.opendatakit.common.persistence.exception.ODKEntityNotFoundException;
-import org.opendatakit.common.persistence.exception.ODKEntityPersistException;
-import org.opendatakit.common.security.User;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.jdbc.core.BatchPreparedStatementSetter;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.PreparedStatementSetter;
-import org.springframework.jdbc.core.RowMapper;
-import org.springframework.jdbc.core.SqlParameterValue;
-import org.springframework.jdbc.datasource.DataSourceTransactionManager;
-import org.springframework.transaction.TransactionStatus;
-import org.springframework.transaction.support.DefaultTransactionDefinition;
-
-/**
- *
- * @author wbrunette@gmail.com
- * @author mitchellsundt@gmail.com
- *
- */
-public class DatastoreImpl implements Datastore, InitializingBean {
-
- private static final boolean logBindDetails = false;
-
- // SQL Server has a 116-character limit in column names.
- // limit to two for future uses
- private static final int MAX_COLUMN_NAME_LEN = 114;
- // and the same limit applies to table names.
- private static final int MAX_TABLE_NAME_LEN = 112; // reserve 4 char for idx
- // name
-
- static final long MAX_IN_ROW_NVARCHAR = 4000L;
-
- // limit on SqlServer capacity (minus about 100 for where clause filters)
- private static final int MAX_BIND_PARAMS = 2000;
-
- static final String PATTERN_ISO8601_NO_ZONE = "yyyy-MM-dd'T'HH:mm:ss.SSS";
-
- // limit to 256MB blob size; don't know the impact of this...
- private static final Long MAX_BLOB_SIZE = 65536 * 4096L;
-
- private final DatastoreAccessMetrics dam = new DatastoreAccessMetrics();
- private DataSource dataSource = null;
- private DataSourceTransactionManager tm = null;
-
- private String schemaName = null;
-
- public DatastoreImpl() throws ODKDatastoreException {
- }
-
- public void setDataSource(DataSource dataSource) {
- this.dataSource = dataSource;
- this.tm = new DataSourceTransactionManager(dataSource);
- }
-
- public void setSchemaName(String schemaName) {
- this.schemaName = schemaName;
- }
-
- @Override
- public void afterPropertiesSet() throws Exception {
- if (dataSource == null) {
- throw new IllegalStateException("dataSource property must be set!");
- }
- if (schemaName == null) {
- JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
- List> databaseNames = jdbcTemplate.queryForList("SELECT current_database()", String.class);
- schemaName = (String) databaseNames.get(0);
- }
- }
-
- public static final String K_CREATE_TABLE = "CREATE TABLE ";
- public static final String K_DROP_TABLE = "DROP TABLE ";
-
- public static final String K_OPEN_PAREN = " ( ";
- public static final String K_CLOSE_PAREN = " ) ";
- public static final String K_SELECT = "SELECT ";
- public static final String K_SELECT_DISTINCT = "SELECT DISTINCT ";
- public static final String K_CS = ", ";
- public static final String K_COLON = ";";
- public static final String K_BQ = "\"";
- public static final String K_FROM = " FROM ";
- public static final String K_WHERE = " WHERE ";
- public static final String K_AND = " AND ";
- public static final String K_IS_NULL = " IS NULL";
- public static final String K_EQ_NULL = " = NULL";
- private static final String K_NULL = " NULL ";
- private static final String K_NOT_NULL = " NOT NULL ";
- public static final String K_EQ = " = ";
- public static final String K_BIND_VALUE = "?";
- public static final String K_CREATE_CLUSTERED_INDEX = "CREATE CLUSTERED INDEX ";
- public static final String K_CREATE_NONCLUSTERED_INDEX = "CREATE NONCLUSTERED INDEX ";
- public static final String K_ON = " ON ";
- public static final String K_INSERT_INTO = "INSERT INTO ";
- public static final String K_VALUES = " VALUES ";
- public static final String K_UPDATE = "UPDATE ";
- public static final String K_SET = " SET ";
- public static final String K_DELETE_FROM = "DELETE FROM ";
-
- public static final Integer DEFAULT_DBL_NUMERIC_SCALE = 10;
- public static final Integer DEFAULT_DBL_NUMERIC_PRECISION = 38;
- public static final Integer DEFAULT_INT_NUMERIC_PRECISION = 9;
-
- private static final class TableDefinition {
-
- public DataField.DataType getDataType() {
- return dataType;
- }
-
- public void setDataType(DataField.DataType dataType) {
- this.dataType = dataType;
- }
-
- public String getColumnName() {
- return columnName;
- }
-
- public boolean isNullable() {
- return isNullable;
- }
-
- public Long getMaxCharLen() {
- return maxCharLen;
- }
-
- public Integer getNumericScale() {
- return numericScale;
- }
-
- public Integer getNumericPrecision() {
- return numericPrecision;
- }
-
- public boolean isDoublePrecision() {
- return isDoublePrecision;
- }
-
- public static final String COLUMN_NAME = "column_name";
- public static final String CHARACTER_MAXIMUM_LENGTH = "character_maximum_length";
- public static final String NUMERIC_PRECISION = "numeric_precision";
- public static final String NUMERIC_SCALE = "numeric_scale";
- public static final String DATA_TYPE = "data_type";
- public static final String IS_NULLABLE = "is_nullable";
- public static final String INFORMATION_SCHEMA_COLUMNS = "sys.columns_join_for_table_def_query";
-
- public static final String TABLE_DEF_FROM_WHERE_CLAUSE = " from sys.columns c, sys.types t, sys.tables tn, sys.schemas s where "
- + "c.object_id = tn.object_id and tn.schema_id = s.schema_id and "
- + "c.system_type_id = t.system_type_id and c.user_type_id = t.user_type_id and "
- + " s.name = " + K_BIND_VALUE + " and tn.name = " + K_BIND_VALUE;
-
- public static final String TABLE_DEF_QUERY = "select s.name as \"schema_name\", tn.name as table_name, c.name as column_name, "
- + "c.is_nullable, c.max_length as \"character_maximum_length\", "
- + "c.precision as \"numeric_precision\", c.scale as \"numeric_scale\", t.name as \"data_type\" "
- + TABLE_DEF_FROM_WHERE_CLAUSE;
-
- public static final String TABLE_EXISTS_QUERY = "select count(1) "
- + TABLE_DEF_FROM_WHERE_CLAUSE;
-
- private static final String BIT = "bit";
-
- private static final String VARBINARY = "varbinary";
-
- private static final String TEXT = "text"; // lower case!
- private static final String CHAR = "char";
-
- private static final String DATE = "date";
- private static final String TIME = "time";
-
- private static final String INT = "int";
- private static final String FLOAT = "float";
-
- private String columnName;
- private boolean isNullable;
- private Long maxCharLen = null;
- private Integer numericScale = null;
- private Integer numericPrecision = null;
- private boolean isDoublePrecision = false;
- private DataField.DataType dataType;
-
- TableDefinition(ResultSet rs) throws SQLException {
- columnName = rs.getString(COLUMN_NAME);
- int i = rs.getInt(IS_NULLABLE);
- isNullable = (i == 1);
- isDoublePrecision = false;
-
- String type = rs.getString(DATA_TYPE);
- BigDecimal num = rs.getBigDecimal(CHARACTER_MAXIMUM_LENGTH);
-
- if (type.equalsIgnoreCase(BIT)) {
- // bit -- boolean
- dataType = DataField.DataType.BOOLEAN;
-
- } else if (type.equalsIgnoreCase(VARBINARY)) {
- // blob
- dataType = DataField.DataType.BINARY;
- maxCharLen = num.longValueExact();
- // limit to a smaller size than 2GB
- if (maxCharLen < 0L || maxCharLen > MAX_BLOB_SIZE) {
- maxCharLen = MAX_BLOB_SIZE;
- }
-
- } else if (type.contains(TEXT) || type.contains(CHAR)) {
- // some sort of text field
- maxCharLen = num.longValueExact();
- // limit to a smaller size than 2GB
- if (maxCharLen < 0L || maxCharLen > MAX_BLOB_SIZE) {
- maxCharLen = MAX_BLOB_SIZE;
- }
-
- if (type.startsWith("n")) {
- // actual number of UTF-8 chars is one half storage size
- maxCharLen = maxCharLen / 2L;
- }
-
- if (maxCharLen.compareTo(MAX_IN_ROW_NVARCHAR) <= 0) {
- dataType = DataField.DataType.STRING;
- } else {
- dataType = DataField.DataType.LONG_STRING;
- }
-
- } else if (type.contains(DATE) || type.contains(TIME)) {
- // holds a timestamp
- dataType = DataField.DataType.DATETIME;
-
- } else if (type.contains(INT)) {
- // some form of integer
- dataType = DataField.DataType.INTEGER;
- numericScale = 0;
- numericPrecision = rs.getBigDecimal(NUMERIC_PRECISION).intValueExact();
-
- } else {
- // must be numeric...
- if (type.contains(FLOAT)) {
-
- dataType = DataField.DataType.DECIMAL;
- numericScale = null;
- num = rs.getBigDecimal(NUMERIC_PRECISION);
- numericPrecision = num.intValueExact();
- isDoublePrecision = true;
-
- } else {
-
- num = rs.getBigDecimal(NUMERIC_SCALE);
- if (num == null) {
- throw new IllegalArgumentException("unrecognized data type in schema: " + type);
- } else {
- // discriminate between decimal and integer by looking at value...
- // We assume that nobody is going crazy with the scale here...
- if (BigDecimal.ZERO.equals(num)) {
- dataType = DataField.DataType.INTEGER;
- numericScale = 0;
- } else {
- numericScale = num.intValueExact();
- dataType = DataField.DataType.DECIMAL;
- }
- num = rs.getBigDecimal(NUMERIC_PRECISION);
- numericPrecision = num.intValueExact();
- }
- }
- }
- }
- }
-
- private static RowMapper tableDef = new RowMapper() {
- @Override
- public TableDefinition mapRow(ResultSet rs, int rowNum) throws SQLException {
- return new TableDefinition(rs);
- }
- };
-
- static SqlParameterValue getBindValue(DataField f, Object value) {
- switch (f.getDataType()) {
- case BOOLEAN:
- if ( value == null ) {
- return new SqlParameterValue(java.sql.Types.BIT, null);
- } else if ( value instanceof Boolean ) {
- return new SqlParameterValue(java.sql.Types.BIT, (((Boolean) value) ? 1 : 0));
- } else {
- Boolean b = Boolean.valueOf(value.toString());
- return new SqlParameterValue(java.sql.Types.BIT, (b ? 1 : 0));
- }
- case STRING:
- case URI:
- if ( value == null ) {
- return new SqlParameterValue(java.sql.Types.NVARCHAR, null);
- } else {
- return new SqlParameterValue(java.sql.Types.NVARCHAR, value.toString());
- }
- case INTEGER:
- if ( value == null ) {
- return new SqlParameterValue(java.sql.Types.BIGINT, null);
- } else if ( value instanceof Long ) {
- return new SqlParameterValue(java.sql.Types.BIGINT, (Long) value);
- } else {
- Long l = Long.valueOf(value.toString());
- return new SqlParameterValue(java.sql.Types.BIGINT, l);
- }
- case DECIMAL: {
- if ( value == null ) {
- // nulls may not go through as DECIMAL -- assert they are strings
- return new SqlParameterValue(java.sql.Types.NVARCHAR, null);
- } else {
- WrappedBigDecimal wbd;
- if ( value instanceof WrappedBigDecimal ) {
- wbd = (WrappedBigDecimal) value;
- } else {
- wbd = new WrappedBigDecimal(value.toString());
- }
- if ( wbd.isSpecialValue() ) {
- return new SqlParameterValue(java.sql.Types.DOUBLE, wbd.d);
- } else {
- return new SqlParameterValue(java.sql.Types.DECIMAL, wbd.bd);
- }
- }
- }
- case DATETIME: {
- // This doesn't like TIMESTAMP data type
- if ( value == null ) {
- return new SqlParameterValue(java.sql.Types.TIMESTAMP, null);
- } else if ( value instanceof Date ) {
- // This doesn't like TIMESTAMP data type
- Date v = (Date) value;
- String dateTime = null;
- if (v != null) {
- SimpleDateFormat asGMTiso8601 = new SimpleDateFormat(DatastoreImpl.PATTERN_ISO8601_NO_ZONE);
- asGMTiso8601.setTimeZone(TimeZone.getTimeZone("GMT"));
- dateTime = asGMTiso8601.format(v);
- }
- return new SqlParameterValue(java.sql.Types.TIMESTAMP, dateTime);
- } else {
- throw new IllegalArgumentException("expected Date for DATETIME bind parameter");
- }
- }
- case BINARY:
- if ( value == null ) {
- return new SqlParameterValue(java.sql.Types.LONGVARBINARY, null);
- } else if ( value instanceof byte[] ) {
- return new SqlParameterValue(java.sql.Types.LONGVARBINARY, value);
- } else {
- throw new IllegalArgumentException("expected byte[] for BINARY bind parameter");
- }
- case LONG_STRING:
- if ( value == null ) {
- return new SqlParameterValue(java.sql.Types.LONGNVARCHAR, null);
- } else {
- return new SqlParameterValue(java.sql.Types.LONGNVARCHAR, value.toString());
- }
-
- default:
- throw new IllegalStateException("Unexpected data type");
- }
- }
-
- public static void buildArgumentList(List pv, CommonFieldsBase entity,
- DataField f) {
- switch (f.getDataType()) {
- case BOOLEAN:
- pv.add(getBindValue(f, entity.getBooleanField(f)));
- break;
- case STRING:
- case URI:
- pv.add(getBindValue(f, entity.getStringField(f)));
- break;
- case INTEGER:
- pv.add(getBindValue(f, entity.getLongField(f)));
- break;
- case DECIMAL:
- pv.add(getBindValue(f, entity.getNumericField(f)));
- break;
- case DATETIME:
- pv.add(getBindValue(f, entity.getDateField(f)));
- break;
- case BINARY:
- pv.add(getBindValue(f, entity.getBlobField(f)));
- break;
- case LONG_STRING:
- pv.add(getBindValue(f, entity.getStringField(f)));
- break;
-
- default:
- throw new IllegalStateException("Unexpected data type");
- }
- }
-
- void recordQueryUsage(CommonFieldsBase relation, int recCount) {
- dam.recordQueryUsage(relation, recCount);
- }
-
- @Override
- public String getDefaultSchemaName() {
- return schemaName;
- }
-
- JdbcTemplate getJdbcConnection() {
- return new JdbcTemplate(dataSource);
- }
-
- @Override
- public int getMaxLenColumnName() {
- return MAX_COLUMN_NAME_LEN;
- }
-
- @Override
- public int getMaxLenTableName() {
- return MAX_TABLE_NAME_LEN;
- }
-
- private final boolean updateRelation(JdbcTemplate jc, CommonFieldsBase relation,
- String originalStatement) {
-
- String qs = TableDefinition.TABLE_DEF_QUERY;
- List> columns;
- columns = jc.query(qs, new Object[] { relation.getSchemaName(), relation.getTableName() },
- tableDef);
- dam.recordQueryUsage(TableDefinition.INFORMATION_SCHEMA_COLUMNS, columns.size());
-
- if (columns.size() > 0) {
- Map map = new HashMap();
- for (Object o : columns) {
- TableDefinition t = (TableDefinition) o;
- map.put(t.getColumnName(), t);
- }
-
- // we may have gotten some results into columns -- go through the fields
- // and
- // assemble the results... we don't care about additional columns in the
- // map...
- for (DataField f : relation.getFieldList()) {
- TableDefinition d = map.get(f.getName());
- if (d == null) {
- StringBuilder b = new StringBuilder();
- if (originalStatement == null) {
- b.append(" Retrieving expected definition (");
- boolean first = true;
- for (DataField field : relation.getFieldList()) {
- if (!first) {
- b.append(K_CS);
- }
- first = false;
- b.append(field.getName());
- }
- b.append(")");
- } else {
- b.append(" Created with: ");
- b.append(originalStatement);
- }
- throw new IllegalStateException(
- "did not find expected column " + f.getName() + " in table "
- + relation.getSchemaName() + "." + relation.getTableName() + b.toString());
- }
- if (f.getDataType() == DataField.DataType.BOOLEAN
- && d.getDataType() == DataField.DataType.STRING) {
- d.setDataType(DataField.DataType.BOOLEAN);
- // don't care about size...
- }
-
- if (d.getDataType() == DataField.DataType.STRING && f.getMaxCharLen() != null
- && f.getMaxCharLen().compareTo(d.getMaxCharLen()) > 0) {
- throw new IllegalStateException("column " + f.getName() + " in table "
- + relation.getSchemaName() + "." + relation.getTableName()
- + " stores string-valued keys but is shorter than required by Aggregate "
- + d.getMaxCharLen().toString() + " < " + f.getMaxCharLen().toString());
- }
-
- if (f.getDataType() == DataField.DataType.URI) {
- if (d.getDataType() != DataField.DataType.STRING) {
- throw new IllegalStateException(
- "column " + f.getName() + " in table " + relation.getSchemaName() + "."
- + relation.getTableName() + " stores URIs but is not a string field");
- }
- d.setDataType(DataField.DataType.URI);
- }
-
- if ((d.getDataType() == DataField.DataType.LONG_STRING)
- && (f.getDataType() == DataField.DataType.STRING)) {
- // we have an overly-large string that needed to be
- // stored as a nvarchar(max) string. This is OK
- } else if (d.getDataType() != f.getDataType()) {
- throw new IllegalStateException("column " + f.getName() + " in table "
- + relation.getSchemaName() + "." + relation.getTableName()
- + " is not of the expected type " + f.getDataType().toString());
- }
-
- // it is OK for the data model to be more strict than the data store.
- if (!d.isNullable() && f.getNullable()) {
- throw new IllegalStateException("column " + f.getName() + " in table "
- + relation.getSchemaName() + "." + relation.getTableName()
- + " is defined as NOT NULL but the data model requires NULL");
- }
- f.setMaxCharLen(d.getMaxCharLen());
- f.setNumericPrecision(d.getNumericPrecision());
- f.setNumericScale(d.getNumericScale());
- f.asDoublePrecision(d.isDoublePrecision());
- }
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Relation manipulation APIs
- */
- @Override
- public void assertRelation(CommonFieldsBase relation, User user) throws ODKDatastoreException {
- JdbcTemplate jc = getJdbcConnection();
- TransactionStatus status = null;
- try {
- DefaultTransactionDefinition paramTransactionDefinition = new DefaultTransactionDefinition();
-
- // do serializable read on the information schema...
- paramTransactionDefinition
- .setIsolationLevel(DefaultTransactionDefinition.ISOLATION_SERIALIZABLE);
- paramTransactionDefinition.setReadOnly(true);
- status = tm.getTransaction(paramTransactionDefinition);
-
- // see if relation already is defined and update it with dimensions...
- if (updateRelation(jc, relation, null)) {
- // it exists -- we're done!
- tm.commit(status);
- status = null;
- return;
- } else {
- tm.commit(status);
- // Try a new transaction to create the table
- paramTransactionDefinition
- .setIsolationLevel(DefaultTransactionDefinition.ISOLATION_SERIALIZABLE);
- paramTransactionDefinition.setReadOnly(false);
- status = tm.getTransaction(paramTransactionDefinition);
-
- // total number of columns must be less than MAX_BIND_PARAMS
- int countColumns = 0;
- // need to create the table...
- StringBuilder b = new StringBuilder();
- b.append(K_CREATE_TABLE);
- b.append(K_BQ);
- b.append(relation.getSchemaName());
- b.append(K_BQ);
- b.append(".");
- b.append(K_BQ);
- b.append(relation.getTableName());
- b.append(K_BQ);
- b.append(K_OPEN_PAREN);
- boolean firstTime = true;
- for (DataField f : relation.getFieldList()) {
- if (!firstTime) {
- b.append(K_CS);
- }
- ++countColumns;
- firstTime = false;
- String nullClause;
- if (f.getNullable()) {
- nullClause = K_NULL;
- } else {
- nullClause = K_NOT_NULL;
- }
-
- b.append(K_BQ);
- b.append(f.getName());
- b.append(K_BQ);
- DataField.DataType type = f.getDataType();
- switch (type) {
- case BINARY:
- b.append(" varbinary(max)").append(nullClause);
- break;
- case LONG_STRING:
- b.append(" nvarchar(max)").append(nullClause);
- break;
- case STRING:
- b.append(" nvarchar(");
- Long len = f.getMaxCharLen();
- if (len == null) {
- len = PersistConsts.DEFAULT_MAX_STRING_LENGTH;
- }
- if (len > MAX_IN_ROW_NVARCHAR) {
- // store value out-of-row
- b.append("max");
- } else {
- b.append(len.toString());
- }
- b.append(K_CLOSE_PAREN).append(nullClause);
- break;
- case BOOLEAN:
- b.append(" bit").append(nullClause);
- break;
- case INTEGER:
- Integer int_digits = f.getNumericPrecision();
- if (int_digits == null) {
- int_digits = DEFAULT_INT_NUMERIC_PRECISION;
- }
-
- if (int_digits.compareTo(9) > 0) {
- b.append(" bigint").append(nullClause);
- } else {
- b.append(" integer").append(nullClause);
- }
- break;
- case DECIMAL:
- if (f == relation.primaryKey) {
- throw new IllegalStateException("cannot use decimal columns as primary keys");
- }
-
- if (f.isDoublePrecision()) {
- b.append(" float(53) ").append(nullClause);
- } else {
- Integer dbl_digits = f.getNumericPrecision();
- Integer dbl_fract = f.getNumericScale();
- if (dbl_digits == null) {
- dbl_digits = DEFAULT_DBL_NUMERIC_PRECISION;
- }
- if (dbl_fract == null) {
- dbl_fract = DEFAULT_DBL_NUMERIC_SCALE;
- }
- b.append(" decimal(");
- b.append(dbl_digits.toString());
- b.append(K_CS);
- b.append(dbl_fract.toString());
- b.append(K_CLOSE_PAREN).append(nullClause);
- }
- break;
- case DATETIME:
- b.append(" datetime2(7)").append(nullClause);
- break;
- case URI:
- b.append(" nvarchar(");
- len = f.getMaxCharLen();
- if (len == null) {
- len = PersistConsts.URI_STRING_LEN;
- }
- b.append(len.toString());
- b.append(")").append(nullClause);
- break;
- }
-
- if (f == relation.primaryKey) {
- b.append(" PRIMARY KEY NONCLUSTERED ");
- }
- }
- b.append(K_CLOSE_PAREN);
-
- if ( countColumns > MAX_BIND_PARAMS ) {
- throw new IllegalArgumentException("Table size exceeds bind parameter limit");
- }
-
- String createTableStmt = b.toString();
- LogFactory.getLog(DatastoreImpl.class).info("Attempting: " + createTableStmt);
-
- jc.execute(createTableStmt);
- LogFactory.getLog(DatastoreImpl.class)
- .info("create table success (before updateRelation): " + relation.getTableName());
-
- boolean alreadyClustered = false;
- String idx;
- // create other indicies
- for (DataField f : relation.getFieldList()) {
- if ((f.getIndexable() != IndexType.NONE) && (f != relation.primaryKey)) {
- idx = relation.getTableName() + "_" + shortPrefix(f.getName());
- alreadyClustered = createIndex(jc, relation, idx, f, alreadyClustered);
- }
- }
-
- // and update the relation with actual dimensions...
- updateRelation(jc, relation, createTableStmt);
- tm.commit(status);
- }
- } catch (Exception e) {
- if (status != null) {
- tm.rollback(status);
- }
- throw new ODKDatastoreException(e);
- }
- }
-
- /**
- * Construct a 3-character or more prefix for use in the index name.
- *
- * @param name
- * @return
- */
- private String shortPrefix(String name) {
- StringBuilder b = new StringBuilder();
- String[] splits = name.split("_");
- for (int i = 0; i < splits.length; ++i) {
- if (splits[i].length() > 0) {
- b.append(splits[i].charAt(0));
- }
- }
- if (b.length() < 3) {
- b.append(Integer.toString(name.length() % 10));
- }
- return b.toString().toLowerCase();
- }
-
- private boolean createIndex(JdbcTemplate jc, CommonFieldsBase tbl, String idxName, DataField field, boolean alreadyClustered) {
- StringBuilder b = new StringBuilder();
-
- if ( field.getDataType() == DataType.DECIMAL ) {
- // don't allow this. It will conflict with our handling of special values.
- throw new IllegalStateException("Cannot index decimal fields");
- }
- // the options are non-clustered or clustered.
- // there can only be one clustered index per table.
- if (field.getIndexable() == IndexType.HASH || alreadyClustered) {
- b.append(K_CREATE_NONCLUSTERED_INDEX);
- } else {
- b.append(K_CREATE_CLUSTERED_INDEX);
- alreadyClustered = true;
- }
- b.append(K_BQ);
- b.append(idxName);
- b.append(K_BQ);
- b.append(K_ON);
- b.append(K_BQ);
- b.append(tbl.getSchemaName());
- b.append(K_BQ);
- b.append(".");
- b.append(K_BQ);
- b.append(tbl.getTableName());
- b.append(K_BQ);
- b.append(" (");
- b.append(K_BQ);
- b.append(field.getName());
- b.append(K_BQ);
- b.append(" )");
-
- jc.execute(b.toString());
- return alreadyClustered;
- }
-
- @Override
- public boolean hasRelation(String schema, String tableName, User user) {
- dam.recordQueryUsage(TableDefinition.INFORMATION_SCHEMA_COLUMNS, 1);
- String qs = TableDefinition.TABLE_EXISTS_QUERY;
- Integer columnCount = getJdbcConnection().queryForObject(qs, new Object[] { schema, tableName },
- Integer.class);
- return (columnCount != null && columnCount != 0);
- }
-
- @Override
- public void dropRelation(CommonFieldsBase relation, User user) throws ODKDatastoreException {
- try {
- StringBuilder b = new StringBuilder();
- b.append(K_DROP_TABLE);
- b.append(K_BQ);
- b.append(relation.getSchemaName());
- b.append(K_BQ);
- b.append(".");
- b.append(K_BQ);
- b.append(relation.getTableName());
- b.append(K_BQ);
-
- LogFactory.getLog(DatastoreImpl.class)
- .info("Executing " + b.toString() + " by user " + user.getUriUser());
- getJdbcConnection().execute(b.toString());
- } catch (Exception e) {
- LogFactory.getLog(DatastoreImpl.class)
- .warn(relation.getTableName() + " exception: " + e.toString());
- throw new ODKDatastoreException(e);
- }
- }
-
- /***************************************************************************
- * Entity manipulation APIs
- *
- */
-
- @SuppressWarnings("unchecked")
- @Override
- public T createEntityUsingRelation(T relation, User user) {
-
- // we are generating our own PK, so we don't need to interact with DB
- // yet...
- T row;
- try {
- row = (T) relation.getEmptyRow(user);
- } catch (Exception e) {
- throw new IllegalArgumentException("failed to create empty row", e);
- }
- return row;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public T getEntity(T relation, String uri, User user)
- throws ODKEntityNotFoundException {
- Query query = new QueryImpl(relation, "getEntity", this, user);
- query.addFilter(relation.primaryKey, FilterOperation.EQUAL, uri);
- dam.recordGetUsage(relation);
- try {
- List extends CommonFieldsBase> results = query.executeQuery();
- if (results == null || results.size() != 1) {
- throw new ODKEntityNotFoundException("Unable to retrieve " + relation.getSchemaName() + "."
- + relation.getTableName() + " key: " + uri);
- }
- return (T) results.get(0);
- } catch (ODKDatastoreException e) {
- throw new ODKEntityNotFoundException("Unable to retrieve " + relation.getSchemaName() + "."
- + relation.getTableName() + " key: " + uri, e);
- }
- }
-
- @Override
- public Query createQuery(CommonFieldsBase relation, String loggingContextTag, User user) {
- Query query = new QueryImpl(relation, loggingContextTag, this, user);
- return query;
- }
-
- private static class ReusableStatementSetter implements PreparedStatementSetter {
-
- String sql = null;
- List argList = null;
-
- ReusableStatementSetter() {
- };
-
- ReusableStatementSetter(String sql, List args) {
- this.sql = sql;
- this.argList = args;
- }
-
- public void setArgList(String sql, List args) {
- this.sql = sql;
- this.argList = args;
- }
-
- private void createLogContent(StringBuilder b, int i, SqlParameterValue arg) {
- b.append("\nbinding[").append(i).append("]: type: ");
- switch ( arg.getSqlType() ) {
- case java.sql.Types.BIT:
- b.append("BIT");
- break;
- case java.sql.Types.BIGINT:
- b.append("BIGINT");
- break;
- case java.sql.Types.DECIMAL:
- b.append("DECIMAL");
- break;
- case java.sql.Types.DOUBLE:
- b.append("DOUBLE");
- break;
- case java.sql.Types.TIMESTAMP:
- b.append("TIMESTAMP");
- break;
- case java.sql.Types.NVARCHAR:
- b.append("NVARCHAR");
- break;
- case java.sql.Types.VARBINARY:
- b.append("VARBINARY");
- break;
- default:
- b.append("**").append(arg.getSqlType()).append("**");
- }
- if ( arg.getValue() == null ) {
- b.append(" is null");
- } else {
- b.append(" = ").append(arg.getValue());
- }
- }
-
- @Override
- public void setValues(PreparedStatement ps) throws SQLException {
- if ( logBindDetails ) {
- StringBuilder b = new StringBuilder();
- b.append(sql);
- for (int i = 0; i < argList.size(); ++i) {
- SqlParameterValue arg = argList.get(i);
- createLogContent(b, i+1, arg);
- }
- LogFactory.getLog(DatastoreImpl.class).info(b.toString());
- }
- for (int i = 0; i < argList.size(); ++i) {
- SqlParameterValue arg = argList.get(i);
- if ((arg.getSqlType() == java.sql.Types.LONGVARBINARY) ||
- (arg.getSqlType() == java.sql.Types.VARBINARY)) {
- if (arg.getValue() == null) {
- ps.setNull(i + 1, arg.getSqlType());
- } else {
- ps.setBytes(i + 1, (byte[]) arg.getValue());
- }
- } else if (arg.getSqlType() == java.sql.Types.TIMESTAMP) {
- // we actually bind an iso8601 string
- if ( arg.getValue() == null ) {
- // seems to require a type vs. Types.NULL
- ps.setNull(i + 1, java.sql.Types.NVARCHAR);
- } else {
- ps.setObject(i + 1, arg.getValue(), java.sql.Types.NVARCHAR);
- }
- } else if (arg.getSqlType() == java.sql.Types.DECIMAL) {
- // nulls don't go through as DECIMAL -- assert they are strings
- if ( arg.getValue() == null ) {
- // DECIMAL seems to require a type but doesn't like itself
- ps.setNull(i + 1, java.sql.Types.NVARCHAR);
- } else {
- ps.setObject(i + 1, arg.getValue(), arg.getSqlType());
- }
- } else if (arg.getValue() == null) {
- ps.setNull(i + 1, arg.getSqlType());
- } else {
- ps.setObject(i + 1, arg.getValue(), arg.getSqlType());
- }
- }
- }
- }
-
- @Override
- public void putEntity(CommonFieldsBase entity, User user) throws ODKEntityPersistException {
- dam.recordPutUsage(entity);
- try {
- boolean first;
- StringBuilder b = new StringBuilder();
- if (entity.isFromDatabase()) {
- // we need to do an update
- entity.setDateField(entity.lastUpdateDate, new Date());
- entity.setStringField(entity.lastUpdateUriUser, user.getUriUser());
-
- b.append(K_UPDATE);
- b.append(K_BQ);
- b.append(entity.getSchemaName());
- b.append(K_BQ);
- b.append(".");
- b.append(K_BQ);
- b.append(entity.getTableName());
- b.append(K_BQ);
- b.append(K_SET);
-
- ArrayList pv = new ArrayList();
-
- first = true;
- // fields...
- for (DataField f : entity.getFieldList()) {
- // primary key goes in the where clause...
- if (f == entity.primaryKey)
- continue;
- if (!first) {
- b.append(K_CS);
- }
- first = false;
- b.append(K_BQ);
- b.append(f.getName());
- b.append(K_BQ);
-
- b.append(K_EQ);
- b.append(K_BIND_VALUE);
- buildArgumentList(pv, entity, f);
- }
- b.append(K_WHERE);
- b.append(K_BQ);
- b.append(entity.primaryKey.getName());
- b.append(K_BQ);
- b.append(K_EQ);
- b.append(K_BIND_VALUE);
- buildArgumentList(pv, entity, entity.primaryKey);
-
- // update...
- String sql = b.toString();
- ReusableStatementSetter setter = new ReusableStatementSetter(sql, pv);
- getJdbcConnection().update(sql, setter);
- } else {
- // not yet in database -- insert
- b.append(K_INSERT_INTO);
- b.append(K_BQ);
- b.append(entity.getSchemaName());
- b.append(K_BQ);
- b.append(".");
- b.append(K_BQ);
- b.append(entity.getTableName());
- b.append(K_BQ);
- first = true;
- b.append(K_OPEN_PAREN);
- // fields...
- for (DataField f : entity.getFieldList()) {
- if (!first) {
- b.append(K_CS);
- }
- first = false;
- b.append(K_BQ);
- b.append(f.getName());
- b.append(K_BQ);
- }
- b.append(K_CLOSE_PAREN);
- b.append(K_VALUES);
-
- ArrayList pv = new ArrayList();
-
- first = true;
- b.append(K_OPEN_PAREN);
- // fields...
- for (DataField f : entity.getFieldList()) {
- if (!first) {
- b.append(K_CS);
- }
- first = false;
- b.append(K_BIND_VALUE);
- buildArgumentList(pv, entity, f);
- }
- b.append(K_CLOSE_PAREN);
-
- // insert...
- String sql = b.toString();
- ReusableStatementSetter setter = new ReusableStatementSetter(sql, pv);
- getJdbcConnection().update(sql, setter);
- entity.setFromDatabase(true); // now it is in the database...
- }
- } catch (Exception e) {
- throw new ODKEntityPersistException(e);
- }
- }
-
- @Override
- public void putEntities(Collection extends CommonFieldsBase> entityList, User user)
- throws ODKEntityPersistException {
- for (CommonFieldsBase d : entityList) {
- putEntity(d, user);
- }
- }
-
- private static final class BatchStatementFieldSetter implements BatchPreparedStatementSetter {
-
- final String sql;
- final List > batchArgs;
- ReusableStatementSetter setter = new ReusableStatementSetter();
-
- BatchStatementFieldSetter(String sql, List > batchArgs) {
- this.sql = sql;
- this.batchArgs = batchArgs;
- }
-
- @Override
- public int getBatchSize() {
- return batchArgs.size();
- }
-
- @Override
- public void setValues(PreparedStatement ps, int idx) throws SQLException {
- List argArray = batchArgs.get(idx);
- setter.setArgList(sql, argArray);
- setter.setValues(ps);
- }
- }
-
- @Override
- public void batchAlterData(List extends CommonFieldsBase> changes, User user)
- throws ODKEntityPersistException {
- if (changes.isEmpty()) {
- return;
- }
-
- // we need to be careful -- SqlServer only allows a small number of
- // bind parameters on a request. This severely limits the batch size
- // that can be sent.
- CommonFieldsBase firstEntity = changes.get(0);
- int maxPerBatch = (MAX_BIND_PARAMS / firstEntity.getFieldList().size());
- for ( int idxStart = 0; idxStart < changes.size() ; idxStart += maxPerBatch ) {
- int idxAfterEnd = idxStart + maxPerBatch;
- if ( idxAfterEnd > changes.size() ) {
- idxAfterEnd = changes.size();
- }
- partialBatchAlterData(changes, idxStart, idxAfterEnd, user);
- }
-
- }
-
- private void partialBatchAlterData(List extends CommonFieldsBase> allChanges,
- int idxStart, int idxAfterEnd, User user)
- throws ODKEntityPersistException {
- if (allChanges.isEmpty()) {
- return;
- }
-
- boolean generateSQL = true;
- String sql = null;
- List > batchArgs = new ArrayList >();
- StringBuilder b = new StringBuilder();
-
- for (int idx = idxStart ; idx < idxAfterEnd ; ++idx ) {
- CommonFieldsBase entity = allChanges.get(idx);
- dam.recordPutUsage(entity);
-
- boolean first;
- b.setLength(0);
-
- ArrayList pv = new ArrayList();
-
- if (entity.isFromDatabase()) {
- // we need to do an update
- entity.setDateField(entity.lastUpdateDate, new Date());
- entity.setStringField(entity.lastUpdateUriUser, user.getUriUser());
-
- if (generateSQL) {
- b.append(K_UPDATE);
- b.append(K_BQ);
- b.append(entity.getSchemaName());
- b.append(K_BQ);
- b.append(".");
- b.append(K_BQ);
- b.append(entity.getTableName());
- b.append(K_BQ);
- b.append(K_SET);
- }
-
- first = true;
- // fields...
- for (DataField f : entity.getFieldList()) {
- // primary key goes in the where clause...
- if (f == entity.primaryKey)
- continue;
-
- if (generateSQL) {
- if (!first) {
- b.append(K_CS);
- }
- first = false;
- b.append(K_BQ);
- b.append(f.getName());
- b.append(K_BQ);
- b.append(K_EQ);
- b.append(K_BIND_VALUE);
- }
-
- buildArgumentList(pv, entity, f);
- }
- if (generateSQL) {
- b.append(K_WHERE);
- b.append(K_BQ);
- b.append(entity.primaryKey.getName());
- b.append(K_BQ);
- b.append(K_EQ);
- b.append(K_BIND_VALUE);
- }
- buildArgumentList(pv, entity, entity.primaryKey);
-
- } else {
- if (generateSQL) {
- // not yet in database -- insert
- b.append(K_INSERT_INTO);
- b.append(K_BQ);
- b.append(entity.getSchemaName());
- b.append(K_BQ);
- b.append(".");
- b.append(K_BQ);
- b.append(entity.getTableName());
- b.append(K_BQ);
- first = true;
- b.append(K_OPEN_PAREN);
- // fields...
- for (DataField f : entity.getFieldList()) {
- if (!first) {
- b.append(K_CS);
- }
- first = false;
- b.append(K_BQ);
- b.append(f.getName());
- b.append(K_BQ);
- }
- b.append(K_CLOSE_PAREN);
- b.append(K_VALUES);
- b.append(K_OPEN_PAREN);
- }
-
- first = true;
- // fields...
- for (DataField f : entity.getFieldList()) {
- if (generateSQL) {
- if (!first) {
- b.append(K_CS);
- }
- first = false;
- b.append(K_BIND_VALUE);
- }
- buildArgumentList(pv, entity, f);
- }
-
- if (generateSQL) {
- b.append(K_CLOSE_PAREN);
- }
- }
-
- if (generateSQL) {
- b.append(K_COLON);
- sql = b.toString();
- }
- generateSQL = false;
- batchArgs.add(pv);
- }
-
- try {
- // update...
- BatchStatementFieldSetter setter = new BatchStatementFieldSetter(sql, batchArgs);
- getJdbcConnection().batchUpdate(sql, setter);
-
- // if this was an insert, set the fromDatabase flag in the entities
- if (!allChanges.get(0).isFromDatabase()) {
- for (int idx = idxStart ; idx < idxAfterEnd ; ++idx ) {
- CommonFieldsBase entity = allChanges.get(idx);
- entity.setFromDatabase(true);
- }
- }
- } catch (Exception e) {
- throw new ODKEntityPersistException(e);
- }
- }
-
- @Override
- public void deleteEntity(EntityKey key, User user) throws ODKDatastoreException {
-
- dam.recordDeleteUsage(key);
- try {
- CommonFieldsBase d = key.getRelation();
-
- StringBuilder b = new StringBuilder();
- b.append(K_DELETE_FROM);
- b.append(K_BQ);
- b.append(d.getSchemaName());
- b.append(K_BQ);
- b.append(".");
- b.append(K_BQ);
- b.append(d.getTableName());
- b.append(K_BQ);
- b.append(K_WHERE);
- b.append(K_BQ);
- b.append(d.primaryKey.getName());
- b.append(K_BQ);
- b.append(K_EQ);
- b.append(K_BIND_VALUE);
-
- LogFactory.getLog(DatastoreImpl.class).info("Executing " + b.toString() + " with key "
- + key.getKey() + " by user " + user.getUriUser());
- getJdbcConnection().update(b.toString(), new Object[] { key.getKey() });
- } catch (Exception e) {
- throw new ODKDatastoreException("delete failed", e);
- }
- }
-
- @Override
- public void deleteEntities(Collection keys, User user) throws ODKDatastoreException {
- ODKDatastoreException e = null;
- for (EntityKey k : keys) {
- try {
- deleteEntity(k, user);
- } catch (ODKDatastoreException ex) {
- ex.printStackTrace();
- if (e == null) {
- e = ex; // save the first exception...
- }
- }
- }
- if (e != null)
- throw e; // throw the first exception...
- }
-
- @Override
- public TaskLock createTaskLock(User user) {
- return new TaskLockImpl(this, dam, user);
- }
-}
diff --git a/src/main/java/org/opendatakit/common/persistence/engine/sqlserver/QueryImpl.java b/src/main/java/org/opendatakit/common/persistence/engine/sqlserver/QueryImpl.java
deleted file mode 100644
index 7e07bbf7e..000000000
--- a/src/main/java/org/opendatakit/common/persistence/engine/sqlserver/QueryImpl.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/**
- * Copyright (C) 2010 University of Washington
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package org.opendatakit.common.persistence.engine.sqlserver;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.opendatakit.common.persistence.CommonFieldsBase;
-import org.opendatakit.common.persistence.DataField;
-import org.opendatakit.common.persistence.EntityKey;
-import org.opendatakit.common.persistence.Query;
-import org.opendatakit.common.persistence.QueryResult;
-import org.opendatakit.common.persistence.QueryResumePoint;
-import org.opendatakit.common.persistence.engine.EngineUtils;
-import org.opendatakit.common.persistence.exception.ODKDatastoreException;
-import org.opendatakit.common.security.User;
-import org.springframework.jdbc.core.ResultSetExtractor;
-import org.springframework.jdbc.core.RowMapper;
-
-/**
- *
- * @author wbrunette@gmail.com
- * @author mitchellsundt@gmail.com
- *
- */
-public class QueryImpl implements Query {
-
- private static final String K_IS_NULL = " IS NULL ";
- private static final String K_IS_NOT_NULL = " IS NOT NULL ";
- private static final String K_SELECT = "SELECT ";
- private static final String K_SELECT_DISTINCT = "SELECT DISTINCT ";
- private static final String K_BQ = "\"";
- private static final String K_CS = ", ";
- private static final String K_FROM = " FROM ";
- private static final String K_WHERE = " WHERE ";
- private static final String K_AND = " AND ";
- private static final String K_IN_OPEN = " IN (";
- private static final String K_IN_CLOSE = ")";
- private static final String K_BIND_VALUE = " ? ";
- private static final String K_ORDER_BY = " ORDER BY ";
-
- private static Map operationMap = new HashMap();
- private static Map directionMap = new HashMap();
-
- static {
- operationMap.put(FilterOperation.EQUAL, " = ");
- operationMap.put(FilterOperation.NOT_EQUAL, " <> ");
- operationMap.put(FilterOperation.GREATER_THAN, " > ");
- operationMap.put(FilterOperation.GREATER_THAN_OR_EQUAL, " >= ");
- operationMap.put(FilterOperation.LESS_THAN, " < ");
- operationMap.put(FilterOperation.LESS_THAN_OR_EQUAL, " <= ");
-
- directionMap.put(Direction.ASCENDING, " ASC ");
- directionMap.put(Direction.DESCENDING, " DESC ");
- }
-
- private final CommonFieldsBase relation;
- private final DatastoreImpl dataStoreImpl;
- private final User user;
-
- private DataField dominantSortAttr = null;
- private Direction dominantSortDirection = null;
- private boolean isSortedByUri = false;
-
- private final StringBuilder queryBindBuilder = new StringBuilder();
- private final List