2547ac0b765c70a0390f0add42486ba16a056552
[ovsdb.git] / ovsdb / src / main / java / org / opendaylight / ovsdb / lib / meta / TableSchema.java
1 package org.opendaylight.ovsdb.lib.meta;
2
3 import com.fasterxml.jackson.databind.JsonNode;
4 import org.opendaylight.ovsdb.Insert;
5 import org.slf4j.Logger;
6 import org.slf4j.LoggerFactory;
7
8 import java.lang.reflect.Constructor;
9 import java.util.HashMap;
10 import java.util.Iterator;
11 import java.util.Map;
12
13 /**
14  * @author araveendrann
15  */
16 public class TableSchema<E extends TableSchema<E>> {
17     protected static final Logger logger = LoggerFactory.getLogger(TableSchema.class);
18     private String name;
19     private Map<String, ColumnSchema> columns;
20
21     public TableSchema() {
22     }
23
24     public TableSchema(String name, Map<String, ColumnSchema> columns) {
25         this.name = name;
26         this.columns = columns;
27     }
28
29     public static TableSchema fromJson(String tableName, JsonNode json) {
30
31         if (!json.isObject() || !json.has("columns")) {
32             //todo specific types of exception
33             throw new RuntimeException("bad tableschema root, expected \"columns\" as child");
34         }
35
36         Map<String, ColumnSchema> columns = new HashMap<>();
37         for (Iterator<Map.Entry<String, JsonNode>> iter = json.get("columns").fields(); iter.hasNext(); ) {
38             Map.Entry<String, JsonNode> column = iter.next();
39             logger.debug("%s:%s", tableName, column.getKey());
40             columns.put(column.getKey(), ColumnSchema.fromJson(column.getKey(), column.getValue()));
41         }
42
43        TableSchema tableSchema = new TableSchema(tableName, columns);
44        return tableSchema;
45     }
46
47     public <E extends TableSchema<E>> E as(Class<E> clazz) {
48         try {
49             Constructor<E> e = clazz.getConstructor(TableSchema.class);
50             return e.newInstance(this);
51         } catch (Exception e) {
52             throw new RuntimeException("exception constructing instance of clazz " + clazz, e);
53         }
54     }
55
56     public Insert<E> insert() {
57         return new Insert<>(this);
58     }
59
60
61
62     public <D> ColumnSchema<E, D> column(String column) {
63         //todo exception handling
64         return columns.get(column);
65     }
66
67     public String getName() {
68         return name;
69     }
70
71     public void setName(String name) {
72         this.name = name;
73     }
74
75     public static class AnyTableSchema extends TableSchema<AnyTableSchema>{}
76 }