From: Jakub Toth Date: Sun, 12 Nov 2017 17:04:52 +0000 (+0100) Subject: Add update method of handlers for REST services X-Git-Tag: release/oxygen~38 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;ds=sidebyside;h=6b8e4f7ee09ed344969ddad8017a7f41ad89f2d0;p=netconf.git Add update method of handlers for REST services Change-Id: I64a7f7a47f43566a50839ce1a83ba0fdd4034ed9 Signed-off-by: Jakub Toth --- diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/RestConnectorProvider.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/RestConnectorProvider.java index 6ad199e7ac..be7d7a878e 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/RestConnectorProvider.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/RestConnectorProvider.java @@ -9,6 +9,9 @@ package org.opendaylight.restconf.nb.rfc8040; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSet.Builder; +import java.util.Set; import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction; import org.opendaylight.controller.md.sal.common.api.data.TransactionChain; import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; @@ -61,16 +64,26 @@ public class RestConnectorProvider implements Restconf private final DOMRpcService rpcService; private final DOMNotificationService notificationService; private final DOMMountPointService mountPointService; - private final T wrapperServices; + private final Builder servicesProperties; private ListenerRegistration listenerRegistration; private SchemaContextHandler schemaCtxHandler; + private T wrapperServices; + // FIXME: refactor this class and its users to interact via builder pattern, where individual + // services are injected and then the provider is created public RestConnectorProvider(final DOMDataBroker domDataBroker, final SchemaService schemaService, final DOMRpcService rpcService, + final DOMNotificationService notificationService, final DOMMountPointService mountPointService) { + this(domDataBroker, schemaService, rpcService, notificationService, mountPointService, null); + } + + public RestConnectorProvider(final DOMDataBroker domDataBroker, final SchemaService schemaService, + final DOMRpcService rpcService, final DOMNotificationService notificationService, final DOMMountPointService mountPointService, final T wrapperServices) { - this.wrapperServices = Preconditions.checkNotNull(wrapperServices); + this.servicesProperties = ImmutableSet.builder(); + this.wrapperServices = wrapperServices; this.schemaService = Preconditions.checkNotNull(schemaService); this.rpcService = Preconditions.checkNotNull(rpcService); this.notificationService = Preconditions.checkNotNull(notificationService); @@ -79,25 +92,33 @@ public class RestConnectorProvider implements Restconf RestConnectorProvider.dataBroker = Preconditions.checkNotNull(domDataBroker); } - public void start() { + public synchronized void start() { mountPointServiceHandler = new DOMMountPointServiceHandler(mountPointService); + servicesProperties.add(mountPointServiceHandler); final DOMDataBrokerHandler brokerHandler = new DOMDataBrokerHandler(dataBroker); + servicesProperties.add(brokerHandler); RestConnectorProvider.transactionChainHandler = new TransactionChainHandler(dataBroker .createTransactionChain(RestConnectorProvider.TRANSACTION_CHAIN_LISTENER)); + servicesProperties.add(transactionChainHandler); this.schemaCtxHandler = new SchemaContextHandler(transactionChainHandler); + servicesProperties.add(schemaCtxHandler); this.listenerRegistration = schemaService.registerSchemaContextListener(this.schemaCtxHandler); final RpcServiceHandler rpcServiceHandler = new RpcServiceHandler(rpcService); + servicesProperties.add(rpcServiceHandler); final NotificationServiceHandler notificationServiceHandler = new NotificationServiceHandler(notificationService); + servicesProperties.add(notificationServiceHandler); - wrapperServices.setHandlers(this.schemaCtxHandler, RestConnectorProvider.mountPointServiceHandler, + if (wrapperServices != null) { + wrapperServices.setHandlers(this.schemaCtxHandler, RestConnectorProvider.mountPointServiceHandler, RestConnectorProvider.transactionChainHandler, brokerHandler, rpcServiceHandler, notificationServiceHandler); + } } public DOMMountPointServiceHandler getMountPointServiceHandler() { @@ -143,4 +164,8 @@ public class RestConnectorProvider implements Restconf mountPointServiceHandler = null; dataBroker = null; } + + public final synchronized Set getServicesProperties() { + return servicesProperties.build(); + } } diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/api/RestconfDataService.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/api/RestconfDataService.java index 46314c5766..87407ac463 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/api/RestconfDataService.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/api/RestconfDataService.java @@ -25,6 +25,7 @@ import org.opendaylight.restconf.common.patch.Patch; import org.opendaylight.restconf.common.patch.PatchContext; import org.opendaylight.restconf.common.patch.PatchStatusContext; import org.opendaylight.restconf.nb.rfc8040.Rfc8040; +import org.opendaylight.restconf.nb.rfc8040.services.simple.api.UpdateHandlers; import org.opendaylight.restconf.nb.rfc8040.utils.RestconfConstants; /** @@ -32,7 +33,7 @@ import org.opendaylight.restconf.nb.rfc8040.utils.RestconfConstants; * is a collection of configuration data and state data nodes. * */ -public interface RestconfDataService { +public interface RestconfDataService extends UpdateHandlers { /** * Get target data resource. diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/api/RestconfInvokeOperationsService.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/api/RestconfInvokeOperationsService.java index 1de502b25c..faa0a4a1e7 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/api/RestconfInvokeOperationsService.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/api/RestconfInvokeOperationsService.java @@ -18,6 +18,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; import org.opendaylight.restconf.common.context.NormalizedNodeContext; import org.opendaylight.restconf.nb.rfc8040.Rfc8040; +import org.opendaylight.restconf.nb.rfc8040.services.simple.api.UpdateHandlers; import org.opendaylight.restconf.nb.rfc8040.utils.RestconfConstants; /** @@ -25,7 +26,7 @@ import org.opendaylight.restconf.nb.rfc8040.utils.RestconfConstants; * "rpc" statement. It is invoked using a POST method on the operation resource. * */ -public interface RestconfInvokeOperationsService { +public interface RestconfInvokeOperationsService extends UpdateHandlers { /** * Invoke RPC operation. diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/api/RestconfStreamsSubscriptionService.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/api/RestconfStreamsSubscriptionService.java index d131c2c80a..978e3f1f28 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/api/RestconfStreamsSubscriptionService.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/api/RestconfStreamsSubscriptionService.java @@ -14,12 +14,13 @@ import javax.ws.rs.PathParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.UriInfo; import org.opendaylight.restconf.common.context.NormalizedNodeContext; +import org.opendaylight.restconf.nb.rfc8040.services.simple.api.UpdateHandlers; /** * Subscribing to streams. * */ -public interface RestconfStreamsSubscriptionService { +public interface RestconfStreamsSubscriptionService extends UpdateHandlers { /** * Subscribing to receive notification from stream support. diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java index a1424316e0..0e8971ff4c 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java @@ -61,9 +61,9 @@ public class RestconfDataServiceImpl implements RestconfDataService { private static final Logger LOG = LoggerFactory.getLogger(RestconfDataServiceImpl.class); private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MMM-dd HH:mm:ss"); - private final SchemaContextHandler schemaContextHandler; - private final TransactionChainHandler transactionChainHandler; - private final DOMMountPointServiceHandler mountPointServiceHandler; + private SchemaContextHandler schemaContextHandler; + private TransactionChainHandler transactionChainHandler; + private DOMMountPointServiceHandler mountPointServiceHandler; private final RestconfStreamsSubscriptionService delegRestconfSubscrService; @@ -77,6 +77,19 @@ public class RestconfDataServiceImpl implements RestconfDataService { this.delegRestconfSubscrService = delegRestconfSubscrService; } + @Override + public synchronized void updateHandlers(final Object... handlers) { + for (final Object object : handlers) { + if (object instanceof SchemaContextHandler) { + schemaContextHandler = (SchemaContextHandler) object; + } else if (object instanceof DOMMountPointServiceHandler) { + mountPointServiceHandler = (DOMMountPointServiceHandler) object; + } else if (object instanceof TransactionChainHandler) { + transactionChainHandler = (TransactionChainHandler) object; + } + } + } + @Override public Response readData(final UriInfo uriInfo) { return readData(null, uriInfo); diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfInvokeOperationsServiceImpl.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfInvokeOperationsServiceImpl.java index 71c6c6c3b0..34c76dc3ae 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfInvokeOperationsServiceImpl.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfInvokeOperationsServiceImpl.java @@ -33,8 +33,8 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; */ public class RestconfInvokeOperationsServiceImpl implements RestconfInvokeOperationsService { - private final RpcServiceHandler rpcServiceHandler; - private final SchemaContextHandler schemaContextHandler; + private RpcServiceHandler rpcServiceHandler; + private SchemaContextHandler schemaContextHandler; public RestconfInvokeOperationsServiceImpl(final RpcServiceHandler rpcServiceHandler, final SchemaContextHandler schemaContextHandler) { @@ -42,6 +42,17 @@ public class RestconfInvokeOperationsServiceImpl implements RestconfInvokeOperat this.schemaContextHandler = schemaContextHandler; } + @Override + public synchronized void updateHandlers(final Object... handlers) { + for (final Object object : handlers) { + if (object instanceof SchemaContextHandler) { + schemaContextHandler = (SchemaContextHandler) object; + } else if (object instanceof RpcServiceHandler) { + rpcServiceHandler = (RpcServiceHandler) object; + } + } + } + @Override public NormalizedNodeContext invokeRpc(final String identifier, final NormalizedNodeContext payload, final UriInfo uriInfo) { diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfStreamsSubscriptionServiceImpl.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfStreamsSubscriptionServiceImpl.java index 547c318ff3..f106fc634a 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfStreamsSubscriptionServiceImpl.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfStreamsSubscriptionServiceImpl.java @@ -46,7 +46,7 @@ public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSu private static final Logger LOG = LoggerFactory.getLogger(RestconfStreamsSubscriptionServiceImpl.class); - private final HandlersHolder handlersHolder; + private HandlersHolder handlersHolder; /** * Initialize holder of handlers with holders as parameters. @@ -67,6 +67,15 @@ public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSu transactionChainHandler, schemaHandler); } + @Override + public synchronized void updateHandlers(final Object... handlers) { + for (final Object object : handlers) { + if (object instanceof HandlersHolder) { + handlersHolder = (HandlersHolder) object; + } + } + } + @Override public NormalizedNodeContext subscribeToStream(final String identifier, final UriInfo uriInfo) { final NotificationQueryParams notificationQueryParams = NotificationQueryParams.fromUriInfo(uriInfo); diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/RestconfOperationsService.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/RestconfOperationsService.java index c313277eca..3027def8e0 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/RestconfOperationsService.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/RestconfOperationsService.java @@ -23,7 +23,7 @@ import org.opendaylight.restconf.nb.rfc8040.utils.RestconfConstants; * supported by the server. * */ -public interface RestconfOperationsService { +public interface RestconfOperationsService extends UpdateHandlers { /** * List of rpc or action operations supported by the server. diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/RestconfSchemaService.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/RestconfSchemaService.java index 2a87fd41d4..cffb2e9e61 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/RestconfSchemaService.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/RestconfSchemaService.java @@ -20,7 +20,7 @@ import org.opendaylight.restconf.nb.rfc8040.utils.RestconfConstants; * */ @Path("/") -public interface RestconfSchemaService { +public interface RestconfSchemaService extends UpdateHandlers { /** * Get schema of specific module. diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/RestconfService.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/RestconfService.java index cd028fd86a..844669eb89 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/RestconfService.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/RestconfService.java @@ -19,7 +19,7 @@ import org.opendaylight.restconf.nb.rfc8040.utils.RestconfConstants; * Service for getting yang library version. * */ -public interface RestconfService { +public interface RestconfService extends UpdateHandlers { /** * Get yang library version. diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/UpdateHandlers.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/UpdateHandlers.java new file mode 100644 index 0000000000..0dfcfac2ff --- /dev/null +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/api/UpdateHandlers.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2017 Pantheon technologies s.r.o. 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.restconf.nb.rfc8040.services.simple.api; + +/** + * Allow update of handlers in web application services, if needed. + */ +public interface UpdateHandlers { + + /** + * Update method for handlers in specific service (resource) of web application. + * Has to be implemented as synchronized to avoid conflict of update variables in multithreaded application. + * + * @param handlers + * array of handlers + */ + default void updateHandlers(final Object... handlers) { + throw new UnsupportedOperationException("This method it's not allowed for this service by default."); + } +} diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/impl/RestconfImpl.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/impl/RestconfImpl.java index bb84a09216..386c991ad3 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/impl/RestconfImpl.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/impl/RestconfImpl.java @@ -25,7 +25,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode; public class RestconfImpl implements RestconfService { - private final SchemaContextHandler schemaContextHandler; + private SchemaContextHandler schemaContextHandler; public RestconfImpl(final SchemaContextHandler schemaContextHandler) { this.schemaContextHandler = schemaContextHandler; @@ -51,4 +51,13 @@ public class RestconfImpl implements RestconfService { Builders.leafBuilder((LeafSchemaNode) schemaNode).withValue(IetfYangLibrary.REVISION).build(); return new NormalizedNodeContext(iid, data); } + + @Override + public synchronized void updateHandlers(final Object... handlers) { + for (final Object object : handlers) { + if (object instanceof SchemaContextHandler) { + schemaContextHandler = (SchemaContextHandler) object; + } + } + } } diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/impl/RestconfOperationsServiceImpl.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/impl/RestconfOperationsServiceImpl.java index d2b383bad1..93c99146c4 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/impl/RestconfOperationsServiceImpl.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/impl/RestconfOperationsServiceImpl.java @@ -46,8 +46,8 @@ public class RestconfOperationsServiceImpl implements RestconfOperationsService private static final Logger LOG = LoggerFactory.getLogger(RestconfOperationsServiceImpl.class); - private final SchemaContextHandler schemaContextHandler; - private final DOMMountPointServiceHandler domMountPointServiceHandler; + private SchemaContextHandler schemaContextHandler; + private DOMMountPointServiceHandler domMountPointServiceHandler; /** * Set {@link SchemaContextHandler} for getting actual {@link SchemaContext}. @@ -63,6 +63,17 @@ public class RestconfOperationsServiceImpl implements RestconfOperationsService this.domMountPointServiceHandler = domMountPointServiceHandler; } + @Override + public synchronized void updateHandlers(final Object... handlers) { + for (final Object object : handlers) { + if (object instanceof SchemaContextHandler) { + schemaContextHandler = (SchemaContextHandler) object; + } else if (object instanceof DOMMountPointServiceHandler) { + domMountPointServiceHandler = (DOMMountPointServiceHandler) object; + } + } + } + @Override public NormalizedNodeContext getOperations(final UriInfo uriInfo) { final SchemaContextRef ref = new SchemaContextRef(this.schemaContextHandler.get()); diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/impl/RestconfSchemaServiceImpl.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/impl/RestconfSchemaServiceImpl.java index e19e9db389..231b436c5e 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/impl/RestconfSchemaServiceImpl.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/services/simple/impl/RestconfSchemaServiceImpl.java @@ -21,8 +21,8 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext; */ public class RestconfSchemaServiceImpl implements RestconfSchemaService { - private final SchemaContextHandler schemaContextHandler; - private final DOMMountPointServiceHandler domMountPointServiceHandler; + private SchemaContextHandler schemaContextHandler; + private DOMMountPointServiceHandler domMountPointServiceHandler; /** * Set {@link SchemaContextHandler} for getting actual {@link SchemaContext} @@ -45,4 +45,15 @@ public class RestconfSchemaServiceImpl implements RestconfSchemaService { return ParserIdentifier.toSchemaExportContextFromIdentifier(schemaContextRef.get(), identifier, this.domMountPointServiceHandler.get()); } + + @Override + public synchronized void updateHandlers(final Object... handlers) { + for (final Object object : handlers) { + if (object instanceof SchemaContextHandler) { + schemaContextHandler = (SchemaContextHandler) object; + } else if (object instanceof DOMMountPointServiceHandler) { + domMountPointServiceHandler = (DOMMountPointServiceHandler) object; + } + } + } }