From 146d00e75d14c9d79854971e51493cab9061b5db Mon Sep 17 00:00:00 2001
From: Sonia Zorba <zorba@oats.inaf.it>
Date: Fri, 27 Oct 2017 12:10:27 +0200
Subject: [PATCH] Bugfix NPE and integer/boolean conversion

---
 TASMAN-core/pom.xml                           |  2 +-
 .../src/main/java/it/inaf/ia2/tsm/Table.java  | 18 +++++++++++++++
 .../java/it/inaf/ia2/tsm/TapSchemaLoader.java | 23 ++++++++++++++-----
 TASMAN-webapp/pom.xml                         |  6 ++---
 4 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/TASMAN-core/pom.xml b/TASMAN-core/pom.xml
index bc18744..04bee63 100644
--- a/TASMAN-core/pom.xml
+++ b/TASMAN-core/pom.xml
@@ -3,7 +3,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>it.inaf.ia2.tap</groupId>
     <artifactId>tasman-core</artifactId>
-    <version>1.3.0</version>
+    <version>1.3.1</version>
     <packaging>jar</packaging>
     <name>tasman-core</name>
     <properties>
diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Table.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Table.java
index fb8388d..ed0d8c4 100644
--- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Table.java
+++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/Table.java
@@ -71,6 +71,23 @@ public class Table extends ChildEntity<Schema> implements EntitiesContainer<Colu
         return null;
     }
 
+    /**
+     * Special behavior for retro-compatibility with oldest TAP_SCHEMA versions
+     * in which the indexed column was represented using 1 and 0 instead boolean
+     * values.
+     */
+    private void fixIndexedMetadataValues() {
+        boolean useIntForBool = tapSchema.getTapSchemaModel()
+                .getTable(TapSchema.COLUMNS_TABLE)
+                .get(Column.INDEXED_KEY).getJavaType() == Integer.class;
+        if (useIntForBool) {
+            for (Map<String, Object> cm : columnsMetadata.values()) {
+                boolean indexed = (boolean) cm.get(Column.INDEXED_KEY);
+                cm.put(Column.INDEXED_KEY, indexed ? 1 : 0);
+            }
+        }
+    }
+
     protected Table(TapSchema tapSchema, Schema schema, String tableSimpleName) throws SQLException {
         super(tapSchema, tapSchema.getTableModel(TapSchema.TABLES_TABLE), schema.getTableMetadata(tableSimpleName));
 
@@ -82,6 +99,7 @@ public class Table extends ChildEntity<Schema> implements EntitiesContainer<Colu
         DBBroker broker = tapSchema.getDBBroker(schema.getName());
         tableTableModel = getTableTableModel();
         columnsMetadata = broker.getAllColumnsMetadata(schema.getName(), tableSimpleName, tableTableModel, tapSchema.getDataTypeMode());
+        fixIndexedMetadataValues();
 
         for (Map.Entry<String, Map<String, Object>> entry : columnsMetadata.entrySet()) {
             // Adding table names to columns metadata
diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchemaLoader.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchemaLoader.java
index 2f75ae8..4020c0f 100644
--- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchemaLoader.java
+++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/TapSchemaLoader.java
@@ -162,11 +162,22 @@ public class TapSchemaLoader {
         Schema parentSchema = column.getParent().getParent();
         if (parentSchema.getName().equals(tapSchema.getName())) {
             return equalsOneOf(key, Column.STD_KEY, Column.PRINCIPAL_KEY);
-        } else if (parentSchema.getName().equals(tapSchema.getIvoaSchemaModel().getName())) {
-            return equalsOneOf(key, Column.STD_KEY, Column.PRINCIPAL_KEY,
-                    Column.UCD_KEY, Column.UNIT_KEY, Column.UTYPE_KEY, Column.DATATYPE_KEY);
+        } else {
+            SchemaModel ivoaSchemaModel = tapSchema.getIvoaSchemaModel();
+            if (ivoaSchemaModel != null
+                    && parentSchema.getName().equals(ivoaSchemaModel.getName())) {
+                return equalsOneOf(key, Column.STD_KEY, Column.PRINCIPAL_KEY,
+                        Column.UCD_KEY, Column.UNIT_KEY, Column.UTYPE_KEY, Column.DATATYPE_KEY);
+            }
+            return false;
         }
-        return false;
+    }
+
+    private Object getCompatibleIntOrBoolValue(String key, boolean value) {
+        if (tapSchema.getTapSchemaModel().getTable(COLUMNS_TABLE).get(key).getJavaType() == Integer.class) {
+            return value ? 1 : 0;
+        }
+        return value;
     }
 
     private Object getCorrectValue(Column column, String key) {
@@ -187,9 +198,9 @@ public class TapSchemaLoader {
         ColumnModel columnModel = schemaModel.getTable(column.getParent().getName()).get(column.getName());
         switch (key) {
             case Column.STD_KEY:
-                return columnModel.isStandard();
+                return getCompatibleIntOrBoolValue(Column.STD_KEY, columnModel.isStandard());
             case Column.PRINCIPAL_KEY:
-                return columnModel.isPrincipal();
+                return getCompatibleIntOrBoolValue(Column.PRINCIPAL_KEY, columnModel.isPrincipal());
             case Column.UCD_KEY:
                 return columnModel.getUcd();
             case Column.UNIT_KEY:
diff --git a/TASMAN-webapp/pom.xml b/TASMAN-webapp/pom.xml
index 74f7102..8e56557 100644
--- a/TASMAN-webapp/pom.xml
+++ b/TASMAN-webapp/pom.xml
@@ -4,7 +4,7 @@
 
     <groupId>it.inaf.ia2.tap</groupId>
     <artifactId>tasman-webapp</artifactId>
-    <version>1.3.0</version>
+    <version>1.3.1</version>
     <packaging>war</packaging>
 
     <name>tasman-webapp</name>
@@ -107,7 +107,7 @@
                 <dependency>
                     <groupId>it.inaf.ia2.tap</groupId>
                     <artifactId>tasman-core</artifactId>
-                    <version>1.2.0</version>
+                    <version>1.3.1</version>
                     <exclusions>
                         <!-- exclusion due to tomcat-jdbc dependency conflicting with Jetty -->
                         <exclusion>
@@ -124,7 +124,7 @@
         <dependency>
             <groupId>it.inaf.ia2.tap</groupId>
             <artifactId>tasman-core</artifactId>
-            <version>1.2.0</version>
+            <version>1.3.1</version>
         </dependency>
         <dependency>
             <groupId>ari.ucidy</groupId>
-- 
GitLab