/*
* Copyright (C) 2012 eXo Platform SAS.
*
* This 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 2.1 of
* the License, or (at your option) any later version.
*
* This software 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 this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.crsh.telnet.term;
import org.crsh.AbstractTestCase;
import org.crsh.text.Screenable;
import org.crsh.text.Style;
import java.io.IOException;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.LinkedList;
import java.util.concurrent.Callable;
public class SyncTerm implements Term {
/** . */
private final LinkedList<Throwable> failures;
/** . */
private final LinkedList<Callable<TermEvent>> queue;
/** . */
private final Object lock;
/** . */
private boolean closed;
public SyncTerm() {
this.failures = new LinkedList<Throwable>();
this.queue = new LinkedList<Callable<TermEvent>>();
this.lock = new Object();
this.closed = false;
}
public void publish(final TermEvent event) {
publish(new Callable<TermEvent>() {
public TermEvent call() throws Exception {
return event;
}
});
}
public void publish(final Callable<TermEvent> event) {
synchronized (lock) {
if (closed) {
throw AbstractTestCase.failure("closed");
}
queue.addLast(event);
lock.notifyAll();
}
}
public int getWidth() {
return 32;
}
public int getHeight() {
return 40;
}
public String getProperty(String name) {
return null;
}
public void setEcho(boolean echo) {
}
public boolean takeAlternateBuffer() throws IOException {
return false;
}
public boolean releaseAlternateBuffer() throws IOException {
return false;
}
public TermEvent read() throws IOException {
synchronized (lock) {
while (true) {
if (closed) {
return TermEvent.close();
} else if (queue.size() > 0) {
try {
Callable<TermEvent> callable = queue.removeFirst();
return callable.call();
}
catch (Exception e) {
if (e instanceof IOException) {
throw (IOException)e;
} else {
throw new UndeclaredThrowableException(e);
}
}
} else {
try {
lock.wait();
}
catch (InterruptedException e) {
throw new UndeclaredThrowableException(e);
}
}
}
}
}
public Appendable append(char c) throws IOException {
return this;
}
public Appendable append(CharSequence s) throws IOException {
return this;
}
public Appendable append(CharSequence csq, int start, int end) throws IOException {
return this;
}
public Screenable append(Style style) throws IOException {
return this;
}
public Screenable cls() throws IOException {
return this;
}
public Appendable getDirectBuffer() {
return null;
}
public CharSequence getBuffer() {
return null;
}
public void addToHistory(CharSequence line) {
}
public void flush() {
}
public void close() {
synchronized (lock) {
if (!closed) {
closed = true;
lock.notifyAll();
}
}
}
}