1 package org.opendaylight.ovsdb.lib.meta;
3 import com.fasterxml.jackson.databind.JsonNode;
4 import org.opendaylight.ovsdb.Insert;
5 import org.slf4j.Logger;
6 import org.slf4j.LoggerFactory;
8 import java.lang.reflect.Constructor;
9 import java.util.HashMap;
10 import java.util.Iterator;
15 * @author araveendrann
17 public class TableSchema<E extends TableSchema<E>> {
18 protected static final Logger logger = LoggerFactory.getLogger(TableSchema.class);
20 private Map<String, ColumnSchema> columns;
22 public TableSchema() {
25 public TableSchema(String name, Map<String, ColumnSchema> columns) {
27 this.columns = columns;
30 public Set<String> getColumns() { return this.columns.keySet(); }
32 public boolean hasColumn(String column) { return this.getColumns().contains(column); }
34 public ColumnSchema getColumn(String column) { return this.columns.get(column); }
36 public ColumnType getColumnType(String column) { return this.columns.get(column).getType(); }
38 public static TableSchema fromJson(String tableName, JsonNode json) {
40 if (!json.isObject() || !json.has("columns")) {
41 //todo specific types of exception
42 throw new RuntimeException("bad tableschema root, expected \"columns\" as child");
45 Map<String, ColumnSchema> columns = new HashMap<>();
46 for (Iterator<Map.Entry<String, JsonNode>> iter = json.get("columns").fields(); iter.hasNext(); ) {
47 Map.Entry<String, JsonNode> column = iter.next();
48 logger.debug("%s:%s", tableName, column.getKey());
49 columns.put(column.getKey(), ColumnSchema.fromJson(column.getKey(), column.getValue()));
52 TableSchema tableSchema = new TableSchema(tableName, columns);
56 public <E extends TableSchema<E>> E as(Class<E> clazz) {
58 Constructor<E> e = clazz.getConstructor(TableSchema.class);
59 return e.newInstance(this);
60 } catch (Exception e) {
61 throw new RuntimeException("exception constructing instance of clazz " + clazz, e);
65 public Insert<E> insert() {
66 return new Insert<>(this);
71 public <D> ColumnSchema<E, D> column(String column) {
72 //todo exception handling
73 return columns.get(column);
76 public String getName() {
80 public void setName(String name) {
84 public static class AnyTableSchema extends TableSchema<AnyTableSchema>{}