/**
* This file is part of CloudML [ http://cloudml.org ]
*
* Copyright (C) 2012 - SINTEF ICT
* Contact: Franck Chauvel <franck.chauvel@sintef.no>
*
* Module: root
*
* CloudML is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* CloudML is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with CloudML. If not, see
* <http://www.gnu.org/licenses/>.
*/
package org.cloudml.ui.shell;
import org.cloudml.ui.shell.terminal.Message;
import java.util.ArrayList;
import java.util.List;
import org.cloudml.facade.commands.CloudMlCommand;
import org.cloudml.facade.events.AbstractEventHandler;
import org.cloudml.facade.events.Event;
import org.cloudml.ui.shell.terminal.OutputDevice;
import static org.cloudml.ui.shell.terminal.Message.format;
/**
* Contains all the message received by the shell
*/
public class Mailbox {
private final OutputDevice terminal;
private final List<Event> content;
private final List<CloudMlCommand> followed;
Mailbox(OutputDevice terminal) {
this.terminal = terminal;
this.content = new ArrayList<Event>();
this.followed = new ArrayList<CloudMlCommand>();
}
void showMessages(int depth) {
if (hasNewMessages()) {
final int max = (depth == -1) ? size() : depth;
terminal.print(format("Last messages:").eol());
for (int index = 1; index <= max; index++) {
final int reversedIndex = size() - index;
Event event = contents().get(reversedIndex);
terminal.print(format(" %03d: %s", index, event));
}
} else {
terminal.print(format("No new message").eol());
}
}
void followUp(CloudMlCommand command) {
followed.add(command);
}
void discard(CloudMlCommand command) {
followed.remove(command);
}
List<Event> contents() {
final List<Event> result = new ArrayList<Event>();
synchronized (content) {
result.addAll(content);
content.clear();
}
return result;
}
int size() {
int result = 0;
synchronized (content) {
result = content.size();
}
return result;
}
boolean hasNewMessages() {
return !content.isEmpty();
}
class EventHandler extends AbstractEventHandler {
public void handle(Event event) {
if (isRelevant(event)) {
terminal.print(Message.format(event.toString()).eol());
} else {
synchronized (content) {
content.add(event);
}
}
}
private boolean isRelevant(Event event) {
for (CloudMlCommand any: followed) {
if (event.wasTriggeredBy(any)) {
return true;
}
}
return false;
}
}
}