explicitly parsing JsonNode for updates 50/7650/3
authorAshwin Raveendran <ashw7n@gmail.com>
Sat, 24 May 2014 22:37:05 +0000 (15:37 -0700)
committerAshwin Raveendran <ashw7n@gmail.com>
Tue, 10 Jun 2014 01:37:48 +0000 (18:37 -0700)
Change-Id: Ib9f420c9f9d8eb11d459e3fc903b7280fa1431cb
Signed-off-by: Ashwin Raveendran <ashw7n@gmail.com>
21 files changed:
library/src/main/java/org/opendaylight/ovsdb/lib/OvsDBClientImpl.java
library/src/main/java/org/opendaylight/ovsdb/lib/message/OvsdbRPC.java
library/src/main/java/org/opendaylight/ovsdb/lib/message/TableUpdate.java
library/src/main/java/org/opendaylight/ovsdb/lib/message/TableUpdates.java
library/src/main/java/org/opendaylight/ovsdb/lib/message/UpdateNotification.java
library/src/main/java/org/opendaylight/ovsdb/lib/message/temp/TableUpdate.java [new file with mode: 0644]
library/src/main/java/org/opendaylight/ovsdb/lib/message/temp/TableUpdates.java
library/src/main/java/org/opendaylight/ovsdb/lib/notation/Column.java [new file with mode: 0644]
library/src/main/java/org/opendaylight/ovsdb/lib/notation/ResultSet.java [new file with mode: 0644]
library/src/main/java/org/opendaylight/ovsdb/lib/notation/Row.java
library/src/main/java/org/opendaylight/ovsdb/lib/notation/json/Converter.java
library/src/main/java/org/opendaylight/ovsdb/lib/operations/Where.java
library/src/main/java/org/opendaylight/ovsdb/lib/schema/BaseType.java
library/src/main/java/org/opendaylight/ovsdb/lib/schema/ColumnSchema.java
library/src/main/java/org/opendaylight/ovsdb/lib/schema/ColumnType.java
library/src/main/java/org/opendaylight/ovsdb/lib/schema/GenericTableSchema.java
library/src/main/java/org/opendaylight/ovsdb/lib/schema/TableSchema.java
library/src/test/java/org/opendaylight/ovsdb/lib/OvsDBClientTestIT.java
library/src/test/java/org/opendaylight/ovsdb/lib/OvsDBClientTestITTyped.java
library/src/test/java/org/opendaylight/ovsdb/lib/message/MonitorResponseTest.java
plugin/src/main/java/org/opendaylight/ovsdb/plugin/InventoryService.java

index 0fbb390a50fcc85186afda2ab7de39dfafe5e565..fe39faef463adc9874ac485e7a8401489305236a 100644 (file)
@@ -10,6 +10,7 @@
 package org.opendaylight.ovsdb.lib;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
@@ -30,11 +31,11 @@ import org.opendaylight.ovsdb.lib.operations.OperationResult;
 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.TableSchema;
-import org.opendaylight.ovsdb.lib.table.Table;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Queue;
@@ -48,7 +49,7 @@ public class OvsDBClientImpl implements OvsDBClient {
     private ExecutorService executorService;
     private OvsdbRPC rpc;
     private Map<String, DatabaseSchema> schema = Maps.newHashMap();
-    private HashMap<String, MonitorCallBack> monitorCallbacks = Maps.newHashMap();
+    private HashMap<String, CallbackContext> monitorCallbacks = Maps.newHashMap();
     private Queue<Throwable> exceptions;
     private OvsdbRPC.Callback rpcCallback;
 
@@ -60,19 +61,20 @@ public class OvsDBClientImpl implements OvsDBClient {
     OvsDBClientImpl() {
     }
 
-    void setupUpdateListner() {
+    void setupUpdateListener() {
         if (rpcCallback == null) {
             OvsdbRPC.Callback temp = new OvsdbRPC.Callback() {
                 @Override
                 public void update(Object node, UpdateNotification upadateNotification) {
                     Object key = upadateNotification.getContext();
-                    MonitorCallBack monitorCallBack = monitorCallbacks.get(key);
+                    CallbackContext callbackContext = monitorCallbacks.get(key);
+                    MonitorCallBack monitorCallBack = callbackContext.monitorCallBack;
                     if (monitorCallBack == null) {
                         //ignore ?
                         logger.info("callback received with context {}, but no known handler. Ignoring!", key);
                         return;
                     }
-                    _transformingCallback(upadateNotification.getUpdate(), monitorCallBack);
+                    _transformingCallback(upadateNotification.getUpdates(), monitorCallBack, callbackContext.schema);
                 }
 
                 @Override
@@ -90,14 +92,23 @@ public class OvsDBClientImpl implements OvsDBClient {
         }
     }
 
-    protected void _transformingCallback( org.opendaylight.ovsdb.lib.message.temp.TableUpdates oldUpdate, MonitorCallBack monitorCallBack) {
-        //todo(ashwin) : temp kludge to get stuff working while deprecating old stuff
-        Map<String, TableUpdate> updateMap = Maps.newHashMap();
-        for (Map.Entry<Table.Name, TableUpdate> temp : oldUpdate.map.entrySet()) {
-            updateMap.put(temp.getKey().getName(), temp.getValue());
-        }
 
-        monitorCallBack.update(new TableUpdates(updateMap));
+    protected void _transformingCallback(JsonNode tableUpdatesJson, MonitorCallBack monitorCallBack, DatabaseSchema dbSchema) {
+        //todo(ashwin): we should move all the JSON parsing logic to a utility class
+        if (tableUpdatesJson instanceof ObjectNode) {
+            Map<String, TableUpdate> tableUpdateMap = Maps.newHashMap();
+            ObjectNode updatesJson = (ObjectNode) tableUpdatesJson;
+            for (Iterator<Map.Entry<String,JsonNode>> itr = updatesJson.fields(); itr.hasNext();){
+                Map.Entry<String, JsonNode> entry = itr.next();
+
+                DatabaseSchema databaseSchema = this.schema.get(dbSchema.getName());
+                TableSchema table = databaseSchema.table(entry.getKey(), TableSchema.class);
+                tableUpdateMap.put(entry.getKey(), table.updatesFromJson(entry.getValue()));
+
+            }
+            TableUpdates updates = new TableUpdates(tableUpdateMap);
+            monitorCallBack.update(updates);
+        }
     }
 
     @Override
@@ -126,18 +137,18 @@ public class OvsDBClientImpl implements OvsDBClient {
                 });
 
         final MonitorHandle monitorHandle = new MonitorHandle(UUID.randomUUID().toString());
-        registerCallback(monitorHandle, callback);
+        registerCallback(monitorHandle, callback, dbSchema);
 
-        ListenableFuture<org.opendaylight.ovsdb.lib.message.temp.TableUpdates> monitor = rpc.monitor(new Params() {
+        ListenableFuture<JsonNode> monitor = rpc.monitor(new Params() {
             @Override
             public List<Object> params() {
                 return Lists.<Object>newArrayList(dbSchema.getName(), monitorHandle.getId(), reqMap);
             }
         });
-        Futures.addCallback(monitor, new FutureCallback<org.opendaylight.ovsdb.lib.message.temp.TableUpdates>() {
+        Futures.addCallback(monitor, new FutureCallback<JsonNode>() {
             @Override
-            public void onSuccess(org.opendaylight.ovsdb.lib.message.temp.TableUpdates result) {
-                _transformingCallback(result, callback);
+            public void onSuccess(JsonNode result) {
+                _transformingCallback(result, callback, dbSchema);
             }
 
             @Override
@@ -149,9 +160,9 @@ public class OvsDBClientImpl implements OvsDBClient {
         return monitorHandle;
     }
 
-    private void registerCallback(MonitorHandle monitorHandle, MonitorCallBack callback) {
-        this.monitorCallbacks.put(monitorHandle.getId(), callback);
-        setupUpdateListner();
+    private void registerCallback(MonitorHandle monitorHandle, MonitorCallBack callback, DatabaseSchema schema) {
+        this.monitorCallbacks.put(monitorHandle.getId(), new CallbackContext(callback, schema));
+        setupUpdateListener();
     }
 
     @Override
@@ -277,4 +288,13 @@ public class OvsDBClientImpl implements OvsDBClient {
         return exceptions;
     }
 
+    static class CallbackContext {
+        MonitorCallBack monitorCallBack;
+        DatabaseSchema schema;
+
+        CallbackContext(MonitorCallBack monitorCallBack, DatabaseSchema schema) {
+            this.monitorCallBack = monitorCallBack;
+            this.schema = schema;
+        }
+    }
 }
index 1d0c096b54d6b5d21878ce5e51f7335139c5a3e5..cb50d6810577ffab6023859ee65a0b91b813eb04 100644 (file)
@@ -11,7 +11,6 @@ package org.opendaylight.ovsdb.lib.message;
 
 import java.util.List;
 
-import org.opendaylight.ovsdb.lib.message.temp.TableUpdates;
 import org.opendaylight.ovsdb.lib.operations.OperationResult;
 
 import com.fasterxml.jackson.databind.JsonNode;
@@ -27,7 +26,7 @@ public interface OvsdbRPC {
 
     public ListenableFuture<List<String>> echo();
 
-    public ListenableFuture<TableUpdates> monitor(Params equest);
+    public ListenableFuture<JsonNode> monitor(Params equest);
 
     public ListenableFuture<List<String>> list_dbs();
 
index 4b57dabd4c1be773e9ccbc69fef96b3cee9a65bc..2e2f07d0e9ea6e3edd6f787e26d05ec0ebbdaab0 100644 (file)
@@ -1,91 +1,38 @@
 /*
- * Copyright (C) 2013 EBay Software Foundation
  *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *  * Copyright (C) 2014 EBay Software Foundation
+ *  *
+ *  * This program and the accompanying materials are made available under the
+ *  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ *  * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *  *
+ *  * Authors : Ashwin Raveendran
  *
- * Authors : Ashwin Raveendran, Madhu Venugopal
  */
-package org.opendaylight.ovsdb.lib.message;
-
-import com.fasterxml.jackson.annotation.JsonAnyGetter;
-import com.fasterxml.jackson.annotation.JsonAnySetter;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.collect.Maps;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.opendaylight.ovsdb.lib.table.Table;
 
+package org.opendaylight.ovsdb.lib.message;
 
-public  class TableUpdate<T extends Table>  {
-    /*This could have been done as a map, but doing so would expose the inner wrapper class in type signature*/
+import org.opendaylight.ovsdb.lib.notation.Row;
+import org.opendaylight.ovsdb.lib.schema.TableSchema;
 
-    Map<String, Row<T>> map = Maps.newHashMap();
+public class TableUpdate<E extends TableSchema<E>> {
 
-    @JsonAnyGetter
-    public Row<T> get(String rowId) {
-        return map.get(rowId);
-    }
+    private Row<E> old;
+    private Row<E> new_;
 
-    @JsonAnySetter
-    public void set(String rowId, Row<T> value) {
-        map.put(rowId, value);
-        value.setId(rowId);
+    public Row<E> getOld() {
+        return old;
     }
 
-    public Collection<Row<T>> getRows() {
-        return map.values();
+    public void setOld(Row<E> old) {
+        this.old = old;
     }
 
-    @Override
-    public String toString() {
-        return "TableUpdate [map=" + map + "]";
+    public Row<E> getNew() {
+        return new_;
     }
 
-    public static class Row<T> {
-
-        @JsonIgnore
-        String id;
-
-        @JsonProperty("new")
-        T _new;
-        T old;
-
-        public String getId() {
-            return id;
-        }
-
-        public T getNew() {
-            return _new;
-        }
-
-        public void setNew(T neww) {
-            this._new = neww;
-        }
-
-        public T getOld() {
-            return old;
-        }
-
-        public void setOld(T old) {
-            this.old = old;
-        }
-
-        void setId(String id) {
-            this.id = id;
-        }
-
-        @Override
-        public String toString() {
-            return "Row{" +
-                    "id='" + id + '\'' +
-                    ", _new=" + _new.toString() +
-                    '}';
-        }
-
+    public void setNew(Row<E> new_) {
+        this.new_ = new_;
     }
 }
index 6b2f488b322f5b910f20f1b62b3957fac3e6949f..b3d323e2eb88f13f1dcd296e2e2299a320bd1c7b 100644 (file)
@@ -12,7 +12,7 @@
 package org.opendaylight.ovsdb.lib.message;
 
 import com.google.common.collect.Maps;
-import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
+import org.opendaylight.ovsdb.lib.schema.TableSchema;
 
 import java.util.Map;
 
@@ -29,13 +29,7 @@ public class TableUpdates extends Response {
         this.map = map;
     }
 
-    public TableUpdate getUpdate(GenericTableSchema table) {
-        //todo Horrible just for time being, before this whole thing is refactored.
-        for (Map.Entry<String, TableUpdate> s : this.map.entrySet()) {
-            if (table.getName().equals(s.getKey())) {
-                return s.getValue();
-            }
-        }
-        return null;
+    public <E extends TableSchema<E>> TableUpdate<E> getUpdate(TableSchema<E> table) {
+        return this.map.get(table.getName());
     }
 }
index 8fb4ef27433f4d72fdc49aeff2e6e9fd97343143..cf7412c050dadf0e48c018eee022ebb8f885ac57 100644 (file)
@@ -9,6 +9,8 @@
  */
 package org.opendaylight.ovsdb.lib.message;
 
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.databind.JsonNode;
 import org.opendaylight.ovsdb.lib.message.temp.TableUpdates;
 import org.opendaylight.ovsdb.lib.notation.json.Converter.UpdateNotificationConverter;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@@ -17,6 +19,8 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 public class UpdateNotification {
     Object context;
     TableUpdates update;
+    private JsonNode updatesJson;
+
     public Object getContext() {
         return context;
     }
@@ -29,4 +33,19 @@ public class UpdateNotification {
     public void setUpdate(TableUpdates update) {
         this.update = update;
     }
+
+    @JsonAnySetter
+    public void setValue(String key, JsonNode val) {
+        System.out.println("key = " + key);
+        System.out.println("val = " + val);
+        System.out.println();
+    }
+
+    public void setUpdates(JsonNode jsonNode) {
+        this.updatesJson = jsonNode;
+    }
+
+    public JsonNode getUpdates() {
+        return updatesJson;
+    }
 }
diff --git a/library/src/main/java/org/opendaylight/ovsdb/lib/message/temp/TableUpdate.java b/library/src/main/java/org/opendaylight/ovsdb/lib/message/temp/TableUpdate.java
new file mode 100644 (file)
index 0000000..62e8788
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2013 EBay Software Foundation
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Ashwin Raveendran, Madhu Venugopal
+ */
+package org.opendaylight.ovsdb.lib.message.temp;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.Maps;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.opendaylight.ovsdb.lib.table.Table;
+
+
+public  class TableUpdate<T extends Table>  {
+    /*This could have been done as a map, but doing so would expose the inner wrapper class in type signature*/
+
+    Map<String, Row<T>> map = Maps.newHashMap();
+
+    @JsonAnyGetter
+    public Row<T> get(String rowId) {
+        return map.get(rowId);
+    }
+
+    @JsonAnySetter
+    public void set(String rowId, Row<T> value) {
+        map.put(rowId, value);
+        value.setId(rowId);
+    }
+
+    public Collection<Row<T>> getRows() {
+        return map.values();
+    }
+
+    @Override
+    public String toString() {
+        return "TableUpdate [map=" + map + "]";
+    }
+
+    public static class Row<T> {
+
+        @JsonIgnore
+        String id;
+
+        @JsonProperty("new")
+        T _new;
+        T old;
+
+        public String getId() {
+            return id;
+        }
+
+        public T getNew() {
+            return _new;
+        }
+
+        public void setNew(T neww) {
+            this._new = neww;
+        }
+
+        public T getOld() {
+            return old;
+        }
+
+        public void setOld(T old) {
+            this.old = old;
+        }
+
+        void setId(String id) {
+            this.id = id;
+        }
+
+        @Override
+        public String toString() {
+            return "Row{" +
+                    "id='" + id + '\'' +
+                    ", _new=" + _new.toString() +
+                    '}';
+        }
+
+    }
+}
index df2b26e2e300d7462355258b7e5fdae0b180fa7f..d26bd0c950c079f51b37997060284729538ff798 100644 (file)
@@ -13,7 +13,6 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.collect.Maps;
 
 import org.opendaylight.ovsdb.lib.message.Response;
-import org.opendaylight.ovsdb.lib.message.TableUpdate;
 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
 import org.opendaylight.ovsdb.lib.table.Bridge;
 import org.opendaylight.ovsdb.lib.table.Capability;
diff --git a/library/src/main/java/org/opendaylight/ovsdb/lib/notation/Column.java b/library/src/main/java/org/opendaylight/ovsdb/lib/notation/Column.java
new file mode 100644 (file)
index 0000000..57a35c6
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ *
+ *  * Copyright (C) 2014 EBay Software Foundation
+ *  *
+ *  * This program and the accompanying materials are made available under the
+ *  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ *  * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *  *
+ *  * Authors : Ashwin Raveendran
+ *
+ */
+
+package org.opendaylight.ovsdb.lib.notation;
+
+
+import org.opendaylight.ovsdb.lib.schema.ColumnSchema;
+import org.opendaylight.ovsdb.lib.schema.TableSchema;
+
+
+public class Column<E extends TableSchema<E>, D> {
+
+    private ColumnSchema<E, D> schema;
+    private D data;
+
+    public Column(ColumnSchema<E, D> schema, D d) {
+        this.schema = schema;
+        this.data = d;
+    }
+
+    public <E extends TableSchema<E>, T> T getData(ColumnSchema<E, T> schema) {
+        return schema.validate(data);
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(D data) {
+        this.data = data;
+    }
+
+    public ColumnSchema<E, D> getSchema() {
+        return schema;
+    }
+
+    public void setSchema(ColumnSchema<E, D> schema) {
+        this.schema = schema;
+    }
+}
diff --git a/library/src/main/java/org/opendaylight/ovsdb/lib/notation/ResultSet.java b/library/src/main/java/org/opendaylight/ovsdb/lib/notation/ResultSet.java
new file mode 100644 (file)
index 0000000..6de6721
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ *
+ *  * Copyright (C) 2014 EBay Software Foundation
+ *  *
+ *  * This program and the accompanying materials are made available under the
+ *  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ *  * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *  *
+ *  * Authors : Ashwin Raveendran
+ *
+ */
+
+package org.opendaylight.ovsdb.lib.notation;
+
+import java.util.List;
+
+/**
+ * A collection of Rows as returned by select and other operations on OVSDB
+ */
+public class ResultSet {
+
+    private List<Row> rows;
+
+    public List<Row> getRows() {
+        return rows;
+    }
+
+    public void setRows(List<Row> rows) {
+        this.rows = rows;
+    }
+}
index 06844ac819c96d0655019d687e3d66367d908293..fdb8a6683bcfd4a947b4f94b2fd76aad1155d837 100644 (file)
 
 package org.opendaylight.ovsdb.lib.notation;
 
-import org.opendaylight.ovsdb.lib.database.ColumnSchema;
+import org.opendaylight.ovsdb.lib.schema.ColumnSchema;
+import org.opendaylight.ovsdb.lib.schema.TableSchema;
 
-import java.util.Map;
+import java.util.List;
 
-public class Row {
-    private Map<String, ColumnSchema> columnSchema;
-    private Map<String, Object> columns;
+public class Row<E extends TableSchema<E>> {
+    List<Column<E, ?>> columns;
 
 
+    public Row(List<Column<E, ?>> columns) {
+        this.columns = columns;
+    }
 
+    public <D> Column<E, D> getColumn(ColumnSchema<E, D> schema) {
+        for (Column<E, ?> column : columns) {
+           if (column.getSchema().equals(schema)) {
+               return (Column<E, D>) column;
+           }
+        }
+        return null;
+    }
+
+    public List<Column<E, ?>> getColumns() {
+        return columns;
+    }
 }
index 380819ab030f0f6087c14f3dac7094cd61097961..017122230eaba74906e1e9301a56937c9acbc510 100644 (file)
@@ -101,6 +101,7 @@ public class Converter {
             if (node.isArray()) {
                 if (node.size() == 2) {
                     un.setContext(node.get(0).asText());
+                    un.setUpdates(node.get(1));
                     ObjectMapper objectMapper = new ObjectMapper();
                     objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
                     TableUpdates updates = objectMapper.convertValue(node.get(1), TableUpdates.class);
index 2791521ef743de8a1fe3c06c3fc51d723efa5ed0..de2894bacce0c74f880bd3925f87e968655884c8 100644 (file)
@@ -49,7 +49,7 @@ public class Where {
         return this;
     }
 
-    public Operation operation() {
+    public Operation build() {
         return (Operation) this.operation;
     }
 
index c900b38cad6b95ba5ce18cad8c2f97dc86e686c5..cd50dfb16e8c80e72545e8eaa6aef5cb3da1c14d 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.ovsdb.lib.schema;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.collect.Sets;
+import org.opendaylight.ovsdb.lib.notation.UUID;
 
 import java.util.Set;
 
@@ -76,6 +77,10 @@ public abstract class BaseType<E extends BaseType<E>> {
         return baseType;
     }
 
+    public abstract Object toValue(JsonNode value);
+
+    public abstract void validate(Object value);
+
     public static class IntegerBaseType extends BaseType<IntegerBaseType> {
         long min = Long.MIN_VALUE;
         long max = Long.MAX_VALUE;
@@ -101,6 +106,16 @@ public abstract class BaseType<E extends BaseType<E>> {
             populateEnum(type);
         }
 
+        @Override
+        public Object toValue(JsonNode value) {
+            return value.asLong();
+        }
+
+        @Override
+        public void validate(Object value) {
+
+        }
+
         private void populateEnum(JsonNode node) {
             if (node.has("enum")) {
                 Set<Long> s = Sets.newHashSet();
@@ -167,6 +182,16 @@ public abstract class BaseType<E extends BaseType<E>> {
             populateEnum(type);
         }
 
+        @Override
+        public Object toValue(JsonNode value) {
+            return value.asDouble();
+        }
+
+        @Override
+        public void validate(Object value) {
+
+        }
+
         private void populateEnum(JsonNode node) {
             if (node.has("enum")) {
                 Set<Double> s = Sets.newHashSet();
@@ -219,6 +244,16 @@ public abstract class BaseType<E extends BaseType<E>> {
             //no op
         }
 
+        @Override
+        public Object toValue(JsonNode value) {
+            return value.asBoolean();
+        }
+
+        @Override
+        public void validate(Object value) {
+
+        }
+
         @Override
         public String toString() {
             return "BooleanBaseType";
@@ -250,6 +285,16 @@ public abstract class BaseType<E extends BaseType<E>> {
             populateEnum(baseType, type);
         }
 
+        @Override
+        public Object toValue(JsonNode value) {
+            return value.asText();
+        }
+
+        @Override
+        public void validate(Object value) {
+
+        }
+
         private void populateEnum(StringBaseType baseType, JsonNode node) {
             if (node.has("enum")) {
                 Set<String> s = Sets.newHashSet();
@@ -314,6 +359,16 @@ public abstract class BaseType<E extends BaseType<E>> {
 
         }
 
+        @Override
+        public Object toValue(JsonNode value) {
+            return new UUID(value.asText());
+        }
+
+        @Override
+        public void validate(Object value) {
+
+        }
+
         public String getRefTable() {
             return refTable;
         }
index 20d1ab2176b39573ca42cd9828ab34a209b9fa3a..9db5ca5c73b8c0802d374133a27b848dbceb371a 100644 (file)
@@ -60,10 +60,13 @@ public class ColumnSchema<E extends TableSchema<E>, D> {
 
     // --- Operations on the column ----------//:w
 
+
     @Override
     public String toString() {
-        return "ColumnType [type=" + type + ", ephemeral=" + ephemeral
-                + ", mutable=" + mutable + "]";
+        return "ColumnSchema{" +
+                "name='" + name + '\'' +
+                ", type=" + type +
+                '}';
     }
 
     /**
@@ -71,8 +74,10 @@ public class ColumnSchema<E extends TableSchema<E>, D> {
      * @param value
      * @throws java.lang.RuntimeException (validation exception)
      */
-    public void validate(Object value)throws RuntimeException {
+    public D validate(Object value)throws RuntimeException {
         //todo(type check and validate based on constraints set)
+        this.type.validate(value);
+        return (D) value;
     }
 
     /**
@@ -82,4 +87,9 @@ public class ColumnSchema<E extends TableSchema<E>, D> {
     public void validateType(Class<?> type) {
 
     }
+
+    public D valueFromJson(JsonNode value) {
+      return (D) this.getType().valueFromJson(value);
+    }
+
 }
index 6cb709eefc11ae43eaee6e5a95dca12f5025ca8d..85c11a78f57a68a16d4136ed2b4fe0afcd5c5764 100644 (file)
 package org.opendaylight.ovsdb.lib.schema;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.Sets;
 import org.opendaylight.ovsdb.lib.jsonrpc.JsonUtils;
 
+import java.util.Set;
+
 
 public abstract class ColumnType {
     BaseType baseType;
-    long min = 0;
-    long max = 0;
+    long min = 1;
+    long max = 1;
 
     public long getMin() {
         return min;
@@ -96,6 +99,19 @@ public abstract class ColumnType {
         return this.min != this.max && this.min != 1;
     }
 
+    public abstract Object valueFromJson(JsonNode value);
+
+    public abstract void validate(Object value);
+
+    @Override
+    public String toString() {
+        return "ColumnType{" +
+                "baseType=" + baseType +
+                ", min=" + min +
+                ", max=" + max +
+                '}';
+    }
+
     public static class AtomicColumnType extends ColumnType {
 
         public AtomicColumnType() {
@@ -119,16 +135,42 @@ public abstract class ColumnType {
                 if ((node = json.get("min")) != null) {
                     atomicColumnType.setMin(node.asLong());
                 }
+
                 if ((node = json.get("max")) != null) {
-                    atomicColumnType.setMax(node.asLong());
+                    if (node.isLong()){
+                        atomicColumnType.setMax(node.asLong());
+                    } else if (node.isTextual() && "unlimited".equals(node.asText())) {
+                        max = Long.MAX_VALUE;
+                    }
                 }
-
                 return atomicColumnType;
             }
 
             return null;
         }
 
+        @Override
+        public Object valueFromJson(JsonNode value) {
+            if (isMultiValued()) {
+                Set<Object> result = Sets.newHashSet();
+               if(value.isContainerNode()) {
+                  for(JsonNode node: value) {
+                     result.add(getBaseType().toValue(node));
+                  }
+               } else {
+                   result.add(getBaseType().toValue(value));
+               }
+                return result;
+            } else {
+                return getBaseType().toValue(value);
+            }
+        }
+
+        @Override
+        public void validate(Object value) {
+            this.baseType.validate(value);
+        }
+
     }
 
     public static class KeyValuedColumnType extends ColumnType {
@@ -151,5 +193,15 @@ public abstract class ColumnType {
 
             return new KeyValuedColumnType(keyType, valueType);
         }
+
+        @Override
+        public Object valueFromJson(JsonNode value) {
+            throw new UnsupportedOperationException("needs to be implemented");
+        }
+
+        @Override
+        public void validate(Object value) {
+            throw new UnsupportedOperationException("not implemented yet");
+        }
     }
 }
index 1f2ad0ce6fe2a2bbf7cd791212ab397fa9720b27..f6ebfae19c55aa86f8673719e56fc608762652f0 100644 (file)
@@ -45,4 +45,30 @@ public class GenericTableSchema extends TableSchema<GenericTableSchema> {
         this.setColumns(columns);
         return this;
     }
+
+//    public TableUpdate<GenericTableSchema> updatesFromJson(JsonNode value) {
+//        ObjectNode new_ = (ObjectNode) value.get("new");
+//        ObjectNode old = (ObjectNode) value.get("new");
+//
+//        Row<GenericTableSchema> newRow = createRow(new_);
+//        Row<GenericTableSchema> oldRow = createRow(old);
+//
+//        TableUpdate<GenericTableSchema> tableUpdate = new TableUpdate<GenericTableSchema>();
+//        tableUpdate.setNew(newRow);
+//        tableUpdate.setNew(oldRow);
+//
+//
+//        return null;
+//    }
+//
+//    protected Row<GenericTableSchema> createRow(ObjectNode rowNode) {
+//        List<Column<GenericTableSchema, ?>> columns = Lists.newArrayList();
+//        for (Iterator<Map.Entry<String, JsonNode>> iter = rowNode.fields(); iter.hasNext();) {
+//            Map.Entry<String, JsonNode> next = iter.next();
+//            ColumnSchema schema = column(next.getKey());
+//            Object o = schema.valueFromJson(next.getValue());
+//            columns.add(new Column(schema, o));
+//        }
+//        return new Row<>(columns);
+//    }
 }
index 31ffa5f609251ddad6d43b03031de1d545d5ae96..b20bb6f82f86061ffb741a2d4c6978b2686b3406 100644 (file)
@@ -9,11 +9,19 @@
  */
 package org.opendaylight.ovsdb.lib.schema;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Lists;
+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.operations.Insert;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.lang.reflect.Constructor;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -87,6 +95,7 @@ public abstract class TableSchema<E extends TableSchema<E>> {
         return this.columns.get(column);
     }
 
+
     public String getName() {
         return name;
     }
@@ -98,4 +107,33 @@ public abstract class TableSchema<E extends TableSchema<E>> {
     protected void setColumns(Map<String, ColumnSchema> columns) {
         this.columns = columns;
     }
+
+    public TableUpdate<E> updatesFromJson(JsonNode value) {
+
+        Map.Entry<String, JsonNode> idOldNew = value.fields().next();
+
+        ObjectNode new_ = (ObjectNode) idOldNew.getValue().get("new");
+        ObjectNode old = (ObjectNode) idOldNew.getValue().get("old");
+
+        Row<E> newRow = new_ != null ? createRow(new_) : null;
+        Row<E> oldRow = old != null ? createRow(old) : null;
+
+        TableUpdate<E> tableUpdate = new TableUpdate<>();
+        tableUpdate.setNew(newRow);
+        tableUpdate.setOld(oldRow);
+
+
+        return tableUpdate;
+    }
+
+    protected Row<E> createRow(ObjectNode rowNode) {
+        List<Column<E, ?>> columns = Lists.newArrayList();
+        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);
+            Object o = schema.valueFromJson(next.getValue());
+            columns.add(new Column<>(schema, o));
+        }
+        return new Row<>(columns);
+    }
 }
index 0980493c9b4268043f8db9d7d7f13f744ae96348..b3ce39682893db3a710ce428657c51181b63b95a 100644 (file)
@@ -9,12 +9,14 @@
  */
 package org.opendaylight.ovsdb.lib;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.ListenableFuture;
 import static org.opendaylight.ovsdb.lib.operations.Operations.op;
 
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -27,10 +29,10 @@ import org.opendaylight.ovsdb.lib.message.MonitorRequest;
 import org.opendaylight.ovsdb.lib.message.MonitorRequestBuilder;
 import org.opendaylight.ovsdb.lib.message.MonitorSelect;
 import org.opendaylight.ovsdb.lib.message.OvsdbRPC;
-import org.opendaylight.ovsdb.lib.message.TableUpdate;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.message.UpdateNotification;
-import org.opendaylight.ovsdb.lib.notation.Mutator;
+import org.opendaylight.ovsdb.lib.notation.Column;
+import org.opendaylight.ovsdb.lib.notation.Row;
 import org.opendaylight.ovsdb.lib.operations.OperationResult;
 import org.opendaylight.ovsdb.lib.schema.ColumnSchema;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
@@ -39,9 +41,7 @@ import org.opendaylight.ovsdb.lib.schema.TableSchema;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Set;
 
 
 public class OvsDBClientTestIT extends OvsdbTestBase {
@@ -72,18 +72,12 @@ public class OvsDBClientTestIT extends OvsdbTestBase {
                 .add(op.update(bridge)
                         .set(fail_mode, "secure")
                         .where(name.opEqual("br-int"))
-                        .operation())
-                .add(op.comment("Updating fail_mode to secure on Bridge br-int"))
+                        .build())
                 .add(op.select(bridge)
                         .column(name)
                         .where(name.opEqual("br-int"))
-                        .operation())
-                .add(op.mutate(bridge)
-                        .addMutation(flood_vlans, Mutator.INSERT, Sets.newHashSet(100, 101, 4001))
-                        .where(name.opEqual("br-int"))
-                        .operation())
+                        .build())
                 .add(op.commit(true))
-                .add(op.comment("Commiting the operation"))
                 .execute();
 
         List<OperationResult> operationResults = results.get();
@@ -93,10 +87,8 @@ public class OvsDBClientTestIT extends OvsdbTestBase {
         results = ovs.transactBuilder()
                 .add(op.delete(bridge)
                         .where(name.opEqual("br-int"))
-                        .operation())
-                .add(op.comment("Deleting Bridge br-int"))
+                        .build())
                 .add(op.commit(true))
-                .add(op.comment("Commiting the operation"))
                 .execute();
 
         operationResults = results.get();
@@ -110,7 +102,7 @@ public class OvsDBClientTestIT extends OvsdbTestBase {
         results = ovs.transactBuilder()
                 .add(op.delete(bridge)
                         .where(name.opEqual("br-int"))
-                        .operation())
+                        .build())
                 .add(op.abort())
                 .execute();
 
@@ -127,7 +119,7 @@ public class OvsDBClientTestIT extends OvsdbTestBase {
         results = ovs.transactBuilder()
                 .add(op.delete(bridge)
                         .where(name.opEqual("br-int"))
-                        .operation())
+                        .build())
                 .add(op.assertion("Assert12345")) // Failing intentionally
                 .execute();
 
@@ -146,11 +138,13 @@ public class OvsDBClientTestIT extends OvsdbTestBase {
         GenericTableSchema bridge = dbSchema.table("Bridge", GenericTableSchema.class);
 
         List<MonitorRequest<GenericTableSchema>> monitorRequests = Lists.newArrayList();
+        ColumnSchema<GenericTableSchema, Set<Integer>> flood_vlans = bridge.multiValuedColumn("flood_vlans", Integer.class);
+
         monitorRequests.add(
                 MonitorRequestBuilder.builder(bridge)
                         .addColumn(bridge.column("name"))
                         .addColumn(bridge.column("fail_mode", String.class))
-                        .addColumn(bridge.multiValuedColumn("flood_vlans", Integer.class))
+                        .addColumn(flood_vlans)
                         .with(new MonitorSelect(true, true, true, true))
                         .build());
 
@@ -178,8 +172,15 @@ public class OvsDBClientTestIT extends OvsdbTestBase {
         Assert.assertTrue(!results.isEmpty());
         Object result = results.get(0);
         Assert.assertTrue(result instanceof TableUpdates);
-        TableUpdate bridgeUpdate = ((TableUpdates) result).getUpdate(bridge);
-        Assert.assertNotNull(bridgeUpdate);
+        TableUpdates updates = (TableUpdates) result;
+        org.opendaylight.ovsdb.lib.message.TableUpdate<GenericTableSchema> update = updates.getUpdate(bridge);
+        Row<GenericTableSchema> aNew = update.getNew();
+        for (Column<GenericTableSchema, ?> column: aNew.getColumns()) {
+            if (column.getSchema().equals(flood_vlans)) {
+                Set<Integer> data = column.getData(flood_vlans);
+                Assert.assertTrue(!data.isEmpty());
+            }
+        }
     }
 
     public void testGetDBs() throws ExecutionException, InterruptedException {
index d104ea62e9011cffb30cfb5d387bc8111cd01b20..7fec593c2f822b366ca68ab177adb377ca8dd53b 100644 (file)
@@ -25,6 +25,7 @@ import org.opendaylight.ovsdb.lib.message.OvsdbRPC;
 import org.opendaylight.ovsdb.lib.message.UpdateNotification;
 import org.opendaylight.ovsdb.lib.operations.OperationResult;
 import org.opendaylight.ovsdb.lib.schema.ColumnSchema;
+import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
 import org.opendaylight.ovsdb.lib.schema.TableSchema;
 import org.opendaylight.ovsdb.lib.schema.temp.Reference;
 import org.slf4j.Logger;
@@ -58,6 +59,7 @@ public class OvsDBClientTestITTyped extends OvsdbTestBase {
         public ColumnSchema<Bridge, Reference> netflow() {
             return column("netflow", Reference.class);
         }
+
     }
 
 
@@ -65,7 +67,10 @@ public class OvsDBClientTestITTyped extends OvsdbTestBase {
     public void test() throws IOException, InterruptedException, ExecutionException {
         OvsDBClientImpl ovs = getVswitch();
 
-        Bridge bridge = ovs.getSchema(OPEN_VSWITCH_SCHEMA, true).get().table("Bridge", Bridge.class);
+        Bridge bridge = ovs.getSchema("Open_vSwitch", true).get().table("Bridge", Bridge.class);
+        GenericTableSchema anytable = null;
+
+
 
         ListenableFuture<List<OperationResult>> results = ovs.transactBuilder()
                 .add(op.insert(bridge).value(bridge.name(), "br-int"))
@@ -73,7 +78,7 @@ public class OvsDBClientTestITTyped extends OvsdbTestBase {
                         .set(bridge.status(), "br-blah")
                         .set(bridge.floodVlans(), 34)
                         .where(bridge.name().opEqual("br-int"))
-                        .and(bridge.name().opEqual("br-int")).operation())
+                        .and(bridge.name().opEqual("br-int")).build())
                 .execute();
 
         List<OperationResult> operationResults = results.get();
index ba5cf7ff0263c00d9de6ef3c9aad5518540c8fe4..6ba2979df8f02a0859ea98b886b931deb8df5101 100644 (file)
@@ -19,6 +19,7 @@ import com.google.common.io.Resources;
 
 import junit.framework.TestCase;
 
+import org.opendaylight.ovsdb.lib.message.temp.TableUpdate;
 import org.opendaylight.ovsdb.lib.message.temp.TableUpdates;
 import org.opendaylight.ovsdb.lib.notation.OvsDBMap;
 import org.opendaylight.ovsdb.lib.notation.OvsDBSet;
@@ -97,7 +98,7 @@ public class MonitorResponseTest extends TestCase {
         assertEquals(2, rows.size());
         List<TableUpdate.Row<Port>> sorted = Ordering.natural().onResultOf(new Function<TableUpdate.Row<Port>, String>() {
             @Override
-            public String apply(org.opendaylight.ovsdb.lib.message.TableUpdate.Row<Port> input) {
+            public String apply(TableUpdate.Row<Port> input) {
                 return input.getId();
             }
         }).sortedCopy(rows);
index 2dd657c521fde145fb59e4f345c0bef693065135..b987efc111207d818b3245127dab4b680f6cc7c1 100644 (file)
@@ -33,8 +33,8 @@ import org.opendaylight.controller.sal.inventory.IPluginOutInventoryService;
 import org.opendaylight.controller.sal.utils.HexEncode;
 import org.opendaylight.controller.sal.utils.ServiceHelper;
 import org.opendaylight.ovsdb.lib.database.DatabaseSchema;
-import org.opendaylight.ovsdb.lib.message.TableUpdate;
-import org.opendaylight.ovsdb.lib.message.TableUpdate.Row;
+import org.opendaylight.ovsdb.lib.message.temp.TableUpdate;
+import org.opendaylight.ovsdb.lib.message.temp.TableUpdate.Row;
 import org.opendaylight.ovsdb.lib.message.temp.TableUpdates;
 import org.opendaylight.ovsdb.lib.notation.OvsDBSet;
 import org.opendaylight.ovsdb.lib.table.Bridge;