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="at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent""/>
-<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="at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent" -Dexec.args="XVSM""/>
+<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="org.mozartspaces.core.Server""/>
+<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="at.ac.tuwien.sbc.valesriegler.xvsm.waiter.Waiter" -Dexec.args="1""/>
+<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.47.3