Add helper methods to meta/*Schema classes
[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 import java.util.Set;
13
14 /**
15  * @author araveendrann
16  */
17 public class TableSchema<E extends TableSchema<E>> {
18     protected static final Logger logger = LoggerFactory.getLogger(TableSchema.class);
19     private String name;
20     private Map<String, ColumnSchema> columns;
21
22     public TableSchema() {
23     }
24
25     public TableSchema(String name, Map<String, ColumnSchema> columns) {
26         this.name = name;
27         this.columns = columns;
28     }
29
30     public Set<String> getColumns() { return this.columns.keySet(); }
31
32     public boolean hasColumn(String column) { return this.getColumns().contains(column); }
33
34     public ColumnSchema getColumn(String column) { return this.columns.get(column); }
35
36     public ColumnType getColumnType(String column) { return this.columns.get(column).getType(); }
37
38     public static TableSchema fromJson(String tableName, JsonNode json) {
39
40         if (!json.isObject() || !json.has("columns")) {
41             //todo specific types of exception
42             throw new RuntimeException("bad tableschema root, expected \"columns\" as child");
43         }
44
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()));
50         }
51
52        TableSchema tableSchema = new TableSchema(tableName, columns);
53        return tableSchema;
54     }
55
56     public <E extends TableSchema<E>> E as(Class<E> clazz) {
57         try {
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);
62         }
63     }
64
65     public Insert<E> insert() {
66         return new Insert<>(this);
67     }
68
69
70
71     public <D> ColumnSchema<E, D> column(String column) {
72         //todo exception handling
73         return columns.get(column);
74     }
75
76     public String getName() {
77         return name;
78     }
79
80     public void setName(String name) {
81         this.name = name;
82     }
83
84     public static class AnyTableSchema extends TableSchema<AnyTableSchema>{}
85 }