From 395a73c9f7f2ee8f19f33dd8888006525cbfeda0 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 9 Feb 2010 14:19:53 +0000
Subject: [PATCH] LMS-1354 Adding and managing data types

SVN: 14655
---
 .../plugins/demo/DemoReportingPlugin.java     |  2 +-
 .../tasks/SimpleTableModelBuilder.java        | 63 ++++++++++++++++---
 2 files changed, 54 insertions(+), 11 deletions(-)

diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/demo/DemoReportingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/demo/DemoReportingPlugin.java
index a84b84e253b..47239c7392e 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/demo/DemoReportingPlugin.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/demo/DemoReportingPlugin.java
@@ -58,7 +58,7 @@ public class DemoReportingPlugin extends AbstractDatastorePlugin implements IRep
         builder.addHeader("Thumbnail");
         builder.addHeader("Name");
         builder.addHeader("Last Modified");
-        builder.addHeader("Size", true);
+        builder.addHeader("Size");
         for (DatasetDescription dataset : datasets)
         {
             File file = getDataSubDir(dataset);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/SimpleTableModelBuilder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/SimpleTableModelBuilder.java
index e6180a598e4..ded459d7617 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/SimpleTableModelBuilder.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/SimpleTableModelBuilder.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DateTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DoubleTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
@@ -38,33 +39,75 @@ public class SimpleTableModelBuilder
 {
     private List<TableModelRow> rows;
 
-    private List<TableModelColumnHeader> header;
+    private List<TableModelColumnHeader> headers;
 
     public SimpleTableModelBuilder()
     {
         this.rows = new ArrayList<TableModelRow>();
-        this.header = new ArrayList<TableModelColumnHeader>();
-    }
-
-    public void addHeader(String title, boolean numeric)
-    {
-        header.add(new TableModelColumnHeader(title, header.size(), numeric));
+        this.headers = new ArrayList<TableModelColumnHeader>();
     }
 
     public void addHeader(String title)
     {
-        addHeader(title, false);
+        headers.add(new TableModelColumnHeader(title, headers.size()));
     }
 
     public void addRow(List<ISerializableComparable> values)
     {
-        assert values.size() == header.size() : "header has different number of columns than a row";
+        assert values.size() == headers.size() : "header has different number of columns than a row";
+        for (int i = 0; i < values.size(); i++)
+        {
+            ISerializableComparable value = values.get(i);
+            TableModelColumnHeader header = headers.get(i);
+            DataTypeCode headerDataType = header.getDataType();
+            DataTypeCode dataType = getDataTypeCodeFor(value);
+            if (headerDataType == null)
+            {
+                header.setDataType(dataType);
+            } else if (headerDataType == DataTypeCode.REAL)
+            {
+                if (dataType != DataTypeCode.REAL && dataType != DataTypeCode.INTEGER)
+                {
+                    header.setDataType(DataTypeCode.VARCHAR);
+                }
+            } else if (headerDataType == DataTypeCode.INTEGER)
+            {
+                if (dataType == DataTypeCode.REAL)
+                {
+                    header.setDataType(DataTypeCode.REAL);
+                } else if (dataType != DataTypeCode.INTEGER)
+                {
+                    header.setDataType(DataTypeCode.VARCHAR);
+                }
+            } else if (headerDataType == DataTypeCode.TIMESTAMP
+                    && dataType != DataTypeCode.TIMESTAMP)
+            {
+                header.setDataType(DataTypeCode.VARCHAR);
+            }
+        }
         rows.add(new TableModelRow(values));
     }
+    
+    private DataTypeCode getDataTypeCodeFor(ISerializableComparable value)
+    {
+        if (value instanceof IntegerTableCell)
+        {
+            return DataTypeCode.INTEGER;
+        } 
+        if (value instanceof DoubleTableCell)
+        {
+            return DataTypeCode.REAL;
+        } 
+        if (value instanceof DateTableCell)
+        {
+            return DataTypeCode.TIMESTAMP;
+        }
+        return DataTypeCode.VARCHAR;
+    }
 
     public TableModel getTableModel()
     {
-        return new TableModel(header, rows);
+        return new TableModel(headers, rows);
     }
 
     public static ISerializableComparable asText(String textOrNull)
-- 
GitLab