/*
 * Copyright 2014 Red Hat, Inc.
 *
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  and Apache License v2.0 which accompanies this distribution.
 *
 *  The Eclipse Public License is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *
 *  The Apache License v2.0 is available at
 *  http://www.opensource.org/licenses/apache2.0.php
 *
 *  You may elect to redistribute this code under either of these licenses.
 */
package io.vertx.serviceproxy;

import io.vertx.core.Vertx;
import io.vertx.core.eventbus.DeliveryOptions;

import java.lang.reflect.Constructor;
import java.util.Objects;

A builder for Service Proxies which state can be reused during the builder lifecycle.
Author:Paulo Lopes
/** * A builder for Service Proxies which state can be reused during the builder lifecycle. * * @author <a href="mailto:plopes@redhat.com">Paulo Lopes</a> */
public class ServiceProxyBuilder { private final Vertx vertx; private String address; private DeliveryOptions options; private String token;
Creates a builder.
Params:
  • vertx – a non null instance of vertx.
/** * Creates a builder. * * @param vertx a non null instance of vertx. */
public ServiceProxyBuilder(Vertx vertx) { Objects.requireNonNull(vertx); this.vertx = vertx; }
Set the address to use on the subsequent proxy creations or service registrations.
Params:
  • address – an eventbus address
Returns:self
/** * Set the address to use on the subsequent proxy creations or service registrations. * * @param address an eventbus address * @return self */
public ServiceProxyBuilder setAddress(String address) { this.address = address; return this; }
Set a JWT token to be used on proxy calls.
Params:
  • token – a JWT token
Returns:self
/** * Set a JWT token to be used on proxy calls. * * @param token a JWT token * @return self */
public ServiceProxyBuilder setToken(String token) { this.token = token; return this; }
Set delivery options to be used during a proxy call.
Params:
  • options – delivery options
Returns:self
/** * Set delivery options to be used during a proxy call. * * @param options delivery options * @return self */
public ServiceProxyBuilder setOptions(DeliveryOptions options) { this.options = options; return this; }
Creates a proxy to a service on the event bus.
Params:
  • clazz – the service class (interface)
Type parameters:
  • <T> – the type of the service interface
Returns:a proxy to the service
/** * Creates a proxy to a service on the event bus. * * @param clazz the service class (interface) * @param <T> the type of the service interface * @return a proxy to the service */
public <T> T build(Class<T> clazz) { Objects.requireNonNull(address); String proxyClassName = clazz.getName() + "VertxEBProxy"; Class<?> proxyClass = loadClass(proxyClassName, clazz); Constructor constructor; Object instance; if (token != null) { if (options == null) { options = new DeliveryOptions(); } options.addHeader("auth-token", token); } if (options == null) { constructor = getConstructor(proxyClass, Vertx.class, String.class); instance = createInstance(constructor, vertx, address); } else { constructor = getConstructor(proxyClass, Vertx.class, String.class, DeliveryOptions.class); instance = createInstance(constructor, vertx, address, options); } return (T) instance; } private static Class<?> loadClass(String name, Class origin) { try { return origin.getClassLoader().loadClass(name); } catch (ClassNotFoundException e) { throw new IllegalStateException("Cannot find proxyClass: " + name, e); } } private static Constructor getConstructor(Class<?> clazz, Class<?>... types) { try { return clazz.getDeclaredConstructor(types); } catch (NoSuchMethodException e) { throw new IllegalStateException("Cannot find constructor on: " + clazz.getName(), e); } } private static Object createInstance(Constructor constructor, Object... args) { try { return constructor.newInstance(args); } catch (Exception e) { throw new IllegalStateException("Failed to call constructor on", e); } } }