Do not allow TableSchema columns to be directly set
[ovsdb.git] / library / impl / src / main / java / org / opendaylight / ovsdb / lib / schema / TableSchema.java
index 04e8fb0ea9024376a24609f04c524a97ef1d661d..9ad3953d2b7d9705d2375c3a1cc2238f10a671db 100644 (file)
@@ -5,43 +5,37 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.ovsdb.lib.schema;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-
 import org.opendaylight.ovsdb.lib.message.TableUpdate;
 import org.opendaylight.ovsdb.lib.notation.Column;
 import org.opendaylight.ovsdb.lib.notation.Row;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.operations.Insert;
 import org.opendaylight.ovsdb.lib.schema.BaseType.UuidBaseType;
-import org.opendaylight.ovsdb.lib.schema.ColumnType.AtomicColumnType;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.Lists;
-
 
 public abstract class TableSchema<E extends TableSchema<E>> {
 
-    private String name;
-    private Map<String, ColumnSchema> columns;
-
-    public TableSchema() {
-    }
+    private final String name;
+    private final Map<String, ColumnSchema> columns;
 
-    protected TableSchema(String name) {
+    protected TableSchema(final String name) {
         this.name = name;
+        this.columns = new HashMap<>();
     }
 
-    public TableSchema(String name, Map<String, ColumnSchema> columns) {
+    protected TableSchema(final String name, final Map<String, ColumnSchema> columns) {
         this.name = name;
         this.columns = columns;
     }
@@ -54,20 +48,20 @@ public abstract class TableSchema<E extends TableSchema<E>> {
         return columns;
     }
 
-    public boolean hasColumn(String column) {
+    public boolean hasColumn(final String column) {
         return this.getColumns().contains(column);
     }
 
-
-    public ColumnType getColumnType(String column) {
+    public ColumnType getColumnType(final String column) {
         return this.columns.get(column).getType();
     }
 
-    public <E extends TableSchema<E>> E as(Class<E> clazz) {
+    public <E extends TableSchema<E>> E as(final Class<E> clazz) {
         try {
             Constructor<E> instance = clazz.getConstructor(TableSchema.class);
             return instance.newInstance(this);
-        } catch (Exception e) {
+        } catch (InstantiationException | IllegalAccessException
+                | InvocationTargetException | NoSuchMethodException e) {
             throw new RuntimeException("exception constructing instance of clazz " + clazz, e);
         }
     }
@@ -76,7 +70,7 @@ public abstract class TableSchema<E extends TableSchema<E>> {
         return new Insert<>(this);
     }
 
-    public <D> ColumnSchema<E, Set<D>> multiValuedColumn(String column, Class<D> type) {
+    public <D> ColumnSchema<E, Set<D>> multiValuedColumn(final String column, final Class<D> type) {
         //todo exception handling
 
         ColumnSchema<E, Set<D>> columnSchema = columns.get(column);
@@ -84,7 +78,8 @@ public abstract class TableSchema<E extends TableSchema<E>> {
         return columnSchema;
     }
 
-    public <K,V> ColumnSchema<E, Map<K,V>> multiValuedColumn(String column, Class<K> keyType, Class<V> valueType) {
+    public <K,V> ColumnSchema<E, Map<K,V>> multiValuedColumn(final String column, final Class<K> keyType,
+            final Class<V> valueType) {
         //todo exception handling
 
         ColumnSchema<E, Map<K, V>> columnSchema = columns.get(column);
@@ -92,7 +87,7 @@ public abstract class TableSchema<E extends TableSchema<E>> {
         return columnSchema;
     }
 
-    public <D> ColumnSchema<E, D> column(String column, Class<D> type) {
+    public <D> ColumnSchema<E, D> column(final String column, final Class<D> type) {
         //todo exception handling
 
         ColumnSchema<E, D> columnSchema = columns.get(column);
@@ -102,24 +97,15 @@ public abstract class TableSchema<E extends TableSchema<E>> {
         return columnSchema;
     }
 
-    public ColumnSchema column(String column) {
+    public ColumnSchema column(final String column) {
         return this.columns.get(column);
     }
 
-
     public String getName() {
         return name;
     }
 
-    protected void setName(String name) {
-        this.name = name;
-    }
-
-    protected void setColumns(Map<String, ColumnSchema> columns) {
-        this.columns = columns;
-    }
-
-    public TableUpdate<E> updatesFromJson(JsonNode value) {
+    public TableUpdate<E> updatesFromJson(final JsonNode value) {
         TableUpdate<E> tableUpdate = new TableUpdate<>();
         Iterator<Entry<String, JsonNode>> fields = value.fields();
         while (fields.hasNext()) {
@@ -137,8 +123,8 @@ public abstract class TableSchema<E extends TableSchema<E>> {
         return tableUpdate;
     }
 
-    public Row<E> createRow(ObjectNode rowNode) {
-        List<Column<E, ?>> columns = Lists.newArrayList();
+    public Row<E> createRow(final ObjectNode rowNode) {
+        List<Column<E, ?>> newColumns = new ArrayList<>();
         for (Iterator<Map.Entry<String, JsonNode>> iter = rowNode.fields(); iter.hasNext();) {
             Map.Entry<String, JsonNode> next = iter.next();
             ColumnSchema<E, Object> schema = column(next.getKey(), Object.class);
@@ -150,14 +136,14 @@ public abstract class TableSchema<E extends TableSchema<E>> {
              */
             if (schema != null) {
                 Object value = schema.valueFromJson(next.getValue());
-                columns.add(new Column<>(schema, value));
+                newColumns.add(new Column<>(schema, value));
             }
         }
-        return new Row<>(this, columns);
+        return new Row<>(this, newColumns);
     }
 
-    public ArrayList<Row<E>> createRows(JsonNode rowsNode) {
-        ArrayList<Row<E>> rows = Lists.newArrayList();
+    public List<Row<E>> createRows(final JsonNode rowsNode) {
+        List<Row<E>> rows = new ArrayList<>();
         for (JsonNode rowNode : rowsNode.get("rows")) {
             rows.add(createRow((ObjectNode)rowNode));
         }