diff --git a/src/main/java/com/github/boukefalos/lirc/Lirc.java b/src/main/java/com/github/boukefalos/lirc/Lirc.java index 23ba9c2..6dd51f5 100644 --- a/src/main/java/com/github/boukefalos/lirc/Lirc.java +++ b/src/main/java/com/github/boukefalos/lirc/Lirc.java @@ -1,10 +1,10 @@ package com.github.boukefalos.lirc; +import base.Control; import base.work.Listen; -public interface Lirc { - public void start(); - // Required for Client / ClientListen to forward from separate Thread - public void input(Object object); +public interface Lirc extends Control { public void register(Listen listen); + public void remove(Listen listen); + //public void send(String remote, String code); } diff --git a/src/main/java/com/github/boukefalos/lirc/Loader.java b/src/main/java/com/github/boukefalos/lirc/Loader.java index d9297be..a8e31fa 100644 --- a/src/main/java/com/github/boukefalos/lirc/Loader.java +++ b/src/main/java/com/github/boukefalos/lirc/Loader.java @@ -2,76 +2,59 @@ package com.github.boukefalos.lirc; import java.util.Properties; -import org.picocontainer.Parameter; -import org.picocontainer.parameters.ConstantParameter; - +import base.exception.LoaderException; import base.loader.AbstractLoader; -import base.work.Work; -import com.github.boukefalos.lirc.client.LircTcpClient; -import com.github.boukefalos.lirc.implementation.LocalImplementation; -import com.github.boukefalos.lirc.implementation.TcpImplementation; -import com.github.boukefalos.lirc.implementation.UdpImplementation; -import com.github.boukefalos.lirc.server.LircServer; -import com.github.boukefalos.lirc.server.LircTcpServer; -import com.github.boukefalos.lirc.server.LircUdpServer; +import com.github.boukefalos.lirc.implementation.Local; +import com.github.boukefalos.lirc.implementation.Remote; -public class Loader extends AbstractLoader { +public class Loader extends AbstractLoader { protected static final String PROPERTIES_FILE = "lirc.properties"; - public Loader(Properties properties) { + public Loader(Properties properties) throws LoaderException { super(); - + /* Add implementation */ switch (properties.getProperty("implementation")) { case "local": - pico.addComponent(LocalImplementation.class); + pico.addComponent(Local.class); break; case "remote": - //pico.addComponent(Remote.class); - break; - } + pico.addComponent(Remote.class); - /* Add protocol */ - if (properties.getProperty("protocol") != null) { - switch (properties.getProperty("protocol")) { - case "tcp": - pico.addComponent(TcpImplementation.class, TcpImplementation.class, new Parameter[]{ - new ConstantParameter(properties.getProperty("remote.host")), - new ConstantParameter(Integer.valueOf(properties.getProperty("remote.port")))}); - break; - case "udp": - pico.addComponent(UdpImplementation.class, UdpImplementation.class, new Parameter[] { - new ConstantParameter(properties.getProperty("remote.host")), - new ConstantParameter(Integer.valueOf(properties.getProperty("remote.port")))}); - break; - } + /* Add remote forwarder implementation */ + try { + String protocol = properties.getOrDefault("server.protocol", "tcp").toString(); + String implementation = properties.getOrDefault("tcp.implementation", "socket").toString(); + int port = Integer.valueOf(properties.getProperty("remote.port")); + addForwarder(protocol, implementation, port); + } catch (NumberFormatException e) { + throw new LoaderException("Failed to parse remote.port"); + } + break; } /* Add server */ if (properties.getProperty("server") != null) { - switch (properties.getProperty("server.protocol")) { - case "tcp": - pico.addComponent(LircTcpServer.class, LircTcpServer.class, new Parameter[]{ - new ConstantParameter(getLirc()), - new ConstantParameter(Integer.valueOf(properties.getProperty("server.port"))), - new ConstantParameter(LircTcpClient.class)}); - break; - case "udp": - pico.addComponent(LircUdpServer.class, LircUdpServer.class, new Parameter[]{ - new ConstantParameter(getLirc()), - new ConstantParameter(Integer.valueOf(properties.getProperty("server.port")))}); - } - + pico.addComponent(Server.class); + + /* Add sender implementation */ + try { + String protocol = properties.getOrDefault("server.protocol", "tcp").toString(); + String implementation = properties.getOrDefault("tcp.implementation", "socket").toString(); + int port = Integer.valueOf(properties.getProperty("server.port")); + addSender(protocol, implementation, "localhost", port); + } catch (NumberFormatException e) { + throw new LoaderException("Failed to parse server.port"); + } } } - public Lirc getLirc() { + public Lirc getLirc() { return pico.getComponent(Lirc.class); } - public Work getServer() { - return (Work) pico.getComponent(LircServer.class); + public Server getServer() { + return pico.getComponent(Server.class); } - } diff --git a/src/main/java/com/github/boukefalos/lirc/listen/ServerListen.java b/src/main/java/com/github/boukefalos/lirc/Server.java similarity index 73% rename from src/main/java/com/github/boukefalos/lirc/listen/ServerListen.java rename to src/main/java/com/github/boukefalos/lirc/Server.java index a43ed68..a195823 100644 --- a/src/main/java/com/github/boukefalos/lirc/listen/ServerListen.java +++ b/src/main/java/com/github/boukefalos/lirc/Server.java @@ -1,4 +1,4 @@ -package com.github.boukefalos.lirc.listen; +package com.github.boukefalos.lirc; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -13,17 +13,39 @@ import lirc.Lirc.DirectionButton; import lirc.Lirc.Number; import lirc.Lirc.NumberButton; import lirc.Lirc.Signal; +import base.Control; +import base.exception.worker.ActivateException; +import base.exception.worker.DeactivateException; import base.sender.Sender; import base.work.Listen; -import com.github.boukefalos.lirc.LircButton; import com.github.boukefalos.lirc.util.SignalObject; -public class ServerListen extends Listen { +public class Server extends Listen implements Control { + protected Lirc lirc; protected Sender sender; - public ServerListen(Sender sender) { + public Server(Lirc lirc, Sender sender) { + this.lirc = lirc; this.sender = sender; + lirc.register(this); + } + + public void activate() throws ActivateException { + lirc.start(); + sender.start(); + super.activate(); + } + + public void deactivate() throws DeactivateException { + super.deactivate(); + lirc.start(); + sender.stop(); + } + + public void exit() { + lirc.exit(); + sender.exit(); } public void input(SignalObject signalObject) { @@ -55,4 +77,4 @@ public class ServerListen extends Listen { logger.error("Failed to send command"); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/boukefalos/lirc/button/RemoteButton.java b/src/main/java/com/github/boukefalos/lirc/button/RemoteButton.java new file mode 100644 index 0000000..cbedb13 --- /dev/null +++ b/src/main/java/com/github/boukefalos/lirc/button/RemoteButton.java @@ -0,0 +1,5 @@ +package com.github.boukefalos.lirc.button; + +public interface RemoteButton { + +} \ No newline at end of file diff --git a/src/main/java/com/github/boukefalos/lirc/client/LircTcpClient.java b/src/main/java/com/github/boukefalos/lirc/client/LircTcpClient.java deleted file mode 100644 index b7a88ba..0000000 --- a/src/main/java/com/github/boukefalos/lirc/client/LircTcpClient.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.boukefalos.lirc.client; - -import java.nio.channels.SocketChannel; - -import base.server.channel.TcpServerClient; - -import com.github.boukefalos.lirc.server.LircTcpServer; - -public class LircTcpClient extends TcpServerClient { - protected LircTcpServer server; - - public LircTcpClient(LircTcpServer server, SocketChannel socketChannel, Integer bufferSize) { - super(server, socketChannel, bufferSize); - this.server = server; - } - - public void receive(byte[] buffer) { - - System.err.println(123); - System.err.println(new String(buffer).trim()); - - } -} diff --git a/src/main/java/com/github/boukefalos/lirc/implementation/LocalImplementation.java b/src/main/java/com/github/boukefalos/lirc/implementation/Local.java similarity index 97% rename from src/main/java/com/github/boukefalos/lirc/implementation/LocalImplementation.java rename to src/main/java/com/github/boukefalos/lirc/implementation/Local.java index 119fc70..5b42c0e 100644 --- a/src/main/java/com/github/boukefalos/lirc/implementation/LocalImplementation.java +++ b/src/main/java/com/github/boukefalos/lirc/implementation/Local.java @@ -33,12 +33,12 @@ import com.github.boukefalos.lirc.LircClient; import com.github.boukefalos.lirc.util.Multiplexer; import com.github.boukefalos.lirc.util.SignalObject; -public class LocalImplementation extends Listen implements Lirc { +public class Local extends Listen implements Lirc { protected ArrayList> listenList; protected Multiplexer multiplexer; protected LircClient lircClient; - public LocalImplementation() { + public Local() { listenList = new ArrayList>(); lircClient = new LircClient(this); multiplexer = new Multiplexer(); diff --git a/src/main/java/com/github/boukefalos/server/helper/ServerHelper.java b/src/main/java/com/github/boukefalos/lirc/implementation/Remote.java similarity index 62% rename from src/main/java/com/github/boukefalos/server/helper/ServerHelper.java rename to src/main/java/com/github/boukefalos/lirc/implementation/Remote.java index 160273a..e6e4ae3 100644 --- a/src/main/java/com/github/boukefalos/server/helper/ServerHelper.java +++ b/src/main/java/com/github/boukefalos/lirc/implementation/Remote.java @@ -1,7 +1,8 @@ -package com.github.boukefalos.server.helper; +package com.github.boukefalos.lirc.implementation; import java.io.ByteArrayInputStream; import java.io.IOException; +import java.util.ArrayList; import lirc.Lirc.Button; import lirc.Lirc.Button.Type; @@ -9,18 +10,40 @@ import lirc.Lirc.Color; import lirc.Lirc.Direction; import lirc.Lirc.Number; import lirc.Lirc.Signal; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import base.receiver.Forwarder; +import base.server.forwarder.AbstractReceiver; +import base.work.Listen; import com.github.boukefalos.lirc.Lirc; import com.github.boukefalos.lirc.LircButton; import com.github.boukefalos.lirc.util.SignalObject; -public class ServerHelper { - protected static Logger logger = LoggerFactory.getLogger(ServerHelper.class); +public class Remote extends AbstractReceiver implements Lirc { + protected ArrayList> listenList; - public static SignalObject decode(Lirc lirc, byte[] buffer) { + public Remote(Forwarder forwarder) { + super(forwarder); + listenList = new ArrayList>(); + } + + public void register(Listen listen) { + listenList.add(listen); + } + + public void remove(Listen listen) { + listenList.remove(listen); + } + + public void receive(byte[] buffer) { + Object object = decode(buffer); + if (object != null) { + for (Listen listen : listenList) { + listen.add(object); + } + } + } + + public SignalObject decode(byte[] buffer) { ByteArrayInputStream input = new ByteArrayInputStream(buffer); try { Button button = Button.parseDelimitedFrom(input); @@ -47,4 +70,4 @@ public class ServerHelper { } return null; } -} +} \ No newline at end of file diff --git a/src/main/java/com/github/boukefalos/lirc/implementation/TcpImplementation.java b/src/main/java/com/github/boukefalos/lirc/implementation/TcpImplementation.java deleted file mode 100644 index a5a89b7..0000000 --- a/src/main/java/com/github/boukefalos/lirc/implementation/TcpImplementation.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.github.boukefalos.lirc.implementation; - -import java.util.ArrayList; - -import base.exception.worker.ActivateException; -import base.server.socket.TcpClient; // Change to channel? -import base.work.Listen; - -import com.github.boukefalos.lirc.Lirc; -import com.github.boukefalos.lirc.listen.ClientListen; -import com.github.boukefalos.server.helper.ServerHelper; - -// Fix dual Receiver and Sender roles -public class TcpImplementation extends Listen implements Lirc { - protected TcpClient tcpClient; - protected ClientListen listen; - protected ArrayList> listenList; - - public TcpImplementation(String host, int port) { - tcpClient = new TcpClient(host, port); - tcpClient.register(this); - listenList = new ArrayList>(); - listen = new ClientListen(this); - } - - public void activate() throws ActivateException { - listen.start(); - super.activate(); - } - - public void input(byte[] buffer) { - Object object = ServerHelper.decode(this, buffer); - if (object != null) { - for (Listen listen : listenList) { - listen.add(object); - } - } - } - - public void register(Listen listen) { - listenList.add(listen); - } -} diff --git a/src/main/java/com/github/boukefalos/lirc/implementation/UdpImplementation.java b/src/main/java/com/github/boukefalos/lirc/implementation/UdpImplementation.java deleted file mode 100644 index ada6be7..0000000 --- a/src/main/java/com/github/boukefalos/lirc/implementation/UdpImplementation.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.github.boukefalos.lirc.implementation; - -import java.net.UnknownHostException; - -import base.sender.UdpSender; -import base.work.Listen; - -import com.github.boukefalos.lirc.Lirc; - -public class UdpImplementation extends UdpSender implements Lirc { - public UdpImplementation(String host, int port) throws UnknownHostException { - super(host, port); - } - - @Override - public void start() { - // TODO Auto-generated method stub - - } - - @Override - public void input(Object object) { - // TODO Auto-generated method stub - - } - - @Override - public void register(Listen listen) { - // TODO Auto-generated method stub - - } - - // add way to receive udp packets -} diff --git a/src/main/java/com/github/boukefalos/lirc/listen/ClientListen.java b/src/main/java/com/github/boukefalos/lirc/listen/ClientListen.java deleted file mode 100644 index f7cca2b..0000000 --- a/src/main/java/com/github/boukefalos/lirc/listen/ClientListen.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.boukefalos.lirc.listen; - -import base.work.Listen; - -import com.github.boukefalos.lirc.Lirc; - -public class ClientListen extends Listen { - protected Lirc lirc; - - public ClientListen(Lirc lirc) { - this.lirc = lirc; - } - - public void input(Object object) { - lirc.input(object); - } - - // forward send requests to sender -} diff --git a/src/main/java/com/github/boukefalos/lirc/server/LircServer.java b/src/main/java/com/github/boukefalos/lirc/server/LircServer.java deleted file mode 100644 index 8351cee..0000000 --- a/src/main/java/com/github/boukefalos/lirc/server/LircServer.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.github.boukefalos.lirc.server; - -public interface LircServer { - -} diff --git a/src/main/java/com/github/boukefalos/lirc/server/LircTcpServer.java b/src/main/java/com/github/boukefalos/lirc/server/LircTcpServer.java deleted file mode 100644 index 953453a..0000000 --- a/src/main/java/com/github/boukefalos/lirc/server/LircTcpServer.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.github.boukefalos.lirc.server; - -import base.exception.worker.ActivateException; -import base.server.channel.TcpServer; - -import com.github.boukefalos.lirc.Lirc; -import com.github.boukefalos.lirc.listen.ServerListen; -import com.github.boukefalos.server.helper.ServerHelper; - -public class LircTcpServer extends TcpServer implements LircServer { - protected Lirc lirc; - protected ServerListen listen; - - public LircTcpServer(Lirc lirc, int port, Class clientClass) { - super(port, clientClass); - this.lirc = lirc; - listen = new ServerListen(this); - lirc.register(listen); - } - - public void activate() throws ActivateException { - lirc.start(); - listen.start(); - super.activate(); - } - - public void receive(byte[] buffer) { - ServerHelper.decode(lirc, buffer); - } -} diff --git a/src/main/java/com/github/boukefalos/lirc/server/LircUdpServer.java b/src/main/java/com/github/boukefalos/lirc/server/LircUdpServer.java deleted file mode 100644 index 5782afc..0000000 --- a/src/main/java/com/github/boukefalos/lirc/server/LircUdpServer.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.boukefalos.lirc.server; - -import base.server.datagram.UdpServer; - -import com.github.boukefalos.lirc.Lirc; -import com.github.boukefalos.server.helper.ServerHelper; - -public class LircUdpServer extends UdpServer implements LircServer { - protected Lirc lirc; - - public LircUdpServer(Lirc lirc, int port) { - this(lirc, port, BUFFER_SIZE); - } - - public LircUdpServer(Lirc lirc, int port, int bufferSize) { - super(port, bufferSize); - this.lirc = lirc; - this.bufferSize = bufferSize; - } - - protected void receive(byte[] buffer) { - ServerHelper.decode(lirc, buffer); - } -} \ No newline at end of file diff --git a/src/main/java/com/github/boukefalos/server/helper/SenderHelper.java b/src/main/java/com/github/boukefalos/server/helper/SenderHelper.java deleted file mode 100644 index 56c9877..0000000 --- a/src/main/java/com/github/boukefalos/server/helper/SenderHelper.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.boukefalos.server.helper; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SenderHelper { - protected static Logger logger = LoggerFactory.getLogger(SenderHelper.class); - - public static void send(String remote, String code) { - - } -} diff --git a/src/test/java/test/TestLocal.java b/src/test/java/test/TestLocal.java index 1cd28a1..e690b53 100644 --- a/src/test/java/test/TestLocal.java +++ b/src/test/java/test/TestLocal.java @@ -6,7 +6,7 @@ import base.work.Listen; import com.github.boukefalos.lirc.Lirc; import com.github.boukefalos.lirc.LircButton; -import com.github.boukefalos.lirc.implementation.LocalImplementation; +import com.github.boukefalos.lirc.implementation.Local; import com.github.boukefalos.lirc.util.SignalObject; public class TestLocal extends Listen { @@ -21,12 +21,11 @@ public class TestLocal extends Listen { protected Lirc lirc; public TestLocal() { - lirc = new LocalImplementation(); + lirc = new Local(); lirc.register(this); } public void activate() throws ActivateException { - logger.debug("Activate " + getClass().getSimpleName()); lirc.start(); super.activate(); } diff --git a/src/test/java/test/TestRemoteImplementation.java b/src/test/java/test/TestRemoteImplementation.java new file mode 100644 index 0000000..f5b1727 --- /dev/null +++ b/src/test/java/test/TestRemoteImplementation.java @@ -0,0 +1,52 @@ +package test; + +import java.util.Properties; + +import lirc.Lirc.Signal; +import base.exception.LoaderException; +import base.exception.worker.ActivateException; +import base.work.Listen; + +import com.github.boukefalos.lirc.Lirc; +import com.github.boukefalos.lirc.LircButton; +import com.github.boukefalos.lirc.Loader; +import com.github.boukefalos.lirc.Server; +import com.github.boukefalos.lirc.util.SignalObject; + +public class TestRemoteImplementation extends Listen { + protected Lirc lirc; + + public TestRemoteImplementation(Loader loader) { + lirc = loader.getLirc(); + lirc.register(this); + } + + public void activate() throws ActivateException { + lirc.start(); + super.activate(); + } + + public void input(SignalObject lircButtonSignal) { + Object object = lircButtonSignal.object; + if (object instanceof LircButton) { + Signal signal = lircButtonSignal.signal; + LircButton lircButton = lircButtonSignal.object; + String code = lircButton.code; + logger.error(signal.name() + " : " + code + " @ " + lircButton.remote); + } + } + + public static void main(Properties localProperties, Properties remoteProperties) throws LoaderException { + Loader localLoader = new Loader(localProperties); + Loader remoteLoader = new Loader(remoteProperties); + + Server server = localLoader.getServer(); + + server.start(); + new TestRemoteImplementation(remoteLoader).start(); + + try { + Thread.sleep(1000000); + } catch (InterruptedException e) {} + } +} diff --git a/src/test/java/test/TestTcpImplementation.java b/src/test/java/test/TestTcpImplementation.java new file mode 100644 index 0000000..91345ad --- /dev/null +++ b/src/test/java/test/TestTcpImplementation.java @@ -0,0 +1,23 @@ +package test; + +import java.util.Properties; + +import base.exception.LoaderException; + +public class TestTcpImplementation { + public static void main(String[] args) throws LoaderException { + Properties localProperties = new Properties(); + localProperties.setProperty("implementation", "local"); + localProperties.setProperty("server", "true"); + localProperties.setProperty("server.port", "8883"); + localProperties.setProperty("server.protocol", "tcp"); + + Properties remoteProperties = new Properties(); + remoteProperties.setProperty("implementation", "remote"); + remoteProperties.setProperty("protocol", "tcp"); + remoteProperties.setProperty("remote.host", "localhost"); + remoteProperties.setProperty("remote.port", "8883"); + + TestRemoteImplementation.main(localProperties, remoteProperties); + } +} diff --git a/src/test/java/test/TestUdpImplementation.java b/src/test/java/test/TestUdpImplementation.java new file mode 100644 index 0000000..7dee2e5 --- /dev/null +++ b/src/test/java/test/TestUdpImplementation.java @@ -0,0 +1,23 @@ +package test; + +import java.util.Properties; + +import base.exception.LoaderException; + +public class TestUdpImplementation { + public static void main(String[] args) throws LoaderException { + Properties localProperties = new Properties(); + localProperties.setProperty("implementation", "local"); + localProperties.setProperty("server", "true"); + localProperties.setProperty("server.port", "8883"); + localProperties.setProperty("server.protocol", "udp"); + + Properties remoteProperties = new Properties(); + remoteProperties.setProperty("implementation", "remote"); + remoteProperties.setProperty("protocol", "udp"); + remoteProperties.setProperty("remote.host", "localhost"); + remoteProperties.setProperty("remote.port", "8883"); + + TestRemoteImplementation.main(localProperties, remoteProperties); + } +}