Expand forwarder model to client, make abstract loader accordingly flexible

This commit is contained in:
2015-06-21 17:37:28 +01:00
parent 0f3907448e
commit ec2d83601f
4 changed files with 104 additions and 9 deletions

View File

@@ -46,11 +46,11 @@ public class AbstractLoader<E> {
return properties; return properties;
} }
protected void addSender(Properties properties) throws LoaderException { protected void addSender(String protocol, String implementation, String host, int port) throws LoaderException {
Class<?> senderClass = null; Class<?> senderClass = null;
switch (properties.getProperty("protocol")) { switch (protocol) {
case "tcp": case "tcp":
switch (properties.getOrDefault("tcp.implementation", "socket").toString()) { switch (implementation) {
case "channel": case "channel":
senderClass = base.server.channel.TcpClient.class; senderClass = base.server.channel.TcpClient.class;
break; break;
@@ -67,15 +67,15 @@ public class AbstractLoader<E> {
throw new LoaderException("Failed to determine <Sender>"); throw new LoaderException("Failed to determine <Sender>");
} }
pico.addComponent(senderClass, senderClass, new Parameter[]{ pico.addComponent(senderClass, senderClass, new Parameter[]{
new ConstantParameter(properties.getProperty("remote.host")), new ConstantParameter(host),
new ConstantParameter(Integer.valueOf(properties.getProperty("remote.port")))}); new ConstantParameter(port)});
} }
protected void addForwarder(Properties properties) throws LoaderException { protected void addForwarder(String protocol, String implementation, int port) throws LoaderException {
Class<?> forwarderClass = null; Class<?> forwarderClass = null;
switch (properties.getProperty("server.protocol", "tcp")) { switch (protocol) {
case "tcp": case "tcp":
switch (properties.getOrDefault("tcp.implementation", "socket").toString()) { switch (implementation) {
case "channel": case "channel":
forwarderClass = TcpServerChannelForwarder.class; forwarderClass = TcpServerChannelForwarder.class;
break; break;
@@ -91,6 +91,6 @@ public class AbstractLoader<E> {
throw new LoaderException("Failed to determine <Forwarder>"); throw new LoaderException("Failed to determine <Forwarder>");
} }
pico.addComponent(forwarderClass, forwarderClass, new Parameter[]{ pico.addComponent(forwarderClass, forwarderClass, new Parameter[]{
new ConstantParameter(Integer.valueOf(properties.getProperty("server.port")))}); new ConstantParameter(port)});
} }
} }

View File

@@ -0,0 +1,33 @@
package base.server.forwarder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import base.Control;
import base.receiver.Forwarder;
import base.receiver.Receiver;
public abstract class AbstractReceiver implements Receiver, Control {
protected Logger logger = LoggerFactory.getLogger(getClass());
protected Forwarder forwarder;
public AbstractReceiver(Forwarder forwarder) {
this.forwarder = forwarder;
forwarder.register(this);
}
public void start() {
forwarder.start();
}
public void stop() {
forwarder.stop();
}
public void exit() {
forwarder.exit();
}
abstract public void receive(byte[] buffer);
}

View File

@@ -0,0 +1,31 @@
package base.server.forwarder;
import java.util.ArrayList;
import base.receiver.Forwarder;
import base.receiver.Receiver;
import base.server.socket.TcpClient;
import base.server.socket.TcpServerClient;
public class TcpClientChannelForwarder extends TcpClient implements Forwarder {
protected ArrayList<Receiver> receiverList;
public TcpClientChannelForwarder(int port) {
super(port);
receiverList = new ArrayList<Receiver>();
}
public void register(Receiver receiver) {
receiverList.add(receiver);
}
public void remove(Receiver receiver) {
receiverList.remove(receiver);
}
public void input(TcpServerClient client, byte[] buffer) {
for (Receiver receiver: receiverList) {
receiver.receive(buffer);
}
}
}

View File

@@ -0,0 +1,31 @@
package base.server.forwarder;
import java.util.ArrayList;
import base.receiver.Forwarder;
import base.receiver.Receiver;
import base.server.channel.TcpClient;
import base.server.channel.TcpServerClient;
public class TcpClientSocketForwarder extends TcpClient implements Forwarder {
protected ArrayList<Receiver> receiverList;
public TcpClientSocketForwarder(int port) {
super(port);
receiverList = new ArrayList<Receiver>();
}
public void register(Receiver receiver) {
receiverList.add(receiver);
}
public void remove(Receiver receiver) {
receiverList.remove(receiver);
}
public void input(TcpServerClient client, byte[] buffer) {
for (Receiver receiver: receiverList) {
receiver.receive(buffer);
}
}
}