From d5533ed5f648124a9e6203297c1d86aa706671ba Mon Sep 17 00:00:00 2001
From: Gregor Riegler <gregor.riegler@gmail.com>
Date: Wed, 1 May 2013 23:27:19 +0200
Subject: [PATCH] First running MozartSpaces communication: PizzeriaGUI writes
 free tables to space after creation and a waiter can read it.

---
 README.md                                     | 16 ++-
 pom.xml                                       | 83 +++++++++++++++-
 run Group.launch                              |  4 +-
 run Pizzeria.launch                           |  9 +-
 run Space Server.launch                       | 15 +++
 run Waiter 1.launch                           | 21 ++++
 .../sbc/valesriegler/common/PizzaType.java    |  4 +-
 .../sbc/valesriegler/common/SpaceUtil.java    | 28 ++++++
 .../sbc/valesriegler/common/TableModel.java   |  3 +-
 .../tuwien/sbc/valesriegler/group/Group.java  |  3 +-
 .../sbc/valesriegler/group/GroupState.java    |  4 +-
 .../sbc/valesriegler/group/MinimalGroup.java  |  4 +-
 .../valesriegler/pizzeria/PizzeriaAgent.java  | 98 +++++++++++++++++--
 .../pizzeria/gui/PizzeriaFrame.java           | 32 ++++--
 .../sbc/valesriegler/pizzeria/gui/Table.java  |  4 +-
 .../gui/tablemodels/OrdersOverviewModel.java  |  4 -
 .../gui/tablemodels/TablesOverviewModel.java  | 40 ++++----
 .../sbc/valesriegler/xvsm/XVSMConnector.java  | 67 +++++++++++++
 .../sbc/valesriegler/xvsm/waiter/Waiter.java  | 73 ++++++++++++++
 src/main/resources/dummy                      |  1 -
 src/main/resources/log4j.properties           |  3 +-
 src/main/resources/logback.xml                | 67 +++++++++++++
 src/main/resources/mozartspaces-client.xml    | 12 +++
 23 files changed, 543 insertions(+), 52 deletions(-)
 create mode 100644 run Space Server.launch
 create mode 100644 run Waiter 1.launch
 create mode 100644 src/main/java/at/ac/tuwien/sbc/valesriegler/common/SpaceUtil.java
 create mode 100644 src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/XVSMConnector.java
 create mode 100644 src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/waiter/Waiter.java
 delete mode 100644 src/main/resources/dummy
 create mode 100644 src/main/resources/logback.xml
 create mode 100644 src/main/resources/mozartspaces-client.xml

diff --git a/README.md b/README.md
index 2f71a22..5f077b4 100644
--- a/README.md
+++ b/README.md
@@ -3,12 +3,20 @@ Space Based Computing SS 2013
 ### How to start the Group GUI
 		mvn exec:java -Dexec.mainClass="at.ac.tuwien.sbc.valesriegler.group.GroupAgent" 
 		
-### How to start the Pizzeria GUI
-		mvn exec:java -Dexec.mainClass="at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent" 
+### How to start the JMS Pizzeria GUI
+		mvn exec:java -Dexec.mainClass="at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent" -Dexec.args="JMS"
 
-### How to start a Waiter with Id 1
+### How to start a JMS Waiter with Id 1
 		mvn exec:java -Dexec.mainClass="at.ac.tuwien.sbc.valesriegler.jms.waiter.Waiter" -Dexec.args="1"
 
-### How to start a Cook with Id 1
+### How to start a JMS Cook with Id 1
 		mvn exec:java -Dexec.mainClass="at.ac.tuwien.sbc.valesriegler.jms.cook.Cook" -Dexec.args="1"
 		
+### How to start the Space Server
+		mvn exec:java -Dexec.mainClass="org.mozartspaces.core.Server"
+		
+### How to start the Space Pizzeria GUI
+		mvn exec:java -Dexec.mainClass="at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent" -Dexec.args="XVSM" -Dmozartspaces.configurationFile="mozartspaces-client.xml"
+		
+### How to start a Space Waiter with Id 1
+		mvn exec:java -Dexec.mainClass="at.ac.tuwien.sbc.valesriegler.xvsm.waiter.Waiter" -Dexec.args="1" -Dmozartspaces.configurationFile="mozartspaces-client.xml"
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 63c6872..fe96bd4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,16 +24,34 @@
 			<groupId>org.apache.activemq</groupId>
 			<artifactId>activemq-all</artifactId>
 			<version>5.8.0</version>
+			<exclusions>
+				<exclusion>
+					<groupId>ch.qos.logback</groupId>
+					<artifactId>logback-classic</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
+		<dependency>
+			<groupId>org.mozartspaces</groupId>
+			<artifactId>mozartspaces-runtime</artifactId>
+			<version>2.2-SNAPSHOT</version>
+			<exclusions>
+				<exclusion>
+					<groupId>ch.qos.logback</groupId>
+					<artifactId>logback-classic</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
 	</dependencies>
 
 	<build>
 		<plugins>
-			<plugin>
+			<!-- <plugin>
 				<groupId>org.codehaus.mojo</groupId>
 				<artifactId>exec-maven-plugin</artifactId>
 				<version>1.2.1</version>
-			</plugin>
+			</plugin> -->
 		</plugins>
 		<pluginManagement>
 			<plugins>
@@ -55,6 +73,67 @@
 				</plugin>
 			</plugins>
 		</pluginManagement>
+
+
 	</build>
 
+	<repositories>
+		<repository>
+			<id>mozartspaces</id>
+			<url>http://www.mozartspaces.org/maven-snapshots</url>
+		</repository>
+	</repositories>
+
+	<profiles>
+		<profile>
+			<id>server</id>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>exec-maven-plugin</artifactId>
+						<executions>
+							<execution>
+								<phase>install</phase>
+								<goals>
+									<goal>java</goal>
+								</goals>
+							</execution>
+						</executions>
+						<configuration>
+							<mainClass>org.mozartspaces.core.Server</mainClass>
+							<arguments>
+								<argument>4242</argument>
+							</arguments>
+							<classpathScope>runtime</classpathScope>
+						</configuration>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		
+		<profile>
+			<id>pizzeria</id>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>exec-maven-plugin</artifactId>
+						<configuration>
+							<executable>java</executable>
+							<arguments>
+								<argument>-Dmozartspaces.configurationFile=mozartspaces-client.xml</argument>
+								<argument>-classpath</argument>
+								<classpath />
+								<argument>at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent</argument>
+						<!-- 		<argument>xvsm://localhost:4242</argument> -->
+							</arguments>
+						</configuration>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
+
+
 </project>
\ No newline at end of file
diff --git a/run Group.launch b/run Group.launch
index fadfd2a..eed0477 100644
--- a/run Group.launch	
+++ b/run Group.launch	
@@ -5,7 +5,9 @@
 <booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
 <booleanAttribute key="M2_OFFLINE" value="false"/>
 <stringAttribute key="M2_PROFILES" value=""/>
-<listAttribute key="M2_PROPERTIES"/>
+<listAttribute key="M2_PROPERTIES">
+<listEntry value="mozartspaces.configurationFile=mozartspaces-client.xml"/>
+</listAttribute>
 <stringAttribute key="M2_RUNTIME" value="EMBEDDED"/>
 <booleanAttribute key="M2_SKIP_TESTS" value="false"/>
 <booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
diff --git a/run Pizzeria.launch b/run Pizzeria.launch
index a31fc91..5f9ef6f 100644
--- a/run Pizzeria.launch	
+++ b/run Pizzeria.launch	
@@ -5,11 +5,14 @@
 <booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
 <booleanAttribute key="M2_OFFLINE" value="false"/>
 <stringAttribute key="M2_PROFILES" value=""/>
-<listAttribute key="M2_PROPERTIES"/>
+<listAttribute key="M2_PROPERTIES">
+<listEntry value="mozartspaces.configurationFile=mozartspaces-client.xml"/>
+</listAttribute>
 <stringAttribute key="M2_RUNTIME" value="EMBEDDED"/>
 <booleanAttribute key="M2_SKIP_TESTS" value="false"/>
 <booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
 <booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dexec.mainClass=&quot;at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent&quot;"/>
-<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="/home/greg/sbc-workspace/vales-riegler"/>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.7.0_07"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dexec.mainClass=&quot;at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent&quot; -Dexec.args=&quot;XVSM&quot;"/>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:/vales-riegler}"/>
 </launchConfiguration>
diff --git a/run Space Server.launch b/run Space Server.launch
new file mode 100644
index 0000000..c07f048
--- /dev/null
+++ b/run Space Server.launch	
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">
+<booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/>
+<stringAttribute key="M2_GOALS" value="exec:java"/>
+<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
+<booleanAttribute key="M2_OFFLINE" value="false"/>
+<stringAttribute key="M2_PROFILES" value=""/>
+<listAttribute key="M2_PROPERTIES"/>
+<stringAttribute key="M2_RUNTIME" value="EMBEDDED"/>
+<booleanAttribute key="M2_SKIP_TESTS" value="false"/>
+<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
+<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dexec.mainClass=&quot;org.mozartspaces.core.Server&quot;"/>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="/home/greg/sbc-workspace/vales-riegler"/>
+</launchConfiguration>
diff --git a/run Waiter 1.launch b/run Waiter 1.launch
new file mode 100644
index 0000000..66424de
--- /dev/null
+++ b/run Waiter 1.launch	
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">
+<booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/>
+<stringAttribute key="M2_GOALS" value="exec:java"/>
+<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
+<booleanAttribute key="M2_OFFLINE" value="false"/>
+<stringAttribute key="M2_PROFILES" value=""/>
+<listAttribute key="M2_PROPERTIES">
+<listEntry value="mozartspaces.configurationFile=mozartspaces-client.xml"/>
+</listAttribute>
+<stringAttribute key="M2_RUNTIME" value="EMBEDDED"/>
+<booleanAttribute key="M2_SKIP_TESTS" value="false"/>
+<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
+<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>
+<stringAttribute key="bad_container_name" value="/vales-riegler/group"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dexec.mainClass=&quot;at.ac.tuwien.sbc.valesriegler.xvsm.waiter.Waiter&quot; -Dexec.args=&quot;1&quot;"/>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="/home/greg/sbc-workspace/vales-riegler"/>
+</launchConfiguration>
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/common/PizzaType.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/common/PizzaType.java
index ee61c7b..9e44555 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/common/PizzaType.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/common/PizzaType.java
@@ -1,6 +1,8 @@
 package at.ac.tuwien.sbc.valesriegler.common;
 
-public enum PizzaType {
+import java.io.Serializable;
+
+public enum PizzaType implements Serializable {
 	MARGHERITA(5, 3), SALAMI(5.5, 7), CARDINALE(6,5);
 	
 	public final double price;
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/common/SpaceUtil.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/common/SpaceUtil.java
new file mode 100644
index 0000000..81f7bf3
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/common/SpaceUtil.java
@@ -0,0 +1,28 @@
+package at.ac.tuwien.sbc.valesriegler.common;
+
+import java.net.URI;
+import java.util.List;
+
+import org.mozartspaces.capi3.Coordinator;
+import org.mozartspaces.core.Capi;
+import org.mozartspaces.core.ContainerReference;
+import org.mozartspaces.core.MzsConstants.Container;
+import org.mozartspaces.core.MzsConstants.RequestTimeout;
+import org.mozartspaces.core.MzsCoreException;
+
+public abstract class SpaceUtil {
+	public static final String TABLES_CONTAINER = "tables";
+	public static final String SERVER_ADDR = "xvsm://localhost:9876";
+	public static ContainerReference getOrCreateNamedContainer(final String spaceUri, final String containerName, final Capi capi, final List<Coordinator> coordinators)
+			throws MzsCoreException {
+
+		ContainerReference container;
+		try {
+			container = capi.lookupContainer(containerName, URI.create(spaceUri), RequestTimeout.DEFAULT, null);
+		} catch (MzsCoreException e) {
+			container = capi.createContainer(containerName, URI.create(spaceUri), Container.UNBOUNDED, coordinators, null, null);
+		}
+		return container;
+	}
+
+}
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/common/TableModel.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/common/TableModel.java
index 729a9dd..f03350a 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/common/TableModel.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/common/TableModel.java
@@ -1,6 +1,7 @@
 package at.ac.tuwien.sbc.valesriegler.common;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import javax.swing.table.AbstractTableModel;
@@ -14,7 +15,7 @@ import javax.swing.table.AbstractTableModel;
 public abstract class TableModel<Item> extends AbstractTableModel {
 	protected static final String UNHANDLEDCOLUMN = "Unhandled column";
 	
-	protected final List<Item> items = new ArrayList<Item>();
+	protected final List<Item> items = Collections.synchronizedList(new ArrayList<Item>());
 	
 	public void addItems(List<Item> newItems) {
 		items.addAll(newItems);
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/Group.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/Group.java
index f95187a..f7f87fb 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/Group.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/Group.java
@@ -1,11 +1,12 @@
 package at.ac.tuwien.sbc.valesriegler.group;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
 import at.ac.tuwien.sbc.valesriegler.common.PizzaType;
 
-public class Group {
+public class Group implements Serializable {
 	private MinimalGroup minimalGroup = new MinimalGroup();
 	
 	private List<PizzaType> pizzas = new ArrayList<PizzaType>();
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/GroupState.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/GroupState.java
index c2f499b..1b9e817 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/GroupState.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/GroupState.java
@@ -1,5 +1,7 @@
 package at.ac.tuwien.sbc.valesriegler.group;
 
-public enum GroupState {
+import java.io.Serializable;
+
+public enum GroupState implements Serializable {
 	WAITING, SITTING, ORDERED, EATING, PAY, GONE
 }
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/MinimalGroup.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/MinimalGroup.java
index 1e4a317..dd97a4b 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/group/MinimalGroup.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/group/MinimalGroup.java
@@ -1,11 +1,13 @@
 package at.ac.tuwien.sbc.valesriegler.group;
 
+import java.io.Serializable;
+
 /**
  * A group bean which only has an id and a size.
  * 
  * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
  */
-public class MinimalGroup {
+public class MinimalGroup implements Serializable {
 	private int id;
 	private int size;
 	
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/PizzeriaAgent.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/PizzeriaAgent.java
index a221c69..a45bf22 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/PizzeriaAgent.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/PizzeriaAgent.java
@@ -1,8 +1,31 @@
 package at.ac.tuwien.sbc.valesriegler.pizzeria;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import javax.swing.SwingUtilities;
 
+import org.mozartspaces.capi3.AnyCoordinator;
+import org.mozartspaces.capi3.Coordinator;
+import org.mozartspaces.core.Capi;
+import org.mozartspaces.core.ContainerReference;
+import org.mozartspaces.core.DefaultMzsCore;
+import org.mozartspaces.core.Entry;
+import org.mozartspaces.core.MzsCore;
+import org.mozartspaces.core.MzsCoreException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.ac.tuwien.sbc.valesriegler.common.SpaceUtil;
 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.PizzeriaFrame;
+import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.Table;
+import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.GroupsOverviewModel;
+import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.OrdersOverviewModel;
+import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.PizzasOfOrderModel;
+import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.TablesOverviewModel;
+import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.WaitersOfOrderModel;
+import at.ac.tuwien.sbc.valesriegler.xvsm.XVSMConnector;
 /**
  * The Main class of the Pizzeria compoment.
  * <p />
@@ -12,21 +35,82 @@ import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.PizzeriaFrame;
  *
  */
 public class PizzeriaAgent {
+	private static final Logger log = LoggerFactory.getLogger(PizzeriaAgent.class);
+
+	private static final String USAGE = "Usage: java PizzeriaAgent XVSM|JMS";
+
+	private OrdersOverviewModel ordersModel;
+	private GroupsOverviewModel groupModel;
+	private TablesOverviewModel tablesModel;
+	private WaitersOfOrderModel waitersModel;
+	private PizzasOfOrderModel pizzasModel;
+
+	private XVSMConnector xvsm;
 
 	public static void main(String[] args) {
-		// TODO initiate communication
-		
-		SwingUtilities.invokeLater(new PizzeriaGUI());
-		
+		if(args.length != 1) {
+			throw new IllegalArgumentException(USAGE);
+		} else {
+			String mom = args[0];
+			log.info(mom);
+			PizzeriaAgent pizzeriaAgent = new PizzeriaAgent();
+			switch(mom) {
+			case "XVSM" : pizzeriaAgent.createModels(); pizzeriaAgent.initXVSM(); pizzeriaAgent.initGUI(); break;
+			case "JMS" : pizzeriaAgent.createModels(); pizzeriaAgent.initJMS(); pizzeriaAgent.initGUI(); break;
+			default : throw new IllegalArgumentException(USAGE);
+			}
+			
+		}
+	}
+
+	private void initJMS() {
+		// do what you have to do
+	}
+
+	private void initXVSM() {
+		try {
+			xvsm = new XVSMConnector();
+			xvsm.initSpaceCommunication();
+			
+		} catch (MzsCoreException e) {
+			log.error(e.getMessage());
+			log.error("The Pizzeria has no Space connection! Have you started the Space Server?");
+			System.exit(1);
+		}
+	}
+
+	private void initGUI() {
+		PizzeriaGUI gui = new PizzeriaGUI();
+		SwingUtilities.invokeLater(gui);
 	}
 	
-	static class PizzeriaGUI implements Runnable {
+	class PizzeriaGUI implements Runnable {
 		@Override
 		public void run() {
-			PizzeriaFrame frame = new PizzeriaFrame();
+			PizzeriaFrame frame = new PizzeriaFrame(ordersModel, groupModel, tablesModel, waitersModel, pizzasModel);
+			frame.setOnTablesCreatedHandler(new TablesCreatedHandler() {
+
+				@Override
+				public void freeTablesCreated(List<Table> tables) {
+					xvsm.sendFreeTablesToSpace(tables);
+				}
+				
+			});
+			frame.start();
 			frame.pack();
 			frame.setVisible(true);
 		}
 	}
-
+	
+	private void createModels() {
+		ordersModel = new OrdersOverviewModel();
+		groupModel = new GroupsOverviewModel();
+		tablesModel = new TablesOverviewModel();
+		waitersModel = new WaitersOfOrderModel();
+		pizzasModel = new PizzasOfOrderModel();
+	}
+	
+	public interface TablesCreatedHandler {
+		public void freeTablesCreated(List<Table> tables);
+	}
 }
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java
index 75f46aa..4783393 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java
@@ -22,6 +22,8 @@ import javax.swing.event.TableModelListener;
 
 import at.ac.tuwien.sbc.valesriegler.common.PizzaType;
 import at.ac.tuwien.sbc.valesriegler.common.TableModel;
+import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
+import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent.TablesCreatedHandler;
 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.PizzaOrder.PizzaOrderStatus;
 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.GroupsOverviewModel;
 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.OrdersOverviewModel;
@@ -48,10 +50,20 @@ public class PizzeriaFrame extends JFrame {
 	private TablesOverviewModel tablesModel;
 	private WaitersOfOrderModel waitersModel;
 	private PizzasOfOrderModel pizzasModel;
+	
+	private TablesCreatedHandler onTablesCreatedHandler;
 
-	public PizzeriaFrame() {
+	public PizzeriaFrame(OrdersOverviewModel ordersModel, GroupsOverviewModel groupModel, TablesOverviewModel tablesModel, WaitersOfOrderModel waitersModel, PizzasOfOrderModel pizzasModel) {
 		super("Pizzeria");
+		
+		this.ordersModel = ordersModel;
+		this.groupModel = groupModel;
+		this.tablesModel = tablesModel;
+		this.waitersModel = waitersModel;
+		this.pizzasModel = pizzasModel;
+	}
 
+	public void start() {
 		initModels();
 
 		JPanel wrapper = new JPanel();
@@ -99,12 +111,13 @@ public class PizzeriaFrame extends JFrame {
 
 	private void initModels() {
 		List<Order> orders = getOrdersTestData();
+		ordersModel.setItems(orders);
+		
+		// When the tables get created in the first place, the handler is informed
+		int numberOfTables = getNumberOfTables();
+		List<Table> freeTablesCreated = tablesModel.createFreeTables(numberOfTables);
+		onTablesCreatedHandler.freeTablesCreated(freeTablesCreated);
 
-		ordersModel = new OrdersOverviewModel(orders);
-		groupModel = new GroupsOverviewModel();
-		tablesModel = new TablesOverviewModel(getNumberOfTables());
-		waitersModel = new WaitersOfOrderModel();
-		pizzasModel = new PizzasOfOrderModel();
 	}
 
 	private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
@@ -204,6 +217,9 @@ public class PizzeriaFrame extends JFrame {
 		return table;
 	}
 
+	/**
+	 * not necessary in production
+	 */
 	private List<Order> getOrdersTestData() {
 		List<Order> orders = new ArrayList<>();
 		Order order1 = new Order();
@@ -238,4 +254,8 @@ public class PizzeriaFrame extends JFrame {
 		return String.format(FREE_TABLES, tablesModel.getNumberOfFreeTables());
 	}
 
+	public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
+		this.onTablesCreatedHandler = tablesCreatedHandler;
+	}
+
 }
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/Table.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/Table.java
index 5ee0531..90fdf42 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/Table.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/Table.java
@@ -1,6 +1,8 @@
 package at.ac.tuwien.sbc.valesriegler.pizzeria.gui;
 
-public class Table {
+import java.io.Serializable;
+
+public class Table implements Serializable {
 
 	private int id;
 	private TableStatus status;
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/OrdersOverviewModel.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/OrdersOverviewModel.java
index abdbfae..5d4f47c 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/OrdersOverviewModel.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/OrdersOverviewModel.java
@@ -16,10 +16,6 @@ public class OrdersOverviewModel extends TableModel<Order> {
 		ID, TABLE_ID, GROUP_ID, STATUS
 	};
 	
-	public OrdersOverviewModel(List<Order> defaultOrders) {
-		setItems(defaultOrders);
-	}
-
 	@Override
 	public Object getValueAt(int rowIndex, int columnIndex) {
 		Order order = items.get(rowIndex);
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/TablesOverviewModel.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/TablesOverviewModel.java
index 67c1311..1bf9c3f 100644
--- a/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/TablesOverviewModel.java
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/tablemodels/TablesOverviewModel.java
@@ -15,11 +15,6 @@ public class TablesOverviewModel extends TableModel<Table> {
 		TABLE_ID, STATUS, GROUP_ID
 	};
 	private int idCounter = 1;
-	
-	public TablesOverviewModel(int numberOfTables) {
-		createFreeTables(numberOfTables);
-	}
-
 
 	@Override
 	protected String[] getColumns() {
@@ -39,23 +34,34 @@ public class TablesOverviewModel extends TableModel<Table> {
 	}
 
 	public int getNumberOfFreeTables() {
-		int i=0;
-		for(Table table : items) {
-			if(table.getStatus() == TableStatus.FREE) {
-				i = i+1;
+		return getIdsOfFreeTables().size();
+	}
+	
+	public List<Integer> getIdsOfFreeTables() {
+		List<Integer> ids = new ArrayList<>();
+		
+		synchronized(items) {
+			for(Table table : items) {
+				if(table.getStatus() == TableStatus.FREE) {
+					ids.add(table.getId());
+				}
 			}
 		}
-		return i;
+		
+		return ids;
 	}
 	
-
-	private void createFreeTables(int numberOfTables) {
-		List<Table> tables = new ArrayList<Table>();
-		for(int i=0; i<numberOfTables; i++) {
-			Table table = createFreeTable();
-			tables.add(table);
+	public List<Table> createFreeTables(int numberOfTables) {
+		synchronized(items) {
+			List<Table> tables = new ArrayList<Table>();
+			for(int i=0; i<numberOfTables; i++) {
+				Table table = createFreeTable();
+				tables.add(table);
+			}
+			addItems(tables);
+			
+			return tables;
 		}
-		addItems(tables);
 	}
 	
 	private Table createFreeTable() {
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/XVSMConnector.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/XVSMConnector.java
new file mode 100644
index 0000000..465b315
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/XVSMConnector.java
@@ -0,0 +1,67 @@
+package at.ac.tuwien.sbc.valesriegler.xvsm;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.mozartspaces.capi3.AnyCoordinator;
+import org.mozartspaces.capi3.Coordinator;
+import org.mozartspaces.core.Capi;
+import org.mozartspaces.core.ContainerReference;
+import org.mozartspaces.core.DefaultMzsCore;
+import org.mozartspaces.core.Entry;
+import org.mozartspaces.core.MzsCore;
+import org.mozartspaces.core.MzsCoreException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.ac.tuwien.sbc.valesriegler.common.SpaceUtil;
+import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.Table;
+
+/**
+ * Responsible for XVSM Communication
+ * 
+ * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
+ *
+ */
+public class XVSMConnector {
+	private static final Logger log = LoggerFactory.getLogger(XVSMConnector.class);
+	
+	private ContainerReference tablesContainer;
+	private Capi capi;
+
+	
+	public void initSpaceCommunication() throws MzsCoreException {
+		MzsCore core = DefaultMzsCore.newInstanceWithoutSpace();
+		capi = new Capi(core);
+		tablesContainer = SpaceUtil.getOrCreateNamedContainer(SpaceUtil.SERVER_ADDR, SpaceUtil.TABLES_CONTAINER, capi, Arrays.asList((Coordinator) new AnyCoordinator()));
+	}
+	
+	public void sendFreeTablesToSpace(List<Table> tables) {
+		try {
+			List<Entry> entries = new ArrayList<>();
+			for (Table table : tables) {
+				entries.add(new Entry(table));
+			}
+			capi.write(entries, tablesContainer);
+			
+			log.info("Wrote Free tables to Space!");
+		} catch (MzsCoreException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public List<Table> readTables() {
+		ArrayList<Table> tables = new ArrayList<>();
+		try {
+			tables = capi.take(tablesContainer);
+		} catch (MzsCoreException e) {
+			log.error(e.getMessage());
+			e.printStackTrace();
+			System.exit(1);
+		}
+		return tables;
+	}
+
+}
diff --git a/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/waiter/Waiter.java b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/waiter/Waiter.java
new file mode 100644
index 0000000..f16e843
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sbc/valesriegler/xvsm/waiter/Waiter.java
@@ -0,0 +1,73 @@
+package at.ac.tuwien.sbc.valesriegler.xvsm.waiter;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.mozartspaces.core.MzsCoreException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.Table;
+import at.ac.tuwien.sbc.valesriegler.xvsm.XVSMConnector;
+
+/**
+ * This is a waiter using XVSM
+ * 
+ * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
+ *
+ */
+public class Waiter implements Serializable {
+	private static final String USAGE = "Waiter needs exactly one parameter: ID of type Integer";
+	private static final Logger log = LoggerFactory.getLogger(Waiter.class);
+	
+	private int id;
+	private XVSMConnector xvsm;
+
+	public static void main(String[] args) {
+		if(args.length != 1) {
+			throw new IllegalArgumentException(USAGE);
+		}
+		
+		int parsedId = 0;
+		try {
+			parsedId = Integer.parseInt(args[0]);
+		} catch (NumberFormatException e) {
+			log.error(USAGE);
+			return;
+		}
+		
+		Waiter waiter = new Waiter(parsedId);
+		waiter.start();
+	}
+
+	private void start() {
+		initSpaceCommunication();
+		
+		List<Table> tables = xvsm.readTables();
+		
+		log.info("Number of free tables received: {}", tables.size());
+		
+	}
+	
+	private void initSpaceCommunication() {
+		try {
+			xvsm = new XVSMConnector();
+			xvsm.initSpaceCommunication();
+		} catch (MzsCoreException e) {
+			log.error(e.getMessage());
+			log.error("The Waiter has no Space connection! Have you started the Space Server?");
+			System.exit(1);
+		}
+		
+		log.info("Space Connection established!");
+		
+		
+	}
+
+	public Waiter(int id) {
+		this.id = id;
+		log.info("I AM A WAITER WITH ID {}", id);
+	}
+
+}
+
diff --git a/src/main/resources/dummy b/src/main/resources/dummy
deleted file mode 100644
index 2a51033..0000000
--- a/src/main/resources/dummy
+++ /dev/null
@@ -1 +0,0 @@
-just a dummy such that git can maintain the directory structure needed by maven
\ No newline at end of file
diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties
index dc58a1c..101a101 100644
--- a/src/main/resources/log4j.properties
+++ b/src/main/resources/log4j.properties
@@ -8,4 +8,5 @@ log4j.appender.A1=org.apache.log4j.ConsoleAppender
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
 
-log4j.category.org.apache.wicket=WARN
\ No newline at end of file
+log4j.category.org.apache.wicket=WARN
+log4j.category.org.mozartspaces=WARN
\ No newline at end of file
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
new file mode 100644
index 0000000..552fd62
--- /dev/null
+++ b/src/main/resources/logback.xml
@@ -0,0 +1,67 @@
+<configuration scan="false" scanPeriod="60 seconds">
+
+	<!-- 
+		The logback configuration manual is online at
+		http://logback.qos.ch/manual/configuration.html.
+		Logback tries to read a configuration file named logback.groovy,
+		logback-test.xml or logback.xml (in that order) from the classpath.
+		Use -Dlogback.configurationFile=/path/to/config.xml to set a different
+		path or filename.
+	-->
+
+	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+		<!--
+			encoders are assigned the type
+			ch.qos.logback.classic.encoder.PatternLayoutEncoder by default
+		-->
+		<encoder>
+			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+			<!-- 
+				The pattern layout configuration is explained at
+			    http://logback.qos.ch/manual/layouts.html#ClassicPatternLayout
+			 -->
+		</encoder>
+	</appender>
+
+	<!--  
+	<appender name="file" class="ch.qos.logback.core.FileAppender">
+		<append>false</append>
+		<file>MozartSpaces.log</file>
+    	<encoder>
+      		<pattern>%date %-5level [%thread] %logger{10} - %msg%n</pattern>
+    	</encoder>
+  	</appender>
+	-->
+
+	<!-- for further appenders see http://logback.qos.ch/manual/appenders.html -->
+	
+	
+	<root level="INFO">
+		<appender-ref ref="stdout"/>
+		<!-- appender-ref ref="file"/ -->		
+	</root>
+	
+	<!-- 
+		Log levels and their ordering: TRACE < DEBUG < INFO < WARN < ERROR
+		Additional values for "level" in the configuration:
+		* ALL, OFF
+		* INHERITED or NULL (not for root)
+	-->
+	
+	<!-- 
+	<logger name="org.mozartspaces.core" level="TRACE"/>
+	 -->
+	 
+	<!-- 
+		Logging with multiple MozartSpaces instances on the same machine:
+		
+		To have separate logback configuration files for different MozartSpaces
+		instances you can set the configuration file name with a system property:
+		java -Dlogback.configurationFile=/path/to/config.xml MozartSpacesApp
+		
+		To have separated log files for different MozartSpaces instances (with
+		the same logback configuration) you can use variable substitution in the
+		configuration file, e.g., in the FileAppender configuration section. See
+		http://logback.qos.ch/manual/joran.html#variableSubstitution for details.		
+	 -->
+</configuration>
diff --git a/src/main/resources/mozartspaces-client.xml b/src/main/resources/mozartspaces-client.xml
new file mode 100644
index 0000000..36185f0
--- /dev/null
+++ b/src/main/resources/mozartspaces-client.xml
@@ -0,0 +1,12 @@
+<mozartspacesCoreConfig>
+	<embeddedSpace>false</embeddedSpace>
+	<remoting>
+		<transports>
+			<tcpsocket scheme="xvsm">
+				<receiverPort>0</receiverPort>
+			</tcpsocket>
+		</transports>
+	</remoting>
+	<spaceURI>${remoting.defaultScheme}://localhost:${remoting.transports.tcpsocket.receiverPort}
+</spaceURI>
+</mozartspacesCoreConfig>
-- 
2.43.0