Use LF as line separator
Change-Id: I41ed7eeefe076ab3f8b09f26d1e091e6d3394846
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
index 7559715..a271f93 100644
--- a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
@@ -1,1128 +1,1128 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.controller.driver;
-
-import io.netty.channel.Channel;
-
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutionException;
-
-import org.onlab.packet.IpAddress;
-import org.onosproject.ovsdb.controller.OvsdbBridge;
-import org.onosproject.ovsdb.controller.OvsdbBridgeName;
-import org.onosproject.ovsdb.controller.OvsdbClientService;
-import org.onosproject.ovsdb.controller.OvsdbConstant;
-import org.onosproject.ovsdb.controller.OvsdbDatapathId;
-import org.onosproject.ovsdb.controller.OvsdbNodeId;
-import org.onosproject.ovsdb.controller.OvsdbPort;
-import org.onosproject.ovsdb.controller.OvsdbPortName;
-import org.onosproject.ovsdb.controller.OvsdbPortNumber;
-import org.onosproject.ovsdb.controller.OvsdbRowStore;
-import org.onosproject.ovsdb.controller.OvsdbStore;
-import org.onosproject.ovsdb.controller.OvsdbTableStore;
-import org.onosproject.ovsdb.controller.OvsdbTunnel;
-import org.onosproject.ovsdb.rfc.jsonrpc.Callback;
-import org.onosproject.ovsdb.rfc.message.OperationResult;
-import org.onosproject.ovsdb.rfc.message.TableUpdates;
-import org.onosproject.ovsdb.rfc.notation.Condition;
-import org.onosproject.ovsdb.rfc.notation.Mutation;
-import org.onosproject.ovsdb.rfc.notation.OvsdbSet;
-import org.onosproject.ovsdb.rfc.notation.Row;
-import org.onosproject.ovsdb.rfc.notation.UUID;
-import org.onosproject.ovsdb.rfc.operations.Delete;
-import org.onosproject.ovsdb.rfc.operations.Insert;
-import org.onosproject.ovsdb.rfc.operations.Mutate;
-import org.onosproject.ovsdb.rfc.operations.Operation;
-import org.onosproject.ovsdb.rfc.operations.Update;
-import org.onosproject.ovsdb.rfc.schema.ColumnSchema;
-import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
-import org.onosproject.ovsdb.rfc.schema.TableSchema;
-import org.onosproject.ovsdb.rfc.table.Bridge;
-import org.onosproject.ovsdb.rfc.table.Controller;
-import org.onosproject.ovsdb.rfc.table.Interface;
-import org.onosproject.ovsdb.rfc.table.OvsdbTable;
-import org.onosproject.ovsdb.rfc.table.Port;
-import org.onosproject.ovsdb.rfc.table.TableGenerator;
-import org.onosproject.ovsdb.rfc.utils.ConditionUtil;
-import org.onosproject.ovsdb.rfc.utils.FromJsonUtil;
-import org.onosproject.ovsdb.rfc.utils.JsonRpcWriterUtil;
-import org.onosproject.ovsdb.rfc.utils.MutationUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.SettableFuture;
-
-/**
- * An representation of an ovsdb client.
- */
-public class DefaultOvsdbClient
- implements OvsdbProviderService, OvsdbClientService {
-
- private final Logger log = LoggerFactory
- .getLogger(DefaultOvsdbClient.class);
-
- private Channel channel;
-
- private OvsdbAgent agent;
- private boolean connected;
- private OvsdbNodeId nodeId;
- private Callback monitorCallBack;
-
- private OvsdbStore ovsdbStore = new OvsdbStore();
-
- private final Map<String, String> requestMethod = Maps.newHashMap();
- private final Map<String, SettableFuture<? extends Object>> requestResult = Maps
- .newHashMap();
-
- private final Map<String, DatabaseSchema> schema = Maps.newHashMap();
- private final Set<OvsdbTunnel> ovsdbTunnels = new HashSet<OvsdbTunnel>();
-
- /**
- * Creates an OvsdbClient.
- *
- * @param nodeId ovsdb node id
- */
- public DefaultOvsdbClient(OvsdbNodeId nodeId) {
- this.nodeId = nodeId;
- }
-
- @Override
- public OvsdbNodeId nodeId() {
- return nodeId;
- }
-
- @Override
- public void setAgent(OvsdbAgent agent) {
- if (this.agent == null) {
- this.agent = agent;
- }
- }
-
- @Override
- public void setChannel(Channel channel) {
- this.channel = channel;
- }
-
- @Override
- public void setConnection(boolean connected) {
- this.connected = connected;
- }
-
- @Override
- public boolean isConnected() {
- return this.connected;
- }
-
- @Override
- public void nodeAdded() {
- this.agent.addConnectedNode(nodeId, this);
- }
-
- @Override
- public void nodeRemoved() {
- this.agent.removeConnectedNode(nodeId);
- channel.disconnect();
- }
-
- /**
- * Gets the ovsdb table store.
- *
- * @param dbName the ovsdb database name
- * @return ovsTableStore, empty if table store is find
- */
- private OvsdbTableStore getTableStore(String dbName) {
- if (ovsdbStore == null) {
- return null;
- }
- return ovsdbStore.getOvsdbTableStore(dbName);
- }
-
- /**
- * Gets the ovsdb row store.
- *
- * @param dbName the ovsdb database name
- * @param tableName the ovsdb table name
- *
- * @return ovsRowStore, empty if row store is find
- */
- private OvsdbRowStore getRowStore(String dbName, String tableName) {
- OvsdbTableStore tableStore = getTableStore(dbName);
- if (tableStore == null) {
- return null;
- }
- return tableStore.getRows(tableName);
- }
-
- /**
- * Gets the ovsdb row.
- *
- * @param dbName the ovsdb database name
- * @param tableName the ovsdb table name
- * @param uuid the key of the row
- * @return row, empty if row is find
- */
- @Override
- public Row getRow(String dbName, String tableName, String uuid) {
- OvsdbTableStore tableStore = getTableStore(dbName);
- if (tableStore == null) {
- return null;
- }
- OvsdbRowStore rowStore = tableStore.getRows(tableName);
- if (rowStore == null) {
- return null;
- }
- return rowStore.getRow(uuid);
- }
-
- @Override
- public void removeRow(String dbName, String tableName, String uuid) {
- OvsdbTableStore tableStore = getTableStore(dbName);
- if (tableStore == null) {
- return;
- }
- OvsdbRowStore rowStore = tableStore.getRows(tableName);
- if (rowStore == null) {
- return;
- }
- rowStore.deleteRow(uuid);
- }
-
- @Override
- public void updateOvsdbStore(String dbName, String tableName, String uuid,
- Row row) {
- OvsdbTableStore tableStore = ovsdbStore.getOvsdbTableStore(dbName);
- if (tableStore == null) {
- tableStore = new OvsdbTableStore();
- }
- OvsdbRowStore rowStore = tableStore.getRows(tableName);
- if (rowStore == null) {
- rowStore = new OvsdbRowStore();
- }
- rowStore.insertRow(uuid, row);
- tableStore.createOrUpdateTable(tableName, rowStore);
- ovsdbStore.createOrUpdateOvsdbStore(dbName, tableStore);
- }
-
- @Override
- public String getPortUuid(String portName, String bridgeUuid) {
- DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
-
- Row bridgeRow = getRow(OvsdbConstant.DATABASENAME,
- OvsdbConstant.BRIDGE, bridgeUuid);
-
- Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow,
- OvsdbTable.BRIDGE);
- if (bridge != null) {
- OvsdbSet setPorts = (OvsdbSet) bridge.getPortsColumn().data();
- @SuppressWarnings("unchecked")
- Set<UUID> ports = setPorts.set();
- if (ports == null || ports.size() == 0) {
- log.warn("The port uuid is null");
- return null;
- }
-
- for (UUID uuid : ports) {
- Row portRow = getRow(OvsdbConstant.DATABASENAME,
- OvsdbConstant.PORT, uuid.value());
- Port port = (Port) TableGenerator.getTable(dbSchema, portRow,
- OvsdbTable.PORT);
- if (port != null && portName.equalsIgnoreCase(port.getName())) {
- return uuid.value();
- }
- }
-
- }
- return null;
- }
-
- @Override
- public String getInterfaceUuid(String portUuid, String portName) {
- DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
-
- Row portRow = getRow(OvsdbConstant.DATABASENAME, OvsdbConstant.PORT,
- portUuid);
- Port port = (Port) TableGenerator.getTable(dbSchema, portRow,
- OvsdbTable.PORT);
-
- if (port != null) {
- OvsdbSet setInterfaces = (OvsdbSet) port.getInterfacesColumn().data();
- @SuppressWarnings("unchecked")
- Set<UUID> interfaces = setInterfaces.set();
-
- if (interfaces == null || interfaces.size() == 0) {
- log.warn("The interface uuid is null");
- return null;
- }
-
- for (UUID uuid : interfaces) {
- Row intfRow = getRow(OvsdbConstant.DATABASENAME,
- OvsdbConstant.INTERFACE, uuid.value());
- Interface intf = (Interface) TableGenerator
- .getTable(dbSchema, intfRow, OvsdbTable.INTERFACE);
- if (intf != null && portName.equalsIgnoreCase(intf.getName())) {
- return uuid.value();
- }
- }
-
- }
-
- return null;
- }
-
- @Override
- public String getBridgeUuid(String bridgeName) {
- DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
-
- OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME,
- OvsdbConstant.BRIDGE);
- if (rowStore == null) {
- log.debug("The bridge uuid is null");
- return null;
- }
-
- ConcurrentMap<String, Row> bridgeTableRows = rowStore.getRowStore();
- if (bridgeTableRows == null) {
- log.debug("The bridge uuid is null");
- return null;
- }
-
- for (String uuid : bridgeTableRows.keySet()) {
- Bridge bridge = (Bridge) TableGenerator
- .getTable(dbSchema, bridgeTableRows.get(uuid),
- OvsdbTable.BRIDGE);
-
- if (bridge.getName().equals(bridgeName)) {
- return uuid;
- }
-
- }
- return null;
- }
-
- @Override
- public String getControllerUuid(String controllerName,
- String controllerTarget) {
- DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
- OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME,
- OvsdbConstant.CONTROLLER);
- if (rowStore == null) {
- log.debug("The controller uuid is null");
- return null;
- }
-
- ConcurrentMap<String, Row> controllerTableRows = rowStore.getRowStore();
- if (controllerTableRows != null) {
- for (String uuid : controllerTableRows.keySet()) {
-
- Controller controller = (Controller) TableGenerator
- .getTable(dbSchema, controllerTableRows.get(uuid),
- OvsdbTable.CONTROLLER);
- String target = (String) controller.getTargetColumn().data();
- if (target.equalsIgnoreCase(controllerTarget)) {
- return uuid;
- }
-
- }
- }
- return null;
- }
-
- @Override
- public String getOvsUuid(String dbName) {
- OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME,
- OvsdbConstant.DATABASENAME);
- if (rowStore == null) {
- log.debug("The bridge uuid is null");
- return null;
- }
- ConcurrentMap<String, Row> ovsTableRows = rowStore.getRowStore();
- if (ovsTableRows != null) {
- for (String uuid : ovsTableRows.keySet()) {
- Row row = ovsTableRows.get(uuid);
- String tableName = row.tableName();
- if (tableName.equals(dbName)) {
- return uuid;
- }
- }
- }
- return null;
- }
-
- @Override
- public void createPort(String bridgeName, String portName) {
- String bridgeUuid = getBridgeUuid(bridgeName);
- if (bridgeUuid == null) {
- log.error("Can't find bridge {} in {}", bridgeName,
- nodeId.getIpAddress());
- return;
- }
-
- DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
- String portUuid = getPortUuid(portName, bridgeUuid);
-
- Port port = (Port) TableGenerator
- .createTable(dbSchema, OvsdbTable.PORT);
-
- port.setName(portName);
- if (portUuid == null) {
- insertConfig(OvsdbConstant.PORT, "_uuid", OvsdbConstant.BRIDGE,
- "ports", bridgeUuid, port.getRow());
- } else {
- updateConfig(OvsdbConstant.PORT, "_uuid", portUuid, port.getRow());
- }
-
- return;
- }
-
- @Override
- public void dropPort(String bridgeName, String portName) {
- String bridgeUuid = getBridgeUuid(bridgeName);
- if (bridgeUuid == null) {
- log.error("Could not find Bridge {} in {}", bridgeName, nodeId);
- return;
- }
-
- String portUuid = getPortUuid(portName, bridgeUuid);
- if (portUuid != null) {
- log.info("Port {} delete", portName);
- deleteConfig(OvsdbConstant.PORT, "_uuid", portUuid,
- OvsdbConstant.BRIDGE, "ports");
- }
- }
-
- @Override
- public void createBridge(String bridgeName) {
- log.debug("create bridge {}", bridgeName);
-
- DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
- if (dbSchema == null) {
- log.warn("The schema is null");
- return;
- }
-
- Bridge bridge = (Bridge) TableGenerator.createTable(dbSchema,
- OvsdbTable.BRIDGE);
- if (bridge == null) {
- log.debug("Can not create bridge");
- return;
- }
-
- Set<String> failModes = new HashSet<>();
- failModes.add("secure");
- bridge.setFailMode(failModes);
-
- Set<String> protocols = new HashSet<>();
- protocols.add(OvsdbConstant.OPENFLOW13);
- bridge.setProtocols(protocols);
-
- String ovsUuid = getOvsUuid(OvsdbConstant.DATABASENAME);
- if (ovsUuid == null) {
- log.warn("The Open_vSwitch is null");
- return;
- }
-
- String bridgeUuid = getBridgeUuid(bridgeName);
- if (bridgeUuid == null) {
- log.debug("Create a new bridge");
-
- bridge.setName(bridgeName);
- bridgeUuid = insertConfig(OvsdbConstant.BRIDGE, "_uuid",
- OvsdbConstant.DATABASENAME, "bridges",
- ovsUuid, bridge.getRow());
-
- if (bridgeUuid != null) {
- Port port = (Port) TableGenerator.createTable(dbSchema,
- OvsdbTable.PORT);
- if (port != null) {
- log.debug("the port is not null");
- port.setName(bridgeName);
-
- insertConfig(OvsdbConstant.PORT, "_uuid", "Bridge", "ports", bridgeUuid,
- port.getRow());
- }
- }
-
- } else {
- log.info("Update a bridge");
- updateConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUuid, bridge.getRow());
- }
-
- setController(bridgeUuid);
- log.info("Create bridge success");
- }
-
- /**
- * Sets the Controller.
- *
- * @param bridgeUuid bridge uuid
- */
- private void setController(String bridgeUuid) {
- String controllerUuid = null;
- String iPAddress = IpAddress.valueOf(((InetSocketAddress) channel
- .localAddress())
- .getAddress()
- .getHostAddress())
- .toString();
-
- String target = "tcp:" + iPAddress + ":" + OvsdbConstant.OFPORT;
- log.debug("controller IP {}: port {}", iPAddress, OvsdbConstant.OFPORT);
-
- DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
- Controller controller = (Controller) TableGenerator
- .createTable(dbSchema, OvsdbTable.CONTROLLER);
-
- if (controller != null) {
- controller.setTarget(target);
- controllerUuid = getControllerUuid(OvsdbConstant.CONTROLLER, target);
- if (controllerUuid == null) {
-
- insertConfig(OvsdbConstant.CONTROLLER, "_uuid",
- OvsdbConstant.BRIDGE, "controller", bridgeUuid,
- controller.getRow());
-
- } else {
-
- Bridge bridge = (Bridge) TableGenerator
- .createTable(dbSchema, OvsdbTable.BRIDGE);
- Set<UUID> controllerUuids = new HashSet<>();
- controllerUuids.add(UUID.uuid(controllerUuid));
- bridge.setController(controllerUuids);
- updateConfig(OvsdbConstant.CONTROLLER, "_uuid", bridgeUuid, bridge.getRow());
-
- }
- }
-
- }
-
- @Override
- public void dropBridge(String bridgeName) {
- String bridgeUUID = getBridgeUuid(bridgeName);
- if (bridgeUUID == null) {
- log.warn("Could not find bridge in node", nodeId.getIpAddress());
- return;
- }
- deleteConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUUID,
- OvsdbConstant.DATABASENAME, "bridges");
- }
-
- @Override
- public void createTunnel(IpAddress srcIp, IpAddress dstIp) {
- String bridgeUuid = getBridgeUuid(OvsdbConstant.INTEGRATION_BRIDGE);
- if (bridgeUuid == null) {
- log.warn("Could not find bridge {} and Could not create tunnel. ",
- OvsdbConstant.INTEGRATION_BRIDGE);
- return;
- }
-
- DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
- String portName = getTunnelName(OvsdbConstant.TYPEVXLAN, dstIp);
- String portUuid = getPortUuid(portName, bridgeUuid);
-
- Port port = (Port) TableGenerator
- .createTable(dbSchema, OvsdbTable.PORT);
- if (port != null) {
- port.setName(portName);
- }
-
- if (portUuid == null) {
- portUuid = insertConfig(OvsdbConstant.PORT, "_uuid", OvsdbConstant.BRIDGE,
- "ports", bridgeUuid, port.getRow());
- } else {
- updateConfig(OvsdbConstant.PORT, "_uuid", portUuid, port.getRow());
- }
-
- // When a tunnel is created, A row is inserted into port table and
- // interface table of the ovsdb node.
- // and the following step is to get the interface uuid from local store
- // in controller node.
- // but it need spend some time synchronising data between node and
- // controller.
- // so loop to judge if interfaceUUid is null is necessary.
- String interfaceUuid = null;
- for (int i = 0; i < 10; i++) {
- interfaceUuid = getInterfaceUuid(portUuid, portName);
- if (interfaceUuid == null) {
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- log.warn("Interrupted while waiting to get interfaceUuid");
- Thread.currentThread().interrupt();
- }
- } else {
- break;
- }
- }
-
- if (interfaceUuid != null) {
-
- Interface tunInterface = (Interface) TableGenerator
- .createTable(dbSchema, OvsdbTable.INTERFACE);
-
- if (tunInterface != null) {
-
- tunInterface.setType(OvsdbConstant.TYPEVXLAN);
- Map<String, String> options = Maps.newHashMap();
- options.put("key", "flow");
- options.put("local_ip", srcIp.toString());
- options.put("remote_ip", dstIp.toString());
- tunInterface.setOptions(options);
- updateConfig(OvsdbConstant.INTERFACE, "_uuid", interfaceUuid,
- tunInterface.getRow());
- log.info("Tunnel added success", tunInterface);
-
- }
- }
-
- return;
- }
-
- @Override
- public void dropTunnel(IpAddress srcIp, IpAddress dstIp) {
- String bridgeName = OvsdbConstant.INTEGRATION_BRIDGE;
- String portName = getTunnelName(OvsdbConstant.TYPEVXLAN, dstIp);
- String bridgeUuid = getBridgeUuid(OvsdbConstant.INTEGRATION_BRIDGE);
- if (bridgeUuid == null) {
- log.warn("Could not find bridge {} in {}", bridgeName,
- nodeId.getIpAddress());
- return;
- }
-
- String portUUID = getPortUuid(portName, bridgeUuid);
- if (portUUID != null) {
- log.info("Delete tunnel");
- deleteConfig(OvsdbConstant.PORT, "_uuid", portUUID,
- OvsdbConstant.BRIDGE, "ports");
- }
-
- return;
- }
-
- /**
- * Delete transact config.
- *
- * @param childTableName child table name
- * @param childColumnName child column name
- * @param childUuid child row uuid
- * @param parentTableName parent table name
- * @param parentColumnName parent column
- *
- */
- private void deleteConfig(String childTableName, String childColumnName,
- String childUuid, String parentTableName,
- String parentColumnName) {
- DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
- TableSchema childTableSchema = dbSchema.getTableSchema(childTableName);
-
- ArrayList<Operation> operations = Lists.newArrayList();
- if (parentTableName != null && parentColumnName != null) {
- TableSchema parentTableSchema = dbSchema
- .getTableSchema(parentTableName);
- ColumnSchema parentColumnSchema = parentTableSchema
- .getColumnSchema(parentColumnName);
- List<Mutation> mutations = Lists.newArrayList();
- Mutation mutation = MutationUtil.delete(parentColumnSchema.name(),
- UUID.uuid(childUuid));
- mutations.add(mutation);
- List<Condition> conditions = Lists.newArrayList();
- Condition condition = ConditionUtil.includes(parentColumnName,
- UUID.uuid(childUuid));
- conditions.add(condition);
- Mutate op = new Mutate(parentTableSchema, conditions, mutations);
- operations.add(op);
- }
-
- List<Condition> conditions = Lists.newArrayList();
- Condition condition = ConditionUtil.equals(childColumnName, UUID.uuid(childUuid));
- conditions.add(condition);
- Delete del = new Delete(childTableSchema, conditions);
- operations.add(del);
- transactConfig(OvsdbConstant.DATABASENAME, operations);
-
- return;
- }
-
- /**
- * Update transact config.
- *
- * @param tableName table name
- * @param columnName column name
- * @param uuid uuid
- * @param row the config data
- *
- */
- private void updateConfig(String tableName, String columnName, String uuid,
- Row row) {
- DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
- TableSchema tableSchema = dbSchema.getTableSchema(tableName);
-
- List<Condition> conditions = Lists.newArrayList();
- Condition condition = ConditionUtil.equals(columnName, UUID.uuid(uuid));
- conditions.add(condition);
-
- Update update = new Update(tableSchema, row, conditions);
-
- ArrayList<Operation> operations = Lists.newArrayList();
- operations.add(update);
-
- transactConfig(OvsdbConstant.DATABASENAME, operations);
- }
-
- /**
- * Insert transact config.
- *
- * @param childTableName child table name
- * @param childColumnName child column name
- * @param parentTableName parent table name
- * @param parentColumnName parent column
- * @param parentUuid parent uuid
- * @param row the config data
- *
- * @return uuid, empty if no uuid is find
- */
- private String insertConfig(String childTableName, String childColumnName,
- String parentTableName, String parentColumnName,
- String parentUuid, Row row) {
- DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
- TableSchema tableSchema = dbSchema.getTableSchema(childTableName);
-
- String namedUuid = childTableName;
- Insert insert = new Insert(tableSchema, namedUuid, row);
-
- ArrayList<Operation> operations = Lists.newArrayList();
- operations.add(insert);
-
- if (parentTableName != null && parentColumnName != null) {
- TableSchema parentTableSchema = dbSchema
- .getTableSchema(parentTableName);
- ColumnSchema parentColumnSchema = parentTableSchema
- .getColumnSchema(parentColumnName);
-
- List<Mutation> mutations = Lists.newArrayList();
- Mutation mutation = MutationUtil.insert(parentColumnSchema.name(),
- UUID.uuid(namedUuid));
- mutations.add(mutation);
-
- List<Condition> conditions = Lists.newArrayList();
- Condition condition = ConditionUtil.equals("_uuid",
- UUID.uuid(parentUuid));
- conditions.add(condition);
-
- Mutate op = new Mutate(parentTableSchema, conditions, mutations);
- operations.add(op);
- }
- if (childTableName.equalsIgnoreCase(OvsdbConstant.PORT)) {
- log.info("Handle port insert");
- Insert intfInsert = handlePortInsertTable(OvsdbConstant.INTERFACE,
- row);
-
- if (intfInsert != null) {
- operations.add(intfInsert);
- }
-
- Insert ins = (Insert) operations.get(0);
- ins.getRow().put("interfaces",
- UUID.uuid(OvsdbConstant.INTERFACE));
- }
-
- List<OperationResult> results;
- try {
- results = transactConfig(OvsdbConstant.DATABASENAME, operations)
- .get();
-
- return results.get(0).getUuid().value();
- } catch (InterruptedException e) {
- log.warn("Interrupted while waiting to get result");
- Thread.currentThread().interrupt();
- } catch (ExecutionException e) {
- log.error("Exception thrown while to get result");
- }
-
- return null;
- }
-
- /**
- * Handles port insert.
- *
- * @param tableName ovsdb table interface
- * @param portRow row of port
- *
- * @return insert, empty if null
- */
- private Insert handlePortInsertTable(String tableName, Row portRow) {
- DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
-
- TableSchema portTableSchema = dbSchema
- .getTableSchema(OvsdbConstant.PORT);
- ColumnSchema portColumnSchema = portTableSchema.getColumnSchema("name");
-
- String portName = (String) portRow.getColumn(portColumnSchema.name()).data();
-
- Interface inf = (Interface) TableGenerator
- .createTable(dbSchema, OvsdbTable.INTERFACE);
-
- inf.setName(portName);
-
- TableSchema intfTableSchema = dbSchema
- .getTableSchema(OvsdbConstant.INTERFACE);
- Insert insert = new Insert(intfTableSchema, OvsdbConstant.INTERFACE,
- inf.getRow());
- return insert;
- }
-
- /**
- * Gets tunnel name.
- *
- * @param tunnelType
- * @param dstIp the remote ip address
- *
- * @return tunnel name
- */
- private String getTunnelName(String tunnelType, IpAddress dstIp) {
- return tunnelType + "-" + dstIp.toString();
- }
-
- @Override
- public ListenableFuture<DatabaseSchema> getOvsdbSchema(String dbName) {
- if (dbName == null) {
- return null;
- }
- DatabaseSchema databaseSchema = schema.get(dbName);
- if (databaseSchema == null) {
- List<String> dbNames = new ArrayList<String>();
- dbNames.add(dbName);
- Function<JsonNode, DatabaseSchema> rowFunction = new Function<JsonNode, DatabaseSchema>() {
- @Override
- public DatabaseSchema apply(JsonNode input) {
- log.info("Get ovsdb database schema", dbName);
- DatabaseSchema dbSchema = FromJsonUtil
- .jsonNodeToDbSchema(dbName, input);
- if (dbSchema == null) {
- log.debug("Get ovsdb database schema error");
- return null;
- }
- schema.put(dbName, dbSchema);
-
- return dbSchema;
- }
- };
-
- ListenableFuture<JsonNode> input = getSchema(dbNames);
- if (input != null) {
- return Futures.transform(input, rowFunction);
- }
- return null;
- } else {
- return Futures.immediateFuture(databaseSchema);
- }
- }
-
- @Override
- public ListenableFuture<TableUpdates> monitorTables(String dbName, String id) {
- if (dbName == null) {
- return null;
- }
- DatabaseSchema dbSchema = schema.get(dbName);
- if (dbSchema != null) {
- Function<JsonNode, TableUpdates> rowFunction = new Function<JsonNode, TableUpdates>() {
- @Override
- public TableUpdates apply(JsonNode input) {
- log.info("Get table updates");
- TableUpdates updates = FromJsonUtil
- .jsonNodeToTableUpdates(input, dbSchema);
- if (updates == null) {
- log.debug("Get table updates error");
- return null;
- }
- return updates;
- }
- };
- return Futures.transform(monitor(dbSchema, id), rowFunction);
- }
- return null;
- }
-
- @Override
- public ListenableFuture<List<OperationResult>> transactConfig(String dbName,
- List<Operation> operations) {
- if (dbName == null) {
- return null;
- }
- DatabaseSchema dbSchema = schema.get(dbName);
- if (dbSchema != null) {
- Function<List<JsonNode>, List<OperationResult>> rowFunction =
- new Function<List<JsonNode>, List<OperationResult>>() {
- @Override
- public List<OperationResult> apply(List<JsonNode> input) {
- log.info("Get ovsdb operation result");
- List<OperationResult> result = FromJsonUtil
- .jsonNodeToOperationResult(input, operations);
-
- if (result == null) {
- log.debug("The operation result is null");
- return null;
- }
- return result;
- }
- };
- return Futures.transform(transact(dbSchema, operations),
- rowFunction);
- }
- return null;
- }
-
- @Override
- public ListenableFuture<JsonNode> getSchema(List<String> dbnames) {
- String id = java.util.UUID.randomUUID().toString();
- String getSchemaString = JsonRpcWriterUtil.getSchemaStr(id, dbnames);
-
- SettableFuture<JsonNode> sf = SettableFuture.create();
- requestResult.put(id, sf);
- requestMethod.put(id, "getSchema");
-
- channel.writeAndFlush(getSchemaString);
- return sf;
-
- }
-
- @Override
- public ListenableFuture<List<String>> echo() {
- String id = java.util.UUID.randomUUID().toString();
- String echoString = JsonRpcWriterUtil.echoStr(id);
-
- SettableFuture<List<String>> sf = SettableFuture.create();
- requestResult.put(id, sf);
- requestMethod.put(id, "echo");
-
- channel.writeAndFlush(echoString);
- return sf;
-
- }
-
- @Override
- public ListenableFuture<JsonNode> monitor(DatabaseSchema dbSchema,
- String monitorId) {
- String id = java.util.UUID.randomUUID().toString();
- String monitorString = JsonRpcWriterUtil.monitorStr(id, monitorId,
- dbSchema);
-
- SettableFuture<JsonNode> sf = SettableFuture.create();
- requestResult.put(id, sf);
- requestMethod.put(id, "monitor");
-
- channel.writeAndFlush(monitorString);
- return sf;
-
- }
-
- @Override
- public ListenableFuture<List<String>> listDbs() {
- String id = java.util.UUID.randomUUID().toString();
- String listDbsString = JsonRpcWriterUtil.listDbsStr(id);
-
- SettableFuture<List<String>> sf = SettableFuture.create();
- requestResult.put(id, sf);
- requestMethod.put(id, "listDbs");
-
- channel.writeAndFlush(listDbsString);
- return sf;
-
- }
-
- @Override
- public ListenableFuture<List<JsonNode>> transact(DatabaseSchema dbSchema,
- List<Operation> operations) {
- String id = java.util.UUID.randomUUID().toString();
- String transactString = JsonRpcWriterUtil.transactStr(id, dbSchema,
- operations);
-
- SettableFuture<List<JsonNode>> sf = SettableFuture.create();
- requestResult.put(id, sf);
- requestMethod.put(id, "transact");
-
- channel.writeAndFlush(transactString);
- return sf;
-
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @Override
- public void processResult(JsonNode response) {
- log.debug("Handle result");
- String requestId = response.get("id").asText();
- SettableFuture sf = requestResult.get(requestId);
- if (sf == null) {
- log.debug("No such future to process");
- return;
- }
- String methodName = requestMethod.get(requestId);
-
- Object result;
- result = FromJsonUtil.jsonResultParser(response, methodName);
-
- sf.set(result);
- return;
- }
-
- @Override
- public void processRequest(JsonNode requestJson) {
- log.debug("Handle request");
- if (requestJson.get("method").asText().equalsIgnoreCase("echo")) {
- log.debug("handle echo request");
-
- String replyString = FromJsonUtil.getEchoRequestStr(requestJson);
- channel.writeAndFlush(replyString);
-
- return;
- } else {
- FromJsonUtil
- .jsonCallbackRequestParser(requestJson, monitorCallBack);
- return;
- }
- }
-
- @Override
- public void setCallback(Callback monitorCallback) {
- this.monitorCallBack = monitorCallback;
- }
-
- @Override
- public Set<OvsdbTunnel> getTunnels() {
- return ovsdbTunnels;
- }
-
- @Override
- public Set<OvsdbBridge> getBridges() {
- Set<OvsdbBridge> ovsdbBridges = new HashSet<OvsdbBridge>();
- OvsdbTableStore tableStore = getTableStore(OvsdbConstant.DATABASENAME);
- if (tableStore == null) {
- return null;
- }
- OvsdbRowStore rowStore = tableStore.getRows(OvsdbConstant.BRIDGE);
- if (rowStore == null) {
- return null;
- }
- ConcurrentMap<String, Row> rows = rowStore.getRowStore();
- for (String uuid : rows.keySet()) {
- Row row = getRow(OvsdbConstant.DATABASENAME, OvsdbConstant.BRIDGE,
- uuid);
- OvsdbBridge ovsdbBridge = getOvsdbBridge(row);
- if (ovsdbBridge != null) {
- ovsdbBridges.add(ovsdbBridge);
- }
- }
- return ovsdbBridges;
- }
-
- @Override
- public Set<OvsdbPort> getPorts() {
- Set<OvsdbPort> ovsdbPorts = new HashSet<OvsdbPort>();
- OvsdbTableStore tableStore = getTableStore(OvsdbConstant.DATABASENAME);
- if (tableStore == null) {
- return null;
- }
- OvsdbRowStore rowStore = tableStore.getRows(OvsdbConstant.INTERFACE);
- if (rowStore == null) {
- return null;
- }
- ConcurrentMap<String, Row> rows = rowStore.getRowStore();
- for (String uuid : rows.keySet()) {
- Row row = getRow(OvsdbConstant.DATABASENAME,
- OvsdbConstant.INTERFACE, uuid);
- OvsdbPort ovsdbPort = getOvsdbPort(row);
- if (ovsdbPort != null) {
- ovsdbPorts.add(ovsdbPort);
- }
- }
- return ovsdbPorts;
- }
-
- @Override
- public DatabaseSchema getDatabaseSchema(String dbName) {
- return schema.get(dbName);
- }
-
- //Gets ovsdb port.
- private OvsdbPort getOvsdbPort(Row row) {
- DatabaseSchema dbSchema = getDatabaseSchema(OvsdbConstant.DATABASENAME);
- Interface intf = (Interface) TableGenerator
- .getTable(dbSchema, row, OvsdbTable.INTERFACE);
- if (intf == null) {
- return null;
- }
- long ofPort = getOfPort(intf);
- String portName = intf.getName();
- if ((ofPort < 0) || (portName == null)) {
- return null;
- }
-
- OvsdbPort ovsdbPort = new OvsdbPort(new OvsdbPortNumber(ofPort),
- new OvsdbPortName(portName));
- return ovsdbPort;
- }
-
- ////Gets ovsdb bridge.
- private OvsdbBridge getOvsdbBridge(Row row) {
- DatabaseSchema dbSchema = getDatabaseSchema(OvsdbConstant.DATABASENAME);
- Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, row,
- OvsdbTable.BRIDGE);
- if (bridge == null) {
- return null;
- }
-
- OvsdbSet datapathIdSet = (OvsdbSet) bridge.getDatapathIdColumn().data();
- @SuppressWarnings("unchecked")
- Set<String> datapathIds = datapathIdSet.set();
- if (datapathIds == null || datapathIds.size() == 0) {
- return null;
- }
- String datapathId = (String) datapathIds.toArray()[0];
- String bridgeName = bridge.getName();
- if ((datapathId == null) || (bridgeName == null)) {
- return null;
- }
-
- OvsdbBridge ovsdbBridge = new OvsdbBridge(new OvsdbBridgeName(bridgeName),
- new OvsdbDatapathId(datapathId));
- return ovsdbBridge;
- }
-
- //Gets ofPort in the interface.
- private long getOfPort(Interface intf) {
- OvsdbSet ofPortSet = (OvsdbSet) intf.getOpenFlowPortColumn().data();
- @SuppressWarnings("unchecked")
- Set<Integer> ofPorts = ofPortSet.set();
- while (ofPorts == null || ofPorts.size() <= 0) {
- log.debug("The ofport is null in {}", intf.getName());
- return -1;
- }
- // return (long) ofPorts.toArray()[0];
- Iterator<Integer> it = ofPorts.iterator();
- return Long.parseLong(it.next().toString());
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.controller.driver;
+
+import io.netty.channel.Channel;
+
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutionException;
+
+import org.onlab.packet.IpAddress;
+import org.onosproject.ovsdb.controller.OvsdbBridge;
+import org.onosproject.ovsdb.controller.OvsdbBridgeName;
+import org.onosproject.ovsdb.controller.OvsdbClientService;
+import org.onosproject.ovsdb.controller.OvsdbConstant;
+import org.onosproject.ovsdb.controller.OvsdbDatapathId;
+import org.onosproject.ovsdb.controller.OvsdbNodeId;
+import org.onosproject.ovsdb.controller.OvsdbPort;
+import org.onosproject.ovsdb.controller.OvsdbPortName;
+import org.onosproject.ovsdb.controller.OvsdbPortNumber;
+import org.onosproject.ovsdb.controller.OvsdbRowStore;
+import org.onosproject.ovsdb.controller.OvsdbStore;
+import org.onosproject.ovsdb.controller.OvsdbTableStore;
+import org.onosproject.ovsdb.controller.OvsdbTunnel;
+import org.onosproject.ovsdb.rfc.jsonrpc.Callback;
+import org.onosproject.ovsdb.rfc.message.OperationResult;
+import org.onosproject.ovsdb.rfc.message.TableUpdates;
+import org.onosproject.ovsdb.rfc.notation.Condition;
+import org.onosproject.ovsdb.rfc.notation.Mutation;
+import org.onosproject.ovsdb.rfc.notation.OvsdbSet;
+import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.notation.UUID;
+import org.onosproject.ovsdb.rfc.operations.Delete;
+import org.onosproject.ovsdb.rfc.operations.Insert;
+import org.onosproject.ovsdb.rfc.operations.Mutate;
+import org.onosproject.ovsdb.rfc.operations.Operation;
+import org.onosproject.ovsdb.rfc.operations.Update;
+import org.onosproject.ovsdb.rfc.schema.ColumnSchema;
+import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+import org.onosproject.ovsdb.rfc.table.Bridge;
+import org.onosproject.ovsdb.rfc.table.Controller;
+import org.onosproject.ovsdb.rfc.table.Interface;
+import org.onosproject.ovsdb.rfc.table.OvsdbTable;
+import org.onosproject.ovsdb.rfc.table.Port;
+import org.onosproject.ovsdb.rfc.table.TableGenerator;
+import org.onosproject.ovsdb.rfc.utils.ConditionUtil;
+import org.onosproject.ovsdb.rfc.utils.FromJsonUtil;
+import org.onosproject.ovsdb.rfc.utils.JsonRpcWriterUtil;
+import org.onosproject.ovsdb.rfc.utils.MutationUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
+/**
+ * An representation of an ovsdb client.
+ */
+public class DefaultOvsdbClient
+ implements OvsdbProviderService, OvsdbClientService {
+
+ private final Logger log = LoggerFactory
+ .getLogger(DefaultOvsdbClient.class);
+
+ private Channel channel;
+
+ private OvsdbAgent agent;
+ private boolean connected;
+ private OvsdbNodeId nodeId;
+ private Callback monitorCallBack;
+
+ private OvsdbStore ovsdbStore = new OvsdbStore();
+
+ private final Map<String, String> requestMethod = Maps.newHashMap();
+ private final Map<String, SettableFuture<? extends Object>> requestResult = Maps
+ .newHashMap();
+
+ private final Map<String, DatabaseSchema> schema = Maps.newHashMap();
+ private final Set<OvsdbTunnel> ovsdbTunnels = new HashSet<OvsdbTunnel>();
+
+ /**
+ * Creates an OvsdbClient.
+ *
+ * @param nodeId ovsdb node id
+ */
+ public DefaultOvsdbClient(OvsdbNodeId nodeId) {
+ this.nodeId = nodeId;
+ }
+
+ @Override
+ public OvsdbNodeId nodeId() {
+ return nodeId;
+ }
+
+ @Override
+ public void setAgent(OvsdbAgent agent) {
+ if (this.agent == null) {
+ this.agent = agent;
+ }
+ }
+
+ @Override
+ public void setChannel(Channel channel) {
+ this.channel = channel;
+ }
+
+ @Override
+ public void setConnection(boolean connected) {
+ this.connected = connected;
+ }
+
+ @Override
+ public boolean isConnected() {
+ return this.connected;
+ }
+
+ @Override
+ public void nodeAdded() {
+ this.agent.addConnectedNode(nodeId, this);
+ }
+
+ @Override
+ public void nodeRemoved() {
+ this.agent.removeConnectedNode(nodeId);
+ channel.disconnect();
+ }
+
+ /**
+ * Gets the ovsdb table store.
+ *
+ * @param dbName the ovsdb database name
+ * @return ovsTableStore, empty if table store is find
+ */
+ private OvsdbTableStore getTableStore(String dbName) {
+ if (ovsdbStore == null) {
+ return null;
+ }
+ return ovsdbStore.getOvsdbTableStore(dbName);
+ }
+
+ /**
+ * Gets the ovsdb row store.
+ *
+ * @param dbName the ovsdb database name
+ * @param tableName the ovsdb table name
+ *
+ * @return ovsRowStore, empty if row store is find
+ */
+ private OvsdbRowStore getRowStore(String dbName, String tableName) {
+ OvsdbTableStore tableStore = getTableStore(dbName);
+ if (tableStore == null) {
+ return null;
+ }
+ return tableStore.getRows(tableName);
+ }
+
+ /**
+ * Gets the ovsdb row.
+ *
+ * @param dbName the ovsdb database name
+ * @param tableName the ovsdb table name
+ * @param uuid the key of the row
+ * @return row, empty if row is find
+ */
+ @Override
+ public Row getRow(String dbName, String tableName, String uuid) {
+ OvsdbTableStore tableStore = getTableStore(dbName);
+ if (tableStore == null) {
+ return null;
+ }
+ OvsdbRowStore rowStore = tableStore.getRows(tableName);
+ if (rowStore == null) {
+ return null;
+ }
+ return rowStore.getRow(uuid);
+ }
+
+ @Override
+ public void removeRow(String dbName, String tableName, String uuid) {
+ OvsdbTableStore tableStore = getTableStore(dbName);
+ if (tableStore == null) {
+ return;
+ }
+ OvsdbRowStore rowStore = tableStore.getRows(tableName);
+ if (rowStore == null) {
+ return;
+ }
+ rowStore.deleteRow(uuid);
+ }
+
+ @Override
+ public void updateOvsdbStore(String dbName, String tableName, String uuid,
+ Row row) {
+ OvsdbTableStore tableStore = ovsdbStore.getOvsdbTableStore(dbName);
+ if (tableStore == null) {
+ tableStore = new OvsdbTableStore();
+ }
+ OvsdbRowStore rowStore = tableStore.getRows(tableName);
+ if (rowStore == null) {
+ rowStore = new OvsdbRowStore();
+ }
+ rowStore.insertRow(uuid, row);
+ tableStore.createOrUpdateTable(tableName, rowStore);
+ ovsdbStore.createOrUpdateOvsdbStore(dbName, tableStore);
+ }
+
+ @Override
+ public String getPortUuid(String portName, String bridgeUuid) {
+ DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+
+ Row bridgeRow = getRow(OvsdbConstant.DATABASENAME,
+ OvsdbConstant.BRIDGE, bridgeUuid);
+
+ Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow,
+ OvsdbTable.BRIDGE);
+ if (bridge != null) {
+ OvsdbSet setPorts = (OvsdbSet) bridge.getPortsColumn().data();
+ @SuppressWarnings("unchecked")
+ Set<UUID> ports = setPorts.set();
+ if (ports == null || ports.size() == 0) {
+ log.warn("The port uuid is null");
+ return null;
+ }
+
+ for (UUID uuid : ports) {
+ Row portRow = getRow(OvsdbConstant.DATABASENAME,
+ OvsdbConstant.PORT, uuid.value());
+ Port port = (Port) TableGenerator.getTable(dbSchema, portRow,
+ OvsdbTable.PORT);
+ if (port != null && portName.equalsIgnoreCase(port.getName())) {
+ return uuid.value();
+ }
+ }
+
+ }
+ return null;
+ }
+
+ @Override
+ public String getInterfaceUuid(String portUuid, String portName) {
+ DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+
+ Row portRow = getRow(OvsdbConstant.DATABASENAME, OvsdbConstant.PORT,
+ portUuid);
+ Port port = (Port) TableGenerator.getTable(dbSchema, portRow,
+ OvsdbTable.PORT);
+
+ if (port != null) {
+ OvsdbSet setInterfaces = (OvsdbSet) port.getInterfacesColumn().data();
+ @SuppressWarnings("unchecked")
+ Set<UUID> interfaces = setInterfaces.set();
+
+ if (interfaces == null || interfaces.size() == 0) {
+ log.warn("The interface uuid is null");
+ return null;
+ }
+
+ for (UUID uuid : interfaces) {
+ Row intfRow = getRow(OvsdbConstant.DATABASENAME,
+ OvsdbConstant.INTERFACE, uuid.value());
+ Interface intf = (Interface) TableGenerator
+ .getTable(dbSchema, intfRow, OvsdbTable.INTERFACE);
+ if (intf != null && portName.equalsIgnoreCase(intf.getName())) {
+ return uuid.value();
+ }
+ }
+
+ }
+
+ return null;
+ }
+
+ @Override
+ public String getBridgeUuid(String bridgeName) {
+ DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+
+ OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME,
+ OvsdbConstant.BRIDGE);
+ if (rowStore == null) {
+ log.debug("The bridge uuid is null");
+ return null;
+ }
+
+ ConcurrentMap<String, Row> bridgeTableRows = rowStore.getRowStore();
+ if (bridgeTableRows == null) {
+ log.debug("The bridge uuid is null");
+ return null;
+ }
+
+ for (String uuid : bridgeTableRows.keySet()) {
+ Bridge bridge = (Bridge) TableGenerator
+ .getTable(dbSchema, bridgeTableRows.get(uuid),
+ OvsdbTable.BRIDGE);
+
+ if (bridge.getName().equals(bridgeName)) {
+ return uuid;
+ }
+
+ }
+ return null;
+ }
+
+ @Override
+ public String getControllerUuid(String controllerName,
+ String controllerTarget) {
+ DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+ OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME,
+ OvsdbConstant.CONTROLLER);
+ if (rowStore == null) {
+ log.debug("The controller uuid is null");
+ return null;
+ }
+
+ ConcurrentMap<String, Row> controllerTableRows = rowStore.getRowStore();
+ if (controllerTableRows != null) {
+ for (String uuid : controllerTableRows.keySet()) {
+
+ Controller controller = (Controller) TableGenerator
+ .getTable(dbSchema, controllerTableRows.get(uuid),
+ OvsdbTable.CONTROLLER);
+ String target = (String) controller.getTargetColumn().data();
+ if (target.equalsIgnoreCase(controllerTarget)) {
+ return uuid;
+ }
+
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getOvsUuid(String dbName) {
+ OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME,
+ OvsdbConstant.DATABASENAME);
+ if (rowStore == null) {
+ log.debug("The bridge uuid is null");
+ return null;
+ }
+ ConcurrentMap<String, Row> ovsTableRows = rowStore.getRowStore();
+ if (ovsTableRows != null) {
+ for (String uuid : ovsTableRows.keySet()) {
+ Row row = ovsTableRows.get(uuid);
+ String tableName = row.tableName();
+ if (tableName.equals(dbName)) {
+ return uuid;
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void createPort(String bridgeName, String portName) {
+ String bridgeUuid = getBridgeUuid(bridgeName);
+ if (bridgeUuid == null) {
+ log.error("Can't find bridge {} in {}", bridgeName,
+ nodeId.getIpAddress());
+ return;
+ }
+
+ DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+ String portUuid = getPortUuid(portName, bridgeUuid);
+
+ Port port = (Port) TableGenerator
+ .createTable(dbSchema, OvsdbTable.PORT);
+
+ port.setName(portName);
+ if (portUuid == null) {
+ insertConfig(OvsdbConstant.PORT, "_uuid", OvsdbConstant.BRIDGE,
+ "ports", bridgeUuid, port.getRow());
+ } else {
+ updateConfig(OvsdbConstant.PORT, "_uuid", portUuid, port.getRow());
+ }
+
+ return;
+ }
+
+ @Override
+ public void dropPort(String bridgeName, String portName) {
+ String bridgeUuid = getBridgeUuid(bridgeName);
+ if (bridgeUuid == null) {
+ log.error("Could not find Bridge {} in {}", bridgeName, nodeId);
+ return;
+ }
+
+ String portUuid = getPortUuid(portName, bridgeUuid);
+ if (portUuid != null) {
+ log.info("Port {} delete", portName);
+ deleteConfig(OvsdbConstant.PORT, "_uuid", portUuid,
+ OvsdbConstant.BRIDGE, "ports");
+ }
+ }
+
+ @Override
+ public void createBridge(String bridgeName) {
+ log.debug("create bridge {}", bridgeName);
+
+ DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+ if (dbSchema == null) {
+ log.warn("The schema is null");
+ return;
+ }
+
+ Bridge bridge = (Bridge) TableGenerator.createTable(dbSchema,
+ OvsdbTable.BRIDGE);
+ if (bridge == null) {
+ log.debug("Can not create bridge");
+ return;
+ }
+
+ Set<String> failModes = new HashSet<>();
+ failModes.add("secure");
+ bridge.setFailMode(failModes);
+
+ Set<String> protocols = new HashSet<>();
+ protocols.add(OvsdbConstant.OPENFLOW13);
+ bridge.setProtocols(protocols);
+
+ String ovsUuid = getOvsUuid(OvsdbConstant.DATABASENAME);
+ if (ovsUuid == null) {
+ log.warn("The Open_vSwitch is null");
+ return;
+ }
+
+ String bridgeUuid = getBridgeUuid(bridgeName);
+ if (bridgeUuid == null) {
+ log.debug("Create a new bridge");
+
+ bridge.setName(bridgeName);
+ bridgeUuid = insertConfig(OvsdbConstant.BRIDGE, "_uuid",
+ OvsdbConstant.DATABASENAME, "bridges",
+ ovsUuid, bridge.getRow());
+
+ if (bridgeUuid != null) {
+ Port port = (Port) TableGenerator.createTable(dbSchema,
+ OvsdbTable.PORT);
+ if (port != null) {
+ log.debug("the port is not null");
+ port.setName(bridgeName);
+
+ insertConfig(OvsdbConstant.PORT, "_uuid", "Bridge", "ports", bridgeUuid,
+ port.getRow());
+ }
+ }
+
+ } else {
+ log.info("Update a bridge");
+ updateConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUuid, bridge.getRow());
+ }
+
+ setController(bridgeUuid);
+ log.info("Create bridge success");
+ }
+
+ /**
+ * Sets the Controller.
+ *
+ * @param bridgeUuid bridge uuid
+ */
+ private void setController(String bridgeUuid) {
+ String controllerUuid = null;
+ String iPAddress = IpAddress.valueOf(((InetSocketAddress) channel
+ .localAddress())
+ .getAddress()
+ .getHostAddress())
+ .toString();
+
+ String target = "tcp:" + iPAddress + ":" + OvsdbConstant.OFPORT;
+ log.debug("controller IP {}: port {}", iPAddress, OvsdbConstant.OFPORT);
+
+ DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+ Controller controller = (Controller) TableGenerator
+ .createTable(dbSchema, OvsdbTable.CONTROLLER);
+
+ if (controller != null) {
+ controller.setTarget(target);
+ controllerUuid = getControllerUuid(OvsdbConstant.CONTROLLER, target);
+ if (controllerUuid == null) {
+
+ insertConfig(OvsdbConstant.CONTROLLER, "_uuid",
+ OvsdbConstant.BRIDGE, "controller", bridgeUuid,
+ controller.getRow());
+
+ } else {
+
+ Bridge bridge = (Bridge) TableGenerator
+ .createTable(dbSchema, OvsdbTable.BRIDGE);
+ Set<UUID> controllerUuids = new HashSet<>();
+ controllerUuids.add(UUID.uuid(controllerUuid));
+ bridge.setController(controllerUuids);
+ updateConfig(OvsdbConstant.CONTROLLER, "_uuid", bridgeUuid, bridge.getRow());
+
+ }
+ }
+
+ }
+
+ @Override
+ public void dropBridge(String bridgeName) {
+ String bridgeUUID = getBridgeUuid(bridgeName);
+ if (bridgeUUID == null) {
+ log.warn("Could not find bridge in node", nodeId.getIpAddress());
+ return;
+ }
+ deleteConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUUID,
+ OvsdbConstant.DATABASENAME, "bridges");
+ }
+
+ @Override
+ public void createTunnel(IpAddress srcIp, IpAddress dstIp) {
+ String bridgeUuid = getBridgeUuid(OvsdbConstant.INTEGRATION_BRIDGE);
+ if (bridgeUuid == null) {
+ log.warn("Could not find bridge {} and Could not create tunnel. ",
+ OvsdbConstant.INTEGRATION_BRIDGE);
+ return;
+ }
+
+ DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+ String portName = getTunnelName(OvsdbConstant.TYPEVXLAN, dstIp);
+ String portUuid = getPortUuid(portName, bridgeUuid);
+
+ Port port = (Port) TableGenerator
+ .createTable(dbSchema, OvsdbTable.PORT);
+ if (port != null) {
+ port.setName(portName);
+ }
+
+ if (portUuid == null) {
+ portUuid = insertConfig(OvsdbConstant.PORT, "_uuid", OvsdbConstant.BRIDGE,
+ "ports", bridgeUuid, port.getRow());
+ } else {
+ updateConfig(OvsdbConstant.PORT, "_uuid", portUuid, port.getRow());
+ }
+
+ // When a tunnel is created, A row is inserted into port table and
+ // interface table of the ovsdb node.
+ // and the following step is to get the interface uuid from local store
+ // in controller node.
+ // but it need spend some time synchronising data between node and
+ // controller.
+ // so loop to judge if interfaceUUid is null is necessary.
+ String interfaceUuid = null;
+ for (int i = 0; i < 10; i++) {
+ interfaceUuid = getInterfaceUuid(portUuid, portName);
+ if (interfaceUuid == null) {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ log.warn("Interrupted while waiting to get interfaceUuid");
+ Thread.currentThread().interrupt();
+ }
+ } else {
+ break;
+ }
+ }
+
+ if (interfaceUuid != null) {
+
+ Interface tunInterface = (Interface) TableGenerator
+ .createTable(dbSchema, OvsdbTable.INTERFACE);
+
+ if (tunInterface != null) {
+
+ tunInterface.setType(OvsdbConstant.TYPEVXLAN);
+ Map<String, String> options = Maps.newHashMap();
+ options.put("key", "flow");
+ options.put("local_ip", srcIp.toString());
+ options.put("remote_ip", dstIp.toString());
+ tunInterface.setOptions(options);
+ updateConfig(OvsdbConstant.INTERFACE, "_uuid", interfaceUuid,
+ tunInterface.getRow());
+ log.info("Tunnel added success", tunInterface);
+
+ }
+ }
+
+ return;
+ }
+
+ @Override
+ public void dropTunnel(IpAddress srcIp, IpAddress dstIp) {
+ String bridgeName = OvsdbConstant.INTEGRATION_BRIDGE;
+ String portName = getTunnelName(OvsdbConstant.TYPEVXLAN, dstIp);
+ String bridgeUuid = getBridgeUuid(OvsdbConstant.INTEGRATION_BRIDGE);
+ if (bridgeUuid == null) {
+ log.warn("Could not find bridge {} in {}", bridgeName,
+ nodeId.getIpAddress());
+ return;
+ }
+
+ String portUUID = getPortUuid(portName, bridgeUuid);
+ if (portUUID != null) {
+ log.info("Delete tunnel");
+ deleteConfig(OvsdbConstant.PORT, "_uuid", portUUID,
+ OvsdbConstant.BRIDGE, "ports");
+ }
+
+ return;
+ }
+
+ /**
+ * Delete transact config.
+ *
+ * @param childTableName child table name
+ * @param childColumnName child column name
+ * @param childUuid child row uuid
+ * @param parentTableName parent table name
+ * @param parentColumnName parent column
+ *
+ */
+ private void deleteConfig(String childTableName, String childColumnName,
+ String childUuid, String parentTableName,
+ String parentColumnName) {
+ DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+ TableSchema childTableSchema = dbSchema.getTableSchema(childTableName);
+
+ ArrayList<Operation> operations = Lists.newArrayList();
+ if (parentTableName != null && parentColumnName != null) {
+ TableSchema parentTableSchema = dbSchema
+ .getTableSchema(parentTableName);
+ ColumnSchema parentColumnSchema = parentTableSchema
+ .getColumnSchema(parentColumnName);
+ List<Mutation> mutations = Lists.newArrayList();
+ Mutation mutation = MutationUtil.delete(parentColumnSchema.name(),
+ UUID.uuid(childUuid));
+ mutations.add(mutation);
+ List<Condition> conditions = Lists.newArrayList();
+ Condition condition = ConditionUtil.includes(parentColumnName,
+ UUID.uuid(childUuid));
+ conditions.add(condition);
+ Mutate op = new Mutate(parentTableSchema, conditions, mutations);
+ operations.add(op);
+ }
+
+ List<Condition> conditions = Lists.newArrayList();
+ Condition condition = ConditionUtil.equals(childColumnName, UUID.uuid(childUuid));
+ conditions.add(condition);
+ Delete del = new Delete(childTableSchema, conditions);
+ operations.add(del);
+ transactConfig(OvsdbConstant.DATABASENAME, operations);
+
+ return;
+ }
+
+ /**
+ * Update transact config.
+ *
+ * @param tableName table name
+ * @param columnName column name
+ * @param uuid uuid
+ * @param row the config data
+ *
+ */
+ private void updateConfig(String tableName, String columnName, String uuid,
+ Row row) {
+ DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+ TableSchema tableSchema = dbSchema.getTableSchema(tableName);
+
+ List<Condition> conditions = Lists.newArrayList();
+ Condition condition = ConditionUtil.equals(columnName, UUID.uuid(uuid));
+ conditions.add(condition);
+
+ Update update = new Update(tableSchema, row, conditions);
+
+ ArrayList<Operation> operations = Lists.newArrayList();
+ operations.add(update);
+
+ transactConfig(OvsdbConstant.DATABASENAME, operations);
+ }
+
+ /**
+ * Insert transact config.
+ *
+ * @param childTableName child table name
+ * @param childColumnName child column name
+ * @param parentTableName parent table name
+ * @param parentColumnName parent column
+ * @param parentUuid parent uuid
+ * @param row the config data
+ *
+ * @return uuid, empty if no uuid is find
+ */
+ private String insertConfig(String childTableName, String childColumnName,
+ String parentTableName, String parentColumnName,
+ String parentUuid, Row row) {
+ DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+ TableSchema tableSchema = dbSchema.getTableSchema(childTableName);
+
+ String namedUuid = childTableName;
+ Insert insert = new Insert(tableSchema, namedUuid, row);
+
+ ArrayList<Operation> operations = Lists.newArrayList();
+ operations.add(insert);
+
+ if (parentTableName != null && parentColumnName != null) {
+ TableSchema parentTableSchema = dbSchema
+ .getTableSchema(parentTableName);
+ ColumnSchema parentColumnSchema = parentTableSchema
+ .getColumnSchema(parentColumnName);
+
+ List<Mutation> mutations = Lists.newArrayList();
+ Mutation mutation = MutationUtil.insert(parentColumnSchema.name(),
+ UUID.uuid(namedUuid));
+ mutations.add(mutation);
+
+ List<Condition> conditions = Lists.newArrayList();
+ Condition condition = ConditionUtil.equals("_uuid",
+ UUID.uuid(parentUuid));
+ conditions.add(condition);
+
+ Mutate op = new Mutate(parentTableSchema, conditions, mutations);
+ operations.add(op);
+ }
+ if (childTableName.equalsIgnoreCase(OvsdbConstant.PORT)) {
+ log.info("Handle port insert");
+ Insert intfInsert = handlePortInsertTable(OvsdbConstant.INTERFACE,
+ row);
+
+ if (intfInsert != null) {
+ operations.add(intfInsert);
+ }
+
+ Insert ins = (Insert) operations.get(0);
+ ins.getRow().put("interfaces",
+ UUID.uuid(OvsdbConstant.INTERFACE));
+ }
+
+ List<OperationResult> results;
+ try {
+ results = transactConfig(OvsdbConstant.DATABASENAME, operations)
+ .get();
+
+ return results.get(0).getUuid().value();
+ } catch (InterruptedException e) {
+ log.warn("Interrupted while waiting to get result");
+ Thread.currentThread().interrupt();
+ } catch (ExecutionException e) {
+ log.error("Exception thrown while to get result");
+ }
+
+ return null;
+ }
+
+ /**
+ * Handles port insert.
+ *
+ * @param tableName ovsdb table interface
+ * @param portRow row of port
+ *
+ * @return insert, empty if null
+ */
+ private Insert handlePortInsertTable(String tableName, Row portRow) {
+ DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+
+ TableSchema portTableSchema = dbSchema
+ .getTableSchema(OvsdbConstant.PORT);
+ ColumnSchema portColumnSchema = portTableSchema.getColumnSchema("name");
+
+ String portName = (String) portRow.getColumn(portColumnSchema.name()).data();
+
+ Interface inf = (Interface) TableGenerator
+ .createTable(dbSchema, OvsdbTable.INTERFACE);
+
+ inf.setName(portName);
+
+ TableSchema intfTableSchema = dbSchema
+ .getTableSchema(OvsdbConstant.INTERFACE);
+ Insert insert = new Insert(intfTableSchema, OvsdbConstant.INTERFACE,
+ inf.getRow());
+ return insert;
+ }
+
+ /**
+ * Gets tunnel name.
+ *
+ * @param tunnelType
+ * @param dstIp the remote ip address
+ *
+ * @return tunnel name
+ */
+ private String getTunnelName(String tunnelType, IpAddress dstIp) {
+ return tunnelType + "-" + dstIp.toString();
+ }
+
+ @Override
+ public ListenableFuture<DatabaseSchema> getOvsdbSchema(String dbName) {
+ if (dbName == null) {
+ return null;
+ }
+ DatabaseSchema databaseSchema = schema.get(dbName);
+ if (databaseSchema == null) {
+ List<String> dbNames = new ArrayList<String>();
+ dbNames.add(dbName);
+ Function<JsonNode, DatabaseSchema> rowFunction = new Function<JsonNode, DatabaseSchema>() {
+ @Override
+ public DatabaseSchema apply(JsonNode input) {
+ log.info("Get ovsdb database schema", dbName);
+ DatabaseSchema dbSchema = FromJsonUtil
+ .jsonNodeToDbSchema(dbName, input);
+ if (dbSchema == null) {
+ log.debug("Get ovsdb database schema error");
+ return null;
+ }
+ schema.put(dbName, dbSchema);
+
+ return dbSchema;
+ }
+ };
+
+ ListenableFuture<JsonNode> input = getSchema(dbNames);
+ if (input != null) {
+ return Futures.transform(input, rowFunction);
+ }
+ return null;
+ } else {
+ return Futures.immediateFuture(databaseSchema);
+ }
+ }
+
+ @Override
+ public ListenableFuture<TableUpdates> monitorTables(String dbName, String id) {
+ if (dbName == null) {
+ return null;
+ }
+ DatabaseSchema dbSchema = schema.get(dbName);
+ if (dbSchema != null) {
+ Function<JsonNode, TableUpdates> rowFunction = new Function<JsonNode, TableUpdates>() {
+ @Override
+ public TableUpdates apply(JsonNode input) {
+ log.info("Get table updates");
+ TableUpdates updates = FromJsonUtil
+ .jsonNodeToTableUpdates(input, dbSchema);
+ if (updates == null) {
+ log.debug("Get table updates error");
+ return null;
+ }
+ return updates;
+ }
+ };
+ return Futures.transform(monitor(dbSchema, id), rowFunction);
+ }
+ return null;
+ }
+
+ @Override
+ public ListenableFuture<List<OperationResult>> transactConfig(String dbName,
+ List<Operation> operations) {
+ if (dbName == null) {
+ return null;
+ }
+ DatabaseSchema dbSchema = schema.get(dbName);
+ if (dbSchema != null) {
+ Function<List<JsonNode>, List<OperationResult>> rowFunction =
+ new Function<List<JsonNode>, List<OperationResult>>() {
+ @Override
+ public List<OperationResult> apply(List<JsonNode> input) {
+ log.info("Get ovsdb operation result");
+ List<OperationResult> result = FromJsonUtil
+ .jsonNodeToOperationResult(input, operations);
+
+ if (result == null) {
+ log.debug("The operation result is null");
+ return null;
+ }
+ return result;
+ }
+ };
+ return Futures.transform(transact(dbSchema, operations),
+ rowFunction);
+ }
+ return null;
+ }
+
+ @Override
+ public ListenableFuture<JsonNode> getSchema(List<String> dbnames) {
+ String id = java.util.UUID.randomUUID().toString();
+ String getSchemaString = JsonRpcWriterUtil.getSchemaStr(id, dbnames);
+
+ SettableFuture<JsonNode> sf = SettableFuture.create();
+ requestResult.put(id, sf);
+ requestMethod.put(id, "getSchema");
+
+ channel.writeAndFlush(getSchemaString);
+ return sf;
+
+ }
+
+ @Override
+ public ListenableFuture<List<String>> echo() {
+ String id = java.util.UUID.randomUUID().toString();
+ String echoString = JsonRpcWriterUtil.echoStr(id);
+
+ SettableFuture<List<String>> sf = SettableFuture.create();
+ requestResult.put(id, sf);
+ requestMethod.put(id, "echo");
+
+ channel.writeAndFlush(echoString);
+ return sf;
+
+ }
+
+ @Override
+ public ListenableFuture<JsonNode> monitor(DatabaseSchema dbSchema,
+ String monitorId) {
+ String id = java.util.UUID.randomUUID().toString();
+ String monitorString = JsonRpcWriterUtil.monitorStr(id, monitorId,
+ dbSchema);
+
+ SettableFuture<JsonNode> sf = SettableFuture.create();
+ requestResult.put(id, sf);
+ requestMethod.put(id, "monitor");
+
+ channel.writeAndFlush(monitorString);
+ return sf;
+
+ }
+
+ @Override
+ public ListenableFuture<List<String>> listDbs() {
+ String id = java.util.UUID.randomUUID().toString();
+ String listDbsString = JsonRpcWriterUtil.listDbsStr(id);
+
+ SettableFuture<List<String>> sf = SettableFuture.create();
+ requestResult.put(id, sf);
+ requestMethod.put(id, "listDbs");
+
+ channel.writeAndFlush(listDbsString);
+ return sf;
+
+ }
+
+ @Override
+ public ListenableFuture<List<JsonNode>> transact(DatabaseSchema dbSchema,
+ List<Operation> operations) {
+ String id = java.util.UUID.randomUUID().toString();
+ String transactString = JsonRpcWriterUtil.transactStr(id, dbSchema,
+ operations);
+
+ SettableFuture<List<JsonNode>> sf = SettableFuture.create();
+ requestResult.put(id, sf);
+ requestMethod.put(id, "transact");
+
+ channel.writeAndFlush(transactString);
+ return sf;
+
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public void processResult(JsonNode response) {
+ log.debug("Handle result");
+ String requestId = response.get("id").asText();
+ SettableFuture sf = requestResult.get(requestId);
+ if (sf == null) {
+ log.debug("No such future to process");
+ return;
+ }
+ String methodName = requestMethod.get(requestId);
+
+ Object result;
+ result = FromJsonUtil.jsonResultParser(response, methodName);
+
+ sf.set(result);
+ return;
+ }
+
+ @Override
+ public void processRequest(JsonNode requestJson) {
+ log.debug("Handle request");
+ if (requestJson.get("method").asText().equalsIgnoreCase("echo")) {
+ log.debug("handle echo request");
+
+ String replyString = FromJsonUtil.getEchoRequestStr(requestJson);
+ channel.writeAndFlush(replyString);
+
+ return;
+ } else {
+ FromJsonUtil
+ .jsonCallbackRequestParser(requestJson, monitorCallBack);
+ return;
+ }
+ }
+
+ @Override
+ public void setCallback(Callback monitorCallback) {
+ this.monitorCallBack = monitorCallback;
+ }
+
+ @Override
+ public Set<OvsdbTunnel> getTunnels() {
+ return ovsdbTunnels;
+ }
+
+ @Override
+ public Set<OvsdbBridge> getBridges() {
+ Set<OvsdbBridge> ovsdbBridges = new HashSet<OvsdbBridge>();
+ OvsdbTableStore tableStore = getTableStore(OvsdbConstant.DATABASENAME);
+ if (tableStore == null) {
+ return null;
+ }
+ OvsdbRowStore rowStore = tableStore.getRows(OvsdbConstant.BRIDGE);
+ if (rowStore == null) {
+ return null;
+ }
+ ConcurrentMap<String, Row> rows = rowStore.getRowStore();
+ for (String uuid : rows.keySet()) {
+ Row row = getRow(OvsdbConstant.DATABASENAME, OvsdbConstant.BRIDGE,
+ uuid);
+ OvsdbBridge ovsdbBridge = getOvsdbBridge(row);
+ if (ovsdbBridge != null) {
+ ovsdbBridges.add(ovsdbBridge);
+ }
+ }
+ return ovsdbBridges;
+ }
+
+ @Override
+ public Set<OvsdbPort> getPorts() {
+ Set<OvsdbPort> ovsdbPorts = new HashSet<OvsdbPort>();
+ OvsdbTableStore tableStore = getTableStore(OvsdbConstant.DATABASENAME);
+ if (tableStore == null) {
+ return null;
+ }
+ OvsdbRowStore rowStore = tableStore.getRows(OvsdbConstant.INTERFACE);
+ if (rowStore == null) {
+ return null;
+ }
+ ConcurrentMap<String, Row> rows = rowStore.getRowStore();
+ for (String uuid : rows.keySet()) {
+ Row row = getRow(OvsdbConstant.DATABASENAME,
+ OvsdbConstant.INTERFACE, uuid);
+ OvsdbPort ovsdbPort = getOvsdbPort(row);
+ if (ovsdbPort != null) {
+ ovsdbPorts.add(ovsdbPort);
+ }
+ }
+ return ovsdbPorts;
+ }
+
+ @Override
+ public DatabaseSchema getDatabaseSchema(String dbName) {
+ return schema.get(dbName);
+ }
+
+ //Gets ovsdb port.
+ private OvsdbPort getOvsdbPort(Row row) {
+ DatabaseSchema dbSchema = getDatabaseSchema(OvsdbConstant.DATABASENAME);
+ Interface intf = (Interface) TableGenerator
+ .getTable(dbSchema, row, OvsdbTable.INTERFACE);
+ if (intf == null) {
+ return null;
+ }
+ long ofPort = getOfPort(intf);
+ String portName = intf.getName();
+ if ((ofPort < 0) || (portName == null)) {
+ return null;
+ }
+
+ OvsdbPort ovsdbPort = new OvsdbPort(new OvsdbPortNumber(ofPort),
+ new OvsdbPortName(portName));
+ return ovsdbPort;
+ }
+
+ ////Gets ovsdb bridge.
+ private OvsdbBridge getOvsdbBridge(Row row) {
+ DatabaseSchema dbSchema = getDatabaseSchema(OvsdbConstant.DATABASENAME);
+ Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, row,
+ OvsdbTable.BRIDGE);
+ if (bridge == null) {
+ return null;
+ }
+
+ OvsdbSet datapathIdSet = (OvsdbSet) bridge.getDatapathIdColumn().data();
+ @SuppressWarnings("unchecked")
+ Set<String> datapathIds = datapathIdSet.set();
+ if (datapathIds == null || datapathIds.size() == 0) {
+ return null;
+ }
+ String datapathId = (String) datapathIds.toArray()[0];
+ String bridgeName = bridge.getName();
+ if ((datapathId == null) || (bridgeName == null)) {
+ return null;
+ }
+
+ OvsdbBridge ovsdbBridge = new OvsdbBridge(new OvsdbBridgeName(bridgeName),
+ new OvsdbDatapathId(datapathId));
+ return ovsdbBridge;
+ }
+
+ //Gets ofPort in the interface.
+ private long getOfPort(Interface intf) {
+ OvsdbSet ofPortSet = (OvsdbSet) intf.getOpenFlowPortColumn().data();
+ @SuppressWarnings("unchecked")
+ Set<Integer> ofPorts = ofPortSet.set();
+ while (ofPorts == null || ofPorts.size() <= 0) {
+ log.debug("The ofport is null in {}", intf.getName());
+ return -1;
+ }
+ // return (long) ofPorts.toArray()[0];
+ Iterator<Integer> it = ofPorts.iterator();
+ return Long.parseLong(it.next().toString());
+ }
+}
diff --git a/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java b/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
index f80a89e..07100a9 100644
--- a/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
+++ b/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
@@ -1,413 +1,413 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.controller.impl;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.math.BigInteger;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.ExecutionException;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Service;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onosproject.ovsdb.controller.DefaultEventSubject;
-import org.onosproject.ovsdb.controller.EventSubject;
-import org.onosproject.ovsdb.controller.OvsdbClientService;
-import org.onosproject.ovsdb.controller.OvsdbConstant;
-import org.onosproject.ovsdb.controller.OvsdbController;
-import org.onosproject.ovsdb.controller.OvsdbDatapathId;
-import org.onosproject.ovsdb.controller.OvsdbEvent;
-import org.onosproject.ovsdb.controller.OvsdbEvent.Type;
-import org.onosproject.ovsdb.controller.OvsdbEventListener;
-import org.onosproject.ovsdb.controller.OvsdbIfaceId;
-import org.onosproject.ovsdb.controller.OvsdbNodeId;
-import org.onosproject.ovsdb.controller.OvsdbNodeListener;
-import org.onosproject.ovsdb.controller.OvsdbPortName;
-import org.onosproject.ovsdb.controller.OvsdbPortNumber;
-import org.onosproject.ovsdb.controller.OvsdbPortType;
-import org.onosproject.ovsdb.controller.driver.OvsdbAgent;
-import org.onosproject.ovsdb.rfc.jsonrpc.Callback;
-import org.onosproject.ovsdb.rfc.message.TableUpdate;
-import org.onosproject.ovsdb.rfc.message.TableUpdates;
-import org.onosproject.ovsdb.rfc.message.UpdateNotification;
-import org.onosproject.ovsdb.rfc.notation.OvsdbMap;
-import org.onosproject.ovsdb.rfc.notation.OvsdbSet;
-import org.onosproject.ovsdb.rfc.notation.Row;
-import org.onosproject.ovsdb.rfc.notation.UUID;
-import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
-import org.onosproject.ovsdb.rfc.table.Bridge;
-import org.onosproject.ovsdb.rfc.table.Interface;
-import org.onosproject.ovsdb.rfc.table.OvsdbTable;
-import org.onosproject.ovsdb.rfc.table.TableGenerator;
-import org.onosproject.ovsdb.rfc.utils.FromJsonUtil;
-import org.osgi.service.component.ComponentContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.databind.JsonNode;
-
-/**
- * The implementation of OvsdbController.
- */
-@Component(immediate = true)
-@Service
-public class OvsdbControllerImpl implements OvsdbController {
-
- public static final Logger log = LoggerFactory
- .getLogger(OvsdbControllerImpl.class);
-
- protected ConcurrentHashMap<OvsdbNodeId, OvsdbClientService> ovsdbClients =
- new ConcurrentHashMap<OvsdbNodeId, OvsdbClientService>();
-
- protected OvsdbAgent agent = new InternalOvsdbNodeAgent();
- protected InternalMonitorCallBack updateCallback = new InternalMonitorCallBack();
-
- protected Set<OvsdbNodeListener> ovsdbNodeListener = new CopyOnWriteArraySet<>();
- protected Set<OvsdbEventListener> ovsdbEventListener = new CopyOnWriteArraySet<>();
-
- protected ConcurrentHashMap<String, OvsdbClientService> requestNotification =
- new ConcurrentHashMap<String, OvsdbClientService>();
-
- protected ConcurrentHashMap<String, String> requestDbName = new ConcurrentHashMap<String, String>();
-
- private final Controller controller = new Controller();
-
- @Activate
- public void activate(ComponentContext context) {
- controller.start(agent, updateCallback);
- log.info("Started");
- }
-
- @Deactivate
- public void deactivate() {
- controller.stop();
- log.info("Stoped");
- }
-
- @Override
- public void addNodeListener(OvsdbNodeListener listener) {
- if (!ovsdbNodeListener.contains(listener)) {
- this.ovsdbNodeListener.add(listener);
- }
- }
-
- @Override
- public void removeNodeListener(OvsdbNodeListener listener) {
- this.ovsdbNodeListener.remove(listener);
- }
-
- @Override
- public void addOvsdbEventListener(OvsdbEventListener listener) {
- if (!ovsdbEventListener.contains(listener)) {
- this.ovsdbEventListener.add(listener);
- }
- }
-
- @Override
- public void removeOvsdbEventListener(OvsdbEventListener listener) {
- this.ovsdbEventListener.remove(listener);
- }
-
- @Override
- public List<OvsdbNodeId> getNodeIds() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public OvsdbClientService getOvsdbClient(OvsdbNodeId nodeId) {
- return ovsdbClients.get(nodeId);
- }
-
- /**
- * Implementation of an Ovsdb Agent which is responsible for keeping track
- * of connected node and the state in which they are.
- */
- private class InternalOvsdbNodeAgent implements OvsdbAgent {
- @Override
- public void addConnectedNode(OvsdbNodeId nodeId,
- OvsdbClientService ovsdbClient) {
-
- if (ovsdbClients.get(nodeId) != null) {
- return;
- } else {
- ovsdbClients.put(nodeId, ovsdbClient);
-
- try {
- List<String> dbNames = ovsdbClient.listDbs().get();
- for (String dbName : dbNames) {
- DatabaseSchema dbSchema;
- dbSchema = ovsdbClient.getOvsdbSchema(dbName).get();
-
- log.debug("Begin to monitor tables");
- String id = java.util.UUID.randomUUID().toString();
- TableUpdates updates = ovsdbClient
- .monitorTables(dbName, id).get();
-
- requestDbName.put(id, dbName);
- requestNotification.put(id, ovsdbClient);
-
- if (updates != null) {
- processTableUpdates(ovsdbClient, updates,
- dbSchema.name());
- }
- }
- } catch (InterruptedException e) {
- log.warn("Interrupted while waiting to get message from ovsdb");
- Thread.currentThread().interrupt();
- } catch (ExecutionException e) {
- log.error("Exception thrown while to get message from ovsdb");
- }
-
- log.debug("Add node to north");
- for (OvsdbNodeListener l : ovsdbNodeListener) {
- l.nodeAdded(nodeId);
- }
- return;
- }
- }
-
- @Override
- public void removeConnectedNode(OvsdbNodeId nodeId) {
- ovsdbClients.remove(nodeId);
- log.debug("Node connection is removed");
- for (OvsdbNodeListener l : ovsdbNodeListener) {
- l.nodeRemoved(nodeId);
- }
- }
- }
-
- /**
- * Processes table updates.
- *
- * @param clientService OvsdbClientService instance
- * @param updates TableUpdates instance
- * @param dbName ovsdb database name
- */
- private void processTableUpdates(OvsdbClientService clientService,
- TableUpdates updates, String dbName)
- throws InterruptedException {
- checkNotNull(clientService, "OvsdbClientService is not null");
-
- DatabaseSchema dbSchema = clientService.getDatabaseSchema(dbName);
-
- for (String tableName : updates.result().keySet()) {
- TableUpdate update = updates.result().get(tableName);
- for (UUID uuid : (Set<UUID>) update.rows().keySet()) {
- log.debug("Begin to process table updates uuid: {}, databaseName: {}, tableName: {}",
- uuid.value(), dbName, tableName);
-
- Row oldRow = update.getOld(uuid);
- Row newRow = update.getNew(uuid);
- if (newRow != null) {
- clientService.updateOvsdbStore(dbName, tableName,
- uuid.value(), newRow);
-
- if (OvsdbConstant.INTERFACE.equals(tableName)) {
- dispatchInterfaceEvent(clientService,
- newRow, null,
- OvsdbEvent.Type.PORT_ADDED,
- dbSchema);
- }
- } else if (update.getOld(uuid) != null) {
- clientService.removeRow(dbName, tableName, uuid.value());
- if (OvsdbConstant.PORT.equals(tableName)) {
- dispatchInterfaceEvent(clientService, null,
- oldRow,
- OvsdbEvent.Type.PORT_REMOVED,
- dbSchema);
- }
- }
- }
- }
- }
-
- /**
- * Dispatches event to the north.
- *
- * @param clientService OvsdbClientService instance
- * @param newRow a new row
- * @param oldRow an old row
- * @param eventType type of event
- * @param dbSchema ovsdb database schema
- */
- private void dispatchInterfaceEvent(OvsdbClientService clientService,
- Row newRow, Row oldRow,
- Type eventType,
- DatabaseSchema dbSchema) {
-
- long dpid = getDataPathid(clientService, dbSchema);
- Interface intf = (Interface) TableGenerator
- .getTable(dbSchema, newRow, OvsdbTable.INTERFACE);
- if (intf == null) {
- return;
- }
-
- String portType = (String) intf.getTypeColumn().data();
- long localPort = getOfPort(intf);
- if (localPort < 0) {
- return;
- }
- String[] macAndIfaceId = getMacAndIfaceid(intf);
- if (macAndIfaceId == null) {
- return;
- }
-
- EventSubject eventSubject = new DefaultEventSubject(MacAddress.valueOf(
- macAndIfaceId[0]),
- new HashSet<IpAddress>(),
- new OvsdbPortName(intf
- .getName()),
- new OvsdbPortNumber(localPort),
- new OvsdbDatapathId(Long
- .toString(dpid)),
- new OvsdbPortType(portType),
- new OvsdbIfaceId(macAndIfaceId[1]));
- for (OvsdbEventListener listener : ovsdbEventListener) {
- listener.handle(new OvsdbEvent<EventSubject>(eventType,
- eventSubject));
- }
- }
-
- /**
- * Gets mac and iface from the table Interface.
- *
- * @param intf Interface instance
- * @return attachedMac, ifaceid
- */
- private String[] getMacAndIfaceid(Interface intf) {
- OvsdbMap ovsdbMap = (OvsdbMap) intf.getExternalIdsColumn().data();
- @SuppressWarnings("unchecked")
- Map<String, String> externalIds = ovsdbMap.map();
- if (externalIds == null) {
- log.warn("The external_ids is null");
- return null;
- }
-
- String attachedMac = externalIds.get(OvsdbConstant.EXTERNAL_ID_VM_MAC);
- if (attachedMac == null) {
- log.warn("The attachedMac is null");
- return null;
- }
- String ifaceid = externalIds
- .get(OvsdbConstant.EXTERNAL_ID_INTERFACE_ID);
- if (ifaceid == null) {
- log.warn("The ifaceid is null");
- return null;
- }
- return new String[] {attachedMac, ifaceid};
- }
-
- /**
- * Gets ofPorts number from table Interface.
- *
- * @param intf Interface instance
- * @return ofport the ofport number
- */
- private long getOfPort(Interface intf) {
- OvsdbSet ofPortSet = (OvsdbSet) intf.getOpenFlowPortColumn().data();
- @SuppressWarnings("unchecked")
- Set<Integer> ofPorts = ofPortSet.set();
- while (ofPorts == null || ofPorts.size() <= 0) {
- log.debug("The ofport is null in {}", intf.getName());
- return -1;
- }
- Iterator<Integer> it = ofPorts.iterator();
- return Long.parseLong(it.next().toString());
- }
-
- /**
- * Gets datapathid from table bridge.
- *
- * @param clientService OvsdbClientService instance
- * @param dbSchema ovsdb database schema
- * @return datapathid the bridge datapathid
- */
- private long getDataPathid(OvsdbClientService clientService,
- DatabaseSchema dbSchema) {
- String bridgeUuid = clientService
- .getBridgeUuid(OvsdbConstant.INTEGRATION_BRIDGE);
- if (bridgeUuid == null) {
- log.debug("Unable to spot bridge uuid for {} in {}",
- OvsdbConstant.INTEGRATION_BRIDGE, clientService);
- return 0;
- }
-
- Row bridgeRow = clientService.getRow(OvsdbConstant.DATABASENAME,
- "Bridge", bridgeUuid);
- Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow,
- OvsdbTable.BRIDGE);
- OvsdbSet dpidSet = (OvsdbSet) bridge.getDatapathIdColumn().data();
- @SuppressWarnings("unchecked")
- Set<String> dpids = dpidSet.set();
- if (dpids == null || dpids.size() == 0) {
- return 0;
- }
- return stringToLong((String) dpids.toArray()[0]);
- }
-
- private long stringToLong(String values) {
- long value = (new BigInteger(values.replaceAll(":", ""), 16))
- .longValue();
- return value;
- }
-
- /**
- * Implementation of an Callback which is responsible for receiving request
- * infomation from ovsdb.
- */
- private class InternalMonitorCallBack implements Callback {
- @Override
- public void update(UpdateNotification updateNotification) {
- Object key = updateNotification.jsonValue();
- OvsdbClientService ovsdbClient = requestNotification.get(key);
-
- String dbName = requestDbName.get(key);
- JsonNode updatesJson = updateNotification.tbUpdatesJsonNode();
- DatabaseSchema dbSchema = ovsdbClient.getDatabaseSchema(dbName);
- TableUpdates updates = FromJsonUtil
- .jsonNodeToTableUpdates(updatesJson, dbSchema);
- try {
- processTableUpdates(ovsdbClient, updates, dbName);
- } catch (InterruptedException e) {
- log.warn("Interrupted while processing table updates");
- Thread.currentThread().interrupt();
- }
- }
-
- @Override
- public void locked(List<String> ids) {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void stolen(List<String> ids) {
- // TODO Auto-generated method stub
- }
-
- }
-
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.controller.impl;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.math.BigInteger;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.ExecutionException;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Service;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onosproject.ovsdb.controller.DefaultEventSubject;
+import org.onosproject.ovsdb.controller.EventSubject;
+import org.onosproject.ovsdb.controller.OvsdbClientService;
+import org.onosproject.ovsdb.controller.OvsdbConstant;
+import org.onosproject.ovsdb.controller.OvsdbController;
+import org.onosproject.ovsdb.controller.OvsdbDatapathId;
+import org.onosproject.ovsdb.controller.OvsdbEvent;
+import org.onosproject.ovsdb.controller.OvsdbEvent.Type;
+import org.onosproject.ovsdb.controller.OvsdbEventListener;
+import org.onosproject.ovsdb.controller.OvsdbIfaceId;
+import org.onosproject.ovsdb.controller.OvsdbNodeId;
+import org.onosproject.ovsdb.controller.OvsdbNodeListener;
+import org.onosproject.ovsdb.controller.OvsdbPortName;
+import org.onosproject.ovsdb.controller.OvsdbPortNumber;
+import org.onosproject.ovsdb.controller.OvsdbPortType;
+import org.onosproject.ovsdb.controller.driver.OvsdbAgent;
+import org.onosproject.ovsdb.rfc.jsonrpc.Callback;
+import org.onosproject.ovsdb.rfc.message.TableUpdate;
+import org.onosproject.ovsdb.rfc.message.TableUpdates;
+import org.onosproject.ovsdb.rfc.message.UpdateNotification;
+import org.onosproject.ovsdb.rfc.notation.OvsdbMap;
+import org.onosproject.ovsdb.rfc.notation.OvsdbSet;
+import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.notation.UUID;
+import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
+import org.onosproject.ovsdb.rfc.table.Bridge;
+import org.onosproject.ovsdb.rfc.table.Interface;
+import org.onosproject.ovsdb.rfc.table.OvsdbTable;
+import org.onosproject.ovsdb.rfc.table.TableGenerator;
+import org.onosproject.ovsdb.rfc.utils.FromJsonUtil;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+/**
+ * The implementation of OvsdbController.
+ */
+@Component(immediate = true)
+@Service
+public class OvsdbControllerImpl implements OvsdbController {
+
+ public static final Logger log = LoggerFactory
+ .getLogger(OvsdbControllerImpl.class);
+
+ protected ConcurrentHashMap<OvsdbNodeId, OvsdbClientService> ovsdbClients =
+ new ConcurrentHashMap<OvsdbNodeId, OvsdbClientService>();
+
+ protected OvsdbAgent agent = new InternalOvsdbNodeAgent();
+ protected InternalMonitorCallBack updateCallback = new InternalMonitorCallBack();
+
+ protected Set<OvsdbNodeListener> ovsdbNodeListener = new CopyOnWriteArraySet<>();
+ protected Set<OvsdbEventListener> ovsdbEventListener = new CopyOnWriteArraySet<>();
+
+ protected ConcurrentHashMap<String, OvsdbClientService> requestNotification =
+ new ConcurrentHashMap<String, OvsdbClientService>();
+
+ protected ConcurrentHashMap<String, String> requestDbName = new ConcurrentHashMap<String, String>();
+
+ private final Controller controller = new Controller();
+
+ @Activate
+ public void activate(ComponentContext context) {
+ controller.start(agent, updateCallback);
+ log.info("Started");
+ }
+
+ @Deactivate
+ public void deactivate() {
+ controller.stop();
+ log.info("Stoped");
+ }
+
+ @Override
+ public void addNodeListener(OvsdbNodeListener listener) {
+ if (!ovsdbNodeListener.contains(listener)) {
+ this.ovsdbNodeListener.add(listener);
+ }
+ }
+
+ @Override
+ public void removeNodeListener(OvsdbNodeListener listener) {
+ this.ovsdbNodeListener.remove(listener);
+ }
+
+ @Override
+ public void addOvsdbEventListener(OvsdbEventListener listener) {
+ if (!ovsdbEventListener.contains(listener)) {
+ this.ovsdbEventListener.add(listener);
+ }
+ }
+
+ @Override
+ public void removeOvsdbEventListener(OvsdbEventListener listener) {
+ this.ovsdbEventListener.remove(listener);
+ }
+
+ @Override
+ public List<OvsdbNodeId> getNodeIds() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public OvsdbClientService getOvsdbClient(OvsdbNodeId nodeId) {
+ return ovsdbClients.get(nodeId);
+ }
+
+ /**
+ * Implementation of an Ovsdb Agent which is responsible for keeping track
+ * of connected node and the state in which they are.
+ */
+ private class InternalOvsdbNodeAgent implements OvsdbAgent {
+ @Override
+ public void addConnectedNode(OvsdbNodeId nodeId,
+ OvsdbClientService ovsdbClient) {
+
+ if (ovsdbClients.get(nodeId) != null) {
+ return;
+ } else {
+ ovsdbClients.put(nodeId, ovsdbClient);
+
+ try {
+ List<String> dbNames = ovsdbClient.listDbs().get();
+ for (String dbName : dbNames) {
+ DatabaseSchema dbSchema;
+ dbSchema = ovsdbClient.getOvsdbSchema(dbName).get();
+
+ log.debug("Begin to monitor tables");
+ String id = java.util.UUID.randomUUID().toString();
+ TableUpdates updates = ovsdbClient
+ .monitorTables(dbName, id).get();
+
+ requestDbName.put(id, dbName);
+ requestNotification.put(id, ovsdbClient);
+
+ if (updates != null) {
+ processTableUpdates(ovsdbClient, updates,
+ dbSchema.name());
+ }
+ }
+ } catch (InterruptedException e) {
+ log.warn("Interrupted while waiting to get message from ovsdb");
+ Thread.currentThread().interrupt();
+ } catch (ExecutionException e) {
+ log.error("Exception thrown while to get message from ovsdb");
+ }
+
+ log.debug("Add node to north");
+ for (OvsdbNodeListener l : ovsdbNodeListener) {
+ l.nodeAdded(nodeId);
+ }
+ return;
+ }
+ }
+
+ @Override
+ public void removeConnectedNode(OvsdbNodeId nodeId) {
+ ovsdbClients.remove(nodeId);
+ log.debug("Node connection is removed");
+ for (OvsdbNodeListener l : ovsdbNodeListener) {
+ l.nodeRemoved(nodeId);
+ }
+ }
+ }
+
+ /**
+ * Processes table updates.
+ *
+ * @param clientService OvsdbClientService instance
+ * @param updates TableUpdates instance
+ * @param dbName ovsdb database name
+ */
+ private void processTableUpdates(OvsdbClientService clientService,
+ TableUpdates updates, String dbName)
+ throws InterruptedException {
+ checkNotNull(clientService, "OvsdbClientService is not null");
+
+ DatabaseSchema dbSchema = clientService.getDatabaseSchema(dbName);
+
+ for (String tableName : updates.result().keySet()) {
+ TableUpdate update = updates.result().get(tableName);
+ for (UUID uuid : (Set<UUID>) update.rows().keySet()) {
+ log.debug("Begin to process table updates uuid: {}, databaseName: {}, tableName: {}",
+ uuid.value(), dbName, tableName);
+
+ Row oldRow = update.getOld(uuid);
+ Row newRow = update.getNew(uuid);
+ if (newRow != null) {
+ clientService.updateOvsdbStore(dbName, tableName,
+ uuid.value(), newRow);
+
+ if (OvsdbConstant.INTERFACE.equals(tableName)) {
+ dispatchInterfaceEvent(clientService,
+ newRow, null,
+ OvsdbEvent.Type.PORT_ADDED,
+ dbSchema);
+ }
+ } else if (update.getOld(uuid) != null) {
+ clientService.removeRow(dbName, tableName, uuid.value());
+ if (OvsdbConstant.PORT.equals(tableName)) {
+ dispatchInterfaceEvent(clientService, null,
+ oldRow,
+ OvsdbEvent.Type.PORT_REMOVED,
+ dbSchema);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Dispatches event to the north.
+ *
+ * @param clientService OvsdbClientService instance
+ * @param newRow a new row
+ * @param oldRow an old row
+ * @param eventType type of event
+ * @param dbSchema ovsdb database schema
+ */
+ private void dispatchInterfaceEvent(OvsdbClientService clientService,
+ Row newRow, Row oldRow,
+ Type eventType,
+ DatabaseSchema dbSchema) {
+
+ long dpid = getDataPathid(clientService, dbSchema);
+ Interface intf = (Interface) TableGenerator
+ .getTable(dbSchema, newRow, OvsdbTable.INTERFACE);
+ if (intf == null) {
+ return;
+ }
+
+ String portType = (String) intf.getTypeColumn().data();
+ long localPort = getOfPort(intf);
+ if (localPort < 0) {
+ return;
+ }
+ String[] macAndIfaceId = getMacAndIfaceid(intf);
+ if (macAndIfaceId == null) {
+ return;
+ }
+
+ EventSubject eventSubject = new DefaultEventSubject(MacAddress.valueOf(
+ macAndIfaceId[0]),
+ new HashSet<IpAddress>(),
+ new OvsdbPortName(intf
+ .getName()),
+ new OvsdbPortNumber(localPort),
+ new OvsdbDatapathId(Long
+ .toString(dpid)),
+ new OvsdbPortType(portType),
+ new OvsdbIfaceId(macAndIfaceId[1]));
+ for (OvsdbEventListener listener : ovsdbEventListener) {
+ listener.handle(new OvsdbEvent<EventSubject>(eventType,
+ eventSubject));
+ }
+ }
+
+ /**
+ * Gets mac and iface from the table Interface.
+ *
+ * @param intf Interface instance
+ * @return attachedMac, ifaceid
+ */
+ private String[] getMacAndIfaceid(Interface intf) {
+ OvsdbMap ovsdbMap = (OvsdbMap) intf.getExternalIdsColumn().data();
+ @SuppressWarnings("unchecked")
+ Map<String, String> externalIds = ovsdbMap.map();
+ if (externalIds == null) {
+ log.warn("The external_ids is null");
+ return null;
+ }
+
+ String attachedMac = externalIds.get(OvsdbConstant.EXTERNAL_ID_VM_MAC);
+ if (attachedMac == null) {
+ log.warn("The attachedMac is null");
+ return null;
+ }
+ String ifaceid = externalIds
+ .get(OvsdbConstant.EXTERNAL_ID_INTERFACE_ID);
+ if (ifaceid == null) {
+ log.warn("The ifaceid is null");
+ return null;
+ }
+ return new String[] {attachedMac, ifaceid};
+ }
+
+ /**
+ * Gets ofPorts number from table Interface.
+ *
+ * @param intf Interface instance
+ * @return ofport the ofport number
+ */
+ private long getOfPort(Interface intf) {
+ OvsdbSet ofPortSet = (OvsdbSet) intf.getOpenFlowPortColumn().data();
+ @SuppressWarnings("unchecked")
+ Set<Integer> ofPorts = ofPortSet.set();
+ while (ofPorts == null || ofPorts.size() <= 0) {
+ log.debug("The ofport is null in {}", intf.getName());
+ return -1;
+ }
+ Iterator<Integer> it = ofPorts.iterator();
+ return Long.parseLong(it.next().toString());
+ }
+
+ /**
+ * Gets datapathid from table bridge.
+ *
+ * @param clientService OvsdbClientService instance
+ * @param dbSchema ovsdb database schema
+ * @return datapathid the bridge datapathid
+ */
+ private long getDataPathid(OvsdbClientService clientService,
+ DatabaseSchema dbSchema) {
+ String bridgeUuid = clientService
+ .getBridgeUuid(OvsdbConstant.INTEGRATION_BRIDGE);
+ if (bridgeUuid == null) {
+ log.debug("Unable to spot bridge uuid for {} in {}",
+ OvsdbConstant.INTEGRATION_BRIDGE, clientService);
+ return 0;
+ }
+
+ Row bridgeRow = clientService.getRow(OvsdbConstant.DATABASENAME,
+ "Bridge", bridgeUuid);
+ Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow,
+ OvsdbTable.BRIDGE);
+ OvsdbSet dpidSet = (OvsdbSet) bridge.getDatapathIdColumn().data();
+ @SuppressWarnings("unchecked")
+ Set<String> dpids = dpidSet.set();
+ if (dpids == null || dpids.size() == 0) {
+ return 0;
+ }
+ return stringToLong((String) dpids.toArray()[0]);
+ }
+
+ private long stringToLong(String values) {
+ long value = (new BigInteger(values.replaceAll(":", ""), 16))
+ .longValue();
+ return value;
+ }
+
+ /**
+ * Implementation of an Callback which is responsible for receiving request
+ * infomation from ovsdb.
+ */
+ private class InternalMonitorCallBack implements Callback {
+ @Override
+ public void update(UpdateNotification updateNotification) {
+ Object key = updateNotification.jsonValue();
+ OvsdbClientService ovsdbClient = requestNotification.get(key);
+
+ String dbName = requestDbName.get(key);
+ JsonNode updatesJson = updateNotification.tbUpdatesJsonNode();
+ DatabaseSchema dbSchema = ovsdbClient.getDatabaseSchema(dbName);
+ TableUpdates updates = FromJsonUtil
+ .jsonNodeToTableUpdates(updatesJson, dbSchema);
+ try {
+ processTableUpdates(ovsdbClient, updates, dbName);
+ } catch (InterruptedException e) {
+ log.warn("Interrupted while processing table updates");
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ @Override
+ public void locked(List<String> ids) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void stolen(List<String> ids) {
+ // TODO Auto-generated method stub
+ }
+
+ }
+
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/UpdateNotification.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/UpdateNotification.java
index d539ff3..d4f0513 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/UpdateNotification.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/message/UpdateNotification.java
@@ -1,90 +1,90 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.message;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Objects;
-
-import org.onosproject.ovsdb.rfc.notation.json.UpdateNotificationConverter;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-
-/**
- * The "update" notification is sent by the server to the client to report
- * changes in tables that are being monitored following a "monitor" request. The
- * "params" of the result JsonNode.
- */
-@JsonDeserialize(converter = UpdateNotificationConverter.class)
-public final class UpdateNotification {
- private final Object jsonValue;
- private final JsonNode tbUpdatesJsonNode;
-
- /**
- * Constructs a UpdateNotification object.
- * @param jsonValue the "json-value" in "params" of the result JsonNode
- * @param tbUpdatesJsonNode the "table-updates" in "params" of the result JsonNode
- */
- public UpdateNotification(Object jsonValue, JsonNode tbUpdatesJsonNode) {
- checkNotNull(jsonValue, "jsonValue cannot be null");
- checkNotNull(tbUpdatesJsonNode, "tablebUpdates JsonNode cannot be null");
- this.jsonValue = jsonValue;
- this.tbUpdatesJsonNode = tbUpdatesJsonNode;
- }
-
- /**
- * Return context.
- * @return context
- */
- public Object jsonValue() {
- return jsonValue;
- }
-
- /**
- * Return tbUpdatesJsonNode.
- * @return tbUpdatesJsonNode
- */
- public JsonNode tbUpdatesJsonNode() {
- return tbUpdatesJsonNode;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(jsonValue, tbUpdatesJsonNode);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj instanceof UpdateNotification) {
- final UpdateNotification other = (UpdateNotification) obj;
- return Objects.equals(this.jsonValue, other.jsonValue)
- && Objects.equals(this.tbUpdatesJsonNode,
- other.tbUpdatesJsonNode);
- }
- return false;
- }
-
- @Override
- public String toString() {
- return toStringHelper(this).add("jsonValue", jsonValue)
- .add("tbUpdatesJsonNode", tbUpdatesJsonNode).toString();
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.message;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.notation.json.UpdateNotificationConverter;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+/**
+ * The "update" notification is sent by the server to the client to report
+ * changes in tables that are being monitored following a "monitor" request. The
+ * "params" of the result JsonNode.
+ */
+@JsonDeserialize(converter = UpdateNotificationConverter.class)
+public final class UpdateNotification {
+ private final Object jsonValue;
+ private final JsonNode tbUpdatesJsonNode;
+
+ /**
+ * Constructs a UpdateNotification object.
+ * @param jsonValue the "json-value" in "params" of the result JsonNode
+ * @param tbUpdatesJsonNode the "table-updates" in "params" of the result JsonNode
+ */
+ public UpdateNotification(Object jsonValue, JsonNode tbUpdatesJsonNode) {
+ checkNotNull(jsonValue, "jsonValue cannot be null");
+ checkNotNull(tbUpdatesJsonNode, "tablebUpdates JsonNode cannot be null");
+ this.jsonValue = jsonValue;
+ this.tbUpdatesJsonNode = tbUpdatesJsonNode;
+ }
+
+ /**
+ * Return context.
+ * @return context
+ */
+ public Object jsonValue() {
+ return jsonValue;
+ }
+
+ /**
+ * Return tbUpdatesJsonNode.
+ * @return tbUpdatesJsonNode
+ */
+ public JsonNode tbUpdatesJsonNode() {
+ return tbUpdatesJsonNode;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(jsonValue, tbUpdatesJsonNode);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof UpdateNotification) {
+ final UpdateNotification other = (UpdateNotification) obj;
+ return Objects.equals(this.jsonValue, other.jsonValue)
+ && Objects.equals(this.tbUpdatesJsonNode,
+ other.tbUpdatesJsonNode);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this).add("jsonValue", jsonValue)
+ .add("tbUpdatesJsonNode", tbUpdatesJsonNode).toString();
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Column.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Column.java
index 615eaac..60f4944 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Column.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Column.java
@@ -1,81 +1,81 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.notation;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Objects;
-
-/**
- * Column is the basic element of the OpenVswitch database.
- */
-public final class Column {
- private final String columnName;
- private final Object data;
-
- /**
- * Column constructor.
- * @param columnName the column name
- * @param obj the data of the column
- */
- public Column(String columnName, Object obj) {
- checkNotNull(columnName, "columnName cannot be null");
- checkNotNull(obj, "data cannot be null");
- this.columnName = columnName;
- this.data = obj;
- }
-
- /**
- * Returns column data.
- * @return column data
- */
- public Object data() {
- return data;
- }
-
- /**
- * Returns columnName.
- * @return columnName
- */
- public String columnName() {
- return columnName;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(columnName, data);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj instanceof Column) {
- final Column other = (Column) obj;
- return Objects.equals(this.columnName, other.columnName)
- && Objects.equals(this.data, other.data);
- }
- return false;
- }
-
- @Override
- public String toString() {
- return toStringHelper(this).add("columnName", columnName)
- .add("data", data).toString();
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.notation;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * Column is the basic element of the OpenVswitch database.
+ */
+public final class Column {
+ private final String columnName;
+ private final Object data;
+
+ /**
+ * Column constructor.
+ * @param columnName the column name
+ * @param obj the data of the column
+ */
+ public Column(String columnName, Object obj) {
+ checkNotNull(columnName, "columnName cannot be null");
+ checkNotNull(obj, "data cannot be null");
+ this.columnName = columnName;
+ this.data = obj;
+ }
+
+ /**
+ * Returns column data.
+ * @return column data
+ */
+ public Object data() {
+ return data;
+ }
+
+ /**
+ * Returns columnName.
+ * @return columnName
+ */
+ public String columnName() {
+ return columnName;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(columnName, data);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof Column) {
+ final Column other = (Column) obj;
+ return Objects.equals(this.columnName, other.columnName)
+ && Objects.equals(this.data, other.data);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this).add("columnName", columnName)
+ .add("data", data).toString();
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Row.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Row.java
index 9ef5b48..3326922 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Row.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Row.java
@@ -1,128 +1,128 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.notation;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.Objects;
-
-import com.google.common.collect.Maps;
-
-/**
- * Row is the basic element of the OpenVswitch's table.
- */
-public final class Row {
- private String tableName;
- private Map<String, Column> columns;
-
- /**
- * Row constructor.
- */
- public Row() {
- this.columns = Maps.newHashMap();
- }
-
- /**
- * Row constructor.
- * @param tableName table name
- */
- public Row(String tableName) {
- checkNotNull(tableName, "tableName cannot be null");
- this.tableName = tableName;
- this.columns = Maps.newHashMap();
- }
-
- /**
- * Row constructor.
- * @param tableName table name
- * @param columns Map of Column entity
- */
- public Row(String tableName, Map<String, Column> columns) {
- checkNotNull(tableName, "table name cannot be null");
- checkNotNull(columns, "columns cannot be null");
- this.tableName = tableName;
- this.columns = columns;
- }
-
- /**
- * Returns tableName.
- * @return tableName
- */
- public String tableName() {
- return tableName;
- }
-
- /**
- * Set tableName value.
- * @param tableName table name
- */
- public void setTableName(String tableName) {
- this.tableName = tableName;
- }
-
- /**
- * Returns Column by ColumnSchema.
- * @param columnName column name
- * @return Column
- */
- public Column getColumn(String columnName) {
- return columns.get(columnName);
- }
-
- /**
- * Returns Collection of Column.
- * @return Collection of Column
- */
- public Collection<Column> getColumns() {
- return columns.values();
- }
-
- /**
- * add Column.
- * @param columnName column name
- * @param data Column entity
- */
- public void addColumn(String columnName, Column data) {
- this.columns.put(columnName, data);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(tableName, columns);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj instanceof Row) {
- final Row other = (Row) obj;
- return Objects.equals(this.tableName, other.tableName)
- && Objects.equals(this.columns, other.columns);
- }
- return false;
- }
-
- @Override
- public String toString() {
- return toStringHelper(this).add("tableName", tableName)
- .add("columns", columns).toString();
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.notation;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Objects;
+
+import com.google.common.collect.Maps;
+
+/**
+ * Row is the basic element of the OpenVswitch's table.
+ */
+public final class Row {
+ private String tableName;
+ private Map<String, Column> columns;
+
+ /**
+ * Row constructor.
+ */
+ public Row() {
+ this.columns = Maps.newHashMap();
+ }
+
+ /**
+ * Row constructor.
+ * @param tableName table name
+ */
+ public Row(String tableName) {
+ checkNotNull(tableName, "tableName cannot be null");
+ this.tableName = tableName;
+ this.columns = Maps.newHashMap();
+ }
+
+ /**
+ * Row constructor.
+ * @param tableName table name
+ * @param columns Map of Column entity
+ */
+ public Row(String tableName, Map<String, Column> columns) {
+ checkNotNull(tableName, "table name cannot be null");
+ checkNotNull(columns, "columns cannot be null");
+ this.tableName = tableName;
+ this.columns = columns;
+ }
+
+ /**
+ * Returns tableName.
+ * @return tableName
+ */
+ public String tableName() {
+ return tableName;
+ }
+
+ /**
+ * Set tableName value.
+ * @param tableName table name
+ */
+ public void setTableName(String tableName) {
+ this.tableName = tableName;
+ }
+
+ /**
+ * Returns Column by ColumnSchema.
+ * @param columnName column name
+ * @return Column
+ */
+ public Column getColumn(String columnName) {
+ return columns.get(columnName);
+ }
+
+ /**
+ * Returns Collection of Column.
+ * @return Collection of Column
+ */
+ public Collection<Column> getColumns() {
+ return columns.values();
+ }
+
+ /**
+ * add Column.
+ * @param columnName column name
+ * @param data Column entity
+ */
+ public void addColumn(String columnName, Column data) {
+ this.columns.put(columnName, data);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(tableName, columns);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof Row) {
+ final Row other = (Row) obj;
+ return Objects.equals(this.tableName, other.tableName)
+ && Objects.equals(this.columns, other.columns);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this).add("tableName", tableName)
+ .add("columns", columns).toString();
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/UUIDConverter.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/UUIDConverter.java
index 02e6bb7..66a8663 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/UUIDConverter.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/json/UUIDConverter.java
@@ -1,32 +1,32 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.notation.json;
-
-import org.onosproject.ovsdb.rfc.notation.UUID;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.util.StdConverter;
-
-/**
- * UUIDConverter Converter.
- */
-public class UUIDConverter extends StdConverter<JsonNode, UUID> {
-
- @Override
- public UUID convert(JsonNode json) {
- return UUID.uuid(json.get(1).asText());
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.notation.json;
+
+import org.onosproject.ovsdb.rfc.notation.UUID;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.util.StdConverter;
+
+/**
+ * UUIDConverter Converter.
+ */
+public class UUIDConverter extends StdConverter<JsonNode, UUID> {
+
+ @Override
+ public UUID convert(JsonNode json) {
+ return UUID.uuid(json.get(1).asText());
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Delete.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Delete.java
index 8dcf1fc..08b5e52 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Delete.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Delete.java
@@ -1,77 +1,77 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.operations;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-
-import org.onosproject.ovsdb.rfc.notation.Condition;
-import org.onosproject.ovsdb.rfc.schema.TableSchema;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * delete operation.Refer to RFC 7047 Section 5.2.
- */
-public final class Delete implements Operation {
-
- @JsonIgnore
- private final TableSchema tableSchema;
- private final String op;
- private final List<Condition> where;
-
- /**
- * Constructs a Delete object.
- * @param schema TableSchema entity
- * @param where the List of Condition entity
- */
- public Delete(TableSchema schema, List<Condition> where) {
- checkNotNull(schema, "TableSchema cannot be null");
- checkNotNull(where, "where is not null");
- this.tableSchema = schema;
- this.op = Operations.DELETE.op();
- this.where = where;
- }
-
- /**
- * Returns the where member of delete operation.
- * @return the where member of delete operation
- */
- public List<Condition> getWhere() {
- return where;
- }
-
- @Override
- public String getOp() {
- return op;
- }
-
- @Override
- public TableSchema getTableSchema() {
- return tableSchema;
- }
-
- /**
- * For the use of serialization.
- * @return the table member of update operation
- */
- @JsonProperty
- public String getTable() {
- return tableSchema.name();
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+
+import org.onosproject.ovsdb.rfc.notation.Condition;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * delete operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Delete implements Operation {
+
+ @JsonIgnore
+ private final TableSchema tableSchema;
+ private final String op;
+ private final List<Condition> where;
+
+ /**
+ * Constructs a Delete object.
+ * @param schema TableSchema entity
+ * @param where the List of Condition entity
+ */
+ public Delete(TableSchema schema, List<Condition> where) {
+ checkNotNull(schema, "TableSchema cannot be null");
+ checkNotNull(where, "where is not null");
+ this.tableSchema = schema;
+ this.op = Operations.DELETE.op();
+ this.where = where;
+ }
+
+ /**
+ * Returns the where member of delete operation.
+ * @return the where member of delete operation
+ */
+ public List<Condition> getWhere() {
+ return where;
+ }
+
+ @Override
+ public String getOp() {
+ return op;
+ }
+
+ @Override
+ public TableSchema getTableSchema() {
+ return tableSchema;
+ }
+
+ /**
+ * For the use of serialization.
+ * @return the table member of update operation
+ */
+ @JsonProperty
+ public String getTable() {
+ return tableSchema.name();
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Insert.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Insert.java
index 32e5ce0..8545b43 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Insert.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Insert.java
@@ -1,110 +1,110 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.operations;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.onosproject.ovsdb.rfc.notation.Column;
-import org.onosproject.ovsdb.rfc.notation.Row;
-import org.onosproject.ovsdb.rfc.schema.TableSchema;
-import org.onosproject.ovsdb.rfc.utils.TransValueUtil;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.collect.Maps;
-
-/**
- * insert operation.Refer to RFC 7047 Section 5.2.
- */
-public final class Insert implements Operation {
-
- @JsonIgnore
- private final TableSchema tableSchema;
- private final String op;
- @JsonProperty("uuid-name")
- private final String uuidName;
- private final Map<String, Object> row;
-
- /**
- * Constructs a Insert object.
- * @param schema TableSchema entity
- * @param uuidName uuid-name
- * @param row Row entity
- */
- public Insert(TableSchema schema, String uuidName, Row row) {
- checkNotNull(schema, "TableSchema cannot be null");
- checkNotNull(uuidName, "uuid name cannot be null");
- checkNotNull(row, "row cannot be null");
- this.tableSchema = schema;
- this.op = Operations.INSERT.op();
- this.uuidName = uuidName;
- this.row = Maps.newHashMap();
- generateOperationRow(row);
- }
-
- /**
- * Row entity convert into the row format of insert operation. Refer to RFC
- * 7047 Section 5.2.
- * @param row Row entity
- */
- private void generateOperationRow(Row row) {
- Collection<Column> columns = row.getColumns();
- for (Column column : columns) {
- String columnName = column.columnName();
- Object value = column.data();
- Object formatValue = TransValueUtil.getFormatData(value);
- this.row.put(columnName, formatValue);
- }
- }
-
- /**
- * Returns the uuid-name member of insert operation.
- * @return the uuid-name member of insert operation
- */
- public String getUuidName() {
- return uuidName;
- }
-
- /**
- * Returns the row member of insert operation.
- * @return the row member of insert operation
- */
- public Map<String, Object> getRow() {
- return row;
- }
-
- @Override
- public String getOp() {
- return op;
- }
-
- @Override
- public TableSchema getTableSchema() {
- return tableSchema;
- }
-
- /**
- * For the use of serialization.
- * @return the table member of update operation
- */
- @JsonProperty
- public String getTable() {
- return tableSchema.name();
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.onosproject.ovsdb.rfc.notation.Column;
+import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+import org.onosproject.ovsdb.rfc.utils.TransValueUtil;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.Maps;
+
+/**
+ * insert operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Insert implements Operation {
+
+ @JsonIgnore
+ private final TableSchema tableSchema;
+ private final String op;
+ @JsonProperty("uuid-name")
+ private final String uuidName;
+ private final Map<String, Object> row;
+
+ /**
+ * Constructs a Insert object.
+ * @param schema TableSchema entity
+ * @param uuidName uuid-name
+ * @param row Row entity
+ */
+ public Insert(TableSchema schema, String uuidName, Row row) {
+ checkNotNull(schema, "TableSchema cannot be null");
+ checkNotNull(uuidName, "uuid name cannot be null");
+ checkNotNull(row, "row cannot be null");
+ this.tableSchema = schema;
+ this.op = Operations.INSERT.op();
+ this.uuidName = uuidName;
+ this.row = Maps.newHashMap();
+ generateOperationRow(row);
+ }
+
+ /**
+ * Row entity convert into the row format of insert operation. Refer to RFC
+ * 7047 Section 5.2.
+ * @param row Row entity
+ */
+ private void generateOperationRow(Row row) {
+ Collection<Column> columns = row.getColumns();
+ for (Column column : columns) {
+ String columnName = column.columnName();
+ Object value = column.data();
+ Object formatValue = TransValueUtil.getFormatData(value);
+ this.row.put(columnName, formatValue);
+ }
+ }
+
+ /**
+ * Returns the uuid-name member of insert operation.
+ * @return the uuid-name member of insert operation
+ */
+ public String getUuidName() {
+ return uuidName;
+ }
+
+ /**
+ * Returns the row member of insert operation.
+ * @return the row member of insert operation
+ */
+ public Map<String, Object> getRow() {
+ return row;
+ }
+
+ @Override
+ public String getOp() {
+ return op;
+ }
+
+ @Override
+ public TableSchema getTableSchema() {
+ return tableSchema;
+ }
+
+ /**
+ * For the use of serialization.
+ * @return the table member of update operation
+ */
+ @JsonProperty
+ public String getTable() {
+ return tableSchema.name();
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Mutate.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Mutate.java
index 1a7023d..b282779 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Mutate.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Mutate.java
@@ -1,91 +1,91 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.operations;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-
-import org.onosproject.ovsdb.rfc.notation.Condition;
-import org.onosproject.ovsdb.rfc.notation.Mutation;
-import org.onosproject.ovsdb.rfc.schema.TableSchema;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * mutate operation.Refer to RFC 7047 Section 5.2.
- */
-public final class Mutate implements Operation {
-
- @JsonIgnore
- private final TableSchema tableSchema;
- private final String op;
- private final List<Condition> where;
- private final List<Mutation> mutations;
-
- /**
- * Constructs a Mutate object.
- * @param schema TableSchema entity
- * @param where the List of Condition entity
- * @param mutations the List of Mutation entity
- */
- public Mutate(TableSchema schema, List<Condition> where,
- List<Mutation> mutations) {
- checkNotNull(schema, "TableSchema cannot be null");
- checkNotNull(mutations, "mutations cannot be null");
- checkNotNull(where, "where cannot be null");
- this.tableSchema = schema;
- this.op = Operations.MUTATE.op();
- this.where = where;
- this.mutations = mutations;
- }
-
- /**
- * Returns the mutations member of mutate operation.
- * @return the mutations member of mutate operation
- */
- public List<Mutation> getMutations() {
- return mutations;
- }
-
- /**
- * Returns the where member of mutate operation.
- * @return the where member of mutate operation
- */
- public List<Condition> getWhere() {
- return where;
- }
-
- @Override
- public String getOp() {
- return op;
- }
-
- @Override
- public TableSchema getTableSchema() {
- return tableSchema;
- }
-
- /**
- * For the use of serialization.
- * @return the table member of update operation
- */
- @JsonProperty
- public String getTable() {
- return tableSchema.name();
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+
+import org.onosproject.ovsdb.rfc.notation.Condition;
+import org.onosproject.ovsdb.rfc.notation.Mutation;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * mutate operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Mutate implements Operation {
+
+ @JsonIgnore
+ private final TableSchema tableSchema;
+ private final String op;
+ private final List<Condition> where;
+ private final List<Mutation> mutations;
+
+ /**
+ * Constructs a Mutate object.
+ * @param schema TableSchema entity
+ * @param where the List of Condition entity
+ * @param mutations the List of Mutation entity
+ */
+ public Mutate(TableSchema schema, List<Condition> where,
+ List<Mutation> mutations) {
+ checkNotNull(schema, "TableSchema cannot be null");
+ checkNotNull(mutations, "mutations cannot be null");
+ checkNotNull(where, "where cannot be null");
+ this.tableSchema = schema;
+ this.op = Operations.MUTATE.op();
+ this.where = where;
+ this.mutations = mutations;
+ }
+
+ /**
+ * Returns the mutations member of mutate operation.
+ * @return the mutations member of mutate operation
+ */
+ public List<Mutation> getMutations() {
+ return mutations;
+ }
+
+ /**
+ * Returns the where member of mutate operation.
+ * @return the where member of mutate operation
+ */
+ public List<Condition> getWhere() {
+ return where;
+ }
+
+ @Override
+ public String getOp() {
+ return op;
+ }
+
+ @Override
+ public TableSchema getTableSchema() {
+ return tableSchema;
+ }
+
+ /**
+ * For the use of serialization.
+ * @return the table member of update operation
+ */
+ @JsonProperty
+ public String getTable() {
+ return tableSchema.name();
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Select.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Select.java
index 7c75710..ba1ec74 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Select.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Select.java
@@ -1,89 +1,89 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.operations;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-
-import org.onosproject.ovsdb.rfc.notation.Condition;
-import org.onosproject.ovsdb.rfc.schema.TableSchema;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * select operation.Refer to RFC 7047 Section 5.2.
- */
-public final class Select implements Operation {
-
- @JsonIgnore
- private final TableSchema tableSchema;
- private final String op;
- private final List<Condition> where;
- private final List<String> columns;
-
- /**
- * Constructs a Select object.
- * @param schema TableSchema entity
- * @param where the List of Condition entity
- * @param columns the List of column name
- */
- public Select(TableSchema schema, List<Condition> where, List<String> columns) {
- checkNotNull(schema, "TableSchema cannot be null");
- checkNotNull(where, "where cannot be null");
- checkNotNull(columns, "columns cannot be null");
- this.tableSchema = schema;
- this.op = Operations.SELECT.op();
- this.where = where;
- this.columns = columns;
- }
-
- /**
- * Returns the columns member of select operation.
- * @return the columns member of select operation
- */
- public List<String> getColumns() {
- return columns;
- }
-
- /**
- * Returns the where member of select operation.
- * @return the where member of select operation
- */
- public List<Condition> getWhere() {
- return where;
- }
-
- @Override
- public String getOp() {
- return op;
- }
-
- @Override
- public TableSchema getTableSchema() {
- return tableSchema;
- }
-
- /**
- * For the use of serialization.
- * @return the table member of update operation
- */
- @JsonProperty
- public String getTable() {
- return tableSchema.name();
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+
+import org.onosproject.ovsdb.rfc.notation.Condition;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * select operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Select implements Operation {
+
+ @JsonIgnore
+ private final TableSchema tableSchema;
+ private final String op;
+ private final List<Condition> where;
+ private final List<String> columns;
+
+ /**
+ * Constructs a Select object.
+ * @param schema TableSchema entity
+ * @param where the List of Condition entity
+ * @param columns the List of column name
+ */
+ public Select(TableSchema schema, List<Condition> where, List<String> columns) {
+ checkNotNull(schema, "TableSchema cannot be null");
+ checkNotNull(where, "where cannot be null");
+ checkNotNull(columns, "columns cannot be null");
+ this.tableSchema = schema;
+ this.op = Operations.SELECT.op();
+ this.where = where;
+ this.columns = columns;
+ }
+
+ /**
+ * Returns the columns member of select operation.
+ * @return the columns member of select operation
+ */
+ public List<String> getColumns() {
+ return columns;
+ }
+
+ /**
+ * Returns the where member of select operation.
+ * @return the where member of select operation
+ */
+ public List<Condition> getWhere() {
+ return where;
+ }
+
+ @Override
+ public String getOp() {
+ return op;
+ }
+
+ @Override
+ public TableSchema getTableSchema() {
+ return tableSchema;
+ }
+
+ /**
+ * For the use of serialization.
+ * @return the table member of update operation
+ */
+ @JsonProperty
+ public String getTable() {
+ return tableSchema.name();
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Update.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Update.java
index 8f21f9c..81a1cab 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Update.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Update.java
@@ -1,111 +1,111 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.operations;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.onosproject.ovsdb.rfc.notation.Column;
-import org.onosproject.ovsdb.rfc.notation.Condition;
-import org.onosproject.ovsdb.rfc.notation.Row;
-import org.onosproject.ovsdb.rfc.schema.TableSchema;
-import org.onosproject.ovsdb.rfc.utils.TransValueUtil;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.collect.Maps;
-
-/**
- * update operation.Refer to RFC 7047 Section 5.2.
- */
-public final class Update implements Operation {
-
- @JsonIgnore
- private final TableSchema tableSchema;
- private final String op;
- private final Map<String, Object> row;
- private final List<Condition> where;
-
- /**
- * Constructs a Update object.
- * @param schema TableSchema entity
- * @param row Row entity
- * @param where the List of Condition entity
- */
- public Update(TableSchema schema, Row row, List<Condition> where) {
- checkNotNull(schema, "TableSchema cannot be null");
- checkNotNull(row, "row cannot be null");
- checkNotNull(where, "where cannot be null");
- this.tableSchema = schema;
- this.op = Operations.UPDATE.op();
- this.row = Maps.newHashMap();
- this.where = where;
- generateOperationRow(row);
- }
-
- /**
- * Row entity convert into the row format of update operation. Refer to RFC
- * 7047 Section 5.2.
- * @param row Row entity
- */
- private void generateOperationRow(Row row) {
- Collection<Column> columns = row.getColumns();
- for (Column column : columns) {
- String columnName = column.columnName();
- Object value = column.data();
- Object formatValue = TransValueUtil.getFormatData(value);
- this.row.put(columnName, formatValue);
- }
- }
-
- /**
- * Returns the row member of update operation.
- * @return the row member of update operation
- */
- public Map<String, Object> getRow() {
- return row;
- }
-
- /**
- * Returns the where member of update operation.
- * @return the where member of update operation
- */
- public List<Condition> getWhere() {
- return where;
- }
-
- @Override
- public String getOp() {
- return op;
- }
-
- @Override
- public TableSchema getTableSchema() {
- return tableSchema;
- }
-
- /**
- * For the use of serialization.
- * @return the table member of update operation
- */
- @JsonProperty
- public String getTable() {
- return tableSchema.name();
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.operations;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.onosproject.ovsdb.rfc.notation.Column;
+import org.onosproject.ovsdb.rfc.notation.Condition;
+import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+import org.onosproject.ovsdb.rfc.utils.TransValueUtil;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.Maps;
+
+/**
+ * update operation.Refer to RFC 7047 Section 5.2.
+ */
+public final class Update implements Operation {
+
+ @JsonIgnore
+ private final TableSchema tableSchema;
+ private final String op;
+ private final Map<String, Object> row;
+ private final List<Condition> where;
+
+ /**
+ * Constructs a Update object.
+ * @param schema TableSchema entity
+ * @param row Row entity
+ * @param where the List of Condition entity
+ */
+ public Update(TableSchema schema, Row row, List<Condition> where) {
+ checkNotNull(schema, "TableSchema cannot be null");
+ checkNotNull(row, "row cannot be null");
+ checkNotNull(where, "where cannot be null");
+ this.tableSchema = schema;
+ this.op = Operations.UPDATE.op();
+ this.row = Maps.newHashMap();
+ this.where = where;
+ generateOperationRow(row);
+ }
+
+ /**
+ * Row entity convert into the row format of update operation. Refer to RFC
+ * 7047 Section 5.2.
+ * @param row Row entity
+ */
+ private void generateOperationRow(Row row) {
+ Collection<Column> columns = row.getColumns();
+ for (Column column : columns) {
+ String columnName = column.columnName();
+ Object value = column.data();
+ Object formatValue = TransValueUtil.getFormatData(value);
+ this.row.put(columnName, formatValue);
+ }
+ }
+
+ /**
+ * Returns the row member of update operation.
+ * @return the row member of update operation
+ */
+ public Map<String, Object> getRow() {
+ return row;
+ }
+
+ /**
+ * Returns the where member of update operation.
+ * @return the where member of update operation
+ */
+ public List<Condition> getWhere() {
+ return where;
+ }
+
+ @Override
+ public String getOp() {
+ return op;
+ }
+
+ @Override
+ public TableSchema getTableSchema() {
+ return tableSchema;
+ }
+
+ /**
+ * For the use of serialization.
+ * @return the table member of update operation
+ */
+ @JsonProperty
+ public String getTable() {
+ return tableSchema.name();
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BaseTypeFactory.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BaseTypeFactory.java
index da60813..210181a 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BaseTypeFactory.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/BaseTypeFactory.java
@@ -1,214 +1,214 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.schema.type;
-
-import java.util.Set;
-
-import org.onosproject.ovsdb.rfc.error.AbnormalJsonNodeException;
-import org.onosproject.ovsdb.rfc.schema.type.UuidBaseType.RefType;
-import org.onosproject.ovsdb.rfc.utils.ObjectMapperUtil;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.collect.Sets;
-
-/**
- * BaseType Factory class.
- */
-public final class BaseTypeFactory {
-
- /**
- * Constructs a BaseTypeFactory object. This class should not be
- * instantiated.
- */
- private BaseTypeFactory() {
- }
-
- /**
- * Create a BaseType from the JsonNode.
- * @param baseTypeJson the BaseType JsonNode
- * @param keyorval the key node or value node
- * @return BaseType
- */
- public static BaseType getBaseTypeFromJson(JsonNode baseTypeJson, String keyorval) {
- if (baseTypeJson.isValueNode()) {
- String type = baseTypeJson.asText().trim();
- return fromTypeStr(type);
- } else {
- if (!baseTypeJson.has(keyorval)) {
- String message = "Abnormal BaseType JsonNode, it should contain 'key' or 'value' node but was not found"
- + ObjectMapperUtil.convertToString(baseTypeJson);
- throw new AbnormalJsonNodeException(message);
- }
- return fromJsonNode(baseTypeJson.get(keyorval));
- }
- }
-
- /**
- * Get BaseType by the type value of JsonNode.
- * @param type the type value of JsonNode
- * @return BaseType
- */
- private static BaseType fromTypeStr(String type) {
- switch (type) {
- case "boolean":
- return new BooleanBaseType();
- case "integer":
- return new IntegerBaseType();
- case "real":
- return new RealBaseType();
- case "string":
- return new StringBaseType();
- case "uuid":
- return new UuidBaseType();
- default:
- return null;
- }
- }
-
- /**
- * json like "string" or json like {"type" : "string", "enum": ["set",
- * ["access", "native-tagged"]]}" for key or value.
- * @param type JsonNode
- */
- private static BaseType fromJsonNode(JsonNode type) {
- if (type.isTextual()) {
- return fromTypeStr(type.asText());
- } else if (type.isObject() && type.has("type")) {
- String typeStr = type.get("type").asText();
- switch (typeStr) {
- case "boolean":
- return new BooleanBaseType();
- case "integer":
- return getIntegerBaseType(type);
- case "real":
- return getRealBaseType(type);
- case "string":
- return getStringBaseType(type);
- case "uuid":
- return getUuidBaseType(type);
- default:
- return null;
- }
- }
- return null;
- }
-
- /**
- * Get IntegerBaseType by the type value of JsonNode which contains the
- * constraints.
- * @param type the type value of JsonNode
- * @return IntegerBaseType
- */
- private static IntegerBaseType getIntegerBaseType(JsonNode type) {
- int min = Integer.MIN_VALUE;
- int max = Integer.MAX_VALUE;
- Set<Integer> enums = Sets.newHashSet();
- JsonNode node = type.get("minInteger");
- if (node != null) {
- min = node.asInt();
- }
- node = type.get("maxInteger");
- if (node != null) {
- max = node.asInt();
- }
- if (type.has("enum")) {
- JsonNode anEnum = type.get("enum").get(1);
- for (JsonNode n : anEnum) {
- enums.add(n.asInt());
- }
- }
- return new IntegerBaseType(min, max, enums);
- }
-
- /**
- * Get RealBaseType by the type value of JsonNode which contains the
- * constraints.
- * @param type the type value of JsonNode
- * @return RealBaseType
- */
- private static RealBaseType getRealBaseType(JsonNode type) {
- double min = Double.MIN_VALUE;
- double max = Double.MAX_VALUE;
- Set<Double> enums = Sets.newHashSet();
- JsonNode node = type.get("minReal");
- if (node != null) {
- min = node.asDouble();
- }
- node = type.get("maxReal");
- if (node != null) {
- max = node.asDouble();
- }
- if (type.has("enum")) {
- JsonNode anEnum = type.get("enum").get(1);
- for (JsonNode n : anEnum) {
- enums.add(n.asDouble());
- }
- }
- return new RealBaseType(min, max, enums);
- }
-
- /**
- * Get StringBaseType by the type value of JsonNode which contains the
- * constraints.
- * @param type the type value of JsonNode
- * @return StringBaseType
- */
- private static StringBaseType getStringBaseType(JsonNode type) {
- int minLength = Integer.MIN_VALUE;
- int maxLength = Integer.MAX_VALUE;
- Set<String> enums = Sets.newHashSet();
- JsonNode node = type.get("minLength");
- if (node != null) {
- minLength = node.asInt();
- }
- node = type.get("maxLength");
- if (node != null) {
- maxLength = node.asInt();
- }
- if (type.has("enum")) {
- JsonNode enumVal = type.get("enum");
- if (enumVal.isArray()) {
- JsonNode anEnum = enumVal.get(1);
- for (JsonNode n : anEnum) {
- enums.add(n.asText());
- }
- } else if (enumVal.isTextual()) {
- enums.add(enumVal.asText());
- }
- }
- return new StringBaseType(minLength, maxLength, enums);
- }
-
- /**
- * Get UuidBaseType by the type value of JsonNode which contains the
- * constraints.
- * @param type the type value of JsonNode
- * @return UuidBaseType
- */
- private static UuidBaseType getUuidBaseType(JsonNode type) {
- String refTable = null;
- String refType = RefType.STRONG.refType();
- JsonNode node = type.get("refTable");
- if (node != null) {
- refTable = node.asText();
- }
- node = type.get("refType");
- if (node != null) {
- refType = node.asText();
- }
- return new UuidBaseType(refTable, refType);
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.schema.type;
+
+import java.util.Set;
+
+import org.onosproject.ovsdb.rfc.error.AbnormalJsonNodeException;
+import org.onosproject.ovsdb.rfc.schema.type.UuidBaseType.RefType;
+import org.onosproject.ovsdb.rfc.utils.ObjectMapperUtil;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.Sets;
+
+/**
+ * BaseType Factory class.
+ */
+public final class BaseTypeFactory {
+
+ /**
+ * Constructs a BaseTypeFactory object. This class should not be
+ * instantiated.
+ */
+ private BaseTypeFactory() {
+ }
+
+ /**
+ * Create a BaseType from the JsonNode.
+ * @param baseTypeJson the BaseType JsonNode
+ * @param keyorval the key node or value node
+ * @return BaseType
+ */
+ public static BaseType getBaseTypeFromJson(JsonNode baseTypeJson, String keyorval) {
+ if (baseTypeJson.isValueNode()) {
+ String type = baseTypeJson.asText().trim();
+ return fromTypeStr(type);
+ } else {
+ if (!baseTypeJson.has(keyorval)) {
+ String message = "Abnormal BaseType JsonNode, it should contain 'key' or 'value' node but was not found"
+ + ObjectMapperUtil.convertToString(baseTypeJson);
+ throw new AbnormalJsonNodeException(message);
+ }
+ return fromJsonNode(baseTypeJson.get(keyorval));
+ }
+ }
+
+ /**
+ * Get BaseType by the type value of JsonNode.
+ * @param type the type value of JsonNode
+ * @return BaseType
+ */
+ private static BaseType fromTypeStr(String type) {
+ switch (type) {
+ case "boolean":
+ return new BooleanBaseType();
+ case "integer":
+ return new IntegerBaseType();
+ case "real":
+ return new RealBaseType();
+ case "string":
+ return new StringBaseType();
+ case "uuid":
+ return new UuidBaseType();
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * json like "string" or json like {"type" : "string", "enum": ["set",
+ * ["access", "native-tagged"]]}" for key or value.
+ * @param type JsonNode
+ */
+ private static BaseType fromJsonNode(JsonNode type) {
+ if (type.isTextual()) {
+ return fromTypeStr(type.asText());
+ } else if (type.isObject() && type.has("type")) {
+ String typeStr = type.get("type").asText();
+ switch (typeStr) {
+ case "boolean":
+ return new BooleanBaseType();
+ case "integer":
+ return getIntegerBaseType(type);
+ case "real":
+ return getRealBaseType(type);
+ case "string":
+ return getStringBaseType(type);
+ case "uuid":
+ return getUuidBaseType(type);
+ default:
+ return null;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get IntegerBaseType by the type value of JsonNode which contains the
+ * constraints.
+ * @param type the type value of JsonNode
+ * @return IntegerBaseType
+ */
+ private static IntegerBaseType getIntegerBaseType(JsonNode type) {
+ int min = Integer.MIN_VALUE;
+ int max = Integer.MAX_VALUE;
+ Set<Integer> enums = Sets.newHashSet();
+ JsonNode node = type.get("minInteger");
+ if (node != null) {
+ min = node.asInt();
+ }
+ node = type.get("maxInteger");
+ if (node != null) {
+ max = node.asInt();
+ }
+ if (type.has("enum")) {
+ JsonNode anEnum = type.get("enum").get(1);
+ for (JsonNode n : anEnum) {
+ enums.add(n.asInt());
+ }
+ }
+ return new IntegerBaseType(min, max, enums);
+ }
+
+ /**
+ * Get RealBaseType by the type value of JsonNode which contains the
+ * constraints.
+ * @param type the type value of JsonNode
+ * @return RealBaseType
+ */
+ private static RealBaseType getRealBaseType(JsonNode type) {
+ double min = Double.MIN_VALUE;
+ double max = Double.MAX_VALUE;
+ Set<Double> enums = Sets.newHashSet();
+ JsonNode node = type.get("minReal");
+ if (node != null) {
+ min = node.asDouble();
+ }
+ node = type.get("maxReal");
+ if (node != null) {
+ max = node.asDouble();
+ }
+ if (type.has("enum")) {
+ JsonNode anEnum = type.get("enum").get(1);
+ for (JsonNode n : anEnum) {
+ enums.add(n.asDouble());
+ }
+ }
+ return new RealBaseType(min, max, enums);
+ }
+
+ /**
+ * Get StringBaseType by the type value of JsonNode which contains the
+ * constraints.
+ * @param type the type value of JsonNode
+ * @return StringBaseType
+ */
+ private static StringBaseType getStringBaseType(JsonNode type) {
+ int minLength = Integer.MIN_VALUE;
+ int maxLength = Integer.MAX_VALUE;
+ Set<String> enums = Sets.newHashSet();
+ JsonNode node = type.get("minLength");
+ if (node != null) {
+ minLength = node.asInt();
+ }
+ node = type.get("maxLength");
+ if (node != null) {
+ maxLength = node.asInt();
+ }
+ if (type.has("enum")) {
+ JsonNode enumVal = type.get("enum");
+ if (enumVal.isArray()) {
+ JsonNode anEnum = enumVal.get(1);
+ for (JsonNode n : anEnum) {
+ enums.add(n.asText());
+ }
+ } else if (enumVal.isTextual()) {
+ enums.add(enumVal.asText());
+ }
+ }
+ return new StringBaseType(minLength, maxLength, enums);
+ }
+
+ /**
+ * Get UuidBaseType by the type value of JsonNode which contains the
+ * constraints.
+ * @param type the type value of JsonNode
+ * @return UuidBaseType
+ */
+ private static UuidBaseType getUuidBaseType(JsonNode type) {
+ String refTable = null;
+ String refType = RefType.STRONG.refType();
+ JsonNode node = type.get("refTable");
+ if (node != null) {
+ refTable = node.asText();
+ }
+ node = type.get("refType");
+ if (node != null) {
+ refType = node.asText();
+ }
+ return new UuidBaseType(refTable, refType);
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnTypeFactory.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnTypeFactory.java
index 1af6974..33c08c5 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnTypeFactory.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnTypeFactory.java
@@ -1,123 +1,123 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.schema.type;
-
-import org.onosproject.ovsdb.rfc.error.AbnormalJsonNodeException;
-import org.onosproject.ovsdb.rfc.utils.ObjectMapperUtil;
-
-import com.fasterxml.jackson.databind.JsonNode;
-
-/**
- * ColumnType Factory class.
- */
-public final class ColumnTypeFactory {
-
- /**
- * Constructs a ColumnTypeFactory object. This class should not be
- * instantiated.
- */
- private ColumnTypeFactory() {
- }
-
- /**
- * Those Json's key/value pairs.
- */
- public enum Type {
- KEY("key"), VALUE("value");
-
- private final String type;
-
- private Type(String type) {
- this.type = type;
- }
-
- /**
- * Returns the type for Type.
- * @return the type
- */
- public String type() {
- return type;
- }
- }
-
- /**
- * JsonNode like
- * "flow_tables":{"type":{"key":{"maxInteger":254,"minInteger":0,"type":
- * "integer"},"min":0,"value":{"type":"uuid","refTable":"Flow_Table"},"max":
- * "unlimited"}}.
- * @param columnTypeJson the ColumnType JsonNode
- * @return ColumnType
- */
- public static ColumnType getColumnTypeFromJson(JsonNode columnTypeJson) {
- if (!columnTypeJson.isObject() || !columnTypeJson.has(Type.VALUE.type())) {
- return createAtomicColumnType(columnTypeJson);
- } else if (!columnTypeJson.isValueNode() && columnTypeJson.has(Type.VALUE.type())) {
- return createKeyValuedColumnType(columnTypeJson);
- }
- String message = "Abnormal ColumnType JsonNode, it should be AtomicColumnType or KeyValuedColumnType"
- + ObjectMapperUtil.convertToString(columnTypeJson);
- throw new AbnormalJsonNodeException(message);
- }
-
- /**
- * Create AtomicColumnType entity.
- * @param json JsonNode
- * @return AtomicColumnType entity
- */
- private static AtomicColumnType createAtomicColumnType(JsonNode json) {
- BaseType baseType = BaseTypeFactory.getBaseTypeFromJson(json, Type.KEY.type());
- int min = 1;
- int max = 1;
- JsonNode node = json.get("min");
- if (node != null && node.isNumber()) {
- min = node.asInt();
- }
- node = json.get("max");
- if (node != null) {
- if (node.isNumber()) {
- max = node.asInt();
- } else if (node.isTextual() && "unlimited".equals(node.asText())) {
- max = Integer.MAX_VALUE;
- }
- }
- return new AtomicColumnType(baseType, min, max);
- }
-
- /**
- * Create KeyValuedColumnType entity.
- * @param json JsonNode
- * @return KeyValuedColumnType entity
- */
- private static KeyValuedColumnType createKeyValuedColumnType(JsonNode json) {
- BaseType keyType = BaseTypeFactory.getBaseTypeFromJson(json, Type.KEY.type());
- BaseType valueType = BaseTypeFactory.getBaseTypeFromJson(json, Type.VALUE.type());
- int min = 1;
- int max = 1;
- JsonNode node = json.get("min");
- if (node != null && node.isNumber()) {
- min = node.asInt();
- }
- node = json.get("max");
- if (node != null) {
- if (node.isNumber()) {
- max = node.asInt();
- } else if (node.isTextual() && "unlimited".equals(node.asText())) {
- max = Integer.MAX_VALUE;
- }
- }
- return new KeyValuedColumnType(keyType, valueType, min, max);
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.schema.type;
+
+import org.onosproject.ovsdb.rfc.error.AbnormalJsonNodeException;
+import org.onosproject.ovsdb.rfc.utils.ObjectMapperUtil;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+/**
+ * ColumnType Factory class.
+ */
+public final class ColumnTypeFactory {
+
+ /**
+ * Constructs a ColumnTypeFactory object. This class should not be
+ * instantiated.
+ */
+ private ColumnTypeFactory() {
+ }
+
+ /**
+ * Those Json's key/value pairs.
+ */
+ public enum Type {
+ KEY("key"), VALUE("value");
+
+ private final String type;
+
+ private Type(String type) {
+ this.type = type;
+ }
+
+ /**
+ * Returns the type for Type.
+ * @return the type
+ */
+ public String type() {
+ return type;
+ }
+ }
+
+ /**
+ * JsonNode like
+ * "flow_tables":{"type":{"key":{"maxInteger":254,"minInteger":0,"type":
+ * "integer"},"min":0,"value":{"type":"uuid","refTable":"Flow_Table"},"max":
+ * "unlimited"}}.
+ * @param columnTypeJson the ColumnType JsonNode
+ * @return ColumnType
+ */
+ public static ColumnType getColumnTypeFromJson(JsonNode columnTypeJson) {
+ if (!columnTypeJson.isObject() || !columnTypeJson.has(Type.VALUE.type())) {
+ return createAtomicColumnType(columnTypeJson);
+ } else if (!columnTypeJson.isValueNode() && columnTypeJson.has(Type.VALUE.type())) {
+ return createKeyValuedColumnType(columnTypeJson);
+ }
+ String message = "Abnormal ColumnType JsonNode, it should be AtomicColumnType or KeyValuedColumnType"
+ + ObjectMapperUtil.convertToString(columnTypeJson);
+ throw new AbnormalJsonNodeException(message);
+ }
+
+ /**
+ * Create AtomicColumnType entity.
+ * @param json JsonNode
+ * @return AtomicColumnType entity
+ */
+ private static AtomicColumnType createAtomicColumnType(JsonNode json) {
+ BaseType baseType = BaseTypeFactory.getBaseTypeFromJson(json, Type.KEY.type());
+ int min = 1;
+ int max = 1;
+ JsonNode node = json.get("min");
+ if (node != null && node.isNumber()) {
+ min = node.asInt();
+ }
+ node = json.get("max");
+ if (node != null) {
+ if (node.isNumber()) {
+ max = node.asInt();
+ } else if (node.isTextual() && "unlimited".equals(node.asText())) {
+ max = Integer.MAX_VALUE;
+ }
+ }
+ return new AtomicColumnType(baseType, min, max);
+ }
+
+ /**
+ * Create KeyValuedColumnType entity.
+ * @param json JsonNode
+ * @return KeyValuedColumnType entity
+ */
+ private static KeyValuedColumnType createKeyValuedColumnType(JsonNode json) {
+ BaseType keyType = BaseTypeFactory.getBaseTypeFromJson(json, Type.KEY.type());
+ BaseType valueType = BaseTypeFactory.getBaseTypeFromJson(json, Type.VALUE.type());
+ int min = 1;
+ int max = 1;
+ JsonNode node = json.get("min");
+ if (node != null && node.isNumber()) {
+ min = node.asInt();
+ }
+ node = json.get("max");
+ if (node != null) {
+ if (node.isNumber()) {
+ max = node.asInt();
+ } else if (node.isTextual() && "unlimited".equals(node.asText())) {
+ max = Integer.MAX_VALUE;
+ }
+ }
+ return new KeyValuedColumnType(keyType, valueType, min, max);
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/OvsdbTable.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/OvsdbTable.java
index f2e5150..2bfe2e7 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/OvsdbTable.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/OvsdbTable.java
@@ -1,41 +1,41 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.table;
-
-/**
- * Ovsdb table name. Refer to RFC7047's Section 9.2.
- */
-public enum OvsdbTable {
- INTERFACE("Interface"), BRIDGE("Bridge"), CONTROLLER("Controller"),
- PORT("Port"), OPENVSWITCH("Open_vSwitch"), FLWTABLE("Flow_Table"),
- QOS("Qos"), QUEUE("Queue"), MIRROR("Mirror"), MANAGER("Manager"),
- NETFLOW("NetFlow"), SSL("SSL"), SFLOW("sFlow"), IPFIX("IPFIX"),
- FLOWSAMPLECOLLECTORSET("Flow_Sample_Collector_Set");
-
- private final String tableName;
-
- private OvsdbTable(String tableName) {
- this.tableName = tableName;
- }
-
- /**
- * Returns the table name for OvsdbTable.
- * @return the table name
- */
- public String tableName() {
- return tableName;
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.table;
+
+/**
+ * Ovsdb table name. Refer to RFC7047's Section 9.2.
+ */
+public enum OvsdbTable {
+ INTERFACE("Interface"), BRIDGE("Bridge"), CONTROLLER("Controller"),
+ PORT("Port"), OPENVSWITCH("Open_vSwitch"), FLWTABLE("Flow_Table"),
+ QOS("Qos"), QUEUE("Queue"), MIRROR("Mirror"), MANAGER("Manager"),
+ NETFLOW("NetFlow"), SSL("SSL"), SFLOW("sFlow"), IPFIX("IPFIX"),
+ FLOWSAMPLECOLLECTORSET("Flow_Sample_Collector_Set");
+
+ private final String tableName;
+
+ private OvsdbTable(String tableName) {
+ this.tableName = tableName;
+ }
+
+ /**
+ * Returns the table name for OvsdbTable.
+ * @return the table name
+ */
+ public String tableName() {
+ return tableName;
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/VersionNum.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/VersionNum.java
index f308266..8b35642 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/VersionNum.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/VersionNum.java
@@ -1,47 +1,47 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.table;
-
-/**
- * The version number of tables and columns.
- */
-public enum VersionNum {
- VERSION100("1.0.0"), VERSION102("1.0.2"), VERSION103("1.0.3"),
- VERSION104("1.0.4"), VERSION106("1.0.6"), VERSION110("1.1.0"),
- VERSION130("1.3.0"), VERSION200("2.0.0"), VERSION300("3.0.0"),
- VERSION330("3.3.0"), VERSION350("3.5.0"), VERSION400("4.0.0"),
- VERSION510("5.1.0"), VERSION520("5.2.0"), VERSION600("6.0.0"),
- VERSION610("6.1.0"), VERSION620("6.2.0"), VERSION630("6.3.0"),
- VERSION640("6.4.0"), VERSION650("6.5.0"), VERSION660("6.6.0"),
- VERSION670("6.7.0"), VERSION680("6.8.0"), VERSION690("6.9.0"),
- VERSION6100("6.10.0"), VERSION6111("6.11.1"), VERSION710("7.1.0"),
- VERSION720("7.2.0"), VERSION721("7.2.1"), VERSION730("7.3.0"),
- VERSION740("7.4.0"), VERSION750("7.5.0"), VERSION770("7.7.0");
-
- private final String versionNum;
-
- private VersionNum(String versionNum) {
- this.versionNum = versionNum;
- }
-
- /**
- * Returns the version number for VersionNum.
- * @return the version number
- */
- public String versionNum() {
- return versionNum;
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.table;
+
+/**
+ * The version number of tables and columns.
+ */
+public enum VersionNum {
+ VERSION100("1.0.0"), VERSION102("1.0.2"), VERSION103("1.0.3"),
+ VERSION104("1.0.4"), VERSION106("1.0.6"), VERSION110("1.1.0"),
+ VERSION130("1.3.0"), VERSION200("2.0.0"), VERSION300("3.0.0"),
+ VERSION330("3.3.0"), VERSION350("3.5.0"), VERSION400("4.0.0"),
+ VERSION510("5.1.0"), VERSION520("5.2.0"), VERSION600("6.0.0"),
+ VERSION610("6.1.0"), VERSION620("6.2.0"), VERSION630("6.3.0"),
+ VERSION640("6.4.0"), VERSION650("6.5.0"), VERSION660("6.6.0"),
+ VERSION670("6.7.0"), VERSION680("6.8.0"), VERSION690("6.9.0"),
+ VERSION6100("6.10.0"), VERSION6111("6.11.1"), VERSION710("7.1.0"),
+ VERSION720("7.2.0"), VERSION721("7.2.1"), VERSION730("7.3.0"),
+ VERSION740("7.4.0"), VERSION750("7.5.0"), VERSION770("7.7.0");
+
+ private final String versionNum;
+
+ private VersionNum(String versionNum) {
+ this.versionNum = versionNum;
+ }
+
+ /**
+ * Returns the version number for VersionNum.
+ * @return the version number
+ */
+ public String versionNum() {
+ return versionNum;
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/tableservice/AbstractOvsdbTableService.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/tableservice/AbstractOvsdbTableService.java
index a65ed12..ed7c9e6 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/tableservice/AbstractOvsdbTableService.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/tableservice/AbstractOvsdbTableService.java
@@ -1,284 +1,284 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.tableservice;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Objects;
-
-import org.onosproject.ovsdb.rfc.error.ColumnSchemaNotFoundException;
-import org.onosproject.ovsdb.rfc.error.TableSchemaNotFoundException;
-import org.onosproject.ovsdb.rfc.error.VersionMismatchException;
-import org.onosproject.ovsdb.rfc.notation.Column;
-import org.onosproject.ovsdb.rfc.notation.Row;
-import org.onosproject.ovsdb.rfc.notation.UUID;
-import org.onosproject.ovsdb.rfc.schema.ColumnSchema;
-import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
-import org.onosproject.ovsdb.rfc.schema.TableSchema;
-import org.onosproject.ovsdb.rfc.table.OvsdbTable;
-import org.onosproject.ovsdb.rfc.table.VersionNum;
-import org.onosproject.ovsdb.rfc.utils.VersionUtil;
-
-/**
- * Representation of conversion between Ovsdb table and Row.
- */
-public abstract class AbstractOvsdbTableService implements OvsdbTableService {
-
- private final DatabaseSchema dbSchema;
- private final Row row;
- private final TableDescription tableDesc;
-
- /**
- * Constructs a AbstractOvsdbTableService object.
- * @param dbSchema DatabaseSchema entity
- * @param row Row entity
- * @param table table name
- * @param formVersion the initial version
- */
- public AbstractOvsdbTableService(DatabaseSchema dbSchema, Row row, OvsdbTable table,
- VersionNum formVersion) {
- checkNotNull(dbSchema, "database schema cannot be null");
- checkNotNull(row, "row cannot be null");
- checkNotNull(table, "table cannot be null");
- checkNotNull(formVersion, "the initial version cannot be null");
- this.dbSchema = dbSchema;
- row.setTableName(table.tableName());
- this.row = row;
- TableDescription tableDesc = new TableDescription(table, formVersion);
- this.tableDesc = tableDesc;
- }
-
- /**
- * Check whether the parameter of dbSchema is valid and check whether the
- * table is existent in Database Schema.
- */
- private boolean isValid() {
- if (dbSchema == null) {
- return false;
- }
- if (!dbSchema.name().equalsIgnoreCase(tableDesc.database())) {
- return false;
- }
- checkTableSchemaVersion();
- return true;
- }
-
- /**
- * Check the table version.
- */
- private void checkTableSchemaVersion() {
- String fromVersion = tableDesc.fromVersion();
- String untilVersion = tableDesc.untilVersion();
- String schemaVersion = dbSchema.version();
- checkVersion(schemaVersion, fromVersion, untilVersion);
- }
-
- /**
- * Check the column version.
- * @param columnDesc ColumnDescription entity
- */
- private void checkColumnSchemaVersion(ColumnDescription columnDesc) {
- String fromVersion = columnDesc.fromVersion();
- String untilVersion = columnDesc.untilVersion();
- String schemaVersion = dbSchema.version();
- checkVersion(schemaVersion, fromVersion, untilVersion);
- }
-
- /**
- * Check whether the DatabaseSchema version between the initial version and
- * the end of the version.
- * @param schemaVersion DatabaseSchema version
- * @param fromVersion The initial version
- * @param untilVersion The end of the version
- * @throws VersionMismatchException this is a version mismatch exception
- */
- private void checkVersion(String schemaVersion, String fromVersion, String untilVersion) {
- VersionUtil.versionMatch(fromVersion);
- VersionUtil.versionMatch(untilVersion);
- if (!fromVersion.equals(VersionUtil.DEFAULT_VERSION_STRING)) {
- if (VersionUtil.versionCompare(schemaVersion, fromVersion) < 0) {
- String message = VersionMismatchException.createFromMessage(schemaVersion,
- fromVersion);
- throw new VersionMismatchException(message);
- }
- }
- if (!untilVersion.equals(VersionUtil.DEFAULT_VERSION_STRING)) {
- if (VersionUtil.versionCompare(untilVersion, schemaVersion) < 0) {
- String message = VersionMismatchException.createToMessage(schemaVersion,
- untilVersion);
- throw new VersionMismatchException(message);
- }
- }
- }
-
- /**
- * Returns TableSchema from dbSchema by table name.
- * @return TableSchema
- */
- private TableSchema getTableSchema() {
- String tableName = tableDesc.name();
- return dbSchema.getTableSchema(tableName);
- }
-
- /**
- * Returns ColumnSchema from TableSchema by column name.
- * @param columnName column name
- * @return ColumnSchema
- */
- private ColumnSchema getColumnSchema(String columnName) {
- TableSchema tableSchema = getTableSchema();
- if (tableSchema == null) {
- String message = TableSchemaNotFoundException.createMessage(tableDesc.name(),
- dbSchema.name());
- throw new TableSchemaNotFoundException(message);
- }
- ColumnSchema columnSchema = tableSchema.getColumnSchema(columnName);
- if (columnSchema == null) {
- String message = ColumnSchemaNotFoundException.createMessage(columnName,
- tableSchema.name());
- throw new ColumnSchemaNotFoundException(message);
- }
- return columnSchema;
- }
-
- @Override
- public Column getColumnHandler(ColumnDescription columnDesc) {
- if (!isValid()) {
- return null;
- }
- String columnName = columnDesc.name();
- checkColumnSchemaVersion(columnDesc);
- ColumnSchema columnSchema = getColumnSchema(columnName);
- if (row == null) {
- return null;
- }
- return row.getColumn(columnSchema.name());
- }
-
- @Override
- public Object getDataHandler(ColumnDescription columnDesc) {
- if (!isValid()) {
- return null;
- }
- String columnName = columnDesc.name();
- checkColumnSchemaVersion(columnDesc);
- ColumnSchema columnSchema = getColumnSchema(columnName);
- if (row == null || row.getColumn(columnSchema.name()) == null) {
- return null;
- }
- return row.getColumn(columnSchema.name()).data();
- }
-
- @Override
- public void setDataHandler(ColumnDescription columnDesc, Object obj) {
- if (!isValid()) {
- return;
- }
- String columnName = columnDesc.name();
- checkColumnSchemaVersion(columnDesc);
- ColumnSchema columnSchema = getColumnSchema(columnName);
- Column column = new Column(columnSchema.name(), obj);
- row.addColumn(columnName, column);
- }
-
- @Override
- public UUID getTableUuid() {
- if (!isValid()) {
- return null;
- }
- ColumnDescription columnDesc = new ColumnDescription("_uuid", "getTableUuid");
- return (UUID) getDataHandler(columnDesc);
- }
-
- @Override
- public Column getTableUuidColumn() {
- if (!isValid()) {
- return null;
- }
- ColumnDescription columnDesc = new ColumnDescription("_uuid", "getTableUuidColumn");
- return (Column) getColumnHandler(columnDesc);
- }
-
- @Override
- public UUID getTableVersion() {
- if (!isValid()) {
- return null;
- }
- ColumnDescription columnDesc = new ColumnDescription("_version", "getTableVersion");
- return (UUID) getDataHandler(columnDesc);
- }
-
- @Override
- public Column getTableVersionColumn() {
- if (!isValid()) {
- return null;
- }
- ColumnDescription columnDesc = new ColumnDescription("_version", "getTableVersionColumn");
- return (Column) getColumnHandler(columnDesc);
- }
-
- /**
- * Get DatabaseSchema entity.
- * @return DatabaseSchema entity
- */
- public DatabaseSchema dbSchema() {
- return dbSchema;
- }
-
- /**
- * Get Row entity.
- * @return Row entity
- */
- public Row getRow() {
- if (!isValid()) {
- return null;
- }
- return this.row;
- }
-
- /**
- * Get TableDescription entity.
- * @return TableDescription entity
- */
- public TableDescription tableDesc() {
- return tableDesc;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(row);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj instanceof AbstractOvsdbTableService) {
- final AbstractOvsdbTableService other = (AbstractOvsdbTableService) obj;
- return Objects.equals(this.row, other.row);
- }
- return false;
- }
-
- @Override
- public String toString() {
- TableSchema schema = (TableSchema) getTableSchema();
- String tableName = schema.name();
- return toStringHelper(this).add("tableName", tableName).add("row", row).toString();
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.tableservice;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onosproject.ovsdb.rfc.error.ColumnSchemaNotFoundException;
+import org.onosproject.ovsdb.rfc.error.TableSchemaNotFoundException;
+import org.onosproject.ovsdb.rfc.error.VersionMismatchException;
+import org.onosproject.ovsdb.rfc.notation.Column;
+import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.notation.UUID;
+import org.onosproject.ovsdb.rfc.schema.ColumnSchema;
+import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+import org.onosproject.ovsdb.rfc.table.OvsdbTable;
+import org.onosproject.ovsdb.rfc.table.VersionNum;
+import org.onosproject.ovsdb.rfc.utils.VersionUtil;
+
+/**
+ * Representation of conversion between Ovsdb table and Row.
+ */
+public abstract class AbstractOvsdbTableService implements OvsdbTableService {
+
+ private final DatabaseSchema dbSchema;
+ private final Row row;
+ private final TableDescription tableDesc;
+
+ /**
+ * Constructs a AbstractOvsdbTableService object.
+ * @param dbSchema DatabaseSchema entity
+ * @param row Row entity
+ * @param table table name
+ * @param formVersion the initial version
+ */
+ public AbstractOvsdbTableService(DatabaseSchema dbSchema, Row row, OvsdbTable table,
+ VersionNum formVersion) {
+ checkNotNull(dbSchema, "database schema cannot be null");
+ checkNotNull(row, "row cannot be null");
+ checkNotNull(table, "table cannot be null");
+ checkNotNull(formVersion, "the initial version cannot be null");
+ this.dbSchema = dbSchema;
+ row.setTableName(table.tableName());
+ this.row = row;
+ TableDescription tableDesc = new TableDescription(table, formVersion);
+ this.tableDesc = tableDesc;
+ }
+
+ /**
+ * Check whether the parameter of dbSchema is valid and check whether the
+ * table is existent in Database Schema.
+ */
+ private boolean isValid() {
+ if (dbSchema == null) {
+ return false;
+ }
+ if (!dbSchema.name().equalsIgnoreCase(tableDesc.database())) {
+ return false;
+ }
+ checkTableSchemaVersion();
+ return true;
+ }
+
+ /**
+ * Check the table version.
+ */
+ private void checkTableSchemaVersion() {
+ String fromVersion = tableDesc.fromVersion();
+ String untilVersion = tableDesc.untilVersion();
+ String schemaVersion = dbSchema.version();
+ checkVersion(schemaVersion, fromVersion, untilVersion);
+ }
+
+ /**
+ * Check the column version.
+ * @param columnDesc ColumnDescription entity
+ */
+ private void checkColumnSchemaVersion(ColumnDescription columnDesc) {
+ String fromVersion = columnDesc.fromVersion();
+ String untilVersion = columnDesc.untilVersion();
+ String schemaVersion = dbSchema.version();
+ checkVersion(schemaVersion, fromVersion, untilVersion);
+ }
+
+ /**
+ * Check whether the DatabaseSchema version between the initial version and
+ * the end of the version.
+ * @param schemaVersion DatabaseSchema version
+ * @param fromVersion The initial version
+ * @param untilVersion The end of the version
+ * @throws VersionMismatchException this is a version mismatch exception
+ */
+ private void checkVersion(String schemaVersion, String fromVersion, String untilVersion) {
+ VersionUtil.versionMatch(fromVersion);
+ VersionUtil.versionMatch(untilVersion);
+ if (!fromVersion.equals(VersionUtil.DEFAULT_VERSION_STRING)) {
+ if (VersionUtil.versionCompare(schemaVersion, fromVersion) < 0) {
+ String message = VersionMismatchException.createFromMessage(schemaVersion,
+ fromVersion);
+ throw new VersionMismatchException(message);
+ }
+ }
+ if (!untilVersion.equals(VersionUtil.DEFAULT_VERSION_STRING)) {
+ if (VersionUtil.versionCompare(untilVersion, schemaVersion) < 0) {
+ String message = VersionMismatchException.createToMessage(schemaVersion,
+ untilVersion);
+ throw new VersionMismatchException(message);
+ }
+ }
+ }
+
+ /**
+ * Returns TableSchema from dbSchema by table name.
+ * @return TableSchema
+ */
+ private TableSchema getTableSchema() {
+ String tableName = tableDesc.name();
+ return dbSchema.getTableSchema(tableName);
+ }
+
+ /**
+ * Returns ColumnSchema from TableSchema by column name.
+ * @param columnName column name
+ * @return ColumnSchema
+ */
+ private ColumnSchema getColumnSchema(String columnName) {
+ TableSchema tableSchema = getTableSchema();
+ if (tableSchema == null) {
+ String message = TableSchemaNotFoundException.createMessage(tableDesc.name(),
+ dbSchema.name());
+ throw new TableSchemaNotFoundException(message);
+ }
+ ColumnSchema columnSchema = tableSchema.getColumnSchema(columnName);
+ if (columnSchema == null) {
+ String message = ColumnSchemaNotFoundException.createMessage(columnName,
+ tableSchema.name());
+ throw new ColumnSchemaNotFoundException(message);
+ }
+ return columnSchema;
+ }
+
+ @Override
+ public Column getColumnHandler(ColumnDescription columnDesc) {
+ if (!isValid()) {
+ return null;
+ }
+ String columnName = columnDesc.name();
+ checkColumnSchemaVersion(columnDesc);
+ ColumnSchema columnSchema = getColumnSchema(columnName);
+ if (row == null) {
+ return null;
+ }
+ return row.getColumn(columnSchema.name());
+ }
+
+ @Override
+ public Object getDataHandler(ColumnDescription columnDesc) {
+ if (!isValid()) {
+ return null;
+ }
+ String columnName = columnDesc.name();
+ checkColumnSchemaVersion(columnDesc);
+ ColumnSchema columnSchema = getColumnSchema(columnName);
+ if (row == null || row.getColumn(columnSchema.name()) == null) {
+ return null;
+ }
+ return row.getColumn(columnSchema.name()).data();
+ }
+
+ @Override
+ public void setDataHandler(ColumnDescription columnDesc, Object obj) {
+ if (!isValid()) {
+ return;
+ }
+ String columnName = columnDesc.name();
+ checkColumnSchemaVersion(columnDesc);
+ ColumnSchema columnSchema = getColumnSchema(columnName);
+ Column column = new Column(columnSchema.name(), obj);
+ row.addColumn(columnName, column);
+ }
+
+ @Override
+ public UUID getTableUuid() {
+ if (!isValid()) {
+ return null;
+ }
+ ColumnDescription columnDesc = new ColumnDescription("_uuid", "getTableUuid");
+ return (UUID) getDataHandler(columnDesc);
+ }
+
+ @Override
+ public Column getTableUuidColumn() {
+ if (!isValid()) {
+ return null;
+ }
+ ColumnDescription columnDesc = new ColumnDescription("_uuid", "getTableUuidColumn");
+ return (Column) getColumnHandler(columnDesc);
+ }
+
+ @Override
+ public UUID getTableVersion() {
+ if (!isValid()) {
+ return null;
+ }
+ ColumnDescription columnDesc = new ColumnDescription("_version", "getTableVersion");
+ return (UUID) getDataHandler(columnDesc);
+ }
+
+ @Override
+ public Column getTableVersionColumn() {
+ if (!isValid()) {
+ return null;
+ }
+ ColumnDescription columnDesc = new ColumnDescription("_version", "getTableVersionColumn");
+ return (Column) getColumnHandler(columnDesc);
+ }
+
+ /**
+ * Get DatabaseSchema entity.
+ * @return DatabaseSchema entity
+ */
+ public DatabaseSchema dbSchema() {
+ return dbSchema;
+ }
+
+ /**
+ * Get Row entity.
+ * @return Row entity
+ */
+ public Row getRow() {
+ if (!isValid()) {
+ return null;
+ }
+ return this.row;
+ }
+
+ /**
+ * Get TableDescription entity.
+ * @return TableDescription entity
+ */
+ public TableDescription tableDesc() {
+ return tableDesc;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(row);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof AbstractOvsdbTableService) {
+ final AbstractOvsdbTableService other = (AbstractOvsdbTableService) obj;
+ return Objects.equals(this.row, other.row);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ TableSchema schema = (TableSchema) getTableSchema();
+ String tableName = schema.name();
+ return toStringHelper(this).add("tableName", tableName).add("row", row).toString();
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/tableservice/OvsdbTableService.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/tableservice/OvsdbTableService.java
index 1ce2870..58b656e 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/tableservice/OvsdbTableService.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/tableservice/OvsdbTableService.java
@@ -1,70 +1,70 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.tableservice;
-
-import org.onosproject.ovsdb.rfc.notation.Column;
-import org.onosproject.ovsdb.rfc.notation.UUID;
-
-/**
- * Representation of conversion between Ovsdb table and Row.
- */
-public interface OvsdbTableService {
-
- /**
- * Get Column from row.
- * @param columndesc Column description
- * @return Column
- */
- public Column getColumnHandler(ColumnDescription columndesc);
-
- /**
- * Get Data from row.
- * @param columndesc Column description
- * @return Object column data
- */
- public Object getDataHandler(ColumnDescription columndesc);
-
- /**
- * Set column data of row.
- * @param columndesc Column description
- * @param obj column data
- */
- public void setDataHandler(ColumnDescription columndesc, Object obj);
-
- /**
- * Returns UUID which column name is _uuid.
- * @return UUID
- */
- public UUID getTableUuid();
-
- /**
- * Returns UUID Column which column name is _uuid.
- * @return UUID Column
- */
- public Column getTableUuidColumn();
-
- /**
- * Returns UUID which column name is _version.
- * @return UUID
- */
- public UUID getTableVersion();
-
- /**
- * Returns UUID Column which column name is _version.
- * @return UUID Column
- */
- public Column getTableVersionColumn();
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.tableservice;
+
+import org.onosproject.ovsdb.rfc.notation.Column;
+import org.onosproject.ovsdb.rfc.notation.UUID;
+
+/**
+ * Representation of conversion between Ovsdb table and Row.
+ */
+public interface OvsdbTableService {
+
+ /**
+ * Get Column from row.
+ * @param columndesc Column description
+ * @return Column
+ */
+ public Column getColumnHandler(ColumnDescription columndesc);
+
+ /**
+ * Get Data from row.
+ * @param columndesc Column description
+ * @return Object column data
+ */
+ public Object getDataHandler(ColumnDescription columndesc);
+
+ /**
+ * Set column data of row.
+ * @param columndesc Column description
+ * @param obj column data
+ */
+ public void setDataHandler(ColumnDescription columndesc, Object obj);
+
+ /**
+ * Returns UUID which column name is _uuid.
+ * @return UUID
+ */
+ public UUID getTableUuid();
+
+ /**
+ * Returns UUID Column which column name is _uuid.
+ * @return UUID Column
+ */
+ public Column getTableUuidColumn();
+
+ /**
+ * Returns UUID which column name is _version.
+ * @return UUID
+ */
+ public UUID getTableVersion();
+
+ /**
+ * Returns UUID Column which column name is _version.
+ * @return UUID Column
+ */
+ public Column getTableVersionColumn();
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/FromJsonUtil.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/FromJsonUtil.java
index 7283d8e..5d06354 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/FromJsonUtil.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/FromJsonUtil.java
@@ -1,320 +1,320 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.utils;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.onosproject.ovsdb.rfc.error.AbnormalJsonNodeException;
-import org.onosproject.ovsdb.rfc.error.UnsupportedException;
-import org.onosproject.ovsdb.rfc.jsonrpc.Callback;
-import org.onosproject.ovsdb.rfc.jsonrpc.JsonRpcResponse;
-import org.onosproject.ovsdb.rfc.message.OperationResult;
-import org.onosproject.ovsdb.rfc.message.RowUpdate;
-import org.onosproject.ovsdb.rfc.message.TableUpdate;
-import org.onosproject.ovsdb.rfc.message.TableUpdates;
-import org.onosproject.ovsdb.rfc.message.UpdateNotification;
-import org.onosproject.ovsdb.rfc.notation.Column;
-import org.onosproject.ovsdb.rfc.notation.Row;
-import org.onosproject.ovsdb.rfc.notation.UUID;
-import org.onosproject.ovsdb.rfc.operations.Operation;
-import org.onosproject.ovsdb.rfc.schema.ColumnSchema;
-import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
-import org.onosproject.ovsdb.rfc.schema.TableSchema;
-import org.onosproject.ovsdb.rfc.schema.type.ColumnTypeFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-/**
- * JsonNode utility class. convert JsonNode into Object.
- */
-public final class FromJsonUtil {
-
- private static final Logger log = LoggerFactory.getLogger(FromJsonUtil.class);
-
- /**
- * Constructs a FromJsonUtil object. Utility classes should not have a
- * public or default constructor, otherwise IDE will compile unsuccessfully.
- * This class should not be instantiated.
- */
- private FromJsonUtil() {
- }
-
- /**
- * Verify whether the jsonNode is normal.
- * @param jsonNode JsonNode
- * @param nodeStr the node name of JsonNode
- */
- private static void validateJsonNode(JsonNode jsonNode, String nodeStr) {
- if (!jsonNode.isObject() || !jsonNode.has(nodeStr)) {
- String message = "Abnormal DatabaseSchema JsonNode, it should contain " + nodeStr
- + " node but was not found";
- throw new AbnormalJsonNodeException(message);
- }
- }
-
- /**
- * convert JsonNode into DatabaseSchema.
- * @param dbName database name
- * @param dbJson the JsonNode of get_schema result
- * @return DatabaseSchema
- * @throws AbnormalJsonNodeException this is an abnormal JsonNode exception
- */
- public static DatabaseSchema jsonNodeToDbSchema(String dbName, JsonNode dbJson) {
- validateJsonNode(dbJson, "tables");
- validateJsonNode(dbJson, "version");
- String dbVersion = dbJson.get("version").asText();
- Map<String, TableSchema> tables = new HashMap<>();
- Iterator<Map.Entry<String, JsonNode>> tablesIter = dbJson.get("tables").fields();
- while (tablesIter.hasNext()) {
- Map.Entry<String, JsonNode> table = tablesIter.next();
- tables.put(table.getKey(), jsonNodeToTableSchema(table.getKey(), table.getValue()));
- }
- return new DatabaseSchema(dbName, dbVersion, tables);
- }
-
- /**
- * convert JsonNode into TableSchema.
- * @param tableName table name
- * @param tableJson table JsonNode
- * @return TableSchema
- * @throws AbnormalJsonNodeException this is an abnormal JsonNode exception
- */
- private static TableSchema jsonNodeToTableSchema(String tableName, JsonNode tableJson) {
- validateJsonNode(tableJson, "columns");
- Map<String, ColumnSchema> columns = new HashMap<>();
- Iterator<Map.Entry<String, JsonNode>> columnsIter = tableJson.get("columns").fields();
- while (columnsIter.hasNext()) {
- Map.Entry<String, JsonNode> column = columnsIter.next();
- columns.put(column.getKey(), jsonNodeToColumnSchema(column.getKey(), column.getValue()));
- }
- return new TableSchema(tableName, columns);
- }
-
- /**
- * convert JsonNode into ColumnSchema.
- * @param name column name
- * @param columnJson column JsonNode
- * @return ColumnSchema
- * @throws AbnormalJsonNodeException this is an abnormal JsonNode exception
- */
- private static ColumnSchema jsonNodeToColumnSchema(String name, JsonNode columnJson) {
- validateJsonNode(columnJson, "type");
- return new ColumnSchema(name, ColumnTypeFactory.getColumnTypeFromJson(columnJson
- .get("type")));
- }
-
- /**
- * convert JsonNode into the returnType of methods in OvsdbRPC class.
- * @param resultJsonNode the result JsonNode
- * @param methodName the method name of methods in OvsdbRPC class
- * @param objectMapper ObjectMapper entity
- * @return Object
- * @throws UnsupportedException this is an unsupported exception
- */
- private static Object convertResultType(JsonNode resultJsonNode, String methodName,
- ObjectMapper objectMapper) {
- switch (methodName) {
- case "getSchema":
- case "monitor":
- return resultJsonNode;
- case "echo":
- case "listDbs":
- return objectMapper.convertValue(resultJsonNode, objectMapper.getTypeFactory()
- .constructParametricType(List.class, String.class));
- case "transact":
- return objectMapper.convertValue(resultJsonNode, objectMapper.getTypeFactory()
- .constructParametricType(List.class, JsonNode.class));
- default:
- throw new UnsupportedException("does not support this rpc method" + methodName);
- }
- }
-
- /**
- * convert JsonNode into the returnType of methods in OvsdbRPC class.
- * @param jsonNode the result JsonNode
- * @param methodName the method name of methods in OvsdbRPC class
- * @return Object
- */
- public static Object jsonResultParser(JsonNode jsonNode, String methodName) {
- ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper();
- JsonNode error = jsonNode.get("error");
- if (error != null && !error.isNull()) {
- log.error("jsonRpcResponse error : {}", error.toString());
- }
- JsonNode resultJsonNode = jsonNode.get("result");
- Object result = convertResultType(resultJsonNode, methodName, objectMapper);
- return result;
- }
-
- /**
- * When monitor the ovsdb tables, if a table update, ovs send update
- * notification, then call callback function.
- * @param jsonNode the result JsonNode
- * @param callback the callback function
- * @throws UnsupportedException this is an unsupported exception
- */
- public static void jsonCallbackRequestParser(JsonNode jsonNode, Callback callback) {
- ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper();
- JsonNode params = jsonNode.get("params");
- Object param = null;
- String methodName = jsonNode.get("method").asText();
- switch (methodName) {
- case "update":
- param = objectMapper.convertValue(params, UpdateNotification.class);
- callback.update((UpdateNotification) param);
- break;
- default:
- throw new UnsupportedException("does not support this callback method: " + methodName);
- }
- }
-
- /**
- * Ovs send echo request to keep the heart, need we return echo result.
- * @param jsonNode the result JsonNode
- * @return JsonRpcResponse String
- */
- public static String getEchoRequestStr(JsonNode jsonNode) {
- ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper();
- String str = null;
- if (jsonNode.get("method").asText().equals("echo")) {
- JsonRpcResponse response = new JsonRpcResponse(jsonNode.get("id").asText());
- try {
- str = objectMapper.writeValueAsString(response);
- } catch (JsonProcessingException e) {
- log.error("JsonProcessingException while converting JsonNode into string: ", e);
- }
- }
- return str;
- }
-
- /**
- * Convert the List of Operation result into List of OperationResult .
- * @param input the List of JsonNode
- * @param operations the List of Operation
- * @return the List of OperationResult
- */
- public static List<OperationResult> jsonNodeToOperationResult(List<JsonNode> input,
- List<Operation> operations) {
- ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper(false);
- List<OperationResult> operationResults = new ArrayList<OperationResult>();
- for (int i = 0; i < input.size(); i++) {
- JsonNode jsonNode = input.get(i);
- Operation operation = operations.get(i);
- if (jsonNode != null && jsonNode.size() > 0) {
- if (i >= operations.size() || operation.getOp() != "select") {
- OperationResult or = objectMapper.convertValue(jsonNode, OperationResult.class);
- operationResults.add(or);
- } else {
- List<Row> rows = createRows(operation.getTableSchema(), jsonNode);
- OperationResult or = new OperationResult(rows);
- operationResults.add(or);
- }
- }
- }
- return operationResults;
- }
-
- /**
- * Convert Operation JsonNode into Rows.
- * @param tableSchema TableSchema entity
- * @param rowsNode JsonNode
- * @return ArrayList<Row> the List of Row
- */
- private static ArrayList<Row> createRows(TableSchema tableSchema, JsonNode rowsNode) {
- validateJsonNode(rowsNode, "rows");
- ArrayList<Row> rows = Lists.newArrayList();
- for (JsonNode rowNode : rowsNode.get("rows")) {
- rows.add(createRow(tableSchema, rowNode));
- }
- return rows;
- }
-
- /**
- * convert the params of Update Notification into TableUpdates.
- * @param updatesJson the params of Update Notification
- * @param dbSchema DatabaseSchema entity
- * @return TableUpdates
- */
- public static TableUpdates jsonNodeToTableUpdates(JsonNode updatesJson, DatabaseSchema dbSchema) {
- Map<String, TableUpdate> tableUpdateMap = Maps.newHashMap();
- Iterator<Map.Entry<String, JsonNode>> tableUpdatesItr = updatesJson.fields();
- while (tableUpdatesItr.hasNext()) {
- Map.Entry<String, JsonNode> entry = tableUpdatesItr.next();
- TableSchema tableSchema = dbSchema.getTableSchema(entry.getKey());
- TableUpdate tableUpdate = jsonNodeToTableUpdate(tableSchema, entry.getValue());
- tableUpdateMap.put(entry.getKey(), tableUpdate);
- }
- return TableUpdates.tableUpdates(tableUpdateMap);
- }
-
- /**
- * convert the params of Update Notification into TableUpdate.
- * @param tableSchema TableSchema entity
- * @param updateJson the table-update in params of Update Notification
- * @return TableUpdate
- */
- public static TableUpdate jsonNodeToTableUpdate(TableSchema tableSchema, JsonNode updateJson) {
- Map<UUID, RowUpdate> rows = Maps.newHashMap();
- Iterator<Map.Entry<String, JsonNode>> tableUpdateItr = updateJson.fields();
- while (tableUpdateItr.hasNext()) {
- Map.Entry<String, JsonNode> oldNewRow = tableUpdateItr.next();
- String uuidStr = oldNewRow.getKey();
- UUID uuid = UUID.uuid(uuidStr);
- JsonNode newR = oldNewRow.getValue().get("new");
- JsonNode oldR = oldNewRow.getValue().get("old");
- Row newRow = newR != null ? createRow(tableSchema, newR) : null;
- Row oldRow = oldR != null ? createRow(tableSchema, oldR) : null;
- RowUpdate rowUpdate = new RowUpdate(uuid, oldRow, newRow);
- rows.put(uuid, rowUpdate);
- }
- return TableUpdate.tableUpdate(rows);
- }
-
- /**
- * Convert Operation JsonNode into Row.
- * @param tableSchema TableSchema entity
- * @param rowNode JsonNode
- * @return Row
- */
- private static Row createRow(TableSchema tableSchema, JsonNode rowNode) {
- if (tableSchema == null) {
- return null;
- }
- Map<String, Column> columns = Maps.newHashMap();
- Iterator<Map.Entry<String, JsonNode>> rowIter = rowNode.fields();
- while (rowIter.hasNext()) {
- Map.Entry<String, JsonNode> next = rowIter.next();
- ColumnSchema columnSchema = tableSchema.getColumnSchema(next.getKey());
- if (columnSchema != null) {
- String columnName = columnSchema.name();
- Object obj = TransValueUtil.getValueFromJson(next.getValue(), columnSchema.type());
- columns.put(columnName, new Column(columnName, obj));
- }
- }
- return new Row(tableSchema.name(), columns);
- }
-
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.utils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.onosproject.ovsdb.rfc.error.AbnormalJsonNodeException;
+import org.onosproject.ovsdb.rfc.error.UnsupportedException;
+import org.onosproject.ovsdb.rfc.jsonrpc.Callback;
+import org.onosproject.ovsdb.rfc.jsonrpc.JsonRpcResponse;
+import org.onosproject.ovsdb.rfc.message.OperationResult;
+import org.onosproject.ovsdb.rfc.message.RowUpdate;
+import org.onosproject.ovsdb.rfc.message.TableUpdate;
+import org.onosproject.ovsdb.rfc.message.TableUpdates;
+import org.onosproject.ovsdb.rfc.message.UpdateNotification;
+import org.onosproject.ovsdb.rfc.notation.Column;
+import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.notation.UUID;
+import org.onosproject.ovsdb.rfc.operations.Operation;
+import org.onosproject.ovsdb.rfc.schema.ColumnSchema;
+import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+import org.onosproject.ovsdb.rfc.schema.type.ColumnTypeFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+/**
+ * JsonNode utility class. convert JsonNode into Object.
+ */
+public final class FromJsonUtil {
+
+ private static final Logger log = LoggerFactory.getLogger(FromJsonUtil.class);
+
+ /**
+ * Constructs a FromJsonUtil object. Utility classes should not have a
+ * public or default constructor, otherwise IDE will compile unsuccessfully.
+ * This class should not be instantiated.
+ */
+ private FromJsonUtil() {
+ }
+
+ /**
+ * Verify whether the jsonNode is normal.
+ * @param jsonNode JsonNode
+ * @param nodeStr the node name of JsonNode
+ */
+ private static void validateJsonNode(JsonNode jsonNode, String nodeStr) {
+ if (!jsonNode.isObject() || !jsonNode.has(nodeStr)) {
+ String message = "Abnormal DatabaseSchema JsonNode, it should contain " + nodeStr
+ + " node but was not found";
+ throw new AbnormalJsonNodeException(message);
+ }
+ }
+
+ /**
+ * convert JsonNode into DatabaseSchema.
+ * @param dbName database name
+ * @param dbJson the JsonNode of get_schema result
+ * @return DatabaseSchema
+ * @throws AbnormalJsonNodeException this is an abnormal JsonNode exception
+ */
+ public static DatabaseSchema jsonNodeToDbSchema(String dbName, JsonNode dbJson) {
+ validateJsonNode(dbJson, "tables");
+ validateJsonNode(dbJson, "version");
+ String dbVersion = dbJson.get("version").asText();
+ Map<String, TableSchema> tables = new HashMap<>();
+ Iterator<Map.Entry<String, JsonNode>> tablesIter = dbJson.get("tables").fields();
+ while (tablesIter.hasNext()) {
+ Map.Entry<String, JsonNode> table = tablesIter.next();
+ tables.put(table.getKey(), jsonNodeToTableSchema(table.getKey(), table.getValue()));
+ }
+ return new DatabaseSchema(dbName, dbVersion, tables);
+ }
+
+ /**
+ * convert JsonNode into TableSchema.
+ * @param tableName table name
+ * @param tableJson table JsonNode
+ * @return TableSchema
+ * @throws AbnormalJsonNodeException this is an abnormal JsonNode exception
+ */
+ private static TableSchema jsonNodeToTableSchema(String tableName, JsonNode tableJson) {
+ validateJsonNode(tableJson, "columns");
+ Map<String, ColumnSchema> columns = new HashMap<>();
+ Iterator<Map.Entry<String, JsonNode>> columnsIter = tableJson.get("columns").fields();
+ while (columnsIter.hasNext()) {
+ Map.Entry<String, JsonNode> column = columnsIter.next();
+ columns.put(column.getKey(), jsonNodeToColumnSchema(column.getKey(), column.getValue()));
+ }
+ return new TableSchema(tableName, columns);
+ }
+
+ /**
+ * convert JsonNode into ColumnSchema.
+ * @param name column name
+ * @param columnJson column JsonNode
+ * @return ColumnSchema
+ * @throws AbnormalJsonNodeException this is an abnormal JsonNode exception
+ */
+ private static ColumnSchema jsonNodeToColumnSchema(String name, JsonNode columnJson) {
+ validateJsonNode(columnJson, "type");
+ return new ColumnSchema(name, ColumnTypeFactory.getColumnTypeFromJson(columnJson
+ .get("type")));
+ }
+
+ /**
+ * convert JsonNode into the returnType of methods in OvsdbRPC class.
+ * @param resultJsonNode the result JsonNode
+ * @param methodName the method name of methods in OvsdbRPC class
+ * @param objectMapper ObjectMapper entity
+ * @return Object
+ * @throws UnsupportedException this is an unsupported exception
+ */
+ private static Object convertResultType(JsonNode resultJsonNode, String methodName,
+ ObjectMapper objectMapper) {
+ switch (methodName) {
+ case "getSchema":
+ case "monitor":
+ return resultJsonNode;
+ case "echo":
+ case "listDbs":
+ return objectMapper.convertValue(resultJsonNode, objectMapper.getTypeFactory()
+ .constructParametricType(List.class, String.class));
+ case "transact":
+ return objectMapper.convertValue(resultJsonNode, objectMapper.getTypeFactory()
+ .constructParametricType(List.class, JsonNode.class));
+ default:
+ throw new UnsupportedException("does not support this rpc method" + methodName);
+ }
+ }
+
+ /**
+ * convert JsonNode into the returnType of methods in OvsdbRPC class.
+ * @param jsonNode the result JsonNode
+ * @param methodName the method name of methods in OvsdbRPC class
+ * @return Object
+ */
+ public static Object jsonResultParser(JsonNode jsonNode, String methodName) {
+ ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper();
+ JsonNode error = jsonNode.get("error");
+ if (error != null && !error.isNull()) {
+ log.error("jsonRpcResponse error : {}", error.toString());
+ }
+ JsonNode resultJsonNode = jsonNode.get("result");
+ Object result = convertResultType(resultJsonNode, methodName, objectMapper);
+ return result;
+ }
+
+ /**
+ * When monitor the ovsdb tables, if a table update, ovs send update
+ * notification, then call callback function.
+ * @param jsonNode the result JsonNode
+ * @param callback the callback function
+ * @throws UnsupportedException this is an unsupported exception
+ */
+ public static void jsonCallbackRequestParser(JsonNode jsonNode, Callback callback) {
+ ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper();
+ JsonNode params = jsonNode.get("params");
+ Object param = null;
+ String methodName = jsonNode.get("method").asText();
+ switch (methodName) {
+ case "update":
+ param = objectMapper.convertValue(params, UpdateNotification.class);
+ callback.update((UpdateNotification) param);
+ break;
+ default:
+ throw new UnsupportedException("does not support this callback method: " + methodName);
+ }
+ }
+
+ /**
+ * Ovs send echo request to keep the heart, need we return echo result.
+ * @param jsonNode the result JsonNode
+ * @return JsonRpcResponse String
+ */
+ public static String getEchoRequestStr(JsonNode jsonNode) {
+ ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper();
+ String str = null;
+ if (jsonNode.get("method").asText().equals("echo")) {
+ JsonRpcResponse response = new JsonRpcResponse(jsonNode.get("id").asText());
+ try {
+ str = objectMapper.writeValueAsString(response);
+ } catch (JsonProcessingException e) {
+ log.error("JsonProcessingException while converting JsonNode into string: ", e);
+ }
+ }
+ return str;
+ }
+
+ /**
+ * Convert the List of Operation result into List of OperationResult .
+ * @param input the List of JsonNode
+ * @param operations the List of Operation
+ * @return the List of OperationResult
+ */
+ public static List<OperationResult> jsonNodeToOperationResult(List<JsonNode> input,
+ List<Operation> operations) {
+ ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper(false);
+ List<OperationResult> operationResults = new ArrayList<OperationResult>();
+ for (int i = 0; i < input.size(); i++) {
+ JsonNode jsonNode = input.get(i);
+ Operation operation = operations.get(i);
+ if (jsonNode != null && jsonNode.size() > 0) {
+ if (i >= operations.size() || operation.getOp() != "select") {
+ OperationResult or = objectMapper.convertValue(jsonNode, OperationResult.class);
+ operationResults.add(or);
+ } else {
+ List<Row> rows = createRows(operation.getTableSchema(), jsonNode);
+ OperationResult or = new OperationResult(rows);
+ operationResults.add(or);
+ }
+ }
+ }
+ return operationResults;
+ }
+
+ /**
+ * Convert Operation JsonNode into Rows.
+ * @param tableSchema TableSchema entity
+ * @param rowsNode JsonNode
+ * @return ArrayList<Row> the List of Row
+ */
+ private static ArrayList<Row> createRows(TableSchema tableSchema, JsonNode rowsNode) {
+ validateJsonNode(rowsNode, "rows");
+ ArrayList<Row> rows = Lists.newArrayList();
+ for (JsonNode rowNode : rowsNode.get("rows")) {
+ rows.add(createRow(tableSchema, rowNode));
+ }
+ return rows;
+ }
+
+ /**
+ * convert the params of Update Notification into TableUpdates.
+ * @param updatesJson the params of Update Notification
+ * @param dbSchema DatabaseSchema entity
+ * @return TableUpdates
+ */
+ public static TableUpdates jsonNodeToTableUpdates(JsonNode updatesJson, DatabaseSchema dbSchema) {
+ Map<String, TableUpdate> tableUpdateMap = Maps.newHashMap();
+ Iterator<Map.Entry<String, JsonNode>> tableUpdatesItr = updatesJson.fields();
+ while (tableUpdatesItr.hasNext()) {
+ Map.Entry<String, JsonNode> entry = tableUpdatesItr.next();
+ TableSchema tableSchema = dbSchema.getTableSchema(entry.getKey());
+ TableUpdate tableUpdate = jsonNodeToTableUpdate(tableSchema, entry.getValue());
+ tableUpdateMap.put(entry.getKey(), tableUpdate);
+ }
+ return TableUpdates.tableUpdates(tableUpdateMap);
+ }
+
+ /**
+ * convert the params of Update Notification into TableUpdate.
+ * @param tableSchema TableSchema entity
+ * @param updateJson the table-update in params of Update Notification
+ * @return TableUpdate
+ */
+ public static TableUpdate jsonNodeToTableUpdate(TableSchema tableSchema, JsonNode updateJson) {
+ Map<UUID, RowUpdate> rows = Maps.newHashMap();
+ Iterator<Map.Entry<String, JsonNode>> tableUpdateItr = updateJson.fields();
+ while (tableUpdateItr.hasNext()) {
+ Map.Entry<String, JsonNode> oldNewRow = tableUpdateItr.next();
+ String uuidStr = oldNewRow.getKey();
+ UUID uuid = UUID.uuid(uuidStr);
+ JsonNode newR = oldNewRow.getValue().get("new");
+ JsonNode oldR = oldNewRow.getValue().get("old");
+ Row newRow = newR != null ? createRow(tableSchema, newR) : null;
+ Row oldRow = oldR != null ? createRow(tableSchema, oldR) : null;
+ RowUpdate rowUpdate = new RowUpdate(uuid, oldRow, newRow);
+ rows.put(uuid, rowUpdate);
+ }
+ return TableUpdate.tableUpdate(rows);
+ }
+
+ /**
+ * Convert Operation JsonNode into Row.
+ * @param tableSchema TableSchema entity
+ * @param rowNode JsonNode
+ * @return Row
+ */
+ private static Row createRow(TableSchema tableSchema, JsonNode rowNode) {
+ if (tableSchema == null) {
+ return null;
+ }
+ Map<String, Column> columns = Maps.newHashMap();
+ Iterator<Map.Entry<String, JsonNode>> rowIter = rowNode.fields();
+ while (rowIter.hasNext()) {
+ Map.Entry<String, JsonNode> next = rowIter.next();
+ ColumnSchema columnSchema = tableSchema.getColumnSchema(next.getKey());
+ if (columnSchema != null) {
+ String columnName = columnSchema.name();
+ Object obj = TransValueUtil.getValueFromJson(next.getValue(), columnSchema.type());
+ columns.put(columnName, new Column(columnName, obj));
+ }
+ }
+ return new Row(tableSchema.name(), columns);
+ }
+
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/JsonRpcReaderUtil.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/JsonRpcReaderUtil.java
index 8436fde..924b73a 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/JsonRpcReaderUtil.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/JsonRpcReaderUtil.java
@@ -1,165 +1,165 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.utils;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufInputStream;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Stack;
-
-import org.onosproject.ovsdb.rfc.error.UnsupportedException;
-import org.onosproject.ovsdb.rfc.jsonrpc.JsonReadContext;
-
-import com.fasterxml.jackson.core.JsonEncoding;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.io.IOContext;
-import com.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper;
-import com.fasterxml.jackson.core.util.BufferRecycler;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.MappingJsonFactory;
-
-/**
- * Decoder utility class.
- */
-public final class JsonRpcReaderUtil {
-
- /**
- * Constructs a JsonRpcReaderUtil object. Utility classes should not have a
- * public or default constructor, otherwise IDE will compile unsuccessfully.
- * This class should not be instantiated.
- */
- private JsonRpcReaderUtil() {
- }
-
- /**
- * Decode the bytes to Json object.
- * @param in input of bytes
- * @param out ouput of Json object list
- * @param jrContext context for the last decoding process
- * @throws IOException IOException
- * @throws JsonParseException JsonParseException
- */
- public static void readToJsonNode(ByteBuf in, List<Object> out, JsonReadContext jrContext)
- throws JsonParseException, IOException {
- int lastReadBytes = jrContext.getLastReadBytes();
- if (lastReadBytes == 0) {
- if (in.readableBytes() < 4) {
- return;
- }
- checkEncoding(in);
- }
-
- int i = lastReadBytes + in.readerIndex();
- Stack<Byte> bufStack = jrContext.getBufStack();
- for (; i < in.writerIndex(); i++) {
- byte b = in.getByte(i);
- switch (b) {
- case '{':
- if (!isDoubleQuote(bufStack)) {
- bufStack.push(b);
- jrContext.setStartMatch(true);
- }
- break;
- case '}':
- if (!isDoubleQuote(bufStack)) {
- bufStack.pop();
- }
- break;
- case '"':
- if (in.getByte(i - 1) != '\\') {
- if (!bufStack.isEmpty() && bufStack.peek() != '"') {
- bufStack.push(b);
- } else {
- bufStack.pop();
- }
- }
- break;
- default:
- break;
- }
-
- if (jrContext.isStartMatch() && bufStack.isEmpty()) {
- ByteBuf buf = in.readSlice(i - in.readerIndex() + 1);
- JsonParser jf = new MappingJsonFactory().createParser(new ByteBufInputStream(buf));
- JsonNode jsonNode = jf.readValueAsTree();
- out.add(jsonNode);
- lastReadBytes = 0;
- jrContext.setLastReadBytes(lastReadBytes);
- break;
- }
- }
-
- if (i >= in.writerIndex()) {
- lastReadBytes = in.readableBytes();
- jrContext.setLastReadBytes(lastReadBytes);
- }
- }
-
- /**
- * Filter the invalid characters before decoding.
- * @param in input of bytes
- * @param lastReadBytes the bytes for last decoding incomplete record
- */
- private static void fliterCharaters(ByteBuf in) {
- while (in.isReadable()) {
- int ch = in.getByte(in.readerIndex());
- if ((ch != ' ') && (ch != '\n') && (ch != '\t') && (ch != '\r')) {
- break;
- } else {
- in.readByte();
- }
- }
- }
-
- /**
- * Check whether the peek of the stack element is double quote.
- * @param jrContext context for the last decoding process
- * @return boolean
- */
- private static boolean isDoubleQuote(Stack<Byte> bufStack) {
- if (!bufStack.isEmpty() && bufStack.peek() == '"') {
- return true;
- }
- return false;
- }
-
- /**
- * Check whether the encoding is valid.
- * @param in input of bytes
- * @throws IOException this is an IO exception
- * @throws UnsupportedException this is an unsupported exception
- */
- private static void checkEncoding(ByteBuf in) throws IOException {
- int inputStart = 0;
- int inputLength = 4;
- fliterCharaters(in);
- byte[] buff = new byte[4];
- in.getBytes(in.readerIndex(), buff);
- ByteSourceJsonBootstrapper strapper = new ByteSourceJsonBootstrapper(new IOContext(new BufferRecycler(),
- null,
- false),
- buff, inputStart,
- inputLength);
- JsonEncoding jsonEncoding = strapper.detectEncoding();
- if (!JsonEncoding.UTF8.equals(jsonEncoding)) {
- throw new UnsupportedException("Only UTF-8 encoding is supported.");
- }
- }
-
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.utils;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufInputStream;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Stack;
+
+import org.onosproject.ovsdb.rfc.error.UnsupportedException;
+import org.onosproject.ovsdb.rfc.jsonrpc.JsonReadContext;
+
+import com.fasterxml.jackson.core.JsonEncoding;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.io.IOContext;
+import com.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper;
+import com.fasterxml.jackson.core.util.BufferRecycler;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.MappingJsonFactory;
+
+/**
+ * Decoder utility class.
+ */
+public final class JsonRpcReaderUtil {
+
+ /**
+ * Constructs a JsonRpcReaderUtil object. Utility classes should not have a
+ * public or default constructor, otherwise IDE will compile unsuccessfully.
+ * This class should not be instantiated.
+ */
+ private JsonRpcReaderUtil() {
+ }
+
+ /**
+ * Decode the bytes to Json object.
+ * @param in input of bytes
+ * @param out ouput of Json object list
+ * @param jrContext context for the last decoding process
+ * @throws IOException IOException
+ * @throws JsonParseException JsonParseException
+ */
+ public static void readToJsonNode(ByteBuf in, List<Object> out, JsonReadContext jrContext)
+ throws JsonParseException, IOException {
+ int lastReadBytes = jrContext.getLastReadBytes();
+ if (lastReadBytes == 0) {
+ if (in.readableBytes() < 4) {
+ return;
+ }
+ checkEncoding(in);
+ }
+
+ int i = lastReadBytes + in.readerIndex();
+ Stack<Byte> bufStack = jrContext.getBufStack();
+ for (; i < in.writerIndex(); i++) {
+ byte b = in.getByte(i);
+ switch (b) {
+ case '{':
+ if (!isDoubleQuote(bufStack)) {
+ bufStack.push(b);
+ jrContext.setStartMatch(true);
+ }
+ break;
+ case '}':
+ if (!isDoubleQuote(bufStack)) {
+ bufStack.pop();
+ }
+ break;
+ case '"':
+ if (in.getByte(i - 1) != '\\') {
+ if (!bufStack.isEmpty() && bufStack.peek() != '"') {
+ bufStack.push(b);
+ } else {
+ bufStack.pop();
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (jrContext.isStartMatch() && bufStack.isEmpty()) {
+ ByteBuf buf = in.readSlice(i - in.readerIndex() + 1);
+ JsonParser jf = new MappingJsonFactory().createParser(new ByteBufInputStream(buf));
+ JsonNode jsonNode = jf.readValueAsTree();
+ out.add(jsonNode);
+ lastReadBytes = 0;
+ jrContext.setLastReadBytes(lastReadBytes);
+ break;
+ }
+ }
+
+ if (i >= in.writerIndex()) {
+ lastReadBytes = in.readableBytes();
+ jrContext.setLastReadBytes(lastReadBytes);
+ }
+ }
+
+ /**
+ * Filter the invalid characters before decoding.
+ * @param in input of bytes
+ * @param lastReadBytes the bytes for last decoding incomplete record
+ */
+ private static void fliterCharaters(ByteBuf in) {
+ while (in.isReadable()) {
+ int ch = in.getByte(in.readerIndex());
+ if ((ch != ' ') && (ch != '\n') && (ch != '\t') && (ch != '\r')) {
+ break;
+ } else {
+ in.readByte();
+ }
+ }
+ }
+
+ /**
+ * Check whether the peek of the stack element is double quote.
+ * @param jrContext context for the last decoding process
+ * @return boolean
+ */
+ private static boolean isDoubleQuote(Stack<Byte> bufStack) {
+ if (!bufStack.isEmpty() && bufStack.peek() == '"') {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Check whether the encoding is valid.
+ * @param in input of bytes
+ * @throws IOException this is an IO exception
+ * @throws UnsupportedException this is an unsupported exception
+ */
+ private static void checkEncoding(ByteBuf in) throws IOException {
+ int inputStart = 0;
+ int inputLength = 4;
+ fliterCharaters(in);
+ byte[] buff = new byte[4];
+ in.getBytes(in.readerIndex(), buff);
+ ByteSourceJsonBootstrapper strapper = new ByteSourceJsonBootstrapper(new IOContext(new BufferRecycler(),
+ null,
+ false),
+ buff, inputStart,
+ inputLength);
+ JsonEncoding jsonEncoding = strapper.detectEncoding();
+ if (!JsonEncoding.UTF8.equals(jsonEncoding)) {
+ throw new UnsupportedException("Only UTF-8 encoding is supported.");
+ }
+ }
+
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/MutationUtil.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/MutationUtil.java
index 5ab2b7a..00e7dbe 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/MutationUtil.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/MutationUtil.java
@@ -1,92 +1,92 @@
-package org.onosproject.ovsdb.rfc.utils;
-
-import org.onosproject.ovsdb.rfc.notation.Mutation;
-import org.onosproject.ovsdb.rfc.notation.Mutation.Mutator;
-
-public final class MutationUtil {
-
- /**
- * Constructs a MutationUtil object. Utility classes should not have a
- * public or default constructor, otherwise IDE will compile unsuccessfully. This
- * class should not be instantiated.
- */
- private MutationUtil() {
- }
-
- /**
- * Returns a Mutation that means += .
- * @param columnName column name
- * @param data column value
- * @return Mutation
- */
- public static Mutation sum(String columnName, Object data) {
- Object value = TransValueUtil.getFormatData(data);
- return new Mutation(columnName, Mutator.SUM, value);
- }
-
- /**
- * Returns a Mutation that means -= .
- * @param columnName column name
- * @param data column value
- * @return Mutation
- */
- public static Mutation difference(String columnName, Object data) {
- Object value = TransValueUtil.getFormatData(data);
- return new Mutation(columnName, Mutator.DIFFERENCE, value);
- }
-
- /**
- * Returns a Mutation that means *= .
- * @param columnName column name
- * @param data column value
- * @return Mutation
- */
- public static Mutation product(String columnName, Object data) {
- Object value = TransValueUtil.getFormatData(data);
- return new Mutation(columnName, Mutator.PRODUCT, value);
- }
-
- /**
- * Returns a Mutation that means /= .
- * @param columnName column name
- * @param data column value
- * @return Mutation
- */
- public static Mutation quotient(String columnName, Object data) {
- Object value = TransValueUtil.getFormatData(data);
- return new Mutation(columnName, Mutator.QUOTIENT, value);
- }
-
- /**
- * Returns a Mutation that means %= .
- * @param columnName column name
- * @param data column value
- * @return Mutation
- */
- public static Mutation remainder(String columnName, Object data) {
- Object value = TransValueUtil.getFormatData(data);
- return new Mutation(columnName, Mutator.REMAINDER, value);
- }
-
- /**
- * Returns a Mutation that means insert .
- * @param columnName column name
- * @param data column value
- * @return Mutation
- */
- public static Mutation insert(String columnName, Object data) {
- Object value = TransValueUtil.getFormatData(data);
- return new Mutation(columnName, Mutator.INSERT, value);
- }
-
- /**
- * Returns a Mutation that means delete .
- * @param columnName column name
- * @param data column value
- * @return Mutation
- */
- public static Mutation delete(String columnName, Object data) {
- Object value = TransValueUtil.getFormatData(data);
- return new Mutation(columnName, Mutator.DELETE, value);
- }
-}
+package org.onosproject.ovsdb.rfc.utils;
+
+import org.onosproject.ovsdb.rfc.notation.Mutation;
+import org.onosproject.ovsdb.rfc.notation.Mutation.Mutator;
+
+public final class MutationUtil {
+
+ /**
+ * Constructs a MutationUtil object. Utility classes should not have a
+ * public or default constructor, otherwise IDE will compile unsuccessfully. This
+ * class should not be instantiated.
+ */
+ private MutationUtil() {
+ }
+
+ /**
+ * Returns a Mutation that means += .
+ * @param columnName column name
+ * @param data column value
+ * @return Mutation
+ */
+ public static Mutation sum(String columnName, Object data) {
+ Object value = TransValueUtil.getFormatData(data);
+ return new Mutation(columnName, Mutator.SUM, value);
+ }
+
+ /**
+ * Returns a Mutation that means -= .
+ * @param columnName column name
+ * @param data column value
+ * @return Mutation
+ */
+ public static Mutation difference(String columnName, Object data) {
+ Object value = TransValueUtil.getFormatData(data);
+ return new Mutation(columnName, Mutator.DIFFERENCE, value);
+ }
+
+ /**
+ * Returns a Mutation that means *= .
+ * @param columnName column name
+ * @param data column value
+ * @return Mutation
+ */
+ public static Mutation product(String columnName, Object data) {
+ Object value = TransValueUtil.getFormatData(data);
+ return new Mutation(columnName, Mutator.PRODUCT, value);
+ }
+
+ /**
+ * Returns a Mutation that means /= .
+ * @param columnName column name
+ * @param data column value
+ * @return Mutation
+ */
+ public static Mutation quotient(String columnName, Object data) {
+ Object value = TransValueUtil.getFormatData(data);
+ return new Mutation(columnName, Mutator.QUOTIENT, value);
+ }
+
+ /**
+ * Returns a Mutation that means %= .
+ * @param columnName column name
+ * @param data column value
+ * @return Mutation
+ */
+ public static Mutation remainder(String columnName, Object data) {
+ Object value = TransValueUtil.getFormatData(data);
+ return new Mutation(columnName, Mutator.REMAINDER, value);
+ }
+
+ /**
+ * Returns a Mutation that means insert .
+ * @param columnName column name
+ * @param data column value
+ * @return Mutation
+ */
+ public static Mutation insert(String columnName, Object data) {
+ Object value = TransValueUtil.getFormatData(data);
+ return new Mutation(columnName, Mutator.INSERT, value);
+ }
+
+ /**
+ * Returns a Mutation that means delete .
+ * @param columnName column name
+ * @param data column value
+ * @return Mutation
+ */
+ public static Mutation delete(String columnName, Object data) {
+ Object value = TransValueUtil.getFormatData(data);
+ return new Mutation(columnName, Mutator.DELETE, value);
+ }
+}
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/ParamUtil.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/ParamUtil.java
index fd62581..486b39b 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/ParamUtil.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/ParamUtil.java
@@ -1,86 +1,86 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.ovsdb.rfc.utils;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.onosproject.ovsdb.rfc.message.MonitorRequest;
-import org.onosproject.ovsdb.rfc.message.MonitorSelect;
-import org.onosproject.ovsdb.rfc.operations.Operation;
-import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
-import org.onosproject.ovsdb.rfc.schema.TableSchema;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-/**
- * Params utility class. Params of the request object, refer to RFC7047's
- * Section 4.1.
- */
-public final class ParamUtil {
-
- /**
- * Constructs a ParamUtil object. Utility classes should not have a public
- * or default constructor, otherwise IDE will compile unsuccessfully. This
- * class should not be instantiated.
- */
- private ParamUtil() {
- }
-
- /**
- * Returns MonitorRequest, refer to RFC7047's Section 4.1.5.
- * @param tableSchema entity
- * @return MonitorRequest
- */
- private static MonitorRequest getAllColumnsMonitorRequest(TableSchema tableSchema) {
- String tableName = tableSchema.name();
- Set<String> columns = tableSchema.getColumnNames();
- MonitorSelect select = new MonitorSelect(true, true, true, true);
- MonitorRequest monitorRequest = new MonitorRequest(tableName, columns, select);
- return monitorRequest;
- }
-
- /**
- * Returns params of monitor method, refer to RFC7047's Section 4.1.5.
- * @param monotorId json-value, refer to RFC7047's Section 4.1.5.
- * @param dbSchema DatabaseSchema entity
- * @return List of Object, the params of monitor request
- */
- public static List<Object> getMonitorParams(String monotorId, DatabaseSchema dbSchema) {
- Set<String> tables = dbSchema.getTableNames();
- Map<String, MonitorRequest> mrMap = Maps.newHashMap();
- for (String tableName : tables) {
- TableSchema tableSchema = dbSchema.getTableSchema(tableName);
- MonitorRequest monitorRequest = getAllColumnsMonitorRequest(tableSchema);
- mrMap.put(tableName, monitorRequest);
- }
- return Lists.newArrayList(dbSchema.name(), monotorId, mrMap);
- }
-
- /**
- * Returns params of transact method, refer to RFC7047's Section 4.1.3.
- * @param dbSchema DatabaseSchema entity
- * @param operations operation*, refer to RFC7047's Section 4.1.3.
- * @return List of Object, the params of transact request
- */
- public static List<Object> getTransactParams(DatabaseSchema dbSchema, List<Operation> operations) {
- List<Object> lists = Lists.newArrayList(dbSchema.name());
- lists.addAll(operations);
- return lists;
- }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ovsdb.rfc.utils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.onosproject.ovsdb.rfc.message.MonitorRequest;
+import org.onosproject.ovsdb.rfc.message.MonitorSelect;
+import org.onosproject.ovsdb.rfc.operations.Operation;
+import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
+import org.onosproject.ovsdb.rfc.schema.TableSchema;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+/**
+ * Params utility class. Params of the request object, refer to RFC7047's
+ * Section 4.1.
+ */
+public final class ParamUtil {
+
+ /**
+ * Constructs a ParamUtil object. Utility classes should not have a public
+ * or default constructor, otherwise IDE will compile unsuccessfully. This
+ * class should not be instantiated.
+ */
+ private ParamUtil() {
+ }
+
+ /**
+ * Returns MonitorRequest, refer to RFC7047's Section 4.1.5.
+ * @param tableSchema entity
+ * @return MonitorRequest
+ */
+ private static MonitorRequest getAllColumnsMonitorRequest(TableSchema tableSchema) {
+ String tableName = tableSchema.name();
+ Set<String> columns = tableSchema.getColumnNames();
+ MonitorSelect select = new MonitorSelect(true, true, true, true);
+ MonitorRequest monitorRequest = new MonitorRequest(tableName, columns, select);
+ return monitorRequest;
+ }
+
+ /**
+ * Returns params of monitor method, refer to RFC7047's Section 4.1.5.
+ * @param monotorId json-value, refer to RFC7047's Section 4.1.5.
+ * @param dbSchema DatabaseSchema entity
+ * @return List of Object, the params of monitor request
+ */
+ public static List<Object> getMonitorParams(String monotorId, DatabaseSchema dbSchema) {
+ Set<String> tables = dbSchema.getTableNames();
+ Map<String, MonitorRequest> mrMap = Maps.newHashMap();
+ for (String tableName : tables) {
+ TableSchema tableSchema = dbSchema.getTableSchema(tableName);
+ MonitorRequest monitorRequest = getAllColumnsMonitorRequest(tableSchema);
+ mrMap.put(tableName, monitorRequest);
+ }
+ return Lists.newArrayList(dbSchema.name(), monotorId, mrMap);
+ }
+
+ /**
+ * Returns params of transact method, refer to RFC7047's Section 4.1.3.
+ * @param dbSchema DatabaseSchema entity
+ * @param operations operation*, refer to RFC7047's Section 4.1.3.
+ * @return List of Object, the params of transact request
+ */
+ public static List<Object> getTransactParams(DatabaseSchema dbSchema, List<Operation> operations) {
+ List<Object> lists = Lists.newArrayList(dbSchema.name());
+ lists.addAll(operations);
+ return lists;
+ }
+}