Bug 1010: Implement restconf error responses
[controller.git] / opendaylight / md-sal / sal-dom-broker / src / main / java / org / opendaylight / controller / sal / dom / broker / ProviderContextImpl.xtend
index 11f68d6e04fb41a64c26d6a4a0a92833390f6e1b..e641ed10397ef215d182f78d465853c37ebf2ff4 100644 (file)
@@ -1,20 +1,30 @@
+/*
+ * 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.dom.broker
 
 import org.opendaylight.controller.sal.core.api.Broker.ProviderSession
 import org.opendaylight.controller.sal.core.api.Provider
-import org.opendaylight.yangtools.yang.common.QName
 import org.opendaylight.controller.sal.core.api.RpcImplementation
+import org.opendaylight.yangtools.yang.common.QName
 import org.osgi.framework.BundleContext
-import static java.util.Collections.*
-import java.util.Collections
-import java.util.HashMap
+import org.opendaylight.controller.sal.core.api.Broker.RpcRegistration
+import org.opendaylight.controller.sal.core.api.RpcRegistrationListener
+import org.opendaylight.yangtools.concepts.Registration
+
+import java.util.Set
+import java.util.HashSet
 
 class ProviderContextImpl extends ConsumerContextImpl implements ProviderSession {
 
     @Property
     private val Provider provider;
 
-    private val rpcImpls = Collections.synchronizedMap(new HashMap<QName, RpcImplementation>());
+    private val Set<Registration<?>> registrations = new HashSet();
 
     new(Provider provider, BundleContext ctx) {
         super(null, ctx);
@@ -22,35 +32,61 @@ class ProviderContextImpl extends ConsumerContextImpl implements ProviderSession
     }
 
     override addRpcImplementation(QName rpcType, RpcImplementation implementation) throws IllegalArgumentException {
-        if(rpcType == null) {
-            throw new IllegalArgumentException("rpcType must not be null");
-        }
-        if(implementation == null) {
-            throw new IllegalArgumentException("Implementation must not be null");
-        }
-        broker.addRpcImplementation(rpcType, implementation);
-        rpcImpls.put(rpcType, implementation);
-        //FIXME: Return registration
-        return null;
+        val origReg = broker.router.addRpcImplementation(rpcType, implementation);
+        val newReg = new RpcRegistrationWrapper(origReg);
+        registrations.add(newReg);
+        return newReg;
     }
 
-    def removeRpcImplementation(QName rpcType, RpcImplementation implToRemove) throws IllegalArgumentException {
-        val localImpl = rpcImpls.get(rpcType);
-        if(localImpl != implToRemove) {
-            throw new IllegalStateException(
-                "Implementation was not registered in this session");
-        }
-
-        broker.removeRpcImplementation(rpcType, implToRemove);
-        rpcImpls.remove(rpcType);
+    protected def removeRpcImplementation(RpcRegistrationWrapper implToRemove) throws IllegalArgumentException {
+        registrations.remove(implToRemove);
     }
     
+    override close() {
+        
+        for (reg : registrations) {
+            reg.close()
+        }
+        super.close
+    }
+
     override addMountedRpcImplementation(QName rpcType, RpcImplementation implementation) {
         throw new UnsupportedOperationException("TODO: auto-generated method stub")
     }
-    
+
     override addRoutedRpcImplementation(QName rpcType, RpcImplementation implementation) {
         throw new UnsupportedOperationException("TODO: auto-generated method stub")
     }
-    
+
+    override getSupportedRpcs() {
+        broker.router.supportedRpcs;
+    }
+
+    override addRpcRegistrationListener(RpcRegistrationListener listener) {
+        broker.router.addRpcRegistrationListener(listener);
+    }
 }
+
+class RpcRegistrationWrapper implements RpcRegistration {
+
+
+    @Property
+    val RpcRegistration delegate
+
+    new(RpcRegistration delegate) {
+        _delegate = delegate
+    }
+
+    override getInstance() {
+        delegate.instance
+    }
+
+    override close() {
+        delegate.close
+    }
+
+    override getType() {
+        delegate.type
+    }
+}
+