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

org.jboss.remoting3.metadata.RemotingMetaData Maven / Gradle / Ivy

package org.jboss.remoting3.metadata;

import java.io.Serializable;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import org.jboss.beans.metadata.spi.BeanMetaData;
import org.jboss.beans.metadata.spi.BeanMetaDataFactory;
import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
import org.jboss.beans.metadata.spi.builder.ParameterMetaDataBuilder;
import org.jboss.remoting3.Client;
import org.jboss.remoting3.Connection;
import org.jboss.remoting3.Endpoint;
import org.jboss.remoting3.Remoting;
import org.jboss.remoting3.RemotingOptions;
import org.jboss.remoting3.RequestListener;
import org.jboss.remoting3.security.ServerAuthenticationProvider;
import org.jboss.remoting3.security.SimpleClientCallbackHandler;
import org.jboss.remoting3.security.SimpleServerAuthenticationProvider;
import org.jboss.util.StringPropertyReplacer;
import org.jboss.xb.annotations.JBossXmlSchema;
import org.jboss.xnio.ChannelListener;
import org.jboss.xnio.Option;
import org.jboss.xnio.OptionMap;
import org.jboss.xnio.Options;
import org.jboss.xnio.SslTcpConnector;
import org.jboss.xnio.TcpConnector;
import org.jboss.xnio.metadata.OptionMetaData;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlAttribute;

import javax.security.auth.callback.CallbackHandler;

/**
 * Metadata which describes a Remoting deployment.  This class is intended for the parsing of
 * {@code jboss-remoting.xml} descriptors.
 */
@JBossXmlSchema (namespace = "urn:jboss:remoting:3.1", elementFormDefault = XmlNsForm.QUALIFIED)
@XmlRootElement (name = "remoting")
@XmlType (name = "remoting", propOrder = {})
public class RemotingMetaData implements BeanMetaDataFactory, Serializable {
    private static final long serialVersionUID = 1L;

    private String endpoint;
    private List services = new ArrayList();
    private List localClients = new ArrayList();
    private List servers = new ArrayList();
    private List connections = new ArrayList();
    private List endpoints = new ArrayList();
    private List simpleServerAuthentications = new ArrayList();

    public String getEndpoint() {
        return endpoint;
    }

    @XmlAttribute(name = "endpoint")
    public void setEndpoint(final String endpoint) {
        this.endpoint = StringPropertyReplacer.replaceProperties(endpoint);
    }

    public List getServices() {
        return services;
    }

    @XmlElement(name = "local-service")
    public void setServices(final List services) {
        this.services = services;
    }

    public List getLocalClients() {
        return localClients;
    }

    @XmlElement(name = "client")
    public void setLocalClients(final List localClients) {
        this.localClients = localClients;
    }

    public List getServers() {
        return servers;
    }

    @XmlElement(name = "server")
    public void setServers(final List servers) {
        this.servers = servers;
    }

    public List getConnections() {
        return connections;
    }

    @XmlElement(name = "connection")
    public void setConnections(final List connections) {
        this.connections = connections;
    }

    public List getEndpoints() {
        return endpoints;
    }

    @XmlElement(name = "endpoint", required = true)
    public void setEndpoints(final List endpoints) {
        this.endpoints = endpoints;
    }

    public List getSimpleServerAuthentications() {
        return simpleServerAuthentications;
    }

    @XmlElement(name = "simple-server-authentication")
    public void setSimpleServerAuthentications(final List simpleServerAuthentications) {
        this.simpleServerAuthentications = simpleServerAuthentications;
    }

    /**
     * Get the metadata items that this deployment produces.
     *
     * @return the list of metadata items
     */
    @XmlTransient
    public List getBeans() {
        final String endpoint = "Remoting:ENDPOINT:" + this.endpoint;
        final List metaDataList = new ArrayList();
        for (ServiceMetaData service : services) {
            final String type = service.getType();
            final String groupName = defaulted(service.getGroupName(), "default");
            final BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder("Remoting:" + endpoint + ":SERVICE:" + type + ":" + groupName, ServiceManager.class.getName());
            builder.ignoreCreate();
            builder.ignoreDestroy();
            builder.setStart("start");
            builder.setStop("stop");
            builder.addPropertyMetaData("endpoint", builder.createInject(endpoint));
            builder.addPropertyMetaData("requestType", service.getRequestClassName().getName());
            builder.addPropertyMetaData("replyType", service.getReplyClassName().getName());
            builder.addPropertyMetaData("clientListener", builder.createInject(service.getClientListener()));
            builder.addPropertyMetaData("optionMap", createOptionMap(service.getOptions()));
            builder.addPropertyMetaData("serviceType", service.getType());
            final RefMetaData classloader = service.getClassloader();
            if (classloader != null) builder.addPropertyMetaData("classloader", builder.createInject(classloader.getName()));
            builder.addPropertyMetaData("groupName", service.getGroupName());
            metaDataList.add(builder.getBeanMetaData());
        }
        for (LocalClientMetaData localClient : localClients) {
            final String name = localClient.getName();
            final BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(name, Client.class.getName());
            builder.ignoreCreate();
            builder.ignoreDestroy();
            builder.ignoreStart();
            builder.setStop("close");
            builder.setFactoryClass(Remoting.class.getName());
            builder.setFactoryMethod("createLocalClient");
            builder.addConstructorParameter(Endpoint.class.getName(), builder.createInject(endpoint));
            builder.addConstructorParameter(RequestListener.class.getName(), builder.createInject(localClient.getRequestListener().getName()));
            builder.addConstructorParameter(Class.class.getName(), localClient.getRequestClassName().getName());
            metaDataList.add(builder.getBeanMetaData());
        }
        for (ServerMetaData server : servers) {
            final String name = server.getName();
            final BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(name, ChannelListener.class.getName());
            builder.ignoreCreate();
            builder.ignoreDestroy();
            builder.ignoreStart();
            builder.ignoreStop();
            builder.setFactoryClass(RemotingHelper.class.getName());
            builder.setFactoryMethod("createServer");
            builder.addConstructorParameter(Endpoint.class.getName(), builder.createInject(endpoint));
            builder.addConstructorParameter(String.class.getName(), server.getProtocol());
            builder.addConstructorParameter(OptionMap.class.getName(), createOptionMap(server.getOptions()));
            final RefMetaData handlerRef = server.getAuthenticationHandler();
            if (handlerRef == null) {
                throw new IllegalArgumentException("No authentication-provider specified for server " + name);
            }
            builder.addConstructorParameter(ServerAuthenticationProvider.class.getName(), builder.createInject("Remoting:AUTH:" + handlerRef.getName()));
            metaDataList.add(builder.getBeanMetaData());
        }
        for (ConnectionMetaData connection : connections) {
            final String name = connection.getName();
            final BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(name, Connection.class.getName());
            builder.ignoreCreate();
            builder.ignoreDestroy();
            builder.ignoreStart();
            builder.setStop("close");
            builder.setFactory(endpoint);
            builder.setFactoryMethod("connect");
            builder.addConstructorParameter(URI.class.getName(), URI.create(connection.getDestination().getName()));
            builder.addConstructorParameter(OptionMap.class.getName(), createOptionMap(connection.getOptions()));
            final ClientAuthenticationMetaData auth = connection.getClientAuthentication();
            if (auth != null) {
                final RefMetaData ref = auth.getCallbackHandler();
                if (ref != null) {
                    builder.addConstructorParameter(CallbackHandler.class.getName(), builder.createInject(ref.getName()));
                } else {
                    final UserEntryMetaData entry = auth.getUserEntry();
                    final String password = entry.getPassword();
                    builder.addConstructorParameter(CallbackHandler.class.getName(), new SimpleClientCallbackHandler(entry.getUserName(), entry.getRealmName(), password == null ? null : password.toCharArray()));
                }
            }
            metaDataList.add(builder.getBeanMetaData());
        }
        for (EndpointMetaData endpointMetaData : endpoints) {
            final String name = endpointMetaData.getName();
            final BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder("Remoting:ENDPOINT:" + name, Endpoint.class.getName());
            builder.ignoreCreate();
            builder.ignoreDestroy();
            builder.ignoreStart();
            builder.setStop("close");
            builder.setFactoryClass(RemotingHelper.class.getName());
            builder.setFactoryMethod("createEndpoint");
            builder.addConstructorParameter(String.class.getName(), name);
            builder.addConstructorParameter(TcpConnector.class.getName(), builder.createInject(endpointMetaData.getTcpConnector().getName()));
            final RefMetaData sslRef = endpointMetaData.getSslConnector();
            builder.addConstructorParameter(SslTcpConnector.class.getName(), sslRef == null ? builder.createNull() : builder.createInject(sslRef.getName()));
            builder.addConstructorParameter(Executor.class.getName(), builder.createInject(endpointMetaData.getExecutor().getName()));
            builder.addConstructorParameter(OptionMap.class.getName(), createOptionMap(endpointMetaData.getOptions()));
            metaDataList.add(builder.getBeanMetaData());
        }
        for (SimpleServerAuthenticationMetaData metaData : simpleServerAuthentications) {
            final String name = metaData.getName();
            final BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder("Remoting:AUTH:" + name, SimpleServerAuthenticationProvider.class.getName());
            builder.ignoreCreate();
            builder.ignoreDestroy();
            builder.ignoreStart();
            builder.ignoreStop();
            for (UserEntryMetaData entry : metaData.getUsers()) {
                final ParameterMetaDataBuilder paramBuilder = builder.addInstallWithParameters("addUser");
                paramBuilder.addParameterMetaData(String.class.getName(), entry.getUserName());
                paramBuilder.addParameterMetaData(String.class.getName(), entry.getRealmName());
                final String password = entry.getPassword();
                paramBuilder.addParameterMetaData(char[].class.getName(), password == null ? null : password.toCharArray());
            }
            metaDataList.add(builder.getBeanMetaData());
        }
        return metaDataList;
    }

    private OptionMap createOptionMap(final List options) {
        if (options.isEmpty()) return OptionMap.EMPTY;
        final OptionMap.Builder builder = OptionMap.builder();
        for (OptionMetaData option : options) {
            final String className = option.getClassName();
            final Option real;
            if (className == null || className.length() == 0) {
                Option test;
                try {
                    test = Option.fromString(RemotingOptions.class.getName() + "." + option.getName(), Remoting.class.getClassLoader());
                } catch (IllegalArgumentException e) {
                    test = Option.fromString(Options.class.getName() + "." + option.getName(), Remoting.class.getClassLoader());
                }
                real = test;
            } else {
                real = Option.fromString(className + "." + option.getName(), Remoting.class.getClassLoader());
            }
            builder.parse(real, option.getValue());
        }
        return builder.getMap();
    }

    private static String defaulted(String val, String def) {
        return val != null ? val : def;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy