X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-rest-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Frestconf%2Fimpl%2FBrokerFacade.xtend;h=d3050061da829852c494a55c05ef8e61a113acd0;hp=4c6eb3b10658c61b5b0c4de6e423cfad33ed0643;hb=273a60e4a5c67c9d6dab1889f86e15092ddbefbd;hpb=ce23509536c00cb2649c36b4b64ac261946445a1 diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/BrokerFacade.xtend b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/BrokerFacade.xtend index 4c6eb3b106..d3050061da 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/BrokerFacade.xtend +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/BrokerFacade.xtend @@ -1,65 +1,146 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ package org.opendaylight.controller.sal.restconf.impl +import javax.ws.rs.core.Response import org.opendaylight.controller.md.sal.common.api.data.DataReader -import java.net.URI -import org.opendaylight.yangtools.yang.data.api.CompositeNode -import org.opendaylight.controller.sal.core.api.data.DataBrokerService -import org.opendaylight.controller.sal.core.api.model.SchemaService -import static com.google.common.base.Preconditions.*; import org.opendaylight.controller.sal.core.api.Broker.ConsumerSession +import org.opendaylight.controller.sal.core.api.data.DataBrokerService +import org.opendaylight.controller.sal.core.api.mount.MountInstance +import org.opendaylight.controller.sal.rest.impl.RestconfProvider +import org.opendaylight.controller.sal.streams.listeners.ListenerAdapter +import org.opendaylight.yangtools.yang.common.QName import org.opendaylight.yangtools.yang.common.RpcResult -import org.opendaylight.controller.md.sal.common.api.data.DataModificationTransactionFactory +import org.opendaylight.yangtools.yang.data.api.CompositeNode +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier +import org.slf4j.LoggerFactory -class BrokerFacade implements DataReader { +class BrokerFacade implements DataReader { + + + val static LOG = LoggerFactory.getLogger(BrokerFacade) + val static BrokerFacade INSTANCE = new BrokerFacade @Property private ConsumerSession context; - + @Property private DataBrokerService dataService; - @Property - private SchemaService schemaService; - - @Property - private extension ControllerContext schemaContext; + private new() { + if (INSTANCE !== null) { + throw new IllegalStateException("Already instantiated"); + } + } + def static BrokerFacade getInstance() { + return INSTANCE + } - def void init() { - checkState(dataService !== null) - checkState(schemaService !== null) - schemaContext = new ControllerContext(); - schemaContext.schemas = schemaService.globalContext; + private def void checkPreconditions() { + if (context === null || dataService === null) { + throw new ResponseException(Response.Status.SERVICE_UNAVAILABLE, RestconfProvider::NOT_INITALIZED_MSG) + } } - override readConfigurationData(String path) { - val processedPath = path.removePrefixes(); - return dataService.readConfigurationData(processedPath.toInstanceIdentifier); + override readConfigurationData(InstanceIdentifier path) { + checkPreconditions + LOG.trace("Read Configuration via Restconf: {}", path) + return dataService.readConfigurationData(path); + } + + def readConfigurationDataBehindMountPoint(MountInstance mountPoint, InstanceIdentifier path) { + checkPreconditions + LOG.trace("Read Configuration via Restconf: {}", path) + return mountPoint.readConfigurationData(path); } - override readOperationalData(String path) { - val processedPath = path.removePrefixes(); - return dataService.readOperationalData(processedPath.toInstanceIdentifier); + override readOperationalData(InstanceIdentifier path) { + checkPreconditions + LOG.trace("Read Operational via Restconf: {}", path) + return dataService.readOperationalData(path); } - def RpcResult invokeRpc(String type,CompositeNode payload) { - val future = context.rpc(type.toRpcQName(),payload); + def readOperationalDataBehindMountPoint(MountInstance mountPoint, InstanceIdentifier path) { + checkPreconditions + LOG.trace("Read Operational via Restconf: {}", path) + return mountPoint.readOperationalData(path); + } + + def RpcResult invokeRpc(QName type, CompositeNode payload) { + checkPreconditions + val future = context.rpc(type, payload); return future.get; } + + def commitConfigurationDataPut(InstanceIdentifier path, CompositeNode payload) { + checkPreconditions + val transaction = dataService.beginTransaction; + LOG.trace("Put Configuration via Restconf: {}", path) + transaction.putConfigurationData(path, payload); + return transaction.commit + } - def commitConfigurationDataUpdate(String path, CompositeNode payload) { + def commitConfigurationDataPutBehindMountPoint(MountInstance mountPoint, InstanceIdentifier path, CompositeNode payload) { + checkPreconditions + val transaction = mountPoint.beginTransaction; + LOG.trace("Put Configuration via Restconf: {}", path) + transaction.putConfigurationData(path, payload); + return transaction.commit + } + + def commitConfigurationDataPost(InstanceIdentifier path, CompositeNode payload) { + checkPreconditions val transaction = dataService.beginTransaction; - transaction.putConfigurationData(path.toInstanceIdentifier,payload); - return transaction.commit() + transaction.putConfigurationData(path, payload); + if (payload == transaction.createdConfigurationData.get(path)) { + LOG.trace("Post Configuration via Restconf: {}", path) + return transaction.commit + } + LOG.trace("Post Configuration via Restconf was not executed because data already exists: {}", path) + return null; } - def commitConfigurationDataCreate(String path, CompositeNode payload) { + def commitConfigurationDataPostBehindMountPoint(MountInstance mountPoint, InstanceIdentifier path, CompositeNode payload) { + checkPreconditions + val transaction = mountPoint.beginTransaction; + transaction.putConfigurationData(path, payload); + if (payload == transaction.createdConfigurationData.get(path)) { + LOG.trace("Post Configuration via Restconf: {}", path) + return transaction.commit + } + LOG.trace("Post Configuration via Restconf was not executed because data already exists: {}", path) + return null; + } + + def commitConfigurationDataDelete(InstanceIdentifier path) { + checkPreconditions val transaction = dataService.beginTransaction; - transaction.putConfigurationData(path.toInstanceIdentifier,payload); - return transaction.commit() + LOG.info("Delete Configuration via Restconf: {}", path) + transaction.removeConfigurationData(path) + return transaction.commit } - private def String removePrefixes(String path) { - return path; + def commitConfigurationDataDeleteBehindMountPoint(MountInstance mountPoint, InstanceIdentifier path) { + checkPreconditions + val transaction = mountPoint.beginTransaction; + LOG.info("Delete Configuration via Restconf: {}", path) + transaction.removeConfigurationData(path) + return transaction.commit } + + def registerToListenDataChanges(ListenerAdapter listener) { + checkPreconditions + if (listener.listening) { + return; + } + val registration = dataService.registerDataChangeListener(listener.path, listener) + listener.setRegistration(registration) + } + }