| /* |
| * Copyright 2016-present Open Networking Foundation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.onosproject.yms.app.ymsm; |
| |
| import org.onosproject.core.ApplicationId; |
| import org.onosproject.core.CoreService; |
| import org.onosproject.core.IdGenerator; |
| import org.onosproject.event.ListenerService; |
| import org.onosproject.yms.app.yab.YangApplicationBroker; |
| import org.onosproject.yms.app.ych.DefaultYangCodecHandler; |
| import org.onosproject.yms.app.ych.defaultcodecs.YangCodecRegistry; |
| import org.onosproject.yms.app.ydt.DefaultYdtWalker; |
| import org.onosproject.yms.app.ydt.YangRequestWorkBench; |
| import org.onosproject.yms.app.ynh.YangNotificationExtendedService; |
| import org.onosproject.yms.app.ynh.YangNotificationManager; |
| import org.onosproject.yms.app.ysr.DefaultYangModuleLibrary; |
| import org.onosproject.yms.app.ysr.DefaultYangSchemaRegistry; |
| import org.onosproject.yms.app.ysr.YangSchemaRegistry; |
| import org.onosproject.yms.ych.YangCodecHandler; |
| import org.onosproject.yms.ych.YangDataTreeCodec; |
| import org.onosproject.yms.ych.YangProtocolEncodingFormat; |
| import org.onosproject.yms.ydt.YdtBuilder; |
| import org.onosproject.yms.ydt.YdtResponse; |
| import org.onosproject.yms.ydt.YdtWalker; |
| import org.onosproject.yms.ydt.YmsOperationType; |
| import org.onosproject.yms.ymsm.YmsService; |
| import org.onosproject.yms.ynh.YangNotificationService; |
| import org.onosproject.yms.ysr.YangModuleIdentifier; |
| import org.onosproject.yms.ysr.YangModuleLibrary; |
| import org.osgi.service.component.annotations.Activate; |
| import org.osgi.service.component.annotations.Component; |
| import org.osgi.service.component.annotations.Deactivate; |
| import org.osgi.service.component.annotations.Reference; |
| import org.osgi.service.component.annotations.ReferenceCardinality; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| import java.util.List; |
| import java.util.concurrent.ExecutorService; |
| |
| import static java.lang.String.valueOf; |
| import static java.util.concurrent.Executors.newSingleThreadExecutor; |
| import static org.onlab.util.Tools.groupedThreads; |
| import static org.onosproject.yms.app.ych.defaultcodecs.YangCodecRegistry.initializeDefaultCodec; |
| |
| /** |
| * Represents implementation of YANG management system manager. |
| */ |
| @Component(immediate = true, service = YmsService.class) |
| public class YmsManager |
| implements YmsService { |
| |
| private final Logger log = LoggerFactory.getLogger(getClass()); |
| |
| private static final String APP_ID = "org.onosproject.app.yms"; |
| private static final String MODULE_ID = "module-id"; |
| private ApplicationId appId; |
| private YangSchemaRegistry schemaRegistry; |
| //module id generator should be used to generate a new module id for |
| //each YSR instance. So YCH also should generate it. |
| private IdGenerator moduleIdGenerator; |
| private ExecutorService executor; |
| private YangNotificationExtendedService ynhExtendedService; |
| private YangModuleLibrary library; |
| |
| @Reference(cardinality = ReferenceCardinality.MANDATORY) |
| protected CoreService coreService; |
| |
| @Activate |
| public void activate() { |
| appId = coreService.registerApplication(APP_ID); |
| moduleIdGenerator = coreService.getIdGenerator(MODULE_ID); |
| schemaRegistry = new DefaultYangSchemaRegistry(); |
| library = new DefaultYangModuleLibrary(getNewModuleId()); |
| executor = newSingleThreadExecutor(groupedThreads( |
| "onos/apps/yang-management-system/schema-registry", |
| "schema-registry-handler", log)); |
| ynhExtendedService = new YangNotificationManager(schemaRegistry); |
| //Initialize the default codec |
| initializeDefaultCodec(); |
| |
| log.info("Started"); |
| } |
| |
| @Deactivate |
| public void deactivate() { |
| schemaRegistry.flushYsrData(); |
| executor.shutdown(); |
| |
| // TODO implementation for other components. |
| log.info("Stopped"); |
| } |
| |
| @Override |
| public YdtBuilder getYdtBuilder(String logicalRootName, |
| String rootNamespace, |
| YmsOperationType opType) { |
| return new YangRequestWorkBench(logicalRootName, rootNamespace, |
| opType, schemaRegistry, true); |
| } |
| |
| @Override |
| public YdtBuilder getYdtBuilder(String logicalRootName, |
| String rootNamespace, |
| YmsOperationType opType, |
| Object schemaRegistryForYdt) { |
| if (schemaRegistryForYdt != null) { |
| return new YangRequestWorkBench( |
| logicalRootName, rootNamespace, opType, |
| (YangSchemaRegistry) schemaRegistryForYdt, false); |
| } |
| return new YangRequestWorkBench(logicalRootName, rootNamespace, |
| opType, schemaRegistry, true); |
| } |
| |
| @Override |
| public YdtWalker getYdtWalker() { |
| return new DefaultYdtWalker(); |
| } |
| |
| @Override |
| public YdtResponse executeOperation(YdtBuilder operationRequest) { |
| YangApplicationBroker requestBroker = |
| new YangApplicationBroker(schemaRegistry); |
| switch (operationRequest.getYmsOperationType()) { |
| case EDIT_CONFIG_REQUEST: |
| try { |
| return requestBroker.processEdit(operationRequest); |
| } catch (CloneNotSupportedException e) { |
| log.error("YAB: failed to process edit request."); |
| } |
| case QUERY_CONFIG_REQUEST: |
| // TODO : to be implemented |
| case QUERY_REQUEST: |
| return requestBroker.processQuery(operationRequest); |
| case RPC_REQUEST: |
| return requestBroker.processOperation(operationRequest); |
| default: |
| // TODO : throw exception |
| } |
| return null; |
| } |
| |
| @Override |
| public YangNotificationService getYangNotificationService() { |
| return ynhExtendedService; |
| } |
| |
| @Override |
| public YangModuleLibrary getYangModuleLibrary() { |
| //TODO: get for YCH should be handled. |
| return library; |
| } |
| |
| @Override |
| public String getYangFile(YangModuleIdentifier moduleIdentifier) { |
| return schemaRegistry.getYangFile(moduleIdentifier); |
| } |
| |
| @Override |
| public void registerDefaultCodec(YangDataTreeCodec defaultCodec, |
| YangProtocolEncodingFormat dataFormat) { |
| YangCodecRegistry.registerDefaultCodec(defaultCodec, dataFormat); |
| } |
| |
| @Override |
| public void registerService(Object manager, Class<?> service, |
| List<String> features) { |
| //perform registration of service |
| executor.execute(() -> { |
| |
| schemaRegistry.registerApplication(manager, service); |
| //process notification registration. |
| processNotificationRegistration(manager, service); |
| |
| schemaRegistry.processModuleLibrary(service.getName(), library); |
| }); |
| // TODO implementation based on supported features. |
| } |
| |
| /** |
| * Process notification registration for manager class object. |
| * |
| * @param manager yang manager |
| * @param service service class |
| */ |
| private void processNotificationRegistration(Object manager, Class<?> service) { |
| synchronized (service) { |
| if (manager != null && manager instanceof ListenerService) { |
| if (schemaRegistry.verifyNotificationObject(manager, service)) { |
| ynhExtendedService.registerAsListener((ListenerService) manager); |
| } |
| } |
| } |
| } |
| |
| @Override |
| public void unRegisterService(Object appManager, Class<?> yangService) { |
| schemaRegistry.unRegisterApplication(appManager, yangService); |
| } |
| |
| @Override |
| public YangCodecHandler getYangCodecHandler() { |
| YangSchemaRegistry registry = new DefaultYangSchemaRegistry(); |
| DefaultYangCodecHandler handler = new DefaultYangCodecHandler(registry); |
| handler.setLibrary(new DefaultYangModuleLibrary(getNewModuleId())); |
| return handler; |
| } |
| |
| /** |
| * Returns schema registry. |
| * |
| * @return schema registry |
| */ |
| public YangSchemaRegistry getSchemaRegistry() { |
| return schemaRegistry; |
| } |
| |
| /** |
| * Returns new generated module id. |
| * |
| * @return new module id |
| */ |
| private String getNewModuleId() { |
| return valueOf(moduleIdGenerator.getNewId()); |
| } |
| } |