All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ws.wamp.jawampa.WampClientBuilder Maven / Gradle / Ivy

/*
 * Copyright 2014 Matthias Einwag
 *
 * The jawampa authors license this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package ws.wamp.jawampa;

import java.net.URI;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.concurrent.TimeUnit;

import ws.wamp.jawampa.auth.client.ClientSideAuthentication;
import ws.wamp.jawampa.client.ClientConfiguration;
import ws.wamp.jawampa.connection.IWampClientConnectionConfig;
import ws.wamp.jawampa.connection.IWampConnector;
import ws.wamp.jawampa.connection.IWampConnectorProvider;
import ws.wamp.jawampa.internal.UriValidator;

/**
 * WampClientBuilder is the builder object which allows to create
 * {@link WampClient} objects.
* New clients have to be configured with the member methods before * a client can be created with the {@link #build build()} method. */ public class WampClientBuilder { String uri; String realm; int nrReconnects = 0; int reconnectInterval = DEFAULT_RECONNECT_INTERVAL; boolean useStrictUriValidation = false; boolean closeOnErrors = true; EnumSet roles; List serializations = new ArrayList(); String authId = null; List authMethods = new ArrayList(); IWampClientConnectionConfig connectionConfiguration = null; IWampConnectorProvider connectorProvider = null; /** The default reconnect interval in milliseconds.
This is set to 5s */ public static final int DEFAULT_RECONNECT_INTERVAL = 5000; /** The minimum reconnect interval in milliseconds.
This is set to 100ms */ public static final int MIN_RECONNECT_INTERVAL = 100; /** * Construct a new WampClientBuilder object. */ public WampClientBuilder() { // Add the default roles roles = EnumSet.of( WampRoles.Caller, WampRoles.Callee, WampRoles.Publisher, WampRoles.Subscriber); WampSerialization.addDefaultSerializations(serializations); } /** * Builds a new {@link WampClient WAMP client} from the information given in this builder.
* At least the uri of the router and the name of the realm have to be * set for a proper operation. * @return The created WAMP client * @throws WampError if any parameter is not invalid */ public WampClient build() throws Exception { if (uri == null) throw new ApplicationError(ApplicationError.INVALID_URI); URI routerUri; try { routerUri = new URI(uri); } catch (Throwable t) { throw new ApplicationError(ApplicationError.INVALID_URI); } if (realm == null) throw new ApplicationError(ApplicationError.INVALID_REALM); try { UriValidator.validate(realm, useStrictUriValidation); } catch (Exception e) { throw new ApplicationError(ApplicationError.INVALID_REALM); } if (roles.size() == 0) { throw new ApplicationError(ApplicationError.INVALID_ROLES); } // Build the roles array from the roles set WampRoles[] rolesArray = new WampRoles[roles.size()]; int i = 0; for (WampRoles r : roles) { rolesArray[i] = r; i++; } if (serializations.size() == 0) { throw new ApplicationError(ApplicationError.INVALID_SERIALIZATIONS); } if (connectorProvider == null) throw new ApplicationError(ApplicationError.INVALID_CONNECTOR_PROVIDER); // Build a connector that can be used by the client afterwards // This can throw! IWampConnector connector = connectorProvider.createConnector(routerUri, connectionConfiguration, serializations); ClientConfiguration clientConfig = new ClientConfiguration( closeOnErrors, authId, authMethods, routerUri, realm, useStrictUriValidation, rolesArray, nrReconnects, reconnectInterval, connectorProvider, connector); return new WampClient(clientConfig); } /** * Sets the address of the router to which the new client shall connect. * @param uri The address of the router, e.g. ws://wamp.ws/ws * @return The {@link WampClientBuilder} object */ public WampClientBuilder withUri(String uri) { this.uri = uri; return this; } /** * Sets the name of the realm on the router which shall be used for the session. * @param realm The name of the realm to which shall be connected. * @return The {@link WampClientBuilder} object */ public WampClientBuilder withRealm(String realm) { this.realm = realm; return this; } /** * Adjusts the roles that this client should have in the session.
* By default a client will have all roles (caller, callee, publisher, subscriber). * Use this function to adjust the roles if not all are needed. * @param roles The set of roles that the client should fulfill in the session. * At least one role is required, otherwise the session can not be established. * @return The {@link WampClientBuilder} object */ public WampClientBuilder withRoles(WampRoles[] roles) { this.roles.clear(); if (roles == null) return this; // Will throw on build() for (WampRoles role : roles) { this.roles.add(role); } return this; } /** * Assigns a connector provider to the WampClient. This provider will be used to * establish connections to the server.
* By using a different ConnectorProvider a different transport framework can be used * for data exchange between client and server. * @param The {@link IWampConnectorProvider} that should be used * @return The {@link WampClientBuilder} object */ public WampClientBuilder withConnectorProvider(IWampConnectorProvider provider) { this.connectorProvider = provider; return this; } /** * Assigns additional configuration data for a connection that should be used.
* The type of this configuration data depends on the used {@link IWampConnectorProvider}.
* Depending on the provider this might be null or not. * @param The {@link IWampClientConnectionConfig} that should be used * @return The {@link WampClientBuilder} object */ public WampClientBuilder withConnectionConfiguration(IWampClientConnectionConfig configuration) { this.connectionConfiguration = configuration; return this; } /** * Adjusts the serializations that this client supports in the session.
* By default a client will have all serializations (JSON, MessagePack).
* The order of the list indicates client preference to the router during * negotiation.
* Use this function to adjust the serializations if not all are needed or * a different order is desired. * @param serializations The set of serializations that the client supports. * @return The {@link WampClientBuilder} object */ public WampClientBuilder withSerializations(WampSerialization[] serializations) throws ApplicationError { this.serializations.clear(); if (serializations == null) return this; // Will throw on build() for (WampSerialization serialization : serializations) { if (serialization == WampSerialization.Invalid) throw new ApplicationError(ApplicationError.INVALID_SERIALIZATIONS); if (!this.serializations.contains(serialization)) this.serializations.add(serialization); } return this; } /** * Allows to activate or deactivate the validation of all WAMP Uris according to the * strict URI validation rules which are described in the WAMP specification. * By default the loose Uri validation rules will be used. * @param useStrictUriValidation true if strict Uri validation rules shall be applied, * false if loose Uris shall be used. * @return The {@link WampClientBuilder} object */ public WampClientBuilder withStrictUriValidation(boolean useStrictUriValidation) { this.useStrictUriValidation = useStrictUriValidation; return this; } /** * Sets whether the client should be closed when an error besides * a connection loss happens.
* Other reasons are the reception of invalid messages from the remote * or the abortion of the session by the remote.
* When this flag is set to true no reconnect attempts will be performed. *
* The default is true. This is to avoid endless reconnects in case of * a malfunctioning remote. * @param closeOnErrors True if the client should be closed on such * errors, false if not. * @return The {@link WampClientBuilder} object */ public WampClientBuilder withCloseOnErrors(boolean closeOnErrors) { this.closeOnErrors = closeOnErrors; return this; } /** * Sets the amount of reconnect attempts to perform to a dealer. * @param nrReconnects The amount of connects to perform. Must be > 0. * @return The {@link WampClientBuilder} object * @throws WampError if the nr of reconnects is negative */ public WampClientBuilder withNrReconnects(int nrReconnects) throws ApplicationError { if (nrReconnects < 0) throw new ApplicationError(ApplicationError.INVALID_PARAMETER); this.nrReconnects = nrReconnects; return this; } /** * Sets the amount of reconnect attempts to perform to a dealer * to infinite. * @return The {@link WampClientBuilder} object */ public WampClientBuilder withInfiniteReconnects() { this.nrReconnects = -1; return this; } /** * Sets the amount of time that should be waited until a reconnect attempt is performed.
* The default value is {@link #DEFAULT_RECONNECT_INTERVAL}. * @param interval The interval that should be waited until a reconnect attempt
* is performed. The interval must be bigger than {@link #MIN_RECONNECT_INTERVAL}. * @param unit The unit of the interval * @return The {@link WampClientBuilder} object * @throws WampError If the interval is invalid */ public WampClientBuilder withReconnectInterval(int interval, TimeUnit unit) throws ApplicationError { long intervalMs = unit.toMillis(interval); if (intervalMs < MIN_RECONNECT_INTERVAL || intervalMs > Integer.MAX_VALUE) throw new ApplicationError(ApplicationError.INVALID_RECONNECT_INTERVAL); this.reconnectInterval = (int)intervalMs; return this; } /** * Set the authId to use. If not called, no authId is used. * @param authId the authId * @return The {@link WampClientBuilder} object */ public WampClientBuilder withAuthId(String authId) { this.authId = authId; return this; } /** * Use a specific auth method. Can be called multiple times to specify multiple * supported auth methods. If this method is not called, anonymous auth is used. * @param authMethod The {@link ClientSideAuthentication} to add * @return The {@link WampClientBuilder} object */ public WampClientBuilder withAuthMethod(ClientSideAuthentication authMethod) { this.authMethods.add( authMethod ); return this; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy