blob: 6e3a691f0dfe4dc16139ce982fd6dafbc4d8556f [file] [log] [blame]
Thomas Vachuska73436b52017-03-22 19:50:47 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Thomas Vachuska73436b52017-03-22 19:50:47 -07003 *
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
17package org.onosproject.yang;
18
19import org.apache.felix.scr.annotations.Activate;
20import org.apache.felix.scr.annotations.Component;
21import org.apache.felix.scr.annotations.Deactivate;
22import org.apache.felix.scr.annotations.Reference;
23import org.apache.felix.scr.annotations.ReferenceCardinality;
24import org.onosproject.yang.model.YangModel;
Gaurav Agrawal8dbd2732017-04-14 18:57:30 +053025import org.onosproject.yang.model.YangModuleId;
26import org.onosproject.yang.runtime.AppModuleInfo;
Thomas Vachuska73436b52017-03-22 19:50:47 -070027import org.onosproject.yang.runtime.DefaultModelRegistrationParam;
28import org.onosproject.yang.runtime.ModelRegistrationParam;
Gaurav Agrawal8dbd2732017-04-14 18:57:30 +053029import org.onosproject.yang.runtime.ModelRegistrationParam.Builder;
Thomas Vachuska73436b52017-03-22 19:50:47 -070030import org.onosproject.yang.runtime.YangModelRegistry;
31import org.slf4j.Logger;
32import org.slf4j.LoggerFactory;
33
Gaurav Agrawal8dbd2732017-04-14 18:57:30 +053034import java.util.Map;
35
Thomas Vachuska73436b52017-03-22 19:50:47 -070036import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.getYangModel;
37
38/**
39 * Abstract base for self-registering YANG models.
40 */
41@Component
42public abstract class AbstractYangModelRegistrator {
43
Thomas Vachuska803278e2017-10-06 11:11:58 -070044 protected final Logger log = LoggerFactory.getLogger(getClass());
Thomas Vachuska73436b52017-03-22 19:50:47 -070045 private final Class<?> loaderClass;
Thomas Vachuskac307d212017-07-31 13:57:20 -070046
Gaurav Agrawal8dbd2732017-04-14 18:57:30 +053047 private Map<YangModuleId, AppModuleInfo> appInfo;
Sean Condond911af92017-07-19 18:05:27 +010048 protected YangModel model;
Thomas Vachuska73436b52017-03-22 19:50:47 -070049 private ModelRegistrationParam registrationParam;
50
Thomas Vachuskac307d212017-07-31 13:57:20 -070051 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
52 protected YangModelRegistry modelRegistry;
53
54 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
55 protected YangClassLoaderRegistry sourceResolver;
56
Thomas Vachuska73436b52017-03-22 19:50:47 -070057 /**
58 * Creates a model registrator primed with the class-loader of the specified
59 * class.
60 *
Gaurav Agrawal8dbd2732017-04-14 18:57:30 +053061 * @param loaderClass class whose class loader is to be used for locating
62 * schema data
Thomas Vachuska73436b52017-03-22 19:50:47 -070063 */
64 protected AbstractYangModelRegistrator(Class<?> loaderClass) {
65 this.loaderClass = loaderClass;
66 }
67
Gaurav Agrawal8dbd2732017-04-14 18:57:30 +053068 /**
69 * Creates a model registrator primed with the class-loader of the specified
70 * class and application info.
71 *
72 * @param loaderClass class whose class loader is to be used for locating
73 * schema data
74 * @param appInfo application information
75 */
76 protected AbstractYangModelRegistrator(Class<?> loaderClass,
77 Map<YangModuleId, AppModuleInfo> appInfo) {
78 this.loaderClass = loaderClass;
79 this.appInfo = appInfo;
80 }
81
Thomas Vachuska73436b52017-03-22 19:50:47 -070082 @Activate
83 protected void activate() {
84 model = getYangModel(loaderClass);
Gaurav Agrawal8dbd2732017-04-14 18:57:30 +053085 ModelRegistrationParam.Builder b =
86 DefaultModelRegistrationParam.builder().setYangModel(model);
87 registrationParam = getAppInfo(b).setYangModel(model).build();
Thomas Vachuskac307d212017-07-31 13:57:20 -070088 sourceResolver.registerClassLoader(model.getYangModelId(), loaderClass.getClassLoader());
Thomas Vachuska73436b52017-03-22 19:50:47 -070089 modelRegistry.registerModel(registrationParam);
90 log.info("Started");
91 }
92
Sean Condond911af92017-07-19 18:05:27 +010093 protected ModelRegistrationParam.Builder getAppInfo(Builder b) {
Gaurav Agrawal8dbd2732017-04-14 18:57:30 +053094 if (appInfo != null) {
95 appInfo.entrySet().stream().filter(
96 entry -> model.getYangModule(entry.getKey()) != null).forEach(
97 entry -> b.addAppModuleInfo(entry.getKey(), entry.getValue()));
98 }
99 return b;
100 }
101
Thomas Vachuska73436b52017-03-22 19:50:47 -0700102 @Deactivate
103 protected void deactivate() {
104 modelRegistry.unregisterModel(registrationParam);
Thomas Vachuskac307d212017-07-31 13:57:20 -0700105 sourceResolver.unregisterClassLoader(model.getYangModelId());
Thomas Vachuska73436b52017-03-22 19:50:47 -0700106 log.info("Stopped");
107 }
108}