From 240f1a781cb951ec93852230fa4ce14206b0294d Mon Sep 17 00:00:00 2001 From: Murray Cumming Date: Wed, 25 Apr 2012 12:43:28 +0200 Subject: [PATCH] Add a Field class and implement some loading of it in Document. --- ChangeLog | 4 ++ .../org/glom/web/server/ConfiguredDocument.java | 18 ++--- src/main/java/org/glom/web/server/SqlUtils.java | 5 +- src/main/java/org/glom/web/server/Utils.java | 14 ++-- .../org/glom/web/server/database/DBAccess.java | 8 +-- .../glom/web/server/database/DetailsDBAccess.java | 2 +- .../web/server/database/RelatedListDBAccess.java | 6 +- .../web/server/database/RelatedListNavigation.java | 4 +- .../java/org/glom/web/shared/libglom/Document.java | 84 ++++++++++++++++------ .../java/org/glom/web/shared/libglom/Field.java | 41 +++++++++++ .../java/org/glom/web/shared/libglom/Report.java | 1 - .../org/glom/web/shared/libglom/Translatable.java | 32 ++++++++- .../org/glom/web/shared/libglom/DocumentTest.java | 6 +- 13 files changed, 168 insertions(+), 57 deletions(-) create mode 100644 src/main/java/org/glom/web/shared/libglom/Field.java diff --git a/ChangeLog b/ChangeLog index ad5bfb4..81de03d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2012-04-25 Murray Cumming + Add a Field class and implement some loading of it in Document. + +2012-04-25 Murray Cumming + Initial Document loading implementation, instead of libglom. * src/test/java/org/glom/web/shared/libglom/: Add Document, Report, diff --git a/src/main/java/org/glom/web/server/ConfiguredDocument.java b/src/main/java/org/glom/web/server/ConfiguredDocument.java index ccec2e1..fd0aa83 100644 --- a/src/main/java/org/glom/web/server/ConfiguredDocument.java +++ b/src/main/java/org/glom/web/server/ConfiguredDocument.java @@ -23,11 +23,12 @@ import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.Locale; import org.apache.commons.lang3.StringUtils; -import org.glom.libglom.Field; -import org.glom.libglom.FieldVector; +import org.glom.libglom.Field.glom_field_type; import org.glom.libglom.LayoutGroupVector; import org.glom.libglom.LayoutItemVector; import org.glom.libglom.LayoutItem_CalendarPortal; @@ -54,6 +55,7 @@ import org.glom.web.shared.layout.LayoutItemField; import org.glom.web.shared.layout.LayoutItemNotebook; import org.glom.web.shared.layout.LayoutItemPortal; import org.glom.web.shared.libglom.Document; +import org.glom.web.shared.libglom.Field; import org.glom.web.shared.libglom.Report; import com.mchange.v2.c3p0.ComboPooledDataSource; @@ -244,7 +246,7 @@ final class ConfiguredDocument { Log.info(documentID, tableName, "A list layout is not defined for this table. Displaying a list layout based on the field list."); - final FieldVector fieldsVec = document.get_table_fields(tableName); + final List fieldsVec = document.get_table_fields(tableName); libglomLayoutGroup = new org.glom.libglom.LayoutGroup(); for (int i = 0; i < fieldsVec.size(); i++) { final Field field = fieldsVec.get(i); @@ -394,7 +396,7 @@ final class ConfiguredDocument { // Add a LayoutItemField for the primary key to the end of the item list in the LayoutGroup because it // doesn't already contain a primary key. Field primaryKey = null; - final FieldVector fieldsVec = document.get_table_fields(tableName); + final List fieldsVec = document.get_table_fields(tableName); for (int i = 0; i < Utils.safeLongToInt(fieldsVec.size()); i++) { final Field field = fieldsVec.get(i); if (field.get_primary_key()) { @@ -595,7 +597,7 @@ final class ConfiguredDocument { if (!StringUtils.isEmpty(toTableName)) { // get the LayoutItem_Feild with details from its Field in the document - final FieldVector fields = document.get_table_fields(toTableName); + final List fields = document.get_table_fields(toTableName); numItems = fields.size(); // reuse loop variable from above for (int i = 0; i < numItems; i++) { final Field field = fields.get(i); @@ -694,8 +696,8 @@ final class ConfiguredDocument { * Field.glom_field_type enum with RPC. An enum identical to Formatting.glom_field_type is included in the * ColumnInfo class. */ - private LayoutItemField.GlomFieldType convertToGWTGlomFieldType(final Field.glom_field_type type) { - switch (type) { + private LayoutItemField.GlomFieldType convertToGWTGlomFieldType(final glom_field_type glom_field_type) { + switch (glom_field_type) { case TYPE_BOOLEAN: return LayoutItemField.GlomFieldType.TYPE_BOOLEAN; case TYPE_DATE: @@ -713,7 +715,7 @@ final class ConfiguredDocument { return LayoutItemField.GlomFieldType.TYPE_INVALID; default: Log.error("Recieved a type that I don't know about: " + Field.glom_field_type.class.getName() + "." - + type.toString() + ". Returning " + LayoutItemField.GlomFieldType.TYPE_INVALID.toString() + "."); + + glom_field_type.toString() + ". Returning " + LayoutItemField.GlomFieldType.TYPE_INVALID.toString() + "."); return LayoutItemField.GlomFieldType.TYPE_INVALID; } } diff --git a/src/main/java/org/glom/web/server/SqlUtils.java b/src/main/java/org/glom/web/server/SqlUtils.java index 13d02c0..2ffc862 100644 --- a/src/main/java/org/glom/web/server/SqlUtils.java +++ b/src/main/java/org/glom/web/server/SqlUtils.java @@ -24,8 +24,6 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.glom.libglom.Field; -import org.glom.libglom.FieldVector; import org.glom.libglom.LayoutFieldVector; import org.glom.libglom.LayoutItem_Field; import org.glom.libglom.Relationship; @@ -33,6 +31,7 @@ import org.glom.libglom.SortClause; import org.glom.libglom.SortFieldPair; import org.glom.libglom.Value; import org.glom.web.shared.libglom.Document; +import org.glom.web.shared.libglom.Field; import org.jooq.AggregateFunction; import org.jooq.Condition; import org.jooq.SQLDialect; @@ -545,7 +544,7 @@ public class SqlUtils { Condition condition = null; // TODO: Cache the list of all fields, as well as caching (m_Fields) the list of all visible fields: - final FieldVector fields = document.get_table_fields(tableName); + final List fields = document.get_table_fields(tableName); final int fieldsSize = Utils.safeLongToInt(fields.size()); for (int i = 0; i < fieldsSize; i++) { diff --git a/src/main/java/org/glom/web/server/Utils.java b/src/main/java/org/glom/web/server/Utils.java index f9c3c2f..0d79356 100644 --- a/src/main/java/org/glom/web/server/Utils.java +++ b/src/main/java/org/glom/web/server/Utils.java @@ -21,10 +21,10 @@ package org.glom.web.server; import java.io.File; -import org.glom.libglom.Field.glom_field_type; import org.glom.libglom.Value; import org.glom.web.shared.TypedDataItem; import org.glom.web.shared.layout.LayoutItemField.GlomFieldType; +import org.glom.web.shared.libglom.Field; /** * @@ -49,10 +49,10 @@ public class Utils { } public static Value getGlomTypeGdaValueForTypedDataItem(String documentID, String tableName, - glom_field_type glomType, TypedDataItem dataItem) { + Field.glom_field_type glom_field_type, TypedDataItem dataItem) { Value gdaValue = null; - switch (glomType) { + switch (glom_field_type) { case TYPE_NUMERIC: if (dataItem.isEmpty()) { @@ -80,7 +80,7 @@ public class Utils { } else { // non-empty data, mis-matched types: // Don't use the data when the type doesn't match the type from the Glom document. - logTypeMismatchError(documentID, tableName, glomType, dataItem); + logTypeMismatchError(documentID, tableName, glom_field_type, dataItem); gdaValue = new Value(); // an empty Value } break; @@ -105,13 +105,13 @@ public class Utils { } else { // non-empty data, mis-matched types: // Don't use the primary key value when the type doesn't match the type from the Glom document. - logTypeMismatchError(documentID, tableName, glomType, dataItem); + logTypeMismatchError(documentID, tableName, glom_field_type, dataItem); gdaValue = new Value(""); // an emtpy string Value } break; default: - Log.error(documentID, tableName, "Unable to create a Gda Value of type: " + glomType + Log.error(documentID, tableName, "Unable to create a Gda Value of type: " + glom_field_type + " based on data of type: " + dataItem.getType() + "."); Log.warn(documentID, tableName, "The data item is being ignored. This is a Bug."); gdaValue = new Value(); // an empty Value @@ -121,7 +121,7 @@ public class Utils { return gdaValue; } - private static void logTypeMismatchError(String documentID, String tableName, glom_field_type glomType, + private static void logTypeMismatchError(String documentID, String tableName, Field.glom_field_type glomType, TypedDataItem dataItem) { String dataItemString; diff --git a/src/main/java/org/glom/web/server/database/DBAccess.java b/src/main/java/org/glom/web/server/database/DBAccess.java index 9447563..2d56e96 100644 --- a/src/main/java/org/glom/web/server/database/DBAccess.java +++ b/src/main/java/org/glom/web/server/database/DBAccess.java @@ -25,10 +25,9 @@ import java.sql.SQLException; import java.sql.Time; import java.text.DateFormat; import java.util.ArrayList; +import java.util.List; import java.util.Locale; -import org.glom.libglom.Field; -import org.glom.libglom.FieldVector; import org.glom.libglom.LayoutFieldVector; import org.glom.libglom.LayoutGroupVector; import org.glom.libglom.LayoutItem; @@ -39,6 +38,7 @@ import org.glom.web.server.Log; import org.glom.web.server.Utils; import org.glom.web.shared.DataItem; import org.glom.web.shared.libglom.Document; +import org.glom.web.shared.libglom.Field; import com.mchange.v2.c3p0.ComboPooledDataSource; @@ -174,7 +174,7 @@ abstract class DBAccess { LayoutItem_Field layoutItemField = LayoutItem_Field.cast_dynamic(layoutItem); if (layoutItemField != null) { // the layoutItem is a LayoutItem_Field - FieldVector fields; + List fields; if (layoutItemField.get_has_relationship_name()) { // layoutItemField is a field in a related table fields = document.get_table_fields(layoutItemField.get_table_used(tableName)); @@ -227,7 +227,7 @@ abstract class DBAccess { */ protected Field getPrimaryKeyField(String tableName) { Field primaryKey = null; - FieldVector fieldsVec = document.get_table_fields(tableName); + List fieldsVec = document.get_table_fields(tableName); for (int i = 0; i < Utils.safeLongToInt(fieldsVec.size()); i++) { Field field = fieldsVec.get(i); if (field.get_primary_key()) { diff --git a/src/main/java/org/glom/web/server/database/DetailsDBAccess.java b/src/main/java/org/glom/web/server/database/DetailsDBAccess.java index fc8b672..752b607 100644 --- a/src/main/java/org/glom/web/server/database/DetailsDBAccess.java +++ b/src/main/java/org/glom/web/server/database/DetailsDBAccess.java @@ -25,7 +25,6 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; -import org.glom.libglom.Field; import org.glom.libglom.LayoutFieldVector; import org.glom.libglom.Value; import org.glom.web.server.Log; @@ -34,6 +33,7 @@ import org.glom.web.server.Utils; import org.glom.web.shared.DataItem; import org.glom.web.shared.TypedDataItem; import org.glom.web.shared.libglom.Document; +import org.glom.web.shared.libglom.Field; import com.mchange.v2.c3p0.ComboPooledDataSource; diff --git a/src/main/java/org/glom/web/server/database/RelatedListDBAccess.java b/src/main/java/org/glom/web/server/database/RelatedListDBAccess.java index 09bcd27..42b03cf 100644 --- a/src/main/java/org/glom/web/server/database/RelatedListDBAccess.java +++ b/src/main/java/org/glom/web/server/database/RelatedListDBAccess.java @@ -21,10 +21,9 @@ package org.glom.web.server.database; import java.sql.Connection; import java.util.ArrayList; +import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.glom.libglom.Field; -import org.glom.libglom.FieldVector; import org.glom.libglom.LayoutGroupVector; import org.glom.libglom.LayoutItem_Portal; import org.glom.libglom.Relationship; @@ -37,6 +36,7 @@ import org.glom.web.shared.DataItem; import org.glom.web.shared.TypedDataItem; import org.jooq.Condition; import org.glom.web.shared.libglom.Document; +import org.glom.web.shared.libglom.Field; import com.mchange.v2.c3p0.ComboPooledDataSource; @@ -185,7 +185,7 @@ public class RelatedListDBAccess extends ListDBAccess { if (StringUtils.isEmpty(tableName)) return null; - final FieldVector fields = document.get_table_fields(tableName); + final List fields = document.get_table_fields(tableName); for (int i = 0; i < fields.size(); i++) { final Field field = fields.get(i); if (fieldName.equals(field.get_name())) { diff --git a/src/main/java/org/glom/web/server/database/RelatedListNavigation.java b/src/main/java/org/glom/web/server/database/RelatedListNavigation.java index 9842a22..9378f93 100644 --- a/src/main/java/org/glom/web/server/database/RelatedListNavigation.java +++ b/src/main/java/org/glom/web/server/database/RelatedListNavigation.java @@ -26,8 +26,6 @@ import java.sql.SQLException; import java.sql.Statement; import org.apache.commons.lang3.StringUtils; -import org.glom.libglom.Field; -import org.glom.libglom.Field.glom_field_type; import org.glom.libglom.LayoutFieldVector; import org.glom.libglom.LayoutItem_Field; import org.glom.libglom.LayoutItem_Portal; @@ -38,6 +36,8 @@ import org.glom.web.server.Utils; import org.glom.web.shared.NavigationRecord; import org.glom.web.shared.TypedDataItem; import org.glom.web.shared.libglom.Document; +import org.glom.web.shared.libglom.Field; +import org.glom.web.shared.libglom.Field.glom_field_type; import com.mchange.v2.c3p0.ComboPooledDataSource; diff --git a/src/main/java/org/glom/web/shared/libglom/Document.java b/src/main/java/org/glom/web/shared/libglom/Document.java index f92537d..0505ed8 100644 --- a/src/main/java/org/glom/web/shared/libglom/Document.java +++ b/src/main/java/org/glom/web/shared/libglom/Document.java @@ -20,17 +20,18 @@ package org.glom.web.shared.libglom; import java.io.IOException; +import java.util.ArrayList; import java.util.Hashtable; +import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.commons.lang3.StringUtils; -import org.glom.libglom.Field; -import org.glom.libglom.FieldVector; import org.glom.libglom.LayoutGroupVector; import org.glom.libglom.StringVector; +import org.glom.web.shared.layout.LayoutItemField; import org.jfree.util.Log; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -49,7 +50,8 @@ public class Document { public String name = ""; public boolean isDefault; public boolean isHidden; - + + private final Hashtable fieldsMap = new Hashtable(); private final Hashtable reportsMap = new Hashtable(); }; @@ -79,6 +81,8 @@ public class Document { private static String NODE_REPORT = "report"; private static String NODE_FIELDS = "fields"; private static String NODE_FIELD = "field"; + private static String ATTRIBUTE_PRIMARY_KEY = "primary_key"; + private static String ATTRIBUTE_FIELD_TYPE = "type"; public void set_file_uri(final String fileURI) { this.fileURI = fileURI; @@ -125,7 +129,7 @@ public class Document { return false; } - databaseTitle.original = rootNode.getAttribute(ATTRIBUTE_TITLE); + databaseTitle.set_title_original( rootNode.getAttribute(ATTRIBUTE_TITLE) ); final NodeList listTableNodes = rootNode.getElementsByTagName(NODE_TABLE); final int num = listTableNodes.getLength(); @@ -177,7 +181,7 @@ public class Document { * @param title */ private void loadTitle(final Element node, final Translatable title) { - title.original = node.getAttribute(ATTRIBUTE_TITLE); + title.set_title_original(node.getAttribute(ATTRIBUTE_TITLE)); final Element nodeSet = getElementByName(node, NODE_TRANSLATIONS_SET); if(nodeSet == null) { @@ -209,7 +213,21 @@ public class Document { loadTitle(node, info); info.isDefault = getAttributeAsBoolean(node, ATTRIBUTE_DEFAULT); info.isHidden = getAttributeAsBoolean(node, ATTRIBUTE_HIDDEN); - + + final Element fieldsNode = getElementByName(node, NODE_FIELDS); + if(fieldsNode != null) { + final NodeList listFieldNodes = fieldsNode.getElementsByTagName(NODE_FIELD); + final int numFields = listFieldNodes.getLength(); + for(int i = 0; i < numFields; i++) { + final Node fieldNode = listFieldNodes.item(i); + final Element element = (Element)fieldNode; //TODO: Check the cast. + Field field = new Field(); + loadField(element, field); + + info.fieldsMap.put(field.get_name(), field); + } + } + final Element reportsNode = getElementByName(node, NODE_REPORTS); if(reportsNode != null) { final NodeList listReportNodes = reportsNode.getElementsByTagName(NODE_REPORT); @@ -220,25 +238,42 @@ public class Document { Report report = new Report(); loadReport(element, report); - info.reportsMap.put(report.name, report); + info.reportsMap.put(report.get_name(), report); } } - final Element fieldsNode = getElementByName(node, NODE_FIELDS); - if(fieldsNode != null) { - final NodeList listFieldNodes = reportsNode.getElementsByTagName(NODE_FIELD); - final int numFields = listFieldNodes.getLength(); - for(int i = 0; i < numFields; i++) { - final Node fieldNode = listFieldNodes.item(i); - final Element element = (Element)fieldNode; //TODO: Check the cast. - //TODO: Report report = new Report(); - //loadField(element, report); + tablesMap.put(info.name, info); + } - //TODO: info.fieldsMap.put(field.name, Field); + /** + * @param element + * @param field + */ + private void loadField(Element element, Field field) { + field.set_name(element.getAttribute(ATTRIBUTE_NAME)); + + Field.glom_field_type fieldType = Field.glom_field_type.TYPE_INVALID; + final String fieldTypeStr = element.getAttribute(ATTRIBUTE_FIELD_TYPE); + if(!StringUtils.isEmpty(fieldTypeStr)) { + if(fieldTypeStr == "boolean") { + fieldType = Field.glom_field_type.TYPE_BOOLEAN; + } else if (fieldTypeStr == "date") { + fieldType = Field.glom_field_type.TYPE_DATE; + } else if (fieldTypeStr == "image") { + fieldType = Field.glom_field_type.TYPE_IMAGE; + } else if (fieldTypeStr == "numeric") { + fieldType = Field.glom_field_type.TYPE_NUMERIC; + } else if (fieldTypeStr == "text") { + fieldType = Field.glom_field_type.TYPE_TEXT; + } else if (fieldTypeStr == "time") { + fieldType = Field.glom_field_type.TYPE_TIME; } } + + field.set_glom_field_type(fieldType); - tablesMap.put(info.name, info); + field.set_primary_key(getAttributeAsBoolean(element, ATTRIBUTE_PRIMARY_KEY)); + loadTitle(element, field); } /** @@ -246,7 +281,7 @@ public class Document { * @param reportNode */ private void loadReport(Element element, Report report) { - report.name = element.getAttribute(ATTRIBUTE_NAME); + report.set_name(element.getAttribute(ATTRIBUTE_NAME)); loadTitle(element, report); } @@ -336,9 +371,12 @@ public class Document { return true; } - public FieldVector get_table_fields(final String tableName) { - //TODO: - return new FieldVector(); + public List get_table_fields(final String tableName) { + final TableInfo info = getTableInfo(tableName); + if(info == null) + return null; + + return new ArrayList(info.fieldsMap.values()); } public Field get_field(String table_name, String strFieldName) { @@ -359,7 +397,7 @@ public class Document { return result; for (final Report report : info.reportsMap.values()) { - result.add(report.name); + result.add(report.get_name()); } return new StringVector(); diff --git a/src/main/java/org/glom/web/shared/libglom/Field.java b/src/main/java/org/glom/web/shared/libglom/Field.java new file mode 100644 index 0000000..872c8aa --- /dev/null +++ b/src/main/java/org/glom/web/shared/libglom/Field.java @@ -0,0 +1,41 @@ +package org.glom.web.shared.libglom; + +public class Field extends Translatable { + + public enum glom_field_type { + TYPE_INVALID, + TYPE_NUMERIC, + TYPE_TEXT, + TYPE_DATE, + TYPE_TIME, + TYPE_BOOLEAN, + TYPE_IMAGE + }; + + private glom_field_type glom_field_type; //TODO: = glom_field_type.TYPE_INVALID; + private boolean primaryKey = false; + + /** + * @return + */ + public boolean get_primary_key() { + return primaryKey; + }; + + public void set_primary_key(boolean primaryKey) { + this.primaryKey = primaryKey; + } + + /** + * @return + */ + public glom_field_type get_glom_type() { + return glom_field_type; + } + + void set_glom_field_type(glom_field_type fieldType) { + this.glom_field_type = fieldType; + } + + +} diff --git a/src/main/java/org/glom/web/shared/libglom/Report.java b/src/main/java/org/glom/web/shared/libglom/Report.java index 1e3f9ea..9708ae0 100644 --- a/src/main/java/org/glom/web/shared/libglom/Report.java +++ b/src/main/java/org/glom/web/shared/libglom/Report.java @@ -3,7 +3,6 @@ package org.glom.web.shared.libglom; import org.glom.libglom.LayoutGroup; public class Report extends Translatable { - public String name; /** * @return diff --git a/src/main/java/org/glom/web/shared/libglom/Translatable.java b/src/main/java/org/glom/web/shared/libglom/Translatable.java index b7abb94..f409cf2 100644 --- a/src/main/java/org/glom/web/shared/libglom/Translatable.java +++ b/src/main/java/org/glom/web/shared/libglom/Translatable.java @@ -2,15 +2,30 @@ package org.glom.web.shared.libglom; import java.util.Hashtable; +import org.glom.web.client.StringUtils; + public class Translatable { - public String original = ""; + + private String name = ""; + private String title_original = ""; // A map of localeID to title: public Hashtable translationsMap = new Hashtable(); + public String get_name() { + return name; + } + + public void set_name(final String name) { + this.name = name; + } public String get_title_original() { - return original; + return title_original; + } + + public void set_title_original(final String title) { + this.title_original = title; } public String get_title(final String locale) { @@ -21,4 +36,17 @@ public class Translatable { return title; } + + /** + * @param locale + * @return + */ + public String get_title_or_name(String locale) { + final String title = get_title(locale); + if(StringUtils.isEmpty(title)) { + return get_name(); + } + + return title; + }; } diff --git a/src/test/java/org/glom/web/shared/libglom/DocumentTest.java b/src/test/java/org/glom/web/shared/libglom/DocumentTest.java index 8a74dbe..e86c09f 100644 --- a/src/test/java/org/glom/web/shared/libglom/DocumentTest.java +++ b/src/test/java/org/glom/web/shared/libglom/DocumentTest.java @@ -24,9 +24,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; +import java.util.List; + import org.glom.web.shared.libglom.Document; -import org.glom.libglom.Field; -import org.glom.libglom.FieldVector; import org.glom.libglom.Glom; import org.glom.libglom.LayoutFieldVector; import org.glom.libglom.LayoutGroup; @@ -92,7 +92,7 @@ public class DocumentTest { @Test public void testReadTableFieldSizes() { - FieldVector fields = document.get_table_fields("albums"); + List fields = document.get_table_fields("albums"); assertEquals(6, fields.size()); Field field = fields.get(0); -- 2.1.4