2 * Copyright (c) 2018 Lumina Networks, Inc. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.jsonrpc.bus.messagelib;
10 import static org.opendaylight.jsonrpc.bus.messagelib.MessageLibraryConstants.DEFAULT_PROXY_RETRY_COUNT;
11 import static org.opendaylight.jsonrpc.bus.messagelib.MessageLibraryConstants.DEFAULT_PROXY_RETRY_DELAY;
12 import static org.opendaylight.jsonrpc.bus.messagelib.MessageLibraryConstants.DEFAULT_TIMEOUT;
13 import static org.opendaylight.jsonrpc.bus.messagelib.MessageLibraryConstants.PARAM_PROXY_RETRY_COUNT;
14 import static org.opendaylight.jsonrpc.bus.messagelib.MessageLibraryConstants.PARAM_PROXY_RETRY_DELAY;
15 import static org.opendaylight.jsonrpc.bus.messagelib.MessageLibraryConstants.PARAM_TIMEOUT;
17 import java.net.URISyntaxException;
20 * Fluent builders to simply creation of endpoints.
22 * @author <a href="mailto:richard.kosegi@gmail.com">Richard Kosegi</a>
25 public final class EndpointBuilders {
26 private EndpointBuilders() {
27 // no instantiation of this class
30 public static class EndpointBuilder {
31 private AbstractTransportFactory factory;
33 EndpointBuilder(AbstractTransportFactory factory) {
34 this.factory = factory;
38 * Create new builder for {@link RequesterSession} or requester proxy.
40 * @return {@link RequesterBuilder} instance
42 public RequesterBuilder requester() {
43 return new RequesterBuilder(factory);
46 public ResponderBuilder responder() {
47 return new ResponderBuilder(factory);
50 public PublisherBuilder publisher() {
51 return new PublisherBuilder(factory);
54 public SubscriberBuilder subscriber() {
55 return new SubscriberBuilder(factory);
60 * Base of other endpoint builders.
62 public abstract static class BaseEndpointBuilder<T extends BaseEndpointBuilder<?>> {
63 protected final AbstractTransportFactory factory;
64 protected boolean useCache = false;
66 BaseEndpointBuilder(AbstractTransportFactory factory) {
67 this.factory = factory;
71 * Enable endpoint cache (which is disabled by default).
73 * @return this builder instance
75 @SuppressWarnings("unchecked")
83 * Builder for {@link RequesterSession} or requester proxy.
85 public static final class RequesterBuilder extends BaseEndpointBuilder<RequesterBuilder> {
86 private int proxyRetryCount = DEFAULT_PROXY_RETRY_COUNT;
87 private long proxyRetryDelay = DEFAULT_PROXY_RETRY_DELAY;
88 private long requestTimeout = DEFAULT_TIMEOUT;
90 private RequesterBuilder(AbstractTransportFactory factory) {
95 * Configure request timeout.
97 * @param requestTimeoutMilliseconds request timeout value in milliseconds
98 * @return this builder instance
100 public RequesterBuilder withRequestTimeout(long requestTimeoutMilliseconds) {
101 this.requestTimeout = requestTimeoutMilliseconds;
106 * Configure proxy retry parameters.
108 * @param retryCount number of retries before giving-up
109 * @param delayMiliseconds delay between retries, in milliseconds
110 * @return this builder instance
112 public RequesterBuilder withProxyConfig(int retryCount, long delayMiliseconds) {
113 this.proxyRetryCount = retryCount;
114 this.proxyRetryDelay = delayMiliseconds;
119 * Create requester proxy using given API contract and URI.
121 * @param api API contract to create proxy for
122 * @param uri remote responder endpoint
123 * @param <T> API contract class
124 * @return proxy object of given API class
125 * @throws URISyntaxException if URI is invalid
127 public <T extends AutoCloseable> T createProxy(Class<T> api, String uri) throws URISyntaxException {
128 String modified = uri;
129 modified = Util.injectQueryParam(modified, PARAM_PROXY_RETRY_COUNT, String.valueOf(proxyRetryCount));
130 modified = Util.injectQueryParam(modified, PARAM_PROXY_RETRY_DELAY, String.valueOf(proxyRetryDelay));
131 modified = Util.injectQueryParam(modified, PARAM_TIMEOUT, String.valueOf(requestTimeout));
132 return factory.createRequesterProxy(api, modified, !useCache);
136 * Create {@link RequesterSession} using given {@link ReplyMessageHandler} and URI.
138 * @param uri remote responder endpoint
139 * @param handler handler used to handle responses
140 * @return {@link RequesterSession}
141 * @throws URISyntaxException if URI is invalid
143 public RequesterSession create(String uri, ReplyMessageHandler handler) throws URISyntaxException {
144 return factory.createRequester(uri, handler, !useCache);
149 * Builder for {@link RequesterSession} or requester proxy.
151 public static final class PublisherBuilder extends BaseEndpointBuilder<PublisherBuilder> {
152 private PublisherBuilder(AbstractTransportFactory factory) {
157 * Create publisher proxy.
159 * @param api API contract of publisher
160 * @param uri local endpoint to bind to
161 * @param <T> API contract type
162 * @return proxy for given API
163 * @throws URISyntaxException if URI is invalid
165 public <T extends AutoCloseable> T createProxy(Class<T> api, String uri) throws URISyntaxException {
166 return factory.createPublisherProxy(api, uri, !useCache);
171 * Builder of {@link SubscriberSession}.
173 public static final class SubscriberBuilder extends BaseEndpointBuilder<SubscriberBuilder> {
174 private SubscriberBuilder(AbstractTransportFactory factory) {
179 * Create new {@link SubscriberSession} using provided implementation and endpoint.
181 * @param uri remote endpoint to subscribe to
182 * @param handler handler that will be invoked on incoming notification
183 * @param <T> type of handler
184 * @return {@link SubscriberSession}
185 * @throws URISyntaxException if URI is invalid
187 public <T extends AutoCloseable> SubscriberSession createSubscriber(String uri, T handler)
188 throws URISyntaxException {
189 return factory.createSubscriber(uri, handler, !useCache);
194 * Builder of {@link ResponderSession}.
196 public static final class ResponderBuilder extends BaseEndpointBuilder<ResponderBuilder> {
197 private ResponderBuilder(AbstractTransportFactory factory) {
202 * Create {@link ResponderBuilder} using provided instance and local endpoint to bound to.
204 * @param uri URI to bound to
205 * @param handler service instance that will be invoked on incoming request
206 * @param <T> type of handler
207 * @return {@link ResponderSession}
208 * @throws URISyntaxException if URI is invalid
210 public <T extends AutoCloseable> ResponderSession create(String uri, T handler) throws URISyntaxException {
211 return factory.createResponder(uri, handler, !useCache);