import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
import org.opendaylight.openflowplugin.api.openflow.device.RequestContext;
import org.opendaylight.openflowplugin.api.openflow.rpc.RpcContext;
-import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeContext;
import org.opendaylight.yangtools.yang.binding.RpcService;
import org.opendaylight.yangtools.yang.common.RpcError;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
public class RpcContextImpl implements RpcContext {
- final ProviderContext providerContext;
+ private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(RpcContextImpl.class);
+ final RpcProviderRegistry rpcProviderRegistry;
// TODO: add private Sal salBroker
- private final List<RequestContext<? extends DataObject>> requestContexts = new ArrayList<>();
private final DeviceContext deviceContext;
private final List<RoutedRpcRegistration> rpcRegistrations = new ArrayList<>();
private final List<RequestContext<?>> synchronizedRequestsList = Collections
private int maxRequestsPerDevice;
- public RpcContextImpl(final ProviderContext providerContext, final DeviceContext deviceContext) {
- this.providerContext = providerContext;
+ public RpcContextImpl(final RpcProviderRegistry rpcProviderRegistry, final DeviceContext deviceContext) {
+ this.rpcProviderRegistry = rpcProviderRegistry;
this.deviceContext = deviceContext;
}
/**
* @see org.opendaylight.openflowplugin.api.openflow.rpc.RpcContext#registerRpcServiceImplementation(java.lang.Class,
- * org.opendaylight.yangtools.yang.binding.RpcService)
+ * org.opendaylight.yangtools.yang.binding.RpcService)
*/
@Override
public <S extends RpcService> void registerRpcServiceImplementation(final Class<S> serviceClass,
- final S serviceInstance) {
- rpcRegistrations.add(providerContext.addRoutedRpcImplementation(serviceClass, serviceInstance));
+ final S serviceInstance) {
+ final RoutedRpcRegistration<S> routedRpcReg = rpcProviderRegistry.addRoutedRpcImplementation(serviceClass, serviceInstance);
+ routedRpcReg.registerPath(NodeContext.class, deviceContext.getDeviceState().getNodeInstanceIdentifier());
+ rpcRegistrations.add(routedRpcReg);
}
@Override
@Override
public void close() throws Exception {
for (final RoutedRpcRegistration<?> rpcRegistration : rpcRegistrations) {
+ rpcRegistration.unregisterPath(NodeContext.class, deviceContext.getDeviceState().getNodeInstanceIdentifier());
rpcRegistration.close();
}
}
@Override
public <T> void forgetRequestContext(final RequestContext<T> requestContext) {
- requestContexts.remove(requestContext);
+ synchronizedRequestsList.remove(requestContext);
+ LOG.trace("Removed request context with xid {}. Context request in list {}.",
+ requestContext.getXid().getValue(), synchronizedRequestsList.size());
}
@Override
}
public boolean isRequestContextCapacityEmpty() {
- return requestContexts.size() <= maxRequestsPerDevice;
+ return synchronizedRequestsList.size() <= maxRequestsPerDevice;
}
+ @Override
+ public void onDeviceDisconnected(final ConnectionContext connectionContext) {
+ for (RoutedRpcRegistration registration : rpcRegistrations) {
+ registration.close();
+ }
+
+ synchronizedRequestsList.clear();
+ }
}