--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="test"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3.8.1"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>netzschalter</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+/*
+ * Created on 12.05.2007
+ *
+ * To change this generated comment go to
+ * Window>Preferences>Java>Code Generation>Code Template
+ */
+package de.bytewurf.projekte.netzschalter;
+
+import java.util.Iterator;
+import java.util.WeakHashMap;
+
+/**
+ * @author felix
+ */
+public class LogMediator {
+ private static LogMediator singleton = new LogMediator();
+ private WeakHashMap observers = new WeakHashMap();
+
+ public static LogMediator getInstance() {
+ return singleton;
+ }
+
+ public void addObserver(Loggable o) {
+ observers.put(o,"OK");
+ }
+
+ public void log(String message) {
+ for (Iterator iterator = observers.keySet().iterator(); iterator.hasNext();) {
+ Loggable observer = (Loggable) iterator.next();
+ if (observer != null)
+ observer.log(message);
+ }
+ }
+}
--- /dev/null
+/*
+ * Created on 12.05.2007
+ *
+ * To change this generated comment go to
+ * Window>Preferences>Java>Code Generation>Code Template
+ */
+package de.bytewurf.projekte.netzschalter;
+
+/**
+ * @author felix
+ */
+public interface Loggable {
+ public void log(String message);
+}
--- /dev/null
+/*
+ * Created on 12.05.2007
+ *
+ * To change this generated comment go to
+ * Window>Preferences>Java>Code Generation>Code Template
+ */
+package de.bytewurf.projekte.netzschalter;
+
+/**
+ * @author felix
+ */
+public interface Netzdose {
+
+ public void setRelais(int relaisNumber, int state);
+
+ public int getRelais(int relaisNumber);
+
+ public int getNumberOfRelais();
+
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Created on 12.05.2007
+ *
+ * To change this generated comment go to
+ * Window>Preferences>Java>Code Generation>Code Template
+ */
+package de.bytewurf.projekte.netzschalter;
+
+/**
+ * @author felix
+ */
+public class NetzdoseImpl implements Netzdose {
+ /* (non-Javadoc)
+ * @see de.bytewurf.projekte.netzschalter.Netzdose#setRelais(int, int)
+ */
+ public void setRelais(int relaisNumber, int state) {
+ }
+
+ public int getNumberOfRelais() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see de.bytewurf.projekte.netzschalter.Netzdose#getRelais(int)
+ */
+ public int getRelais(int relaisNumber) {
+ return NetzdoseKonstanten.STATE_OFF;
+ }
+}
--- /dev/null
+/*
+ * Created on 12.05.2007
+ *
+ * To change this generated comment go to
+ * Window>Preferences>Java>Code Generation>Code Template
+ */
+package de.bytewurf.projekte.netzschalter;
+
+/**
+ * @author felix
+ */
+public class NetzdoseKonstanten {
+
+ public static final int STATE_ON = 1;
+ public static final int STATE_OFF = 2;
+
+}
--- /dev/null
+/*
+ * Created on 12.05.2007
+ *
+ * To change this generated comment go to
+ * Window>Preferences>Java>Code Generation>Code Template
+ */
+package de.bytewurf.projekte.netzschalter;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTabbedPane;
+
+/**
+ * @author felix
+ */
+public class NetzdosenApplet extends Applet {
+
+ private static final long serialVersionUID = 1L;
+
+ private Netzdose netzdose;
+
+ private TextAreaLogger logArea;
+
+ public void start() {
+ super.start();
+ }
+
+ @Override
+ public void stop() {
+ // TODO Auto-generated method stub
+ super.stop();
+ }
+
+ public void init() {
+ netzdose = new NetzdosenMockup();
+
+ setLayout(new BorderLayout());
+
+ JTabbedPane modePanel = new JTabbedPane();
+
+ modePanel.add("LED", new NetzdosenLEDPanel(netzdose));
+ JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
+ splitPane.add(modePanel, JSplitPane.TOP);
+
+ logArea = new TextAreaLogger();
+ splitPane.add(new JScrollPane(logArea,
+ JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
+ JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), JSplitPane.BOTTOM);
+
+ add(splitPane);
+
+ }
+}
--- /dev/null
+/*
+ * Created on 12.05.2007
+ *
+ * To change this generated comment go to
+ * Window>Preferences>Java>Code Generation>Code Template
+ */
+package de.bytewurf.projekte.netzschalter;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JPanel;
+import javax.swing.JToggleButton;
+
+/**
+ * @author felix
+ */
+public class NetzdosenLEDPanel extends JPanel {
+
+ private Netzdose netzdose;
+
+ private JToggleButton[] relaisToggles;
+
+ public NetzdosenLEDPanel(Netzdose netzdose) {
+ this.netzdose = netzdose;
+
+ relaisToggles = new JToggleButton[netzdose.getNumberOfRelais()];
+ for (int i = 0; i < netzdose.getNumberOfRelais(); i++) {
+ relaisToggles[i] = new JToggleButton("Relais " + i);
+ relaisToggles[i].setSelected(netzdose.getRelais(i) == NetzdoseKonstanten.STATE_ON);
+ relaisToggles[i].addActionListener(new RelaisAction(relaisToggles[i], i));
+ add(relaisToggles[i]);
+ }
+
+
+ }
+
+ private class RelaisAction implements ActionListener {
+
+ JToggleButton button;
+
+ int relaisNumber;
+
+ public RelaisAction(JToggleButton button, int relaisNumber) {
+ this.button = button;
+ this.relaisNumber = relaisNumber;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ netzdose.setRelais(relaisNumber,
+ button.isSelected() ? NetzdoseKonstanten.STATE_ON
+ : NetzdoseKonstanten.STATE_OFF);
+ LogMediator.getInstance().log("toggled " + relaisNumber + " = " + netzdose.getRelais(relaisNumber));
+ }
+
+ }
+}
--- /dev/null
+/*
+ * Created on 12.05.2007
+ *
+ * To change this generated comment go to
+ * Window>Preferences>Java>Code Generation>Code Template
+ */
+package de.bytewurf.projekte.netzschalter;
+
+import java.awt.Dimension;
+import java.text.DateFormat;
+import java.util.Date;
+
+import javax.swing.JTextArea;
+
+/**
+ * @author felix
+ */
+public class TextAreaLogger extends JTextArea implements Loggable {
+
+ public TextAreaLogger() {
+ setMinimumSize(new Dimension(80,60));
+ setPreferredSize(new Dimension(400,60));
+ this.setRows(6);
+ this.setEditable(false);
+ LogMediator.getInstance().addObserver(this);
+ }
+
+ public void log(String message) {
+ append(DateFormat.getInstance().format(new Date()) + ": " + message + "\n");
+ }
+}
--- /dev/null
+/*
+ * Created on 12.05.2007
+ *
+ * To change this generated comment go to
+ * Window>Preferences>Java>Code Generation>Code Template
+ */
+package de.bytewurf.projekte.netzschalter;
+
+/**
+ * @author felix
+ */
+public class NetzdosenMockup implements Netzdose {
+
+ byte relaisState = 0;
+
+ public int getNumberOfRelais() {
+ return 8;
+ }
+
+ public int getRelais(int relaisNumber) {
+ if ((relaisNumber < 0) || (relaisNumber >= getNumberOfRelais()))
+ throw new IllegalArgumentException("Kein gültiger Wert");
+
+ return ((relaisState & (1 << relaisNumber)) == (1 << relaisNumber)) ? NetzdoseKonstanten.STATE_ON
+ : NetzdoseKonstanten.STATE_OFF;
+ }
+
+ public void setRelais(int relaisNumber, int state) {
+ if ((relaisNumber < 0) || (relaisNumber >= getNumberOfRelais()))
+ throw new IllegalArgumentException("Kein gültiger Wert");
+
+ if (state == NetzdoseKonstanten.STATE_ON)
+ relaisState |= (1 << relaisNumber);
+ else
+ relaisState &= ~(1 << relaisNumber);
+ }
+
+}
--- /dev/null
+/*
+ * Created on 12.05.2007
+ *
+ * To change this generated comment go to
+ * Window>Preferences>Java>Code Generation>Code Template
+ */
+package de.bytewurf.projekte.netzschalter;
+
+import junit.framework.TestCase;
+
+/**
+ * @author felix
+ */
+public class NetzdosenMockupTest extends TestCase {
+
+ private Netzdose netzdose;
+
+ protected void setUp() throws Exception {
+ netzdose = new NetzdosenMockup();
+ netzdose.setRelais(4, NetzdoseKonstanten.STATE_ON);
+ netzdose.setRelais(7, NetzdoseKonstanten.STATE_ON);
+ }
+
+ public void testSetRelaisArguments() {
+ netzdose.setRelais(0, NetzdoseKonstanten.STATE_ON);
+ netzdose.setRelais(3, NetzdoseKonstanten.STATE_ON);
+ netzdose.setRelais(7, NetzdoseKonstanten.STATE_ON);
+ assertTrue("8 ist kein gültiger Wert", checkSetRelaisWithException(8));
+ assertTrue("-1 ist kein gültiger Wert", checkSetRelaisWithException(-1));
+ }
+
+ private boolean checkSetRelaisWithException(int relaisNumber) {
+ boolean exceptionOccured = false;
+ try {
+ netzdose.setRelais(relaisNumber, NetzdoseKonstanten.STATE_ON);
+ } catch (IllegalArgumentException e) {
+ exceptionOccured = true;
+ }
+ return exceptionOccured;
+ }
+
+ public void testGetRelaisArguments() {
+ assertEquals(NetzdoseKonstanten.STATE_OFF, netzdose.getRelais(0));
+ assertEquals(NetzdoseKonstanten.STATE_OFF, netzdose.getRelais(3));
+ assertEquals(NetzdoseKonstanten.STATE_ON, netzdose.getRelais(4));
+ assertEquals(NetzdoseKonstanten.STATE_ON, netzdose.getRelais(7));
+ assertTrue("8 ist kein gültiger Wert", checkGetRelaisWithException(8));
+ assertTrue("-1 ist kein gültiger Wert", checkGetRelaisWithException(-1));
+ }
+
+ private boolean checkGetRelaisWithException(int relaisNumber) {
+ boolean exceptionOccured = false;
+ try {
+ netzdose.getRelais(relaisNumber);
+ } catch (IllegalArgumentException e) {
+ exceptionOccured = true;
+ }
+ return exceptionOccured;
+ }
+
+ public void testGetNumberOfRelais() {
+ assertEquals(8, netzdose.getNumberOfRelais());
+ }
+}