1 package at.ac.tuwien.sbc.valesriegler.xvsm.spacehelpers;
3 import at.ac.tuwien.sbc.valesriegler.common.Util;
4 import at.ac.tuwien.sbc.valesriegler.xvsm.AbstractXVSMConnector;
5 import org.mozartspaces.notifications.Notification;
6 import org.mozartspaces.notifications.NotificationListener;
7 import org.mozartspaces.notifications.Operation;
8 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory;
11 import java.io.Serializable;
12 import java.util.Date;
13 import java.util.List;
14 import java.util.Timer;
15 import java.util.TimerTask;
19 * The SpaceListener provides the {@link NotificationListener} interface.
21 * In {@link SpaceListener#getEntries()} a method for reading the entities, that are normally expected from the notification,
22 * must be supplied. Thus, it's possible in {@link SpaceListener#startHandlingAbsenceOfNotifications()} to start a timer and to
23 * execute the actions, which are normally triggered by the notification, with space objects read from {@link SpaceListener#getEntries()}.
24 * If {@link SpaceListener#lookAround} is true the timer periodically checks if the corresponding {@link at.ac.tuwien.sbc.valesriegler.xvsm.AbstractXVSMConnector#timeOflastOperation} is old enough (= the agent is idle for some time)
25 * and possibly executes the action as a result.
27 * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
30 public abstract class SpaceListener implements NotificationListener {
31 private static final Logger log = LoggerFactory
32 .getLogger(SpaceListener.class);
34 protected boolean lookAround = true;
35 protected long timeout = 3000;
37 protected SpaceAction spaceAction;
40 public boolean noNotification;
42 public void entryOperationFinished(Notification arg0, Operation arg1,
43 List<? extends Serializable> entries) {
44 synchronized (AbstractXVSMConnector.lockObject) {
45 AbstractXVSMConnector.timeOflastOperation.set(new Date().getTime());
47 // log.info("I am running a notification now!");
48 spaceAction.inNotification.set(true);
49 spaceAction.onEntriesWritten(entries);
50 } catch (Exception e) {
51 // e.printStackTrace();
57 abstract List<? extends Serializable> getEntries() throws Exception;
59 public SpaceAction getSpaceAction() {
63 public void startHandlingAbsenceOfNotifications() {
64 if(!lookAround || Util.runSimulation) return;
65 AbstractXVSMConnector.timeOflastOperation.set(new Date().getTime() + 3500);
67 Timer timer = new Timer();
69 timer.schedule(new SpaceTask(), 3000, 3000);
72 class SpaceTask extends TimerTask {
76 if(new Date().getTime()-timeout <= AbstractXVSMConnector.timeOflastOperation.get()) {
79 synchronized(AbstractXVSMConnector.lockObject) {
81 AbstractXVSMConnector.timeOflastOperation.set(new Date().getTime());
83 List<? extends Serializable> entries = getEntries();
84 if(entries.size() != 0) {
85 log.info("Start '{}' task", name);
86 log.info("{} entries in timer", entries.size());
87 spaceAction.inNotification.set(false);
88 spaceAction.onEntriesWritten(entries);
90 } catch (Exception e) {
91 log.info(e.getMessage());