blob: d315c223c4d9eca6f1e2aaede83fd2f430e38362 [file] [log] [blame]
Simon Huntcc035c52017-02-22 21:12:51 -08001/*
2 * Copyright 2017-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Thomas Vachuska04059f92017-03-07 15:16:23 -080017package org.onosproject.yang.gui;
Simon Huntcc035c52017-02-22 21:12:51 -080018
Thomas Vachuskacde197c2017-03-23 17:51:08 -070019import com.fasterxml.jackson.databind.node.ArrayNode;
Simon Huntcc035c52017-02-22 21:12:51 -080020import com.fasterxml.jackson.databind.node.ObjectNode;
21import com.google.common.collect.ImmutableSet;
22import org.onlab.osgi.ServiceDirectory;
23import org.onosproject.ui.RequestHandler;
24import org.onosproject.ui.UiConnection;
25import org.onosproject.ui.UiMessageHandler;
26import org.onosproject.ui.table.TableModel;
27import org.onosproject.ui.table.TableRequestHandler;
Thomas Vachuska04059f92017-03-07 15:16:23 -080028import org.onosproject.yang.model.YangModel;
Thomas Vachuska0cb73f42017-03-22 10:57:34 -070029import org.onosproject.yang.model.YangModuleId;
Thomas Vachuska04059f92017-03-07 15:16:23 -080030import org.onosproject.yang.runtime.YangModelRegistry;
Simon Huntcc035c52017-02-22 21:12:51 -080031import org.slf4j.Logger;
32import org.slf4j.LoggerFactory;
33
34import java.util.Collection;
Thomas Vachuska0cb73f42017-03-22 10:57:34 -070035import java.util.Set;
Simon Huntcc035c52017-02-22 21:12:51 -080036
37/**
Thomas Vachuska04059f92017-03-07 15:16:23 -080038 * ONOS UI YANG Models message handler.
Simon Huntcc035c52017-02-22 21:12:51 -080039 */
40public class YangModelMessageHandler extends UiMessageHandler {
41
42 private static final String TABLE_REQ = "yangModelDataRequest";
43 private static final String TABLE_RESP = "yangModelDataResponse";
Simon Hunt7d5e9842017-02-23 11:37:02 -080044 private static final String MODELS = "yangModels";
Simon Huntcc035c52017-02-22 21:12:51 -080045
46 private static final String DETAILS_REQ = "yangModelDetailsRequest";
47 private static final String DETAILS_RESP = "yangModelDetailsResponse";
48 private static final String DETAILS = "details";
49
50 // Table Column IDs
51 private static final String ID = "id";
Thomas Vachuska0cb73f42017-03-22 10:57:34 -070052 private static final String MODULES = "modules";
Simon Huntcc035c52017-02-22 21:12:51 -080053 // TODO: fill out table columns as needed
54
55 private static final String[] COL_IDS = {
Thomas Vachuska0cb73f42017-03-22 10:57:34 -070056 ID, MODULES
Simon Huntcc035c52017-02-22 21:12:51 -080057 };
58
59 private final Logger log = LoggerFactory.getLogger(getClass());
60
Thomas Vachuska04059f92017-03-07 15:16:23 -080061 private YangModelRegistry modelRegistry;
Simon Huntcc035c52017-02-22 21:12:51 -080062 // TODO: fill out other fields as necessary
63
64
65 // ===============-=-=-=-=-=-==================-=-=-=-=-=-=-===========
66
67 @Override
68 public void init(UiConnection connection, ServiceDirectory directory) {
69 super.init(connection, directory);
Thomas Vachuska04059f92017-03-07 15:16:23 -080070 modelRegistry = directory.get(YangModelRegistry.class);
Simon Huntcc035c52017-02-22 21:12:51 -080071 }
72
73 @Override
74 public void destroy() {
Simon Huntcc035c52017-02-22 21:12:51 -080075 super.destroy();
Simon Huntcc035c52017-02-22 21:12:51 -080076 }
77
78 @Override
79 protected Collection<RequestHandler> createRequestHandlers() {
80 return ImmutableSet.of(
Simon Hunt7d5e9842017-02-23 11:37:02 -080081 new TableDataHandler(),
82 new DetailRequestHandler()
Simon Huntcc035c52017-02-22 21:12:51 -080083 );
84 }
85
Simon Huntcc035c52017-02-22 21:12:51 -080086 // Handler for table requests
87 private final class TableDataHandler extends TableRequestHandler {
88 private static final String NO_ROWS_MESSAGE = "No YANG Models found";
89
90 private TableDataHandler() {
91 super(TABLE_REQ, TABLE_RESP, MODELS);
92 }
93
94 @Override
95 protected String[] getColumnIds() {
96 return COL_IDS;
97 }
98
99 @Override
100 protected String noRowsMessage(ObjectNode payload) {
101 return NO_ROWS_MESSAGE;
102 }
103
104 @Override
105 protected void populateTable(TableModel tm, ObjectNode payload) {
Thomas Vachuska04059f92017-03-07 15:16:23 -0800106 for (YangModel model : modelRegistry.getModels()) {
Thomas Vachuska0cb73f42017-03-22 10:57:34 -0700107 populateRow(tm.addRow(), model.getYangModulesId());
Simon Huntcc035c52017-02-22 21:12:51 -0800108 }
109 }
110
Thomas Vachuska0cb73f42017-03-22 10:57:34 -0700111 private void populateRow(TableModel.Row row, Set<YangModuleId> moduleIds) {
112 StringBuilder sb = new StringBuilder();
113 moduleIds.forEach(i -> sb.append(", ").append(i.moduleName())
114 .append("(").append(i.revision()).append(")"));
115 row.cell(ID, moduleIds.hashCode()).cell(MODULES, sb.toString().substring(2));
Simon Huntcc035c52017-02-22 21:12:51 -0800116 }
117 }
118
119
120 // handler for selected model detail requests (selected table row)
121 private final class DetailRequestHandler extends RequestHandler {
122 private DetailRequestHandler() {
123 super(DETAILS_REQ);
124 }
125
126 @Override
127 public void process(ObjectNode payload) {
128 String id = string(payload, ID);
Thomas Vachuskacde197c2017-03-23 17:51:08 -0700129 YangModel model = getModel(id);
Simon Huntcc035c52017-02-22 21:12:51 -0800130
131 ObjectNode data = objectNode();
Simon Huntcc035c52017-02-22 21:12:51 -0800132 data.put(ID, id);
Thomas Vachuskacde197c2017-03-23 17:51:08 -0700133
134 if (model != null) {
135 ArrayNode modules = arrayNode();
136 model.getYangModulesId().forEach(mid -> {
137 ObjectNode module = objectNode();
138 module.put("name", mid.moduleName());
139 module.put("revision", mid.revision());
140 modules.add(module);
141 });
142 data.set(MODULES, modules);
143 }
Simon Huntcc035c52017-02-22 21:12:51 -0800144
145 ObjectNode rootNode = objectNode();
146 rootNode.set(DETAILS, data);
Simon Huntcc035c52017-02-22 21:12:51 -0800147 sendMessage(DETAILS_RESP, rootNode);
148 }
149 }
Thomas Vachuskacde197c2017-03-23 17:51:08 -0700150
151 private YangModel getModel(String id) {
152 int nid = Integer.parseInt(id);
153 return modelRegistry.getModels().stream()
154 .filter(m -> m.getYangModulesId().hashCode() == nid)
155 .findFirst().orElse(null);
156 }
Simon Huntcc035c52017-02-22 21:12:51 -0800157}