Java tutorial
/*- * ============LICENSE_START======================================================= * openECOMP : SDN-C * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights * reserved. * ================================================================================ * 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. * ============LICENSE_END========================================================= */ package org.openecomp.sdnc.datachange; import java.util.Properties; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.yang.gen.v1.org.openecomp.sdnc.datachange.rev150519.DataChangeNotificationInput; import org.opendaylight.yang.gen.v1.org.openecomp.sdnc.datachange.rev150519.DataChangeNotificationInputBuilder; import org.opendaylight.yang.gen.v1.org.openecomp.sdnc.datachange.rev150519.DataChangeNotificationOutput; import org.opendaylight.yang.gen.v1.org.openecomp.sdnc.datachange.rev150519.DataChangeNotificationOutputBuilder; import org.opendaylight.yang.gen.v1.org.openecomp.sdnc.datachange.rev150519.DataChangeService; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.openecomp.sdnc.sli.provider.MdsalHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.util.concurrent.Futures; /** * Defines a base implementation for your provider. This class extends from a helper class * which provides storage for the most commonly used components of the MD-SAL. Additionally the * base class provides some basic logging and initialization / clean up methods. * */ public class DataChangeProvider implements AutoCloseable, DataChangeService { private final Logger log = LoggerFactory.getLogger(DataChangeProvider.class); private final String appName = "DataChange"; private final ExecutorService executor; protected DataBroker dataBroker; protected NotificationProviderService notificationService; protected RpcProviderRegistry rpcRegistry; protected BindingAwareBroker.RpcRegistration<DataChangeService> rpcRegistration; public DataChangeProvider(DataBroker dataBroker2, NotificationProviderService notificationProviderService, RpcProviderRegistry rpcProviderRegistry) { this.log.info("Creating provider for " + appName); executor = Executors.newFixedThreadPool(1); dataBroker = dataBroker2; notificationService = notificationProviderService; rpcRegistry = rpcProviderRegistry; initialize(); } public void initialize() { log.info("Initializing provider for " + appName); rpcRegistration = rpcRegistry.addRpcImplementation(DataChangeService.class, this); log.info("Initialization complete for " + appName); } protected void initializeChild() { //Override if you have custom initialization intelligence } @Override public void close() throws Exception { log.info("Closing provider for " + appName); executor.shutdown(); rpcRegistration.close(); log.info("Successfully closed provider for " + appName); } public void setDataBroker(DataBroker dataBroker) { this.dataBroker = dataBroker; if (log.isDebugEnabled()) { log.debug("DataBroker set to " + (dataBroker == null ? "null" : "non-null") + "."); } } public void setNotificationService(NotificationProviderService notificationService) { this.notificationService = notificationService; if (log.isDebugEnabled()) { log.debug("Notification Service set to " + (notificationService == null ? "null" : "non-null") + "."); } } public void setRpcRegistry(RpcProviderRegistry rpcRegistry) { this.rpcRegistry = rpcRegistry; if (log.isDebugEnabled()) { log.debug("RpcRegistry set to " + (rpcRegistry == null ? "null" : "non-null") + "."); } } @Override public Future<RpcResult<DataChangeNotificationOutput>> dataChangeNotification( DataChangeNotificationInput input) { final String SVC_OPERATION = "data-change-notification"; Properties parms = new Properties(); DataChangeNotificationOutputBuilder serviceDataBuilder = new DataChangeNotificationOutputBuilder(); log.info(SVC_OPERATION + " called."); if (input == null || input.getAaiEventId() == null) { log.debug("exiting " + SVC_OPERATION + " because of invalid input"); serviceDataBuilder.setDataChangeResponseCode("403"); RpcResult<DataChangeNotificationOutput> rpcResult = RpcResultBuilder .<DataChangeNotificationOutput>status(true).withResult(serviceDataBuilder.build()).build(); return Futures.immediateFuture(rpcResult); } // add input to parms log.info("Adding INPUT data for " + SVC_OPERATION + " input: " + input); DataChangeNotificationInputBuilder inputBuilder = new DataChangeNotificationInputBuilder(input); MdsalHelper.toProperties(parms, inputBuilder.build()); // Call SLI sync method // Get SvcLogicService reference DataChangeClient svcLogicClient = new DataChangeClient(); Properties respProps = null; try { if (svcLogicClient.hasGraph("DataChange", SVC_OPERATION, null, "sync")) { try { respProps = svcLogicClient.execute("DataChange", SVC_OPERATION, null, "sync", serviceDataBuilder, parms); } catch (Exception e) { log.error("Caught exception executing service logic for " + SVC_OPERATION, e); serviceDataBuilder.setDataChangeResponseCode("500"); } } else { log.error("No service logic active for DataChange: '" + SVC_OPERATION + "'"); serviceDataBuilder.setDataChangeResponseCode("503"); } } catch (Exception e) { log.error("Caught exception looking for service logic", e); serviceDataBuilder.setDataChangeResponseCode("500"); } String errorCode = serviceDataBuilder.getDataChangeResponseCode(); if (errorCode != null && errorCode.length() != 0 && !(errorCode.equals("0") || errorCode.equals("200"))) { log.error("Returned FAILED for " + SVC_OPERATION + " error code: '" + errorCode + "'"); } else { log.info("Returned SUCCESS for " + SVC_OPERATION + " "); } RpcResult<DataChangeNotificationOutput> rpcResult = RpcResultBuilder .<DataChangeNotificationOutput>status(true).withResult(serviceDataBuilder.build()).build(); // return error return Futures.immediateFuture(rpcResult); } }