
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