diff --git a/CHANGELOG.md b/CHANGELOG.md
index 48b486036..c6d646827 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,8 @@
# Change Log
+## [3.0.0-alpha-97](https://github.com/k3po/k3po/tree/3.0.0-alpha-97) (2018-12-05)
+[Full Changelog](https://github.com/k3po/k3po/compare/3.0.0-alpha-96...3.0.0-alpha-97)
+
## [3.0.0-alpha-96](https://github.com/k3po/k3po/tree/3.0.0-alpha-96) (2018-05-18)
[Full Changelog](https://github.com/k3po/k3po/compare/3.0.0-alpha-95...3.0.0-alpha-96)
diff --git a/control/pom.xml b/control/pom.xml
index c27530af0..152180085 100644
--- a/control/pom.xml
+++ b/control/pom.xml
@@ -4,7 +4,7 @@
org.kaazing
k3po.parent
- 3.0.0-alpha-97
+ 3.1.0
k3po.control
diff --git a/control/src/main/java/org/kaazing/k3po/control/internal/Control.java b/control/src/main/java/org/kaazing/k3po/control/internal/Control.java
index c5e21c4fc..c034a74b8 100644
--- a/control/src/main/java/org/kaazing/k3po/control/internal/Control.java
+++ b/control/src/main/java/org/kaazing/k3po/control/internal/Control.java
@@ -19,12 +19,11 @@
import static java.lang.String.format;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
-import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
@@ -32,7 +31,6 @@
import java.net.URLConnection;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -59,6 +57,8 @@
*/
public final class Control {
+ private static final int END_OF_STREAM = -1;
+ private static final char END_OF_LINE = '\n';
private static final String FINISHED_EVENT = "FINISHED";
private static final String ERROR_EVENT = "ERROR";
private static final String STARTED_EVENT = "STARTED";
@@ -70,7 +70,8 @@ public final class Control {
private final URL location;
private URLConnection connection;
- BufferedReader textIn;
+ private InputStream bytesIn;
+ private ByteArrayOutputStream lineBuf;
/**
* @param location of k3po server to connect to.
@@ -88,14 +89,13 @@ public void connect() throws Exception {
URLConnection newConnection = location.openConnection();
newConnection.connect();
connection = newConnection;
-
- InputStream bytesIn = connection.getInputStream();
- CharsetDecoder decoder = UTF_8.newDecoder();
- textIn = new BufferedReader(new InputStreamReader(bytesIn, decoder));
+
+ bytesIn = connection.getInputStream();
+ lineBuf = new ByteArrayOutputStream();
}
/**
- * Discoonects from the k3po server.
+ * Disconnects from the k3po server.
* @throws Exception if error in closing the connection.
*/
public void disconnect() throws Exception {
@@ -180,7 +180,7 @@ public CommandEvent readEvent(int timeout, TimeUnit unit) throws Exception {
connection.setReadTimeout((int) unit.toMillis(timeout));
CommandEvent event = null;
- String eventType = textIn.readLine();
+ String eventType = readLine();
if (Thread.interrupted())
{
@@ -306,9 +306,9 @@ private void writeCommand(CloseCommand close) throws IOException, CharacterCodin
private PreparedEvent readPreparedEvent() throws IOException {
PreparedEvent prepared = new PreparedEvent();
String line;
- int length = -1;
+ int length = END_OF_STREAM;
do {
- line = textIn.readLine();
+ line = readLine();
Matcher matcher = HEADER_PATTERN.matcher(line);
if (matcher.matches()) {
String headerName = matcher.group(1);
@@ -329,7 +329,6 @@ private PreparedEvent readPreparedEvent() throws IOException {
}
} while (!line.isEmpty());
- // note: this assumes bytes-length == string-length (ASCII)
// note: zero-length script should be non-null
if (length >= 0) {
prepared.setScript(readContent(length));
@@ -342,7 +341,7 @@ private StartedEvent readStartedEvent() throws IOException {
StartedEvent started = new StartedEvent();
String line;
do {
- line = textIn.readLine();
+ line = readLine();
Matcher matcher = HEADER_PATTERN.matcher(line);
if (matcher.matches()) {
String headerName = matcher.group(1);
@@ -362,9 +361,9 @@ private StartedEvent readStartedEvent() throws IOException {
private FinishedEvent readFinishedEvent() throws IOException {
FinishedEvent finished = new FinishedEvent();
String line;
- int length = -1;
+ int length = END_OF_STREAM;
do {
- line = textIn.readLine();
+ line = readLine();
Matcher matcher = HEADER_PATTERN.matcher(line);
if (matcher.matches()) {
String headerName = matcher.group(1);
@@ -388,7 +387,6 @@ private FinishedEvent readFinishedEvent() throws IOException {
}
} while (!line.isEmpty());
- // note: this assumes bytes-length == string-length (ASCII)
// note: zero-length script should be non-null
if (length >= 0) {
finished.setScript(readContent(length));
@@ -401,7 +399,7 @@ private NotifiedEvent readNotifiedEvent() throws IOException {
NotifiedEvent notified = new NotifiedEvent();
String line;
do {
- line = textIn.readLine();
+ line = readLine();
Matcher matcher = HEADER_PATTERN.matcher(line);
if (matcher.matches()) {
String headerName = matcher.group(1);
@@ -423,7 +421,7 @@ private ErrorEvent readErrorEvent() throws IOException {
String line;
int length = 0;
do {
- line = textIn.readLine();
+ line = readLine();
Matcher matcher = HEADER_PATTERN.matcher(line);
if (matcher.matches()) {
String headerName = matcher.group(1);
@@ -444,7 +442,6 @@ private ErrorEvent readErrorEvent() throws IOException {
}
} while (!line.isEmpty());
- // note: this assumes bytes-length == string-length (ASCII)
if (length > 0) {
error.setDescription(readContent(length));
}
@@ -453,16 +450,30 @@ private ErrorEvent readErrorEvent() throws IOException {
}
private String readContent(final int length) throws IOException {
- final char[] content = new char[length];
+ final byte[] content = new byte[length];
int bytesRead = 0;
do {
- int result = textIn.read(content, bytesRead, length - bytesRead);
- if (result == -1) {
+ int result = bytesIn.read(content, bytesRead, length - bytesRead);
+ if (result == END_OF_STREAM) {
throw new EOFException("EOF detected before all content read");
}
bytesRead += result;
} while (bytesRead != length);
- return new String(content);
+ return new String(content, "UTF-8");
+ }
+
+ private String readLine() throws IOException {
+ lineBuf.reset();
+ int b;
+ for (b = bytesIn.read(); b != END_OF_STREAM && b != END_OF_LINE; b = bytesIn.read()) {
+ lineBuf.write(b);
+ }
+
+ String line = null;
+ if (lineBuf.size() != 0 || b != END_OF_STREAM) {
+ line = lineBuf.toString("UTF-8");
+ }
+ return line;
}
public void notifyBarrier(String barrierName) throws Exception {
diff --git a/control/src/test/java/org/kaazing/k3po/control/internal/ControlTest.java b/control/src/test/java/org/kaazing/k3po/control/internal/ControlTest.java
index 832070c26..32f98f7c3 100644
--- a/control/src/test/java/org/kaazing/k3po/control/internal/ControlTest.java
+++ b/control/src/test/java/org/kaazing/k3po/control/internal/ControlTest.java
@@ -214,14 +214,13 @@ public void shouldReadPreparedEvent() throws Exception {
mockery.checking(new Expectations() {
{
+ atLeast(1).of(input).read();
+ will(readBytes(("PREPARED\n" +
+ "content-length:9\n" +
+ "future-header:future-value\n" + // test forward compatibility
+ "\n").getBytes(UTF_8)));
oneOf(input).read(with(any(byte[].class)), with(equal(0)), with(any(int.class)));
- will(readInitialBytes(0, ("PREPARED\n" +
- "content-length:9\n" +
- "future-header:future-value\n" + // test forward compatibility
- "\n" +
- "# comment").getBytes(UTF_8)));
- allowing(input).available();
- will(returnValue(0));
+ will(readBytes(0, "# comment".getBytes(UTF_8)));
}
});
@@ -237,11 +236,10 @@ public void shouldReadStartedEvent() throws Exception {
mockery.checking(new Expectations() {
{
- oneOf(input).read(with(any(byte[].class)), with(equal(0)), with(any(int.class)));
- will(readInitialBytes(0, ("STARTED\n" + "future-header:future-value\n" + // test forward compatibility
- "\n").getBytes(UTF_8)));
- allowing(input).available();
- will(returnValue(0));
+ atLeast(1).of(input).read();
+ will(readBytes(("STARTED\n" +
+ "future-header:future-value\n" + // test forward compatibility
+ "\n").getBytes(UTF_8)));
}
});
@@ -258,14 +256,13 @@ public void shouldReadFinishedEvent() throws Exception {
mockery.checking(new Expectations() {
{
+ atLeast(1).of(input).read();
+ will(readBytes(("FINISHED\n" +
+ "content-length:9\n" +
+ "future-header:future-value\n" + // test forward compatibility
+ "\n").getBytes(UTF_8)));
oneOf(input).read(with(any(byte[].class)), with(equal(0)), with(any(int.class)));
- will(readInitialBytes(0, ("FINISHED\n" +
- "content-length:9\n" +
- "future-header:future-value\n" + // test forward compatibility
- "\n" +
- "# comment").getBytes(UTF_8)));
- allowing(input).available();
- will(returnValue(0));
+ will(readBytes(0, "# comment".getBytes(UTF_8)));
}
});
@@ -283,15 +280,14 @@ public void shouldReadErrorEvent() throws Exception {
mockery.checking(new Expectations() {
{
+ atLeast(1).of(input).read();
+ will(readBytes(("ERROR\n" +
+ "summary:summary text\n" +
+ "content-length:16\n" +
+ "future-header:future-value\n" + // test forward compatibility
+ "\n").getBytes(UTF_8)));
oneOf(input).read(with(any(byte[].class)), with(equal(0)), with(any(int.class)));
- will(readInitialBytes(0, ("ERROR\n" +
- "summary:summary text\n" +
- "content-length:16\n" +
- "future-header:future-value\n" + // test forward compatibility
- "\n" +
- "description text").getBytes(UTF_8)));
- allowing(input).available();
- will(returnValue(0));
+ will(readBytes(0, "description text".getBytes(UTF_8)));
}
});
@@ -331,22 +327,31 @@ public void describeTo(Description description) {
};
}
- private static Action readInitialBytes(final int parameter, final byte[] initialBytes) {
+ private static Action readBytes(final byte[] bytes) {
+ Action[] actions = new Action[bytes.length];
+ for (int i=0; i < bytes.length; i++)
+ {
+ actions[i] = Expectations.returnValue((int) bytes[i]);
+ }
+ return Expectations.onConsecutiveCalls(actions);
+ }
+
+ private static Action readBytes(final int parameter, final byte[] bytes) {
return new Action() {
@Override
public Object invoke(Invocation invocation) throws Throwable {
byte[] array = (byte[]) invocation.getParameter(parameter);
- if (array.length < initialBytes.length) {
+ if (array.length < bytes.length) {
throw new IndexOutOfBoundsException();
}
- for (int i = 0; i < initialBytes.length; i++) {
- array[i] = initialBytes[i];
+ for (int i = 0; i < bytes.length; i++) {
+ array[i] = bytes[i];
}
- return initialBytes.length;
+ return bytes.length;
}
@Override
diff --git a/driver/pom.xml b/driver/pom.xml
index 09333de30..f43b9b48e 100644
--- a/driver/pom.xml
+++ b/driver/pom.xml
@@ -5,7 +5,7 @@
org.kaazing
k3po.parent
- 3.0.0-alpha-97
+ 3.1.0
k3po.driver
@@ -99,8 +99,8 @@
org.agrona
- Agrona
- 0.5.5
+ agrona
+ 1.6.0
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/Robot.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/Robot.java
index 0a37e5a7f..5169bc95c 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/Robot.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/Robot.java
@@ -20,12 +20,10 @@
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.jboss.netty.channel.Channels.pipeline;
import static org.jboss.netty.channel.Channels.pipelineFactory;
-import static org.jboss.netty.util.CharsetUtil.UTF_8;
import static org.kaazing.k3po.driver.internal.netty.bootstrap.BootstrapFactory.newBootstrapFactory;
import static org.kaazing.k3po.driver.internal.netty.channel.ChannelAddressFactory.newChannelAddressFactory;
import static org.kaazing.k3po.lang.internal.RegionInfo.newSequential;
-import java.io.ByteArrayInputStream;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.Collections;
@@ -41,6 +39,7 @@
import org.jboss.netty.channel.ChannelHandler.Sharable;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
+import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.ChildChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
@@ -60,6 +59,7 @@
import org.kaazing.k3po.driver.internal.netty.bootstrap.BootstrapFactory;
import org.kaazing.k3po.driver.internal.netty.bootstrap.ClientBootstrap;
import org.kaazing.k3po.driver.internal.netty.bootstrap.ServerBootstrap;
+import org.kaazing.k3po.driver.internal.netty.bootstrap.udp.UdpServerChannel;
import org.kaazing.k3po.driver.internal.netty.channel.ChannelAddressFactory;
import org.kaazing.k3po.driver.internal.netty.channel.CompositeChannelFuture;
import org.kaazing.k3po.driver.internal.resolver.ClientBootstrapResolver;
@@ -128,7 +128,7 @@ public ChannelFuture prepare(String expectedScript) throws Exception {
}
final ScriptParser parser = new Parser();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(expectedScript.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(expectedScript);
final ScriptValidator validator = new ScriptValidator();
validator.validate(scriptAST);
@@ -276,9 +276,20 @@ private ChannelFuture prepareServers() throws Exception {
/* Keep track of the client channels */
server.setParentHandler(new SimpleChannelHandler() {
+
+ @Override
+ public void channelBound(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception
+ {
+ super.channelBound(ctx, e);
+
+ unbindLastStreamIfNotUdp(serverResolver, e.getChannel());
+ }
+
@Override
public void childChannelOpen(ChannelHandlerContext ctx, ChildChannelStateEvent e) throws Exception {
closeableChannels.add(e.getChildChannel());
+
+ unbindLastStreamIfNotUdp(serverResolver, e.getChannel());
}
@Override
@@ -286,6 +297,13 @@ public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws
Channel channel = ctx.getChannel();
channel.close();
}
+
+ private void unbindLastStreamIfNotUdp(ServerBootstrapResolver serverResolver, Channel server)
+ {
+ if (!serverResolver.canAccept() && !(server instanceof UdpServerChannel)) {
+ server.unbind();
+ }
+ }
});
// Bind Asynchronously
@@ -324,7 +342,6 @@ public void operationComplete(ChannelFuture future) throws Exception {
}
private void connectClient(ClientBootstrapResolver clientResolver) throws Exception {
- final RegionInfo regionInfo = clientResolver.getRegionInfo();
ClientBootstrap client = clientResolver.resolve();
if (LOGGER.isDebugEnabled()) {
@@ -333,8 +350,14 @@ private void connectClient(ClientBootstrapResolver clientResolver) throws Except
ChannelFuture connectFuture = client.connect();
connectFutures.add(connectFuture);
- closeableChannels.add(connectFuture.getChannel());
- connectFuture.addListener(createConnectCompleteListener(regionInfo));
+ connectFuture.addListener(new ChannelFutureListener() {
+ @Override
+ public void operationComplete(ChannelFuture future) throws Exception {
+ if (future.isSuccess()) {
+ closeableChannels.add(connectFuture.getChannel());
+ }
+ }
+ });
}
private void stopConfiguration() throws Exception {
@@ -461,25 +484,6 @@ public void operationComplete(final ChannelFuture bindFuture) throws Exception {
};
}
- private ChannelFutureListener createConnectCompleteListener(final RegionInfo regionInfo) {
- return new ChannelFutureListener() {
- @Override
- public void operationComplete(ChannelFuture connectFuture) throws Exception {
- if (connectFuture.isCancelled()) {
- // This is more that the connect never really fired, as in the case of a barrier, or the the connect
- // is still in process here, so an empty line annotates that it did not do a connect, an actual
- // connect
- // failure should fail the future
- progress.addScriptFailure(regionInfo, "");
- } else if (!connectFuture.isSuccess()) {
- Throwable cause = connectFuture.getCause();
- String message = format("connect failed: %s", cause.getMessage());
- progress.addScriptFailure(regionInfo, message);
- }
- }
- };
- }
-
private ChannelFutureListener createStreamCompletionListener() {
return new ChannelFutureListener() {
@Override
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/BehaviorSystem.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/BehaviorSystem.java
index 378015873..e6de46f98 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/BehaviorSystem.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/BehaviorSystem.java
@@ -25,8 +25,12 @@
import org.jboss.netty.channel.ChannelHandler;
import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageDecoder;
import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageEncoder;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadConfigNode;
import org.kaazing.k3po.lang.internal.ast.AstReadOptionNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteConfigNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteOptionNode;
import org.kaazing.k3po.lang.internal.ast.matcher.AstValueMatcher;
@@ -40,6 +44,10 @@ public final class BehaviorSystem {
private final Map, WriteOptionFactory> writeOptions;
private final Map readConfigs;
private final Map writeConfigs;
+ private final Map readAdvises;
+ private final Map writeAdvises;
+ private final Map readAdviseds;
+ private final Map writeAdviseds;
private BehaviorSystem(Iterable behaviorSystems) {
@@ -47,6 +55,10 @@ private BehaviorSystem(Iterable behaviorSystems) {
Map, WriteOptionFactory> writeOptions = new IdentityHashMap<>();
Map readConfigs = new IdentityHashMap<>();
Map writeConfigs = new IdentityHashMap<>();
+ Map readAdvises = new IdentityHashMap<>();
+ Map writeAdvises = new IdentityHashMap<>();
+ Map readAdviseds = new IdentityHashMap<>();
+ Map writeAdviseds = new IdentityHashMap<>();
for (BehaviorSystemSpi behaviorSystem : behaviorSystems) {
for (TypeInfo> optionType : behaviorSystem.getReadOptionTypes()) {
@@ -62,12 +74,25 @@ private BehaviorSystem(Iterable behaviorSystems) {
for (StructuredTypeInfo configType : behaviorSystem.getWriteConfigTypes()) {
writeConfigs.put(configType, behaviorSystem.writeConfigFactory(configType));
}
+
+ for (StructuredTypeInfo advisoryType : behaviorSystem.getReadAdvisoryTypes()) {
+ readAdvises.put(advisoryType, behaviorSystem.readAdviseFactory(advisoryType));
+ writeAdviseds.put(advisoryType, behaviorSystem.writeAdvisedFactory(advisoryType));
+ }
+ for (StructuredTypeInfo advisoryType : behaviorSystem.getWriteAdvisoryTypes()) {
+ writeAdvises.put(advisoryType, behaviorSystem.writeAdviseFactory(advisoryType));
+ readAdviseds.put(advisoryType, behaviorSystem.readAdvisedFactory(advisoryType));
+ }
}
this.readOptions = unmodifiableMap(readOptions);
this.writeOptions = unmodifiableMap(writeOptions);
this.readConfigs = unmodifiableMap(readConfigs);
this.writeConfigs = unmodifiableMap(writeConfigs);
+ this.readAdvises = unmodifiableMap(readAdvises);
+ this.writeAdvises = unmodifiableMap(writeAdvises);
+ this.readAdviseds = unmodifiableMap(readAdviseds);
+ this.writeAdviseds = unmodifiableMap(writeAdviseds);
}
public ChannelHandler newReadOptionHandler(
@@ -104,6 +129,42 @@ public ChannelHandler newWriteConfigHandler(
return factory.newHandler(node, encoderFactory);
}
+ public ChannelHandler newReadAdviseHandler(
+ AstReadAdviseNode node,
+ Function, MessageEncoder> encoderFactory) {
+
+ StructuredTypeInfo type = node.getType();
+ ReadAdviseFactory factory = readAdvises.getOrDefault(type, (n, f) -> null);
+ return factory.newHandler(node, encoderFactory);
+ }
+
+ public ChannelHandler newWriteAdviseHandler(
+ AstWriteAdviseNode node,
+ Function, MessageEncoder> encoderFactory) {
+
+ StructuredTypeInfo type = node.getType();
+ WriteAdviseFactory factory = writeAdvises.getOrDefault(type, (n, f) -> null);
+ return factory.newHandler(node, encoderFactory);
+ }
+
+ public ChannelHandler newReadAdvisedHandler(
+ AstReadAdvisedNode node,
+ Function decoderFactory) {
+
+ StructuredTypeInfo type = node.getType();
+ ReadAdvisedFactory factory = readAdviseds.getOrDefault(type, (n, f) -> null);
+ return factory.newHandler(node, decoderFactory);
+ }
+
+ public ChannelHandler newWriteAdvisedHandler(
+ AstWriteAdvisedNode node,
+ Function decoderFactory) {
+
+ StructuredTypeInfo type = node.getType();
+ WriteAdvisedFactory factory = writeAdviseds.getOrDefault(type, (n, f) -> null);
+ return factory.newHandler(node, decoderFactory);
+ }
+
public static final BehaviorSystem newInstance() {
return new BehaviorSystem(load(BehaviorSystemSpi.class));
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/BehaviorSystemSpi.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/BehaviorSystemSpi.java
index 08f202d93..974e04178 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/BehaviorSystemSpi.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/BehaviorSystemSpi.java
@@ -38,4 +38,16 @@ public interface BehaviorSystemSpi {
WriteConfigFactory writeConfigFactory(StructuredTypeInfo configType);
+ Set getReadAdvisoryTypes();
+
+ Set getWriteAdvisoryTypes();
+
+ ReadAdviseFactory readAdviseFactory(StructuredTypeInfo advisoryType);
+
+ ReadAdvisedFactory readAdvisedFactory(StructuredTypeInfo advisoryType);
+
+ WriteAdviseFactory writeAdviseFactory(StructuredTypeInfo advisoryType);
+
+ WriteAdvisedFactory writeAdvisedFactory(StructuredTypeInfo advisoryType);
+
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/FileBehaviorSystem.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/FileBehaviorSystem.java
index 35ff7b6be..8b5b6fe57 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/FileBehaviorSystem.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/FileBehaviorSystem.java
@@ -39,6 +39,11 @@ public class FileBehaviorSystem implements BehaviorSystemSpi {
private final Map readConfigFactories;
private final Map writeConfigFactories;
+ private final Map readAdviseFactories;
+ private final Map writeAdviseFactories;
+ private final Map readAdvisedFactories;
+ private final Map writeAdvisedFactories;
+
public FileBehaviorSystem()
{
Map, ReadOptionFactory> readOptionFactories = new LinkedHashMap<>();
@@ -51,6 +56,10 @@ public FileBehaviorSystem()
this.readConfigFactories = emptyMap();
this.writeConfigFactories = emptyMap();
+ this.readAdviseFactories = emptyMap();
+ this.writeAdviseFactories = emptyMap();
+ this.readAdvisedFactories = emptyMap();
+ this.writeAdvisedFactories = emptyMap();
}
@Override
@@ -79,6 +88,46 @@ public WriteConfigFactory writeConfigFactory(
return writeConfigFactories.get(configType);
}
+ @Override
+ public Set getReadAdvisoryTypes()
+ {
+ return readAdviseFactories.keySet();
+ }
+
+ @Override
+ public Set getWriteAdvisoryTypes()
+ {
+ return writeAdviseFactories.keySet();
+ }
+
+ @Override
+ public ReadAdviseFactory readAdviseFactory(
+ StructuredTypeInfo advisoryType)
+ {
+ return readAdviseFactories.get(advisoryType);
+ }
+
+ @Override
+ public ReadAdvisedFactory readAdvisedFactory(
+ StructuredTypeInfo advisoryType)
+ {
+ return readAdvisedFactories.get(advisoryType);
+ }
+
+ @Override
+ public WriteAdviseFactory writeAdviseFactory(
+ StructuredTypeInfo advisoryType)
+ {
+ return writeAdviseFactories.get(advisoryType);
+ }
+
+ @Override
+ public WriteAdvisedFactory writeAdvisedFactory(
+ StructuredTypeInfo advisoryType)
+ {
+ return writeAdvisedFactories.get(advisoryType);
+ }
+
@Override
public Set> getReadOptionTypes()
{
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/HttpBehaviorSystem.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/HttpBehaviorSystem.java
index 56954f898..f9b35d353 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/HttpBehaviorSystem.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/HttpBehaviorSystem.java
@@ -15,6 +15,7 @@
*/
package org.kaazing.k3po.driver.internal.behavior;
+import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonMap;
import static java.util.Collections.unmodifiableMap;
import static java.util.Objects.requireNonNull;
@@ -77,6 +78,11 @@ public class HttpBehaviorSystem implements BehaviorSystemSpi {
private final Map readConfigFactories;
private final Map writeConfigFactories;
+ private final Map readAdviseFactories;
+ private final Map writeAdviseFactories;
+ private final Map readAdvisedFactories;
+ private final Map writeAdvisedFactories;
+
public HttpBehaviorSystem()
{
this.readOptionFactories = singletonMap(OPTION_CHUNK_EXT, HttpBehaviorSystem::newReadHttpChunkExtHandler);
@@ -102,6 +108,11 @@ public HttpBehaviorSystem()
writeConfigFactories.put(CONFIG_STATUS, HttpBehaviorSystem::newWriteHttpStatusHandler);
writeConfigFactories.put(CONFIG_TRAILER, HttpBehaviorSystem::newWriteHttpTrailerHandler);
this.writeConfigFactories = unmodifiableMap(writeConfigFactories);
+
+ this.readAdviseFactories = emptyMap();
+ this.writeAdviseFactories = emptyMap();
+ this.readAdvisedFactories = emptyMap();
+ this.writeAdvisedFactories = emptyMap();
}
@Override
@@ -130,6 +141,46 @@ public WriteConfigFactory writeConfigFactory(
return writeConfigFactories.get(configType);
}
+ @Override
+ public Set getReadAdvisoryTypes()
+ {
+ return readAdviseFactories.keySet();
+ }
+
+ @Override
+ public Set getWriteAdvisoryTypes()
+ {
+ return writeAdviseFactories.keySet();
+ }
+
+ @Override
+ public ReadAdviseFactory readAdviseFactory(
+ StructuredTypeInfo advisoryType)
+ {
+ return readAdviseFactories.get(advisoryType);
+ }
+
+ @Override
+ public ReadAdvisedFactory readAdvisedFactory(
+ StructuredTypeInfo advisoryType)
+ {
+ return readAdvisedFactories.get(advisoryType);
+ }
+
+ @Override
+ public WriteAdviseFactory writeAdviseFactory(
+ StructuredTypeInfo advisoryType)
+ {
+ return writeAdviseFactories.get(advisoryType);
+ }
+
+ @Override
+ public WriteAdvisedFactory writeAdvisedFactory(
+ StructuredTypeInfo advisoryType)
+ {
+ return writeAdvisedFactories.get(advisoryType);
+ }
+
@Override
public Set> getReadOptionTypes()
{
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/ReadAdviseFactory.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/ReadAdviseFactory.java
new file mode 100644
index 000000000..7250ae690
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/ReadAdviseFactory.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.behavior;
+
+import java.util.function.Function;
+
+import org.jboss.netty.channel.ChannelHandler;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageEncoder;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.value.AstValue;
+
+public interface ReadAdviseFactory {
+
+ ChannelHandler newHandler(AstReadAdviseNode node, Function, MessageEncoder> encoderFactory);
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/ReadAdvisedFactory.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/ReadAdvisedFactory.java
new file mode 100644
index 000000000..f93cecdc5
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/ReadAdvisedFactory.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.behavior;
+
+import java.util.function.Function;
+
+import org.jboss.netty.channel.ChannelHandler;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageDecoder;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdvisedNode;
+import org.kaazing.k3po.lang.internal.ast.matcher.AstValueMatcher;
+
+public interface ReadAdvisedFactory {
+
+ ChannelHandler newHandler(AstReadAdvisedNode node, Function decoderFactory);
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/ScriptProgress.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/ScriptProgress.java
index bb164bc14..e4e250a57 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/ScriptProgress.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/ScriptProgress.java
@@ -15,6 +15,7 @@
*/
package org.kaazing.k3po.driver.internal.behavior;
+import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Objects.requireNonNull;
import java.util.Iterator;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/WriteAdviseFactory.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/WriteAdviseFactory.java
new file mode 100644
index 000000000..3439d8b36
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/WriteAdviseFactory.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.behavior;
+
+import java.util.function.Function;
+
+import org.jboss.netty.channel.ChannelHandler;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageEncoder;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.value.AstValue;
+
+public interface WriteAdviseFactory {
+
+ ChannelHandler newHandler(AstWriteAdviseNode node, Function, MessageEncoder> encoderFactory);
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/WriteAdvisedFactory.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/WriteAdvisedFactory.java
new file mode 100644
index 000000000..403cee9bf
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/WriteAdvisedFactory.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.behavior;
+
+import java.util.function.Function;
+
+import org.jboss.netty.channel.ChannelHandler;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageDecoder;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdvisedNode;
+import org.kaazing.k3po.lang.internal.ast.matcher.AstValueMatcher;
+
+public interface WriteAdvisedFactory {
+
+ ChannelHandler newHandler(AstWriteAdvisedNode node, Function decoderFactory);
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/RejectedHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/RejectedHandler.java
new file mode 100644
index 000000000..32b5e2b9b
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/RejectedHandler.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.behavior.handler;
+
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelStateEvent;
+
+public class RejectedHandler extends ExecutionHandler {
+
+ @Override
+ public void channelBound(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception
+ {
+ super.channelBound(ctx, e);
+
+ getHandlerFuture().setSuccess();
+ }
+
+ @Override
+ protected StringBuilder describe(StringBuilder sb) {
+ return sb.append("rejected");
+ }
+
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/AbstractConfigDecoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/AbstractConfigDecoder.java
index 898b0876d..c91d8eb7b 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/AbstractConfigDecoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/AbstractConfigDecoder.java
@@ -18,7 +18,7 @@
import org.kaazing.k3po.lang.internal.RegionInfo;
-public abstract class AbstractConfigDecoder implements ConfigDecoder {
+public abstract class AbstractConfigDecoder implements ChannelDecoder {
private RegionInfo regionInfo;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ConfigDecoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ChannelDecoder.java
similarity index 95%
rename from driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ConfigDecoder.java
rename to driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ChannelDecoder.java
index d60e3ed1f..483d1d567 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ConfigDecoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ChannelDecoder.java
@@ -18,7 +18,7 @@
import org.jboss.netty.channel.Channel;
-public interface ConfigDecoder {
+public interface ChannelDecoder {
boolean decode(Channel channel) throws Exception;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ConfigEncoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ChannelEncoder.java
similarity index 95%
rename from driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ConfigEncoder.java
rename to driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ChannelEncoder.java
index eac7c3e00..064957628 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ConfigEncoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ChannelEncoder.java
@@ -17,7 +17,7 @@
import org.jboss.netty.channel.Channel;
-public interface ConfigEncoder {
+public interface ChannelEncoder {
void encode(Channel channel) throws Exception;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ReadExpressionDecoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ReadExpressionDecoder.java
index 1cd6ab073..f0045bdd0 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ReadExpressionDecoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/ReadExpressionDecoder.java
@@ -19,6 +19,7 @@
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.kaazing.k3po.lang.internal.RegionInfo.newSequential;
+import java.nio.ByteBuffer;
import java.util.Arrays;
import javax.el.ValueExpression;
@@ -26,6 +27,7 @@
import org.jboss.netty.buffer.ChannelBuffer;
import org.kaazing.k3po.driver.internal.behavior.ScriptProgressException;
import org.kaazing.k3po.driver.internal.util.Utils;
+import org.kaazing.k3po.lang.el.BytesMatcher;
import org.kaazing.k3po.lang.internal.RegionInfo;
import org.kaazing.k3po.lang.internal.el.ExpressionContext;
@@ -33,6 +35,7 @@ public class ReadExpressionDecoder extends MessageDecoder {
private final ValueExpression expression;
private final ExpressionContext environment;
+ private BytesMatcher matcher;
public ReadExpressionDecoder(RegionInfo regionInfo, ValueExpression expression, ExpressionContext environment) {
super(regionInfo);
@@ -54,7 +57,32 @@ protected Object decodeBuffer(ChannelBuffer buffer) throws Exception {
expected = expression.getValue(environment);
}
- Object read = readValue(buffer, expected);
+ Object read;
+
+ if (matcher == null && expected instanceof BytesMatcher)
+ {
+ matcher = (BytesMatcher) expected;
+ }
+
+ if (matcher != null)
+ {
+ final ByteBuffer byteBuf = buffer.toByteBuffer();
+ final int initialPos = byteBuf.position();
+ try
+ {
+ read = matcher.match(byteBuf);
+ }
+ catch (Exception ex)
+ {
+ throw new ScriptProgressException(getRegionInfo(), ex.getMessage());
+ }
+ final int bytesAdvanced = byteBuf.position() - initialPos;
+ buffer.skipBytes(bytesAdvanced);
+ }
+ else
+ {
+ read = readValue(buffer, expected);
+ }
if (read == null) {
return null;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpContentLengthEncoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpContentLengthEncoder.java
index 727a2d5bc..02237e0f1 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpContentLengthEncoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpContentLengthEncoder.java
@@ -16,10 +16,10 @@
package org.kaazing.k3po.driver.internal.behavior.handler.codec.http;
import org.jboss.netty.channel.Channel;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigEncoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
import org.kaazing.k3po.driver.internal.netty.bootstrap.http.HttpChannelConfig;
-public class HttpContentLengthEncoder implements ConfigEncoder {
+public class HttpContentLengthEncoder implements ChannelEncoder {
private final int maximumBufferedContentLength;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpHeaderEncoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpHeaderEncoder.java
index 28b5b857a..7bc2bfbe8 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpHeaderEncoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpHeaderEncoder.java
@@ -23,11 +23,11 @@
import org.jboss.netty.buffer.ChannelBufferFactory;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.handler.codec.http.HttpHeaders;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigEncoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageEncoder;
import org.kaazing.k3po.driver.internal.netty.bootstrap.http.HttpChannelConfig;
-public class HttpHeaderEncoder implements ConfigEncoder {
+public class HttpHeaderEncoder implements ChannelEncoder {
private final MessageEncoder nameEncoder;
private final List valueEncoders;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpHostEncoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpHostEncoder.java
index 63e683c4d..3ff703f02 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpHostEncoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpHostEncoder.java
@@ -19,12 +19,12 @@
import org.jboss.netty.channel.Channel;
import org.jboss.netty.handler.codec.http.HttpHeaders;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigEncoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
import org.kaazing.k3po.driver.internal.netty.bootstrap.channel.AbstractChannel;
import org.kaazing.k3po.driver.internal.netty.bootstrap.http.HttpChannelConfig;
import org.kaazing.k3po.driver.internal.netty.channel.ChannelAddress;
-public class HttpHostEncoder implements ConfigEncoder {
+public class HttpHostEncoder implements ChannelEncoder {
@Override
@SuppressWarnings("unchecked")
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpMethodEncoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpMethodEncoder.java
index 11a1a1c05..8e9118ada 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpMethodEncoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpMethodEncoder.java
@@ -21,11 +21,11 @@
import org.jboss.netty.buffer.ChannelBufferFactory;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.handler.codec.http.HttpMethod;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigEncoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageEncoder;
import org.kaazing.k3po.driver.internal.netty.bootstrap.http.HttpChannelConfig;
-public class HttpMethodEncoder implements ConfigEncoder {
+public class HttpMethodEncoder implements ChannelEncoder {
private final MessageEncoder methodEncoder;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpParameterEncoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpParameterEncoder.java
index 7e489677b..d2189c3bd 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpParameterEncoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpParameterEncoder.java
@@ -24,12 +24,12 @@
import org.jboss.netty.buffer.ChannelBufferFactory;
import org.jboss.netty.channel.Channel;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigEncoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageEncoder;
import org.kaazing.k3po.driver.internal.netty.bootstrap.http.HttpChannelConfig;
import org.kaazing.k3po.driver.internal.netty.channel.ChannelAddress;
-public class HttpParameterEncoder implements ConfigEncoder {
+public class HttpParameterEncoder implements ChannelEncoder {
private final MessageEncoder nameEncoder;
private final List valueEncoders;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpRequestFormEncoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpRequestFormEncoder.java
index 73a3a8c28..edeb84afd 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpRequestFormEncoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpRequestFormEncoder.java
@@ -20,12 +20,12 @@
import org.jboss.netty.buffer.ChannelBufferFactory;
import org.jboss.netty.channel.Channel;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigEncoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageEncoder;
import org.kaazing.k3po.driver.internal.netty.bootstrap.http.HttpChannelConfig;
import org.kaazing.k3po.driver.internal.netty.bootstrap.http.HttpRequestForm;
-public class HttpRequestFormEncoder implements ConfigEncoder {
+public class HttpRequestFormEncoder implements ChannelEncoder {
private MessageEncoder formEncoder;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpStatusEncoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpStatusEncoder.java
index e2da96332..e07ac2c2f 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpStatusEncoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpStatusEncoder.java
@@ -21,11 +21,11 @@
import org.jboss.netty.buffer.ChannelBufferFactory;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.handler.codec.http.HttpResponseStatus;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigEncoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageEncoder;
import org.kaazing.k3po.driver.internal.netty.bootstrap.http.HttpChannelConfig;
-public class HttpStatusEncoder implements ConfigEncoder {
+public class HttpStatusEncoder implements ChannelEncoder {
private final MessageEncoder codeEncoder;
private final MessageEncoder reasonEncoder;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpTrailerEncoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpTrailerEncoder.java
index f38966fb4..bab161bd6 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpTrailerEncoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpTrailerEncoder.java
@@ -23,11 +23,11 @@
import org.jboss.netty.buffer.ChannelBufferFactory;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.handler.codec.http.HttpHeaders;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigEncoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageEncoder;
import org.kaazing.k3po.driver.internal.netty.bootstrap.http.HttpChannelConfig;
-public class HttpTrailerEncoder implements ConfigEncoder {
+public class HttpTrailerEncoder implements ChannelEncoder {
private final MessageEncoder nameEncoder;
private final List valueEncoders;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpVersionEncoder.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpVersionEncoder.java
index 7e1b70a08..e928e87ea 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpVersionEncoder.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/codec/http/HttpVersionEncoder.java
@@ -21,11 +21,11 @@
import org.jboss.netty.buffer.ChannelBufferFactory;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.handler.codec.http.HttpVersion;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigEncoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageEncoder;
import org.kaazing.k3po.driver.internal.netty.bootstrap.http.HttpChannelConfig;
-public class HttpVersionEncoder implements ConfigEncoder {
+public class HttpVersionEncoder implements ChannelEncoder {
private MessageEncoder versionEncoder;
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ConnectAbortHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ConnectAbortHandler.java
new file mode 100644
index 000000000..1e2fdd13f
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ConnectAbortHandler.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.kaazing.k3po.driver.internal.behavior.handler.command;
+
+import org.jboss.netty.channel.ChannelEvent;
+import org.jboss.netty.channel.ChannelException;
+import org.jboss.netty.channel.ChannelFuture;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelState;
+import org.jboss.netty.channel.ChannelStateEvent;
+
+public class ConnectAbortHandler extends AbstractCommandHandler {
+
+ private ChannelFuture connectFuture;
+
+ @Override
+ public void handleDownstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
+ if (e instanceof ChannelStateEvent) {
+ ChannelStateEvent cse = (ChannelStateEvent) e;
+ if (cse.getState() == ChannelState.CONNECTED) {
+ this.connectFuture = cse.getFuture();
+ }
+ }
+
+ ctx.sendDownstream(e);
+ }
+
+ @Override
+ protected void invokeCommand(ChannelHandlerContext ctx) throws Exception {
+
+ ChannelFuture handlerFuture = getHandlerFuture();
+ if (connectFuture == null || !connectFuture.cancel()) {
+ handlerFuture.setFailure(new ChannelException("connect not aborted"));
+ }
+ else {
+ handlerFuture.setSuccess();
+ }
+ }
+
+ @Override
+ protected StringBuilder describe(StringBuilder sb) {
+ return sb.append("connect abort");
+ }
+
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ConnectHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ConnectHandler.java
index b892a978d..c6965ee78 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ConnectHandler.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ConnectHandler.java
@@ -15,11 +15,15 @@
*/
package org.kaazing.k3po.driver.internal.behavior.handler.command;
+import static org.jboss.netty.channel.Channels.future;
+
import java.net.SocketAddress;
import org.jboss.netty.channel.ChannelFuture;
+import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.Channels;
+import org.kaazing.k3po.driver.internal.behavior.ScriptProgressException;
public class ConnectHandler extends AbstractCommandHandler {
@@ -33,7 +37,21 @@ public ConnectHandler(SocketAddress remoteAddress) {
protected void invokeCommand(ChannelHandlerContext ctx) throws Exception {
ChannelFuture handlerFuture = getHandlerFuture();
- Channels.connect(ctx, handlerFuture, remoteAddress);
+ ChannelFuture connectFuture = future(ctx.getChannel(), true);
+ Channels.connect(ctx, connectFuture, remoteAddress);
+ connectFuture.addListener(new ChannelFutureListener() {
+
+ @Override
+ public void operationComplete(ChannelFuture future) throws Exception {
+
+ if (future.isSuccess()) {
+ handlerFuture.setSuccess();
+ }
+ else {
+ handlerFuture.setFailure(new ScriptProgressException(getRegionInfo(), "connect aborted"));
+ }
+ }
+ });
}
@Override
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ReadAdviseHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ReadAdviseHandler.java
new file mode 100644
index 000000000..aed35efa5
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ReadAdviseHandler.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.behavior.handler.command;
+
+import static java.lang.String.format;
+import static java.util.Collections.singletonList;
+import static java.util.Objects.requireNonNull;
+import static org.kaazing.k3po.driver.internal.netty.channel.Channels.adviseInput;
+
+import java.util.List;
+
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
+
+public class ReadAdviseHandler extends AbstractCommandHandler {
+
+ private final Object value;
+ private final List encoders;
+
+ public ReadAdviseHandler(Object value, ChannelEncoder encoder) {
+ this(value, singletonList(encoder));
+ }
+
+ public ReadAdviseHandler(Object value, List encoders) {
+ requireNonNull(encoders, "encoders");
+ if (encoders.size() == 0) {
+ throw new IllegalArgumentException("must have at least one encoder");
+ }
+ this.value = value;
+ this.encoders = encoders;
+ }
+
+ @Override
+ protected void invokeCommand(ChannelHandlerContext ctx) throws Exception {
+ try {
+ Channel channel = ctx.getChannel();
+ for (ChannelEncoder encoder : encoders) {
+ encoder.encode(channel);
+ }
+ adviseInput(ctx, getHandlerFuture(), value);
+ }
+ catch (Exception e) {
+ getHandlerFuture().setFailure(e);
+ }
+ }
+
+ @Override
+ protected StringBuilder describe(StringBuilder sb) {
+ return sb.append(format("read advise %s %s", value, encoders));
+ }
+
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ReadConfigHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ReadConfigHandler.java
index 67cc00782..085e041b9 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ReadConfigHandler.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ReadConfigHandler.java
@@ -28,7 +28,7 @@
import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigDecoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelDecoder;
//
// Reading the configuration requires the channel to be readable as an indication that
@@ -38,14 +38,14 @@
//
public class ReadConfigHandler extends AbstractCommandHandler {
- private final List decoders;
+ private final List decoders;
private ChannelFuture readableFuture;
- public ReadConfigHandler(ConfigDecoder decoder) {
+ public ReadConfigHandler(ChannelDecoder decoder) {
this(singletonList(decoder));
}
- public ReadConfigHandler(List decoders) {
+ public ReadConfigHandler(List decoders) {
requireNonNull(decoders, "decoders");
if (decoders.size() == 0) {
throw new IllegalArgumentException("must have at least one decoder");
@@ -88,7 +88,7 @@ private void invokeCommandWhenReadable(ChannelHandlerContext ctx) {
Channel channel = ctx.getChannel();
try {
- for (ConfigDecoder decoder : decoders) {
+ for (ChannelDecoder decoder : decoders) {
decoder.decode(channel);
}
getHandlerFuture().setSuccess();
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/WriteAdviseHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/WriteAdviseHandler.java
new file mode 100644
index 000000000..17476ba99
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/WriteAdviseHandler.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.behavior.handler.command;
+
+import static java.lang.String.format;
+import static java.util.Collections.singletonList;
+import static java.util.Objects.requireNonNull;
+import static org.kaazing.k3po.driver.internal.netty.channel.Channels.adviseOutput;
+
+import java.util.List;
+
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
+
+public class WriteAdviseHandler extends AbstractCommandHandler {
+
+ private final Object value;
+ private final List encoders;
+
+ public WriteAdviseHandler(Object value, ChannelEncoder encoder) {
+ this(value, singletonList(encoder));
+ }
+
+ public WriteAdviseHandler(Object value, List encoders) {
+ requireNonNull(encoders, "encoders");
+ if (encoders.size() == 0) {
+ throw new IllegalArgumentException("must have at least one encoder");
+ }
+ this.value = value;
+ this.encoders = encoders;
+ }
+
+ @Override
+ protected void invokeCommand(ChannelHandlerContext ctx) throws Exception {
+ try {
+ Channel channel = ctx.getChannel();
+ for (ChannelEncoder encoder : encoders) {
+ encoder.encode(channel);
+ }
+ adviseOutput(ctx, getHandlerFuture(), value);
+ }
+ catch (Exception e) {
+ getHandlerFuture().setFailure(e);
+ }
+ }
+
+ @Override
+ protected StringBuilder describe(StringBuilder sb) {
+ return sb.append(format("write advise %s %s", value, encoders));
+ }
+
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/WriteConfigHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/WriteConfigHandler.java
index 4cb4ac5ee..f8da14a2c 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/WriteConfigHandler.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/command/WriteConfigHandler.java
@@ -23,17 +23,17 @@
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigEncoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
public class WriteConfigHandler extends AbstractCommandHandler {
- private final List encoders;
+ private final List encoders;
- public WriteConfigHandler(ConfigEncoder encoder) {
+ public WriteConfigHandler(ChannelEncoder encoder) {
this(singletonList(encoder));
}
- public WriteConfigHandler(List encoders) {
+ public WriteConfigHandler(List encoders) {
requireNonNull(encoders, "encoders");
if (encoders.size() == 0) {
throw new IllegalArgumentException("must have at least one encoder");
@@ -45,7 +45,7 @@ public WriteConfigHandler(List encoders) {
protected void invokeCommand(ChannelHandlerContext ctx) throws Exception {
try {
Channel channel = ctx.getChannel();
- for (ConfigEncoder encoder : encoders) {
+ for (ChannelEncoder encoder : encoders) {
encoder.encode(channel);
}
getHandlerFuture().setSuccess();
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/AbstractEventHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/AbstractEventHandler.java
index 953af84b3..5bc27ae2c 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/AbstractEventHandler.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/AbstractEventHandler.java
@@ -34,9 +34,11 @@
import static org.kaazing.k3po.driver.internal.behavior.handler.event.AbstractEventHandler.ChannelEventKind.OPEN;
import static org.kaazing.k3po.driver.internal.behavior.handler.event.AbstractEventHandler.ChannelEventKind.OUTPUT_SHUTDOWN;
import static org.kaazing.k3po.driver.internal.behavior.handler.event.AbstractEventHandler.ChannelEventKind.READ_ABORTED;
+import static org.kaazing.k3po.driver.internal.behavior.handler.event.AbstractEventHandler.ChannelEventKind.READ_ADVISED;
import static org.kaazing.k3po.driver.internal.behavior.handler.event.AbstractEventHandler.ChannelEventKind.UNBOUND;
import static org.kaazing.k3po.driver.internal.behavior.handler.event.AbstractEventHandler.ChannelEventKind.UNKNOWN;
import static org.kaazing.k3po.driver.internal.behavior.handler.event.AbstractEventHandler.ChannelEventKind.WRITE_ABORTED;
+import static org.kaazing.k3po.driver.internal.behavior.handler.event.AbstractEventHandler.ChannelEventKind.WRITE_ADVISED;
import static org.kaazing.k3po.driver.internal.behavior.handler.event.AbstractEventHandler.ChannelEventKind.WRITE_COMPLETED;
import java.util.EnumSet;
@@ -57,9 +59,11 @@
import org.kaazing.k3po.driver.internal.behavior.handler.ExecutionHandler;
import org.kaazing.k3po.driver.internal.netty.channel.FlushEvent;
import org.kaazing.k3po.driver.internal.netty.channel.ReadAbortEvent;
+import org.kaazing.k3po.driver.internal.netty.channel.ReadAdviseEvent;
import org.kaazing.k3po.driver.internal.netty.channel.ShutdownInputEvent;
import org.kaazing.k3po.driver.internal.netty.channel.ShutdownOutputEvent;
import org.kaazing.k3po.driver.internal.netty.channel.WriteAbortEvent;
+import org.kaazing.k3po.driver.internal.netty.channel.WriteAdviseEvent;
public abstract class AbstractEventHandler extends ExecutionHandler {
@@ -69,7 +73,8 @@ public abstract class AbstractEventHandler extends ExecutionHandler {
public enum ChannelEventKind {
CHILD_OPEN, CHILD_CLOSED, OPEN, BOUND, CONNECTED, MESSAGE, WRITE_COMPLETED, DISCONNECTED, UNBOUND, CLOSED, EXCEPTION,
- INTEREST_OPS, IDLE_STATE, INPUT_SHUTDOWN, OUTPUT_SHUTDOWN, FLUSHED, UNKNOWN, READ_ABORTED, WRITE_ABORTED
+ INTEREST_OPS, IDLE_STATE, INPUT_SHUTDOWN, OUTPUT_SHUTDOWN, FLUSHED, UNKNOWN, READ_ABORTED, WRITE_ABORTED,
+ READ_ADVISED, WRITE_ADVISED
};
private final Set interestEvents;
@@ -129,6 +134,10 @@ protected void handleUnexpectedEvent(ChannelHandlerContext ctx, ChannelEvent evt
throw new ScriptProgressException(getRegionInfo(), "read aborted");
case WRITE_ABORTED:
throw new ScriptProgressException(getRegionInfo(), "write aborted");
+ case READ_ADVISED:
+ throw new ScriptProgressException(getRegionInfo(), "read advised ...");
+ case WRITE_ADVISED:
+ throw new ScriptProgressException(getRegionInfo(), "write advised ...");
case MESSAGE:
throw new ScriptProgressException(getRegionInfo(), "read ...");
case INPUT_SHUTDOWN:
@@ -157,6 +166,14 @@ protected void handleUnexpectedEvent(ChannelHandlerContext ctx, ChannelEvent evt
}
private static ChannelEventKind asEventKind(ChannelEvent evt) {
+ if (evt instanceof ReadAdviseEvent) {
+ return READ_ADVISED;
+ }
+
+ if (evt instanceof WriteAdviseEvent) {
+ return WRITE_ADVISED;
+ }
+
if (evt instanceof ReadAbortEvent) {
return READ_ABORTED;
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/ConnectAbortedHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/ConnectAbortedHandler.java
new file mode 100644
index 000000000..683232ef7
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/ConnectAbortedHandler.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.behavior.handler.event;
+
+import org.jboss.netty.channel.ChannelDownstreamHandler;
+import org.jboss.netty.channel.ChannelEvent;
+import org.jboss.netty.channel.ChannelFuture;
+import org.jboss.netty.channel.ChannelFutureListener;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelState;
+import org.jboss.netty.channel.ChannelStateEvent;
+import org.kaazing.k3po.driver.internal.behavior.ScriptProgressException;
+import org.kaazing.k3po.driver.internal.behavior.handler.ExecutionHandler;
+
+public class ConnectAbortedHandler extends ExecutionHandler implements ChannelDownstreamHandler {
+
+ @Override
+ public void handleDownstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
+ if (e instanceof ChannelStateEvent) {
+ ChannelStateEvent cse = (ChannelStateEvent) e;
+ if (cse.getState() == ChannelState.CONNECTED) {
+ final ChannelFuture connectFuture = cse.getFuture();
+ final ChannelFuture handlerFuture = getHandlerFuture();
+ connectFuture.addListener(new ChannelFutureListener() {
+
+ @Override
+ public void operationComplete(ChannelFuture future) throws Exception {
+
+ if (future.isSuccess()) {
+ handlerFuture.setFailure(new ScriptProgressException(getRegionInfo(), "connect not aborted"));
+ }
+ else {
+ handlerFuture.setSuccess();
+ }
+ }
+ });
+ }
+ }
+
+ ctx.sendDownstream(e);
+ }
+
+ @Override
+ protected StringBuilder describe(StringBuilder sb) {
+ return sb.append("connect aborted");
+ }
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/ReadAdvisedHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/ReadAdvisedHandler.java
new file mode 100644
index 000000000..0ab81735d
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/ReadAdvisedHandler.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.kaazing.k3po.driver.internal.behavior.handler.event;
+
+import static java.util.Collections.singletonList;
+import static java.util.EnumSet.of;
+import static org.kaazing.k3po.driver.internal.behavior.handler.event.AbstractEventHandler.ChannelEventKind.READ_ADVISED;
+
+import java.util.List;
+import java.util.Objects;
+
+import javax.el.ELException;
+
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelFuture;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.kaazing.k3po.driver.internal.behavior.ScriptProgressException;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelDecoder;
+import org.kaazing.k3po.driver.internal.netty.channel.ReadAdviseEvent;
+
+public class ReadAdvisedHandler extends AbstractEventHandler {
+
+ private final Object value;
+ private final List decoders;
+
+ public ReadAdvisedHandler(Object value, ChannelDecoder decoder) {
+ this(value, singletonList(decoder));
+ }
+
+ public ReadAdvisedHandler(Object value, List decoders) {
+ super(of(READ_ADVISED));
+ this.value = value;
+ this.decoders = decoders;
+ }
+
+ @Override
+ public void inputAdvised(ChannelHandlerContext ctx, ReadAdviseEvent e) {
+
+ ChannelFuture handlerFuture = getHandlerFuture();
+ assert handlerFuture != null;
+
+ outer:
+ try {
+ if (!Objects.equals(value, e.getValue()))
+ {
+ handlerFuture.setFailure(new ScriptProgressException(getRegionInfo(), String.valueOf(e.getValue())));
+ break outer;
+ }
+
+ Channel channel = ctx.getChannel();
+ for (ChannelDecoder decoder : decoders) {
+ boolean decoded = decoder.decode(channel);
+ if (!decoded)
+ {
+ handlerFuture.setFailure(new ScriptProgressException(getRegionInfo(), "decode failed"));
+ break outer;
+ }
+ }
+ handlerFuture.setSuccess();
+ }
+ catch (ELException ele) {
+ ScriptProgressException exception = new ScriptProgressException(getRegionInfo(), ele.getMessage());
+ exception.initCause(ele);
+ handlerFuture.setFailure(exception);
+ }
+ catch (Exception ex) {
+ handlerFuture.setFailure(ex);
+ }
+ }
+
+ @Override
+ protected StringBuilder describe(StringBuilder sb) {
+ return sb.append(String.format("read advised %s %s", value, decoders));
+ }
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/WriteAdvisedHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/WriteAdvisedHandler.java
new file mode 100644
index 000000000..9a43122fd
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/handler/event/WriteAdvisedHandler.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.kaazing.k3po.driver.internal.behavior.handler.event;
+
+import static java.util.Collections.singletonList;
+import static java.util.EnumSet.of;
+import static org.kaazing.k3po.driver.internal.behavior.handler.event.AbstractEventHandler.ChannelEventKind.WRITE_ADVISED;
+
+import java.util.List;
+import java.util.Objects;
+
+import javax.el.ELException;
+
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelFuture;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.kaazing.k3po.driver.internal.behavior.ScriptProgressException;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelDecoder;
+import org.kaazing.k3po.driver.internal.netty.channel.WriteAdviseEvent;
+
+public class WriteAdvisedHandler extends AbstractEventHandler {
+
+ private final Object value;
+ private final List decoders;
+
+ public WriteAdvisedHandler(Object value, ChannelDecoder decoder) {
+ this(value, singletonList(decoder));
+ }
+
+ public WriteAdvisedHandler(Object value, List decoders) {
+ super(of(WRITE_ADVISED));
+ this.value = value;
+ this.decoders = decoders;
+ }
+
+ @Override
+ public void outputAdvised(ChannelHandlerContext ctx, WriteAdviseEvent e) {
+
+ ChannelFuture handlerFuture = getHandlerFuture();
+ assert handlerFuture != null;
+
+ outer:
+ try {
+ if (!Objects.equals(value, e.getValue()))
+ {
+ handlerFuture.setFailure(new ScriptProgressException(getRegionInfo(), String.valueOf(e.getValue())));
+ break outer;
+ }
+
+ Channel channel = ctx.getChannel();
+ for (ChannelDecoder decoder : decoders) {
+ boolean decoded = decoder.decode(channel);
+ if (!decoded)
+ {
+ handlerFuture.setFailure(new ScriptProgressException(getRegionInfo(), "decode failed"));
+ break outer;
+ }
+ }
+ handlerFuture.setSuccess();
+ }
+ catch (ELException ele) {
+ ScriptProgressException exception = new ScriptProgressException(getRegionInfo(), ele.getMessage());
+ exception.initCause(ele);
+ handlerFuture.setFailure(exception);
+ }
+ catch (Exception ex) {
+ handlerFuture.setFailure(ex);
+ }
+ }
+
+ @Override
+ protected StringBuilder describe(StringBuilder sb) {
+ return sb.append(String.format("read advised %s %s", value, decoders));
+ }
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/parser/Parser.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/parser/Parser.java
index 8d89c21e4..e0e10eb84 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/parser/Parser.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/parser/Parser.java
@@ -15,8 +15,6 @@
*/
package org.kaazing.k3po.driver.internal.behavior.parser;
-import java.io.InputStream;
-
import org.kaazing.k3po.driver.internal.behavior.visitor.AssociateStreamsVisitor;
import org.kaazing.k3po.driver.internal.behavior.visitor.InjectBarriersVisitor;
import org.kaazing.k3po.driver.internal.behavior.visitor.InjectEventsVisitor;
@@ -35,7 +33,7 @@ public Parser() {
}
@Override
- public AstScriptNode parse(InputStream input) throws ScriptParseException {
+ public AstScriptNode parse(String input) throws ScriptParseException {
try {
AstScriptNode script = parser.parse(input);
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/AssociateStreamsVisitor.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/AssociateStreamsVisitor.java
index b98b8303d..ac87b5bf6 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/AssociateStreamsVisitor.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/AssociateStreamsVisitor.java
@@ -25,11 +25,14 @@
import org.kaazing.k3po.lang.internal.RegionInfo;
import org.kaazing.k3po.lang.internal.ast.AstAcceptNode;
import org.kaazing.k3po.lang.internal.ast.AstAcceptableNode;
+import org.kaazing.k3po.lang.internal.ast.AstAcceptedNode;
import org.kaazing.k3po.lang.internal.ast.AstBoundNode;
import org.kaazing.k3po.lang.internal.ast.AstChildClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstChildOpenedNode;
import org.kaazing.k3po.lang.internal.ast.AstCloseNode;
import org.kaazing.k3po.lang.internal.ast.AstClosedNode;
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortNode;
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortedNode;
import org.kaazing.k3po.lang.internal.ast.AstConnectNode;
import org.kaazing.k3po.lang.internal.ast.AstConnectedNode;
import org.kaazing.k3po.lang.internal.ast.AstDisconnectNode;
@@ -39,6 +42,8 @@
import org.kaazing.k3po.lang.internal.ast.AstPropertyNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAbortNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAbortedNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAwaitNode;
import org.kaazing.k3po.lang.internal.ast.AstReadClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadConfigNode;
@@ -46,6 +51,7 @@
import org.kaazing.k3po.lang.internal.ast.AstReadOptionNode;
import org.kaazing.k3po.lang.internal.ast.AstReadValueNode;
import org.kaazing.k3po.lang.internal.ast.AstRegionException;
+import org.kaazing.k3po.lang.internal.ast.AstRejectedNode;
import org.kaazing.k3po.lang.internal.ast.AstScriptNode;
import org.kaazing.k3po.lang.internal.ast.AstStreamNode;
import org.kaazing.k3po.lang.internal.ast.AstStreamableNode;
@@ -53,6 +59,8 @@
import org.kaazing.k3po.lang.internal.ast.AstUnboundNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAbortNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAbortedNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAwaitNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteCloseNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteConfigNode;
@@ -130,29 +138,57 @@ public AstScriptNode visit(AstAcceptNode acceptNode, State state) {
}
@Override
- public AstScriptNode visit(AstAcceptableNode acceptableNode, State state) {
+ public AstScriptNode visit(AstAcceptedNode acceptedNode, State state) {
- AstAcceptableNode newAcceptableNode = new AstAcceptableNode();
- newAcceptableNode.setRegionInfo(acceptableNode.getRegionInfo());
+ AstAcceptedNode newAcceptedNode = new AstAcceptedNode();
+ newAcceptedNode.setRegionInfo(acceptedNode.getRegionInfo());
- String acceptName = acceptableNode.getAcceptName();
+ String acceptName = acceptedNode.getAcceptName();
if (acceptName == null) {
acceptName = state.implicitAcceptName;
}
AstAcceptNode acceptNode = state.accepts.get(acceptName);
if (acceptNode == null) {
- RegionInfo regionInfo = acceptableNode.getRegionInfo();
+ RegionInfo regionInfo = acceptedNode.getRegionInfo();
throw new AstRegionException("Accept not found for accepted").initRegionInfo(regionInfo);
}
- state.streamables = newAcceptableNode.getStreamables();
- for (AstStreamableNode streamable : acceptableNode.getStreamables()) {
+ state.streamables = newAcceptedNode.getStreamables();
+ for (AstStreamableNode streamable : acceptedNode.getStreamables()) {
streamable.accept(this, state);
}
// associate accepted stream to corresponding accept
- acceptNode.getAcceptables().add(newAcceptableNode);
+ acceptNode.getAcceptables().add(newAcceptedNode);
+
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstRejectedNode rejectedNode, State state) {
+
+ AstRejectedNode newRejectedNode = new AstRejectedNode();
+ newRejectedNode.setRegionInfo(rejectedNode.getRegionInfo());
+
+ String acceptName = rejectedNode.getAcceptName();
+ if (acceptName == null) {
+ acceptName = state.implicitAcceptName;
+ }
+
+ AstAcceptNode acceptNode = state.accepts.get(acceptName);
+ if (acceptNode == null) {
+ RegionInfo regionInfo = rejectedNode.getRegionInfo();
+ throw new AstRegionException("Accept not found for accepted").initRegionInfo(regionInfo);
+ }
+
+ state.streamables = newRejectedNode.getStreamables();
+ for (AstStreamableNode streamable : rejectedNode.getStreamables()) {
+ streamable.accept(this, state);
+ }
+
+ // associate accepted stream to corresponding accept
+ acceptNode.getAcceptables().add(newRejectedNode);
return null;
}
@@ -173,6 +209,18 @@ public AstScriptNode visit(AstConnectNode connectNode, State state) {
return null;
}
+ @Override
+ public AstScriptNode visit(AstConnectAbortNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstConnectAbortedNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
@Override
public AstScriptNode visit(AstReadAwaitNode node, State state) {
@@ -330,6 +378,34 @@ public AstScriptNode visit(AstWriteConfigNode node, State state) {
return null;
}
+ @Override
+ public AstScriptNode visit(AstReadAdviseNode node, State state)
+ {
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstWriteAdviseNode node, State state)
+ {
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstReadAdvisedNode node, State state)
+ {
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstWriteAdvisedNode node, State state)
+ {
+ state.streamables.add(node);
+ return null;
+ }
+
@Override
public AstScriptNode visit(AstReadClosedNode node, State state) {
state.streamables.add(node);
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/GenerateConfigurationVisitor.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/GenerateConfigurationVisitor.java
index 362dc77b5..10e32ed7d 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/GenerateConfigurationVisitor.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/GenerateConfigurationVisitor.java
@@ -25,7 +25,6 @@
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -46,7 +45,7 @@
import org.kaazing.k3po.driver.internal.behavior.BehaviorSystem;
import org.kaazing.k3po.driver.internal.behavior.Configuration;
import org.kaazing.k3po.driver.internal.behavior.handler.CompletionHandler;
-import org.kaazing.k3po.driver.internal.behavior.handler.FailureHandler;
+import org.kaazing.k3po.driver.internal.behavior.handler.RejectedHandler;
import org.kaazing.k3po.driver.internal.behavior.handler.barrier.AwaitBarrierDownstreamHandler;
import org.kaazing.k3po.driver.internal.behavior.handler.barrier.AwaitBarrierUpstreamHandler;
import org.kaazing.k3po.driver.internal.behavior.handler.barrier.NotifyBarrierHandler;
@@ -73,6 +72,7 @@
import org.kaazing.k3po.driver.internal.behavior.handler.codec.WriteShortEncoder;
import org.kaazing.k3po.driver.internal.behavior.handler.codec.WriteTextEncoder;
import org.kaazing.k3po.driver.internal.behavior.handler.command.CloseHandler;
+import org.kaazing.k3po.driver.internal.behavior.handler.command.ConnectAbortHandler;
import org.kaazing.k3po.driver.internal.behavior.handler.command.DisconnectHandler;
import org.kaazing.k3po.driver.internal.behavior.handler.command.FlushHandler;
import org.kaazing.k3po.driver.internal.behavior.handler.command.ReadAbortHandler;
@@ -84,6 +84,7 @@
import org.kaazing.k3po.driver.internal.behavior.handler.event.ChildClosedHandler;
import org.kaazing.k3po.driver.internal.behavior.handler.event.ChildOpenedHandler;
import org.kaazing.k3po.driver.internal.behavior.handler.event.ClosedHandler;
+import org.kaazing.k3po.driver.internal.behavior.handler.event.ConnectAbortedHandler;
import org.kaazing.k3po.driver.internal.behavior.handler.event.ConnectedHandler;
import org.kaazing.k3po.driver.internal.behavior.handler.event.DisconnectedHandler;
import org.kaazing.k3po.driver.internal.behavior.handler.event.InputShutdownHandler;
@@ -101,11 +102,14 @@
import org.kaazing.k3po.lang.internal.RegionInfo;
import org.kaazing.k3po.lang.internal.ast.AstAcceptNode;
import org.kaazing.k3po.lang.internal.ast.AstAcceptableNode;
+import org.kaazing.k3po.lang.internal.ast.AstAcceptedNode;
import org.kaazing.k3po.lang.internal.ast.AstBoundNode;
import org.kaazing.k3po.lang.internal.ast.AstChildClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstChildOpenedNode;
import org.kaazing.k3po.lang.internal.ast.AstCloseNode;
import org.kaazing.k3po.lang.internal.ast.AstClosedNode;
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortNode;
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortedNode;
import org.kaazing.k3po.lang.internal.ast.AstConnectNode;
import org.kaazing.k3po.lang.internal.ast.AstConnectedNode;
import org.kaazing.k3po.lang.internal.ast.AstDisconnectNode;
@@ -115,12 +119,15 @@
import org.kaazing.k3po.lang.internal.ast.AstPropertyNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAbortNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAbortedNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAwaitNode;
import org.kaazing.k3po.lang.internal.ast.AstReadClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadConfigNode;
import org.kaazing.k3po.lang.internal.ast.AstReadNotifyNode;
import org.kaazing.k3po.lang.internal.ast.AstReadOptionNode;
import org.kaazing.k3po.lang.internal.ast.AstReadValueNode;
+import org.kaazing.k3po.lang.internal.ast.AstRejectedNode;
import org.kaazing.k3po.lang.internal.ast.AstScriptNode;
import org.kaazing.k3po.lang.internal.ast.AstStreamNode;
import org.kaazing.k3po.lang.internal.ast.AstStreamableNode;
@@ -128,6 +135,8 @@
import org.kaazing.k3po.lang.internal.ast.AstUnboundNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAbortNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAbortedNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAwaitNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteCloseNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteConfigNode;
@@ -257,7 +266,7 @@ public Configuration visit(AstPropertyNode propertyNode, State state) {
}
@Override
- public Configuration visit(AstAcceptableNode acceptedNode, State state) {
+ public Configuration visit(AstAcceptedNode acceptedNode, State state) {
// masking is a no-op by default for each stream
state.readUnmasker = Masker.IDENTITY_MASKER;
@@ -278,6 +287,33 @@ public Configuration visit(AstAcceptableNode acceptedNode, State state) {
return state.configuration;
}
+ @Override
+ public Configuration visit(AstRejectedNode rejectedNode, State state) {
+
+ // masking is a no-op by default for each stream
+ state.readUnmasker = Masker.IDENTITY_MASKER;
+ state.writeMasker = Masker.IDENTITY_MASKER;
+
+ state.pipelineAsMap = new LinkedHashMap<>();
+
+ Map pipelineAsMap = state.pipelineAsMap;
+ String rejectedName = String.format("rejected#%d", pipelineAsMap.size() + 1);
+ RejectedHandler rejected = new RejectedHandler();
+ rejected.setRegionInfo(rejectedNode.getRegionInfo());
+ pipelineAsMap.put(rejectedName, rejected);
+
+ for (AstStreamableNode streamable : rejectedNode.getStreamables()) {
+ streamable.accept(this, state);
+ }
+
+ String completionName = String.format("completion#%d", pipelineAsMap.size() + 1);
+ CompletionHandler completion = new CompletionHandler();
+ completion.setRegionInfo(rejectedNode.getRegionInfo());
+ pipelineAsMap.put(completionName, completion);
+
+ return state.configuration;
+ }
+
@Override
public Configuration visit(AstAcceptNode acceptNode, State state) {
@@ -305,19 +341,6 @@ public Configuration visit(AstAcceptNode acceptNode, State state) {
state.configuration.getServerPipelines(acceptInfo).addAll(pipelines);
state.configuration.getClientAndServerPipelines().addAll(pipelines);
- /*
- * As new connections are accepted we grab a pipeline line off the list. Note the pipelines map is ordered. Note
- * that the final pipeline is just a Fail and Complete so that additional connect attempts will fail.
- */
- ChannelPipelineFactory pipelineFactory = new ChannelPipelineFactory() {
- private final Iterator i = pipelines.iterator();
-
- @Override
- public ChannelPipeline getPipeline() {
- return i.hasNext() ? i.next() : pipeline(new FailureHandler(), new CompletionHandler());
- }
- };
-
Map acceptOptions = new HashMap<>();
acceptOptions.put("regionInfo", acceptInfo);
acceptOptions.putAll(acceptNode.getOptions());
@@ -335,7 +358,7 @@ public ChannelPipeline getPipeline() {
// accept uri is available.
Supplier locationResolver = acceptNode.getLocation()::getValue;
ServerBootstrapResolver serverResolver = new ServerBootstrapResolver(bootstrapFactory, addressFactory,
- pipelineFactory, locationResolver, optionsResolver, notifyBarrier);
+ pipelines, locationResolver, optionsResolver, notifyBarrier);
state.configuration.getServerResolvers().add(serverResolver);
@@ -399,7 +422,7 @@ public ChannelPipeline getPipeline() {
OptionsResolver optionsResolver = new OptionsResolver(connectNode.getOptions());
ClientBootstrapResolver clientResolver = new ClientBootstrapResolver(bootstrapFactory, addressFactory,
- pipelineFactory, locationResolver, optionsResolver, awaitBarrier, connectNode.getRegionInfo());
+ pipelineFactory, locationResolver, optionsResolver, awaitBarrier);
// retain pipelines for tear down
state.configuration.getClientAndServerPipelines().add(pipeline);
@@ -691,6 +714,36 @@ public Configuration visit(AstConnectedNode node, State state) {
return state.configuration;
}
+ @Override
+ public Configuration visit(AstConnectAbortNode node, State state) {
+
+ RegionInfo regionInfo = node.getRegionInfo();
+
+ ConnectAbortHandler handler = new ConnectAbortHandler();
+ handler.setRegionInfo(regionInfo);
+
+ Map pipelineAsMap = state.pipelineAsMap;
+ String handlerName = String.format("connect abort#%d", pipelineAsMap.size() + 1);
+ pipelineAsMap.put(handlerName, handler);
+
+ return state.configuration;
+ }
+
+ @Override
+ public Configuration visit(AstConnectAbortedNode node, State state) {
+
+ RegionInfo regionInfo = node.getRegionInfo();
+
+ ConnectAbortedHandler handler = new ConnectAbortedHandler();
+ handler.setRegionInfo(regionInfo);
+
+ Map pipelineAsMap = state.pipelineAsMap;
+ String handlerName = String.format("connect aborted#%d", pipelineAsMap.size() + 1);
+ pipelineAsMap.put(handlerName, handler);
+
+ return state.configuration;
+ }
+
@Override
public Configuration visit(AstReadValueNode node, State state) {
@@ -934,6 +987,7 @@ public Configuration visit(AstReadConfigNode node, State state) {
throw new IllegalStateException("Unrecognized configuration type: " + node.getType());
}
}
+
@Override
public Configuration visit(AstWriteConfigNode node, State state) {
@@ -951,6 +1005,74 @@ public Configuration visit(AstWriteConfigNode node, State state) {
}
}
+ @Override
+ public Configuration visit(AstReadAdviseNode node, State state) {
+
+ Function, MessageEncoder> encoderFactory = v -> v.accept(new GenerateWriteEncoderVisitor(), null);
+ ChannelHandler handler = behaviorSystem.newReadAdviseHandler(node, encoderFactory);
+
+ if (handler != null) {
+ Map pipelineAsMap = state.pipelineAsMap;
+ String handlerName = String.format("readAdvise#%d (%s)", pipelineAsMap.size() + 1, node.getType().getName());
+ pipelineAsMap.put(handlerName, handler);
+ return state.configuration;
+ }
+ else {
+ throw new IllegalStateException("Unrecognized advisory type: " + node.getType());
+ }
+ }
+
+ @Override
+ public Configuration visit(AstWriteAdviseNode node, State state) {
+
+ Function, MessageEncoder> encoderFactory = v -> v.accept(new GenerateWriteEncoderVisitor(), null);
+ ChannelHandler handler = behaviorSystem.newWriteAdviseHandler(node, encoderFactory);
+
+ if (handler != null) {
+ Map pipelineAsMap = state.pipelineAsMap;
+ String handlerName = String.format("writeAdvise#%d (%s)", pipelineAsMap.size() + 1, node.getType().getName());
+ pipelineAsMap.put(handlerName, handler);
+ return state.configuration;
+ }
+ else {
+ throw new IllegalStateException("Unrecognized advisory type: " + node.getType());
+ }
+ }
+
+ @Override
+ public Configuration visit(AstReadAdvisedNode node, State state) {
+
+ Function decoderFactory = m -> m.accept(new GenerateReadDecoderVisitor(), state.configuration);
+ ChannelHandler handler = behaviorSystem.newReadAdvisedHandler(node, decoderFactory);
+
+ if (handler != null) {
+ Map pipelineAsMap = state.pipelineAsMap;
+ String handlerName = String.format("readAdvised#%d (%s)", pipelineAsMap.size() + 1, node.getType().getName());
+ pipelineAsMap.put(handlerName, handler);
+ return state.configuration;
+ }
+ else {
+ throw new IllegalStateException("Unrecognized advisory type: " + node.getType());
+ }
+ }
+
+ @Override
+ public Configuration visit(AstWriteAdvisedNode node, State state) {
+
+ Function decoderFactory = m -> m.accept(new GenerateReadDecoderVisitor(), state.configuration);
+ ChannelHandler handler = behaviorSystem.newWriteAdvisedHandler(node, decoderFactory);
+
+ if (handler != null) {
+ Map pipelineAsMap = state.pipelineAsMap;
+ String handlerName = String.format("writeAdvised#%d (%s)", pipelineAsMap.size() + 1, node.getType().getName());
+ pipelineAsMap.put(handlerName, handler);
+ return state.configuration;
+ }
+ else {
+ throw new IllegalStateException("Unrecognized advisory type: " + node.getType());
+ }
+ }
+
@Override
public Configuration visit(AstReadClosedNode node, State state) {
InputShutdownHandler handler = new InputShutdownHandler();
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectBarriersVisitor.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectBarriersVisitor.java
index a72a17863..016413f5a 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectBarriersVisitor.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectBarriersVisitor.java
@@ -21,11 +21,14 @@
import org.kaazing.k3po.lang.internal.RegionInfo;
import org.kaazing.k3po.lang.internal.ast.AstAcceptNode;
import org.kaazing.k3po.lang.internal.ast.AstAcceptableNode;
+import org.kaazing.k3po.lang.internal.ast.AstAcceptedNode;
import org.kaazing.k3po.lang.internal.ast.AstBoundNode;
import org.kaazing.k3po.lang.internal.ast.AstChildClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstChildOpenedNode;
import org.kaazing.k3po.lang.internal.ast.AstCloseNode;
import org.kaazing.k3po.lang.internal.ast.AstClosedNode;
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortNode;
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortedNode;
import org.kaazing.k3po.lang.internal.ast.AstConnectNode;
import org.kaazing.k3po.lang.internal.ast.AstConnectedNode;
import org.kaazing.k3po.lang.internal.ast.AstDisconnectNode;
@@ -35,12 +38,15 @@
import org.kaazing.k3po.lang.internal.ast.AstPropertyNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAbortNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAbortedNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAwaitNode;
import org.kaazing.k3po.lang.internal.ast.AstReadClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadConfigNode;
import org.kaazing.k3po.lang.internal.ast.AstReadNotifyNode;
import org.kaazing.k3po.lang.internal.ast.AstReadOptionNode;
import org.kaazing.k3po.lang.internal.ast.AstReadValueNode;
+import org.kaazing.k3po.lang.internal.ast.AstRejectedNode;
import org.kaazing.k3po.lang.internal.ast.AstScriptNode;
import org.kaazing.k3po.lang.internal.ast.AstStreamNode;
import org.kaazing.k3po.lang.internal.ast.AstStreamableNode;
@@ -48,6 +54,8 @@
import org.kaazing.k3po.lang.internal.ast.AstUnboundNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAbortNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAbortedNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAwaitNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteCloseNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteConfigNode;
@@ -112,20 +120,39 @@ public AstScriptNode visit(AstAcceptNode acceptNode, State state) {
}
@Override
- public AstScriptNode visit(AstAcceptableNode acceptableNode, State state) {
+ public AstScriptNode visit(AstAcceptedNode acceptedNode, State state) {
state.readWriteState = ReadWriteState.NONE;
- AstAcceptableNode newAcceptableNode = new AstAcceptableNode();
- newAcceptableNode.setRegionInfo(acceptableNode.getRegionInfo());
- newAcceptableNode.setAcceptName(acceptableNode.getAcceptName());
+ AstAcceptedNode newAcceptedNode = new AstAcceptedNode();
+ newAcceptedNode.setRegionInfo(acceptedNode.getRegionInfo());
+ newAcceptedNode.setAcceptName(acceptedNode.getAcceptName());
- state.streamables = newAcceptableNode.getStreamables();
- for (AstStreamableNode streamable : acceptableNode.getStreamables()) {
+ state.streamables = newAcceptedNode.getStreamables();
+ for (AstStreamableNode streamable : acceptedNode.getStreamables()) {
streamable.accept(this, state);
}
- state.streams.add(newAcceptableNode);
+ state.streams.add(newAcceptedNode);
+
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstRejectedNode rejectedNode, State state) {
+
+ state.readWriteState = ReadWriteState.NONE;
+
+ AstRejectedNode newRejectedNode = new AstRejectedNode();
+ newRejectedNode.setRegionInfo(rejectedNode.getRegionInfo());
+ newRejectedNode.setAcceptName(rejectedNode.getAcceptName());
+
+ state.streamables = newRejectedNode.getStreamables();
+ for (AstStreamableNode streamable : rejectedNode.getStreamables()) {
+ streamable.accept(this, state);
+ }
+
+ state.streams.add(newRejectedNode);
return null;
}
@@ -147,6 +174,18 @@ public AstScriptNode visit(AstConnectNode connectNode, State state) {
return null;
}
+ @Override
+ public AstScriptNode visit(AstConnectAbortNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstConnectAbortedNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
@Override
public AstScriptNode visit(AstReadAwaitNode node, State state) {
@@ -312,6 +351,30 @@ public AstScriptNode visit(AstWriteConfigNode node, State state) {
return null;
}
+ @Override
+ public AstScriptNode visit(AstReadAdviseNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstWriteAdviseNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstReadAdvisedNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstWriteAdvisedNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
@Override
public AstScriptNode visit(AstReadClosedNode node, State state) {
state.streamables.add(node);
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectEventsVisitor.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectEventsVisitor.java
index b7a360f1c..92b07a615 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectEventsVisitor.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectEventsVisitor.java
@@ -20,11 +20,14 @@
import org.kaazing.k3po.driver.internal.behavior.visitor.InjectEventsVisitor.State;
import org.kaazing.k3po.lang.internal.ast.AstAcceptNode;
import org.kaazing.k3po.lang.internal.ast.AstAcceptableNode;
+import org.kaazing.k3po.lang.internal.ast.AstAcceptedNode;
import org.kaazing.k3po.lang.internal.ast.AstBoundNode;
import org.kaazing.k3po.lang.internal.ast.AstChildClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstChildOpenedNode;
import org.kaazing.k3po.lang.internal.ast.AstCloseNode;
import org.kaazing.k3po.lang.internal.ast.AstClosedNode;
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortNode;
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortedNode;
import org.kaazing.k3po.lang.internal.ast.AstConnectNode;
import org.kaazing.k3po.lang.internal.ast.AstConnectedNode;
import org.kaazing.k3po.lang.internal.ast.AstDisconnectNode;
@@ -34,12 +37,15 @@
import org.kaazing.k3po.lang.internal.ast.AstPropertyNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAbortNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAbortedNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAwaitNode;
import org.kaazing.k3po.lang.internal.ast.AstReadClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadConfigNode;
import org.kaazing.k3po.lang.internal.ast.AstReadNotifyNode;
import org.kaazing.k3po.lang.internal.ast.AstReadOptionNode;
import org.kaazing.k3po.lang.internal.ast.AstReadValueNode;
+import org.kaazing.k3po.lang.internal.ast.AstRejectedNode;
import org.kaazing.k3po.lang.internal.ast.AstScriptNode;
import org.kaazing.k3po.lang.internal.ast.AstStreamNode;
import org.kaazing.k3po.lang.internal.ast.AstStreamableNode;
@@ -47,6 +53,8 @@
import org.kaazing.k3po.lang.internal.ast.AstUnboundNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAbortNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAbortedNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAwaitNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteCloseNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteConfigNode;
@@ -110,20 +118,39 @@ public AstScriptNode visit(AstAcceptNode acceptNode, State state) {
}
@Override
- public AstScriptNode visit(AstAcceptableNode acceptableNode, State state) {
+ public AstScriptNode visit(AstAcceptedNode acceptedNode, State state) {
state.connectivityState = ConnectivityState.NONE;
- AstAcceptableNode newAcceptableNode = new AstAcceptableNode();
- newAcceptableNode.setRegionInfo(acceptableNode.getRegionInfo());
- newAcceptableNode.setAcceptName(acceptableNode.getAcceptName());
+ AstAcceptedNode newAcceptedNode = new AstAcceptedNode();
+ newAcceptedNode.setRegionInfo(acceptedNode.getRegionInfo());
+ newAcceptedNode.setAcceptName(acceptedNode.getAcceptName());
- state.streamables = newAcceptableNode.getStreamables();
- for (AstStreamableNode streamable : acceptableNode.getStreamables()) {
+ state.streamables = newAcceptedNode.getStreamables();
+ for (AstStreamableNode streamable : acceptedNode.getStreamables()) {
streamable.accept(this, state);
}
- state.streams.add(newAcceptableNode);
+ state.streams.add(newAcceptedNode);
+
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstRejectedNode rejectedNode, State state) {
+
+ state.connectivityState = ConnectivityState.NONE;
+
+ AstRejectedNode newRejectedNode = new AstRejectedNode();
+ newRejectedNode.setRegionInfo(rejectedNode.getRegionInfo());
+ newRejectedNode.setAcceptName(rejectedNode.getAcceptName());
+
+ state.streamables = newRejectedNode.getStreamables();
+ for (AstStreamableNode streamable : rejectedNode.getStreamables()) {
+ streamable.accept(this, state);
+ }
+
+ state.streams.add(newRejectedNode);
return null;
}
@@ -342,6 +369,64 @@ public AstScriptNode visit(AstConnectedNode connectedNode, State state) {
return null;
}
+ @Override
+ public AstScriptNode visit(AstConnectAbortNode connectAbortNode, State state) {
+
+ switch (state.connectivityState) {
+ case NONE:
+ case OPENED:
+ AstBoundNode boundNode = new AstBoundNode();
+ boundNode.setRegionInfo(connectAbortNode.getRegionInfo());
+ boundNode.accept(this, state);
+ break;
+ default:
+ break;
+ }
+
+ // The above switch might have changed the connectivity state, so
+ // we switch on it again
+ switch (state.connectivityState) {
+ case BOUND:
+ state.streamables.add(connectAbortNode);
+ state.connectivityState = ConnectivityState.CLOSED;
+ break;
+
+ default:
+ throw new IllegalStateException("Unexpected connect abort");
+ }
+
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstConnectAbortedNode connectAbortedNode, State state) {
+
+ switch (state.connectivityState) {
+ case NONE:
+ case OPENED:
+ AstBoundNode boundNode = new AstBoundNode();
+ boundNode.setRegionInfo(connectAbortedNode.getRegionInfo());
+ boundNode.accept(this, state);
+ break;
+ default:
+ break;
+ }
+
+ // The above switch might have changed the connectivity state, so
+ // we switch on it again
+ switch (state.connectivityState) {
+ case BOUND:
+ state.streamables.add(connectAbortedNode);
+ state.connectivityState = ConnectivityState.CLOSED;
+ break;
+
+ default:
+ throw new IllegalStateException("Unexpected event: connect aborted");
+ }
+
+ return null;
+ }
+
@Override
public AstScriptNode visit(AstReadValueNode node, State state) {
@@ -486,6 +571,58 @@ public AstScriptNode visit(AstWriteConfigNode node, State state) {
return null;
}
+ @Override
+ public AstScriptNode visit(AstReadAdviseNode node, State state) {
+ switch (state.connectivityState) {
+ case NONE:
+ case CONNECTED:
+ break;
+ default:
+ throw new IllegalStateException(String.format("Unexpected \"%s\" before connected", node));
+ }
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstWriteAdviseNode node, State state) {
+ switch (state.connectivityState) {
+ case NONE:
+ case CONNECTED:
+ break;
+ default:
+ throw new IllegalStateException(String.format("Unexpected \"%s\" before connected", node));
+ }
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstReadAdvisedNode node, State state) {
+ switch (state.connectivityState) {
+ case NONE:
+ case CONNECTED:
+ break;
+ default:
+ throw new IllegalStateException(String.format("Unexpected \"%s\" before connected", node));
+ }
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstWriteAdvisedNode node, State state) {
+ switch (state.connectivityState) {
+ case NONE:
+ case CONNECTED:
+ break;
+ default:
+ throw new IllegalStateException(String.format("Unexpected \"%s\" before connected", node));
+ }
+ state.streamables.add(node);
+ return null;
+ }
+
@Override
public AstScriptNode visit(AstReadClosedNode node, State state) {
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectFlushVisitor.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectFlushVisitor.java
index fe48a39ef..829b3b324 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectFlushVisitor.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectFlushVisitor.java
@@ -20,11 +20,14 @@
import org.kaazing.k3po.driver.internal.behavior.visitor.InjectFlushVisitor.State;
import org.kaazing.k3po.lang.internal.ast.AstAcceptNode;
import org.kaazing.k3po.lang.internal.ast.AstAcceptableNode;
+import org.kaazing.k3po.lang.internal.ast.AstAcceptedNode;
import org.kaazing.k3po.lang.internal.ast.AstBoundNode;
import org.kaazing.k3po.lang.internal.ast.AstChildClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstChildOpenedNode;
import org.kaazing.k3po.lang.internal.ast.AstCloseNode;
import org.kaazing.k3po.lang.internal.ast.AstClosedNode;
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortNode;
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortedNode;
import org.kaazing.k3po.lang.internal.ast.AstConnectNode;
import org.kaazing.k3po.lang.internal.ast.AstConnectedNode;
import org.kaazing.k3po.lang.internal.ast.AstDisconnectNode;
@@ -34,12 +37,15 @@
import org.kaazing.k3po.lang.internal.ast.AstPropertyNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAbortNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAbortedNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAwaitNode;
import org.kaazing.k3po.lang.internal.ast.AstReadClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadConfigNode;
import org.kaazing.k3po.lang.internal.ast.AstReadNotifyNode;
import org.kaazing.k3po.lang.internal.ast.AstReadOptionNode;
import org.kaazing.k3po.lang.internal.ast.AstReadValueNode;
+import org.kaazing.k3po.lang.internal.ast.AstRejectedNode;
import org.kaazing.k3po.lang.internal.ast.AstScriptNode;
import org.kaazing.k3po.lang.internal.ast.AstStreamNode;
import org.kaazing.k3po.lang.internal.ast.AstStreamableNode;
@@ -47,6 +53,8 @@
import org.kaazing.k3po.lang.internal.ast.AstUnboundNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAbortNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAbortedNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAwaitNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteCloseNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteConfigNode;
@@ -112,21 +120,41 @@ public AstScriptNode visit(AstAcceptNode acceptNode, State state) {
}
@Override
- public AstScriptNode visit(AstAcceptableNode acceptableNode, State state) {
+ public AstScriptNode visit(AstAcceptedNode acceptedNode, State state) {
state.readState = ReadWriteState.NONE;
state.writeState = ReadWriteState.NONE;
- AstAcceptableNode newAcceptableNode = new AstAcceptableNode();
- newAcceptableNode.setRegionInfo(acceptableNode.getRegionInfo());
- newAcceptableNode.setAcceptName(acceptableNode.getAcceptName());
+ AstAcceptedNode newAcceptedNode = new AstAcceptedNode();
+ newAcceptedNode.setRegionInfo(acceptedNode.getRegionInfo());
+ newAcceptedNode.setAcceptName(acceptedNode.getAcceptName());
- state.streamables = newAcceptableNode.getStreamables();
- for (AstStreamableNode streamable : acceptableNode.getStreamables()) {
+ state.streamables = newAcceptedNode.getStreamables();
+ for (AstStreamableNode streamable : acceptedNode.getStreamables()) {
streamable.accept(this, state);
}
- state.streams.add(newAcceptableNode);
+ state.streams.add(newAcceptedNode);
+
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstRejectedNode rejectedNode, State state) {
+
+ state.readState = ReadWriteState.NONE;
+ state.writeState = ReadWriteState.NONE;
+
+ AstRejectedNode newRejectedNode = new AstRejectedNode();
+ newRejectedNode.setRegionInfo(rejectedNode.getRegionInfo());
+ newRejectedNode.setAcceptName(rejectedNode.getAcceptName());
+
+ state.streamables = newRejectedNode.getStreamables();
+ for (AstStreamableNode streamable : rejectedNode.getStreamables()) {
+ streamable.accept(this, state);
+ }
+
+ state.streams.add(newRejectedNode);
return null;
}
@@ -149,6 +177,18 @@ public AstScriptNode visit(AstConnectNode connectNode, State state) {
return null;
}
+ @Override
+ public AstScriptNode visit(AstConnectAbortNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstConnectAbortedNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
@Override
public AstScriptNode visit(AstReadAwaitNode node, State state) {
@@ -349,6 +389,30 @@ public AstScriptNode visit(AstWriteConfigNode node, State state) {
return null;
}
+ @Override
+ public AstScriptNode visit(AstReadAdviseNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstWriteAdviseNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstReadAdvisedNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstWriteAdvisedNode node, State state) {
+ state.streamables.add(node);
+ return null;
+ }
+
@Override
public AstScriptNode visit(AstReadClosedNode node, State state) {
state.streamables.add(node);
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/ValidateStreamsVisitor.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/ValidateStreamsVisitor.java
index 5684836f1..bae35118b 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/ValidateStreamsVisitor.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/behavior/visitor/ValidateStreamsVisitor.java
@@ -17,12 +17,15 @@
import org.kaazing.k3po.lang.internal.ast.AstAcceptNode;
import org.kaazing.k3po.lang.internal.ast.AstAcceptableNode;
+import org.kaazing.k3po.lang.internal.ast.AstAcceptedNode;
import org.kaazing.k3po.lang.internal.ast.AstBoundNode;
import org.kaazing.k3po.lang.internal.ast.AstChildClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstChildOpenedNode;
import org.kaazing.k3po.lang.internal.ast.AstCloseNode;
import org.kaazing.k3po.lang.internal.ast.AstClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstCommandNode;
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortNode;
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortedNode;
import org.kaazing.k3po.lang.internal.ast.AstConnectNode;
import org.kaazing.k3po.lang.internal.ast.AstConnectedNode;
import org.kaazing.k3po.lang.internal.ast.AstDisconnectNode;
@@ -33,12 +36,15 @@
import org.kaazing.k3po.lang.internal.ast.AstPropertyNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAbortNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAbortedNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadAwaitNode;
import org.kaazing.k3po.lang.internal.ast.AstReadClosedNode;
import org.kaazing.k3po.lang.internal.ast.AstReadConfigNode;
import org.kaazing.k3po.lang.internal.ast.AstReadNotifyNode;
import org.kaazing.k3po.lang.internal.ast.AstReadOptionNode;
import org.kaazing.k3po.lang.internal.ast.AstReadValueNode;
+import org.kaazing.k3po.lang.internal.ast.AstRejectedNode;
import org.kaazing.k3po.lang.internal.ast.AstScriptNode;
import org.kaazing.k3po.lang.internal.ast.AstStreamNode;
import org.kaazing.k3po.lang.internal.ast.AstStreamableNode;
@@ -46,6 +52,8 @@
import org.kaazing.k3po.lang.internal.ast.AstUnboundNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAbortNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAbortedNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdviseNode;
+import org.kaazing.k3po.lang.internal.ast.AstWriteAdvisedNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteAwaitNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteCloseNode;
import org.kaazing.k3po.lang.internal.ast.AstWriteConfigNode;
@@ -118,11 +126,38 @@ public AstScriptNode visit(AstConnectNode connectNode, State state) {
return null;
}
+ @Override
+ public AstScriptNode visit(AstConnectAbortNode node, State state) {
+
+ switch (state.writeState) {
+ case OPEN:
+ state.readState = StreamState.CLOSED;
+ break;
+ default:
+ throw new IllegalStateException(unexpectedInWriteState(node, state));
+ }
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstConnectAbortedNode node, State state) {
+
+ switch (state.writeState) {
+ case OPEN:
+ state.readState = StreamState.CLOSED;
+ break;
+ default:
+ throw new IllegalStateException(unexpectedInWriteState(node, state));
+ }
+ return null;
+ }
+
@Override
public AstScriptNode visit(AstReadConfigNode node, State state) {
switch (state.readState) {
case OPEN:
+ case CLOSED:
break;
default:
throw new IllegalStateException(String.format("Unexpected read config event (%s) while reading in state %s", node
@@ -136,6 +171,7 @@ public AstScriptNode visit(AstWriteConfigNode node, State state) {
switch (state.writeState) {
case OPEN:
+ case CLOSED:
break;
default:
throw new IllegalStateException(String.format("Unexpected write config command (%s) while writing in state %s", node
@@ -144,6 +180,62 @@ public AstScriptNode visit(AstWriteConfigNode node, State state) {
return null;
}
+ @Override
+ public AstScriptNode visit(AstReadAdviseNode node, State state) {
+
+ switch (state.readState) {
+ case OPEN:
+ case CLOSED:
+ break;
+ default:
+ throw new IllegalStateException(String.format("Unexpected read advise command (%s) while writing in state %s", node
+ .toString().trim(), state.writeState));
+ }
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstReadAdvisedNode node, State state) {
+
+ switch (state.readState) {
+ case OPEN:
+ case CLOSED:
+ break;
+ default:
+ throw new IllegalStateException(String.format("Unexpected read advised event (%s) while writing in state %s", node
+ .toString().trim(), state.writeState));
+ }
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstWriteAdviseNode node, State state) {
+
+ switch (state.writeState) {
+ case OPEN:
+ case CLOSED:
+ break;
+ default:
+ throw new IllegalStateException(String.format("Unexpected write advise command (%s) while writing in state %s", node
+ .toString().trim(), state.writeState));
+ }
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstWriteAdvisedNode node, State state) {
+
+ switch (state.writeState) {
+ case OPEN:
+ case CLOSED:
+ break;
+ default:
+ throw new IllegalStateException(String.format("Unexpected write advised event (%s) while writing in state %s", node
+ .toString().trim(), state.writeState));
+ }
+ return null;
+ }
+
@Override
public AstScriptNode visit(AstReadClosedNode node, State state) {
@@ -261,9 +353,19 @@ public AstScriptNode visit(AstWriteFlushNode node, State state) {
}
@Override
- public AstScriptNode visit(AstAcceptableNode acceptableNode, State state) {
+ public AstScriptNode visit(AstAcceptedNode node, State state) {
+
+ for (AstStreamableNode streamable : node.getStreamables()) {
+ streamable.accept(this, state);
+ }
+
+ return null;
+ }
+
+ @Override
+ public AstScriptNode visit(AstRejectedNode node, State state) {
- for (AstStreamableNode streamable : acceptableNode.getStreamables()) {
+ for (AstStreamableNode streamable : node.getStreamables()) {
streamable.accept(this, state);
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/ext/tls/TlsBehaviorSystem.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/ext/tls/TlsBehaviorSystem.java
index 403ccd53e..243fa2877 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/ext/tls/TlsBehaviorSystem.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/ext/tls/TlsBehaviorSystem.java
@@ -21,8 +21,12 @@
import java.util.Set;
import org.kaazing.k3po.driver.internal.behavior.BehaviorSystemSpi;
+import org.kaazing.k3po.driver.internal.behavior.ReadAdviseFactory;
+import org.kaazing.k3po.driver.internal.behavior.ReadAdvisedFactory;
import org.kaazing.k3po.driver.internal.behavior.ReadConfigFactory;
import org.kaazing.k3po.driver.internal.behavior.ReadOptionFactory;
+import org.kaazing.k3po.driver.internal.behavior.WriteAdviseFactory;
+import org.kaazing.k3po.driver.internal.behavior.WriteAdvisedFactory;
import org.kaazing.k3po.driver.internal.behavior.WriteConfigFactory;
import org.kaazing.k3po.driver.internal.behavior.WriteOptionFactory;
import org.kaazing.k3po.lang.types.StructuredTypeInfo;
@@ -36,12 +40,21 @@ public class TlsBehaviorSystem implements BehaviorSystemSpi {
private final Map readConfigFactories;
private final Map writeConfigFactories;
+ private final Map readAdviseFactories;
+ private final Map writeAdviseFactories;
+ private final Map readAdvisedFactories;
+ private final Map writeAdvisedFactories;
+
public TlsBehaviorSystem()
{
this.readOptionFactories = emptyMap();
this.writeOptionFactories = emptyMap();
this.readConfigFactories = emptyMap();
this.writeConfigFactories = emptyMap();
+ this.readAdviseFactories = emptyMap();
+ this.writeAdviseFactories = emptyMap();
+ this.readAdvisedFactories = emptyMap();
+ this.writeAdvisedFactories = emptyMap();
}
@Override
@@ -70,6 +83,46 @@ public WriteConfigFactory writeConfigFactory(
return writeConfigFactories.get(configType);
}
+ @Override
+ public Set getReadAdvisoryTypes()
+ {
+ return readAdviseFactories.keySet();
+ }
+
+ @Override
+ public Set getWriteAdvisoryTypes()
+ {
+ return writeAdviseFactories.keySet();
+ }
+
+ @Override
+ public ReadAdviseFactory readAdviseFactory(
+ StructuredTypeInfo advisoryType)
+ {
+ return readAdviseFactories.get(advisoryType);
+ }
+
+ @Override
+ public ReadAdvisedFactory readAdvisedFactory(
+ StructuredTypeInfo advisoryType)
+ {
+ return readAdvisedFactories.get(advisoryType);
+ }
+
+ @Override
+ public WriteAdviseFactory writeAdviseFactory(
+ StructuredTypeInfo advisoryType)
+ {
+ return writeAdviseFactories.get(advisoryType);
+ }
+
+ @Override
+ public WriteAdvisedFactory writeAdvisedFactory(
+ StructuredTypeInfo advisoryType)
+ {
+ return writeAdvisedFactories.get(advisoryType);
+ }
+
@Override
public Set> getReadOptionTypes()
{
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/ext/tls/TlsTypeSystem.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/ext/tls/TlsTypeSystem.java
index e87b991f4..501e568ec 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/ext/tls/TlsTypeSystem.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/ext/tls/TlsTypeSystem.java
@@ -43,6 +43,8 @@ public final class TlsTypeSystem implements TypeSystemSpi
private final Set> writeOptions;
private final Set readConfigs;
private final Set writeConfigs;
+ private final Set readAdvisories;
+ private final Set writeAdvisories;
public TlsTypeSystem()
{
@@ -70,6 +72,8 @@ public TlsTypeSystem()
this.writeOptions = emptySet();
this.readConfigs = emptySet();
this.writeConfigs = emptySet();;
+ this.readAdvisories = emptySet();
+ this.writeAdvisories = emptySet();
}
@Override
@@ -113,4 +117,16 @@ public Set writeConfigs()
{
return writeConfigs;
}
+
+ @Override
+ public Set readAdvisories()
+ {
+ return readAdvisories;
+ }
+
+ @Override
+ public Set writeAdvisories()
+ {
+ return writeAdvisories;
+ }
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/functions/agrona/Functions.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/functions/agrona/Functions.java
index 6acd5a139..c2939c23d 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/functions/agrona/Functions.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/functions/agrona/Functions.java
@@ -54,7 +54,7 @@ public static ChannelWriter manyToOneWriter(AtomicBuffer buffer) {
@Function
public static ChannelReader broadcastReceiver(AtomicBuffer buffer) {
- return new CopyBroadcastReceiverChannelReader(new CopyBroadcastReceiver(new BroadcastReceiver(buffer)));
+ return new CopyBroadcastReceiverChannelReader(new FlushingCopyBroadcastReceiver(new BroadcastReceiver(buffer)));
}
@Function
@@ -75,6 +75,20 @@ public String getPrefixName() {
}
+ private static final class FlushingCopyBroadcastReceiver extends CopyBroadcastReceiver
+ {
+ public FlushingCopyBroadcastReceiver(
+ BroadcastReceiver receiver)
+ {
+ super(receiver);
+
+ while (receiver.receiveNext())
+ {
+ // flush to latest
+ }
+ }
+ }
+
private Functions() {
// utility
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/bootstrap/channel/AbstractChannelSink.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/bootstrap/channel/AbstractChannelSink.java
index 0e8d1c5da..0af637778 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/bootstrap/channel/AbstractChannelSink.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/bootstrap/channel/AbstractChannelSink.java
@@ -21,9 +21,11 @@
import org.jboss.netty.channel.MessageEvent;
import org.kaazing.k3po.driver.internal.netty.channel.FlushEvent;
import org.kaazing.k3po.driver.internal.netty.channel.ReadAbortEvent;
+import org.kaazing.k3po.driver.internal.netty.channel.ReadAdviseEvent;
import org.kaazing.k3po.driver.internal.netty.channel.ShutdownInputEvent;
import org.kaazing.k3po.driver.internal.netty.channel.ShutdownOutputEvent;
import org.kaazing.k3po.driver.internal.netty.channel.WriteAbortEvent;
+import org.kaazing.k3po.driver.internal.netty.channel.WriteAdviseEvent;
public abstract class AbstractChannelSink extends org.jboss.netty.channel.AbstractChannelSink {
@@ -71,6 +73,10 @@ public void eventSunk(ChannelPipeline pipeline, ChannelEvent e) throws Exception
abortInputRequested(pipeline, (ReadAbortEvent) e);
} else if (e instanceof WriteAbortEvent) {
abortOutputRequested(pipeline, (WriteAbortEvent) e);
+ } else if (e instanceof ReadAdviseEvent) {
+ adviseInputRequested(pipeline, (ReadAdviseEvent) e);
+ } else if (e instanceof WriteAdviseEvent) {
+ adviseOutputRequested(pipeline, (WriteAdviseEvent) e);
} else {
eventSunk0(pipeline, e);
}
@@ -109,6 +115,12 @@ protected void abortInputRequested(ChannelPipeline pipeline, ReadAbortEvent evt)
protected void abortOutputRequested(ChannelPipeline pipeline, WriteAbortEvent evt) throws Exception {
}
+ protected void adviseInputRequested(ChannelPipeline pipeline, ReadAdviseEvent evt) throws Exception {
+ }
+
+ protected void adviseOutputRequested(ChannelPipeline pipeline, WriteAdviseEvent evt) throws Exception {
+ }
+
protected void shutdownInputRequested(ChannelPipeline pipeline, ShutdownInputEvent evt) throws Exception {
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/bootstrap/udp/UdpServerChannel.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/bootstrap/udp/UdpServerChannel.java
index 3f83c93d4..dc18295a0 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/bootstrap/udp/UdpServerChannel.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/bootstrap/udp/UdpServerChannel.java
@@ -34,7 +34,7 @@
* ServerBootStrap.Binder
*
*/
-class UdpServerChannel extends AbstractServerChannel {
+public class UdpServerChannel extends AbstractServerChannel {
UdpServerChannel(ChannelFactory factory, ChannelPipeline pipeline, ChannelSink sink) {
super(factory, pipeline, sink, new DefaultServerChannelConfig());
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/Channels.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/Channels.java
index 98ab2556f..7aa2fe92d 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/Channels.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/Channels.java
@@ -183,7 +183,6 @@ public static ChannelFuture abortOutput(Channel channel) {
return future;
}
-
public static void abortOutput(ChannelHandlerContext ctx, ChannelFuture future) {
ctx.sendDownstream(new DownstreamWriteAbortEvent(ctx.getChannel(), future));
}
@@ -199,7 +198,6 @@ public static ChannelFuture abortInput(Channel channel) {
return future;
}
-
public static void abortInput(ChannelHandlerContext ctx, ChannelFuture future) {
ctx.sendDownstream(new DownstreamReadAbortEvent(ctx.getChannel(), future));
}
@@ -208,6 +206,36 @@ public static void fireInputAborted(Channel channel) {
channel.getPipeline().sendUpstream(new UpstreamReadAbortEvent(channel));
}
+ public static ChannelFuture adviseOutput(Channel channel, Object value) {
+ ChannelFuture future = future(channel);
+ channel.getPipeline().sendDownstream(
+ new DownstreamWriteAdviseEvent(channel, future, value));
+ return future;
+ }
+
+ public static void adviseOutput(ChannelHandlerContext ctx, ChannelFuture future, Object value) {
+ ctx.sendDownstream(new DownstreamWriteAdviseEvent(ctx.getChannel(), future, value));
+ }
+
+ public static void fireOutputAdvised(Channel channel, Object value) {
+ channel.getPipeline().sendUpstream(new UpstreamWriteAdviseEvent(channel, value));
+ }
+
+ public static ChannelFuture adviseInput(Channel channel, Object value) {
+ ChannelFuture future = future(channel);
+ channel.getPipeline().sendDownstream(
+ new DownstreamReadAdviseEvent(channel, future, value));
+ return future;
+ }
+
+ public static void adviseInput(ChannelHandlerContext ctx, ChannelFuture future, Object value) {
+ ctx.sendDownstream(new DownstreamReadAdviseEvent(ctx.getChannel(), future, value));
+ }
+
+ public static void fireInputAdvised(Channel channel, Object value) {
+ channel.getPipeline().sendUpstream(new UpstreamReadAdviseEvent(channel, value));
+ }
+
public static ChannelFuture shutdownOutputOrClose(Channel channel) {
if (channel instanceof AbstractChannel) {
return shutdownOutput(channel);
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/DownstreamReadAdviseEvent.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/DownstreamReadAdviseEvent.java
new file mode 100644
index 000000000..48beeefad
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/DownstreamReadAdviseEvent.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.netty.channel;
+
+import static java.util.Objects.requireNonNull;
+
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelFuture;
+
+final class DownstreamReadAdviseEvent implements ReadAdviseEvent {
+
+ private final Channel channel;
+ private final ChannelFuture future;
+ private final Object value;
+
+ DownstreamReadAdviseEvent(
+ Channel channel,
+ ChannelFuture future,
+ Object value) {
+ requireNonNull(channel);
+ requireNonNull(future);
+ this.channel = channel;
+ this.future = future;
+ this.value = value;
+ }
+
+ @Override
+ public Channel getChannel() {
+ return channel;
+ }
+
+ @Override
+ public ChannelFuture getFuture() {
+ return future;
+ }
+
+ @Override
+ public Object getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ String channelString = getChannel().toString();
+ StringBuilder buf = new StringBuilder(channelString.length() + 64);
+ buf.append(channelString);
+ buf.append(" READ_ADVISE_REQUEST");
+ if (value != null) {
+ buf.append(" ");
+ buf.append(value);
+ }
+ return buf.toString();
+ }
+
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/DownstreamWriteAdviseEvent.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/DownstreamWriteAdviseEvent.java
new file mode 100644
index 000000000..b7f828a50
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/DownstreamWriteAdviseEvent.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.netty.channel;
+
+import static java.util.Objects.requireNonNull;
+
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelFuture;
+
+final class DownstreamWriteAdviseEvent implements WriteAdviseEvent {
+
+ private final Channel channel;
+ private final ChannelFuture future;
+ private final Object value;
+
+ DownstreamWriteAdviseEvent(
+ Channel channel,
+ ChannelFuture future,
+ Object value) {
+ requireNonNull(channel);
+ requireNonNull(future);
+ this.channel = channel;
+ this.future = future;
+ this.value = value;
+ }
+
+ @Override
+ public Channel getChannel() {
+ return channel;
+ }
+
+ @Override
+ public ChannelFuture getFuture() {
+ return future;
+ }
+
+ @Override
+ public Object getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ String channelString = getChannel().toString();
+ StringBuilder buf = new StringBuilder(channelString.length() + 64);
+ buf.append(channelString);
+ buf.append(" WRITE_ADVISE_REQUEST");
+ if (value != null) {
+ buf.append(" ");
+ buf.append(value);
+ }
+ return buf.toString();
+ }
+
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/ReadAdviseEvent.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/ReadAdviseEvent.java
new file mode 100644
index 000000000..be4f8252a
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/ReadAdviseEvent.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.netty.channel;
+
+import org.jboss.netty.channel.ChannelEvent;
+
+public interface ReadAdviseEvent extends ChannelEvent {
+
+ Object getValue();
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/SimpleChannelDownstreamHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/SimpleChannelDownstreamHandler.java
index 34ca00660..11631e1dd 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/SimpleChannelDownstreamHandler.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/SimpleChannelDownstreamHandler.java
@@ -37,6 +37,12 @@ else if (e instanceof ReadAbortEvent) {
else if (e instanceof WriteAbortEvent) {
abortOutputRequested(ctx, (WriteAbortEvent) e);
}
+ else if (e instanceof ReadAdviseEvent) {
+ adviseInputRequested(ctx, (ReadAdviseEvent) e);
+ }
+ else if (e instanceof WriteAdviseEvent) {
+ adviseOutputRequested(ctx, (WriteAdviseEvent) e);
+ }
else {
super.handleDownstream(ctx, e);
}
@@ -62,4 +68,12 @@ public void abortOutputRequested(ChannelHandlerContext ctx, WriteAbortEvent e) {
ctx.sendDownstream(e);
}
+ public void adviseInputRequested(ChannelHandlerContext ctx, ReadAdviseEvent e) {
+ ctx.sendDownstream(e);
+ }
+
+ public void adviseOutputRequested(ChannelHandlerContext ctx, WriteAdviseEvent e) {
+ ctx.sendDownstream(e);
+ }
+
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/SimpleChannelHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/SimpleChannelHandler.java
index fdbe43ffd..49e85decc 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/SimpleChannelHandler.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/SimpleChannelHandler.java
@@ -38,6 +38,12 @@ else if (e instanceof ReadAbortEvent) {
else if (e instanceof WriteAbortEvent) {
outputAborted(ctx, (WriteAbortEvent) e);
}
+ else if (e instanceof ReadAdviseEvent) {
+ inputAdvised(ctx, (ReadAdviseEvent) e);
+ }
+ else if (e instanceof WriteAdviseEvent) {
+ outputAdvised(ctx, (WriteAdviseEvent) e);
+ }
else {
super.handleUpstream(ctx, e);
}
@@ -63,6 +69,14 @@ public void outputAborted(ChannelHandlerContext ctx, WriteAbortEvent e) {
ctx.sendUpstream(e);
}
+ public void inputAdvised(ChannelHandlerContext ctx, ReadAdviseEvent e) {
+ ctx.sendUpstream(e);
+ }
+
+ public void outputAdvised(ChannelHandlerContext ctx, WriteAdviseEvent e) {
+ ctx.sendUpstream(e);
+ }
+
@Override
public void handleDownstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
if (e instanceof ShutdownInputEvent) {
@@ -80,6 +94,12 @@ else if (e instanceof ReadAbortEvent) {
else if (e instanceof WriteAbortEvent) {
abortOutputRequested(ctx, (WriteAbortEvent) e);
}
+ else if (e instanceof ReadAdviseEvent) {
+ adviseInputRequested(ctx, (ReadAdviseEvent) e);
+ }
+ else if (e instanceof WriteAdviseEvent) {
+ adviseOutputRequested(ctx, (WriteAdviseEvent) e);
+ }
else {
super.handleDownstream(ctx, e);
}
@@ -105,4 +125,12 @@ public void abortOutputRequested(ChannelHandlerContext ctx, WriteAbortEvent e) {
ctx.sendDownstream(e);
}
+ public void adviseInputRequested(ChannelHandlerContext ctx, ReadAdviseEvent e) {
+ ctx.sendDownstream(e);
+ }
+
+ public void adviseOutputRequested(ChannelHandlerContext ctx, WriteAdviseEvent e) {
+ ctx.sendDownstream(e);
+ }
+
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/SimpleChannelUpstreamHandler.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/SimpleChannelUpstreamHandler.java
index 479b286e4..4d7b8e5c1 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/SimpleChannelUpstreamHandler.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/SimpleChannelUpstreamHandler.java
@@ -38,6 +38,12 @@ else if (e instanceof ReadAbortEvent) {
else if (e instanceof WriteAbortEvent) {
outputAborted(ctx, (WriteAbortEvent) e);
}
+ else if (e instanceof ReadAdviseEvent) {
+ inputAdvised(ctx, (ReadAdviseEvent) e);
+ }
+ else if (e instanceof WriteAdviseEvent) {
+ outputAdvised(ctx, (WriteAdviseEvent) e);
+ }
else {
super.handleUpstream(ctx, e);
}
@@ -62,4 +68,12 @@ public void inputAborted(ChannelHandlerContext ctx, ReadAbortEvent e) {
public void outputAborted(ChannelHandlerContext ctx, WriteAbortEvent e) {
ctx.sendUpstream(e);
}
+
+ public void inputAdvised(ChannelHandlerContext ctx, ReadAdviseEvent e) {
+ ctx.sendUpstream(e);
+ }
+
+ public void outputAdvised(ChannelHandlerContext ctx, WriteAdviseEvent e) {
+ ctx.sendUpstream(e);
+ }
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/UpstreamReadAdviseEvent.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/UpstreamReadAdviseEvent.java
new file mode 100644
index 000000000..7a4f0fa8f
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/UpstreamReadAdviseEvent.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.netty.channel;
+
+import static java.util.Objects.requireNonNull;
+import static org.jboss.netty.channel.Channels.succeededFuture;
+
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelFuture;
+
+final class UpstreamReadAdviseEvent implements ReadAdviseEvent {
+
+ private final Channel channel;
+ private final Object value;
+
+ UpstreamReadAdviseEvent(
+ Channel channel,
+ Object value) {
+ requireNonNull(channel);
+ this.channel = channel;
+ this.value = value;
+ }
+
+ @Override
+ public Channel getChannel() {
+ return channel;
+ }
+
+ @Override
+ public ChannelFuture getFuture() {
+ return succeededFuture(channel);
+ }
+
+ @Override
+ public Object getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ String channelString = getChannel().toString();
+ StringBuilder buf = new StringBuilder(channelString.length() + 64);
+ buf.append(channelString);
+ buf.append(" READ_ADVISED");
+ if (value != null) {
+ buf.append(" ");
+ buf.append(value);
+ }
+ return buf.toString();
+ }
+
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/UpstreamWriteAdviseEvent.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/UpstreamWriteAdviseEvent.java
new file mode 100644
index 000000000..306dc7951
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/UpstreamWriteAdviseEvent.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.netty.channel;
+
+import static java.util.Objects.requireNonNull;
+import static org.jboss.netty.channel.Channels.succeededFuture;
+
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelFuture;
+
+final class UpstreamWriteAdviseEvent implements WriteAdviseEvent {
+
+ private final Channel channel;
+ private final Object value;
+
+ UpstreamWriteAdviseEvent(
+ Channel channel,
+ Object value) {
+ requireNonNull(channel);
+ this.channel = channel;
+ this.value = value;
+ }
+
+ @Override
+ public Channel getChannel() {
+ return channel;
+ }
+
+ @Override
+ public ChannelFuture getFuture() {
+ return succeededFuture(channel);
+ }
+
+ @Override
+ public Object getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ String channelString = getChannel().toString();
+ StringBuilder buf = new StringBuilder(channelString.length() + 64);
+ buf.append(channelString);
+ buf.append(" WRITE_ADVISED");
+ if (value != null) {
+ buf.append(" ");
+ buf.append(value);
+ }
+ return buf.toString();
+ }
+
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/WriteAdviseEvent.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/WriteAdviseEvent.java
new file mode 100644
index 000000000..a9f08f212
--- /dev/null
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/netty/channel/WriteAdviseEvent.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.driver.internal.netty.channel;
+
+import org.jboss.netty.channel.ChannelEvent;
+
+public interface WriteAdviseEvent extends ChannelEvent {
+
+ Object getValue();
+}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/resolver/ClientBootstrapResolver.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/resolver/ClientBootstrapResolver.java
index 240595915..a491d480e 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/resolver/ClientBootstrapResolver.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/resolver/ClientBootstrapResolver.java
@@ -42,22 +42,19 @@ public class ClientBootstrapResolver {
private final ChannelPipelineFactory pipelineFactory;
private final Supplier locationResolver;
private final Barrier awaitBarrier;
- private final RegionInfo regionInfo;
private final OptionsResolver optionsResolver;
private ClientBootstrap bootstrap;
public ClientBootstrapResolver(BootstrapFactory bootstrapFactory, ChannelAddressFactory addressFactory,
ChannelPipelineFactory pipelineFactory, Supplier locationResolver,
- OptionsResolver optionsResolver, Barrier awaitBarrier,
- RegionInfo regionInfo) {
+ OptionsResolver optionsResolver, Barrier awaitBarrier) {
this.bootstrapFactory = bootstrapFactory;
this.addressFactory = addressFactory;
this.pipelineFactory = pipelineFactory;
this.locationResolver = locationResolver;
this.optionsResolver = optionsResolver;
this.awaitBarrier = awaitBarrier;
- this.regionInfo = regionInfo;
}
public ClientBootstrap resolve() throws Exception {
@@ -78,8 +75,4 @@ public ClientBootstrap resolve() throws Exception {
public Barrier getAwaitBarrier() {
return this.awaitBarrier;
}
-
- public RegionInfo getRegionInfo() {
- return this.regionInfo;
- }
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/resolver/ServerBootstrapResolver.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/resolver/ServerBootstrapResolver.java
index 637e42368..4bf481f4c 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/resolver/ServerBootstrapResolver.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/resolver/ServerBootstrapResolver.java
@@ -15,10 +15,15 @@
*/
package org.kaazing.k3po.driver.internal.resolver;
+import static org.jboss.netty.channel.Channels.pipeline;
+
import java.net.URI;
+import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
+import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.logging.InternalLogger;
import org.jboss.netty.logging.InternalLoggerFactory;
@@ -37,6 +42,7 @@ public class ServerBootstrapResolver {
private final BootstrapFactory bootstrapFactory;
private final ChannelAddressFactory addressFactory;
+ private final Iterator pipelinesIterator;
private final ChannelPipelineFactory pipelineFactory;
private final Supplier locationResolver;
private final OptionsResolver optionsResolver;
@@ -45,20 +51,30 @@ public class ServerBootstrapResolver {
private ServerBootstrap bootstrap;
public ServerBootstrapResolver(BootstrapFactory bootstrapFactory, ChannelAddressFactory addressFactory,
- ChannelPipelineFactory pipelineFactory, Supplier locationResolver,
+ List pipelines, Supplier locationResolver,
OptionsResolver optionsResolver, Barrier notifyBarrier) {
this.bootstrapFactory = bootstrapFactory;
this.addressFactory = addressFactory;
- this.pipelineFactory = pipelineFactory;
+ this.pipelinesIterator = pipelines.iterator();
this.locationResolver = locationResolver;
this.optionsResolver = optionsResolver;
this.notifyBarrier = notifyBarrier;
+ this.pipelineFactory = new ChannelPipelineFactory() {
+ @Override
+ public ChannelPipeline getPipeline() {
+ return pipelinesIterator.hasNext() ? pipelinesIterator.next() : pipeline();
+ }
+ };
}
public Barrier getNotifyBarrier() {
return notifyBarrier;
}
+ public boolean canAccept() {
+ return pipelinesIterator.hasNext();
+ }
+
// TODO: asynchronous, triggered by awaitBarrier
public ServerBootstrap resolve() throws Exception {
if (bootstrap == null) {
@@ -74,5 +90,4 @@ public ServerBootstrap resolve() throws Exception {
}
return bootstrap;
}
-
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/types/AgronaTypeSystem.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/types/AgronaTypeSystem.java
index fe146f3cc..8200204ac 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/types/AgronaTypeSystem.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/types/AgronaTypeSystem.java
@@ -34,6 +34,8 @@ public final class AgronaTypeSystem implements TypeSystemSpi
private final Set> writeOptions;
private final Set readConfigs;
private final Set writeConfigs;
+ private final Set readAdvisories;
+ private final Set writeAdvisories;
public AgronaTypeSystem()
{
@@ -54,6 +56,8 @@ public AgronaTypeSystem()
this.writeOptions = emptySet();
this.readConfigs = emptySet();
this.writeConfigs = emptySet();
+ this.readAdvisories = emptySet();
+ this.writeAdvisories = emptySet();
}
@Override
@@ -97,4 +101,16 @@ public Set writeConfigs()
{
return writeConfigs;
}
+
+ @Override
+ public Set readAdvisories()
+ {
+ return readAdvisories;
+ }
+
+ @Override
+ public Set writeAdvisories()
+ {
+ return writeAdvisories;
+ }
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/types/FileTypeSystem.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/types/FileTypeSystem.java
index 0286c77f8..bdda42ede 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/types/FileTypeSystem.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/types/FileTypeSystem.java
@@ -38,6 +38,8 @@ public final class FileTypeSystem implements TypeSystemSpi
private final Set> writeOptions;
private final Set readConfigs;
private final Set writeConfigs;
+ private final Set readAdvisories;
+ private final Set writeAdvisories;
public FileTypeSystem()
{
@@ -55,6 +57,8 @@ public FileTypeSystem()
this.writeOptions = singleton(OPTION_OFFSET);
this.readConfigs = emptySet();
this.writeConfigs = emptySet();
+ this.readAdvisories = emptySet();
+ this.writeAdvisories = emptySet();
}
@Override
@@ -98,4 +102,16 @@ public Set writeConfigs()
{
return writeConfigs;
}
+
+ @Override
+ public Set readAdvisories()
+ {
+ return readAdvisories;
+ }
+
+ @Override
+ public Set writeAdvisories()
+ {
+ return writeAdvisories;
+ }
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/types/HttpTypeSystem.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/types/HttpTypeSystem.java
index f3a51b5a7..707d68b8e 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/types/HttpTypeSystem.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/types/HttpTypeSystem.java
@@ -17,6 +17,7 @@
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
+import static java.util.Collections.emptySet;
import static java.util.Collections.singleton;
import static java.util.Collections.singletonList;
@@ -49,6 +50,8 @@ public final class HttpTypeSystem implements TypeSystemSpi
private final Set> writeOptions;
private final Set readConfigs;
private final Set writeConfigs;
+ private final Set readAdvisories;
+ private final Set writeAdvisories;
public HttpTypeSystem()
{
@@ -77,6 +80,9 @@ public HttpTypeSystem()
writeConfigs.add(CONFIG_HOST);
writeConfigs.add(CONFIG_CONTENT_LENGTH);
this.writeConfigs = writeConfigs;
+
+ this.readAdvisories = emptySet();
+ this.writeAdvisories = emptySet();
}
@Override
@@ -120,4 +126,16 @@ public Set writeConfigs()
{
return writeConfigs;
}
+
+ @Override
+ public Set readAdvisories()
+ {
+ return readAdvisories;
+ }
+
+ @Override
+ public Set writeAdvisories()
+ {
+ return writeAdvisories;
+ }
}
diff --git a/driver/src/main/java/org/kaazing/k3po/driver/internal/types/UdpTypeSystem.java b/driver/src/main/java/org/kaazing/k3po/driver/internal/types/UdpTypeSystem.java
index a381f5c46..ae4c1961c 100644
--- a/driver/src/main/java/org/kaazing/k3po/driver/internal/types/UdpTypeSystem.java
+++ b/driver/src/main/java/org/kaazing/k3po/driver/internal/types/UdpTypeSystem.java
@@ -34,6 +34,8 @@ public final class UdpTypeSystem implements TypeSystemSpi
private final Set> writeOptions;
private final Set readConfigs;
private final Set writeConfigs;
+ private final Set readAdvisories;
+ private final Set writeAdvisories;
public UdpTypeSystem()
{
@@ -43,6 +45,8 @@ public UdpTypeSystem()
this.writeOptions = emptySet();
this.readConfigs = emptySet();
this.writeConfigs = emptySet();
+ this.readAdvisories = emptySet();
+ this.writeAdvisories = emptySet();
}
@Override
@@ -86,4 +90,16 @@ public Set writeConfigs()
{
return writeConfigs;
}
+
+ @Override
+ public Set readAdvisories()
+ {
+ return readAdvisories;
+ }
+
+ @Override
+ public Set writeAdvisories()
+ {
+ return writeAdvisories;
+ }
}
diff --git a/driver/src/test/java/org/kaazing/k3po/driver/internal/agrona/Functions.java b/driver/src/test/java/org/kaazing/k3po/driver/internal/agrona/Functions.java
index 6151d341e..fcdb79336 100644
--- a/driver/src/test/java/org/kaazing/k3po/driver/internal/agrona/Functions.java
+++ b/driver/src/test/java/org/kaazing/k3po/driver/internal/agrona/Functions.java
@@ -80,6 +80,7 @@ private static Layout layout(String filename, int ringCapacity, int broadcastCap
File location = new File(filename);
int totalRingLength = ringCapacity + RingBufferDescriptor.TRAILER_LENGTH;
int totalBroadcastLength = broadcastCapacity + BroadcastBufferDescriptor.TRAILER_LENGTH;
+ create &= !location.exists();
MappedByteBuffer buffer = create ? mapNewFile(location, totalRingLength + totalBroadcastLength)
: mapExistingFile(location, filename);
AtomicBuffer ring = new UnsafeBuffer(buffer, 0, totalRingLength);
diff --git a/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/ScriptProgressTest.java b/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/ScriptProgressTest.java
index a52596912..a1c195169 100644
--- a/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/ScriptProgressTest.java
+++ b/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/ScriptProgressTest.java
@@ -15,11 +15,8 @@
*/
package org.kaazing.k3po.driver.internal.behavior;
-import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.assertEquals;
-import java.io.ByteArrayInputStream;
-
import org.junit.Test;
import org.kaazing.k3po.lang.internal.RegionInfo;
import org.kaazing.k3po.lang.internal.ast.AstRegion;
@@ -41,7 +38,7 @@ public void observedScriptEqualsScriptOnSuccess() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
@@ -64,7 +61,7 @@ public void connectFailWriteWithWhiteSpaceOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(0);
AstRegion readAST = connectAST.getStreamables().get(1);
@@ -97,7 +94,7 @@ public void testWithTabsSuccess() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
ScriptProgress progress = new ScriptProgress(scriptInfo, script);
@@ -121,7 +118,7 @@ public void testEOFWithNoNewLine() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
ScriptProgress progress = new ScriptProgress(scriptInfo, script);
@@ -145,7 +142,7 @@ public void trailingWhiteSpaceOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
ScriptProgress progress = new ScriptProgress(scriptInfo, script);
@@ -167,7 +164,7 @@ public void testFailOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(0);
AstRegion closedAST = connectAST.getStreamables().get(2);
@@ -195,7 +192,7 @@ public void testFailWithTabOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(0);
AstRegion closedAST = connectAST.getStreamables().get(2);
@@ -227,7 +224,7 @@ public void resultScriptEqualsOriginalScriptWithCommentsSuccess() throws Excepti
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
ScriptProgress progress = new ScriptProgress(scriptInfo, script);
@@ -253,7 +250,7 @@ public void failCaseWithComments() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(0);
AstRegion closedAST = connectAST.getStreamables().get(2);
@@ -287,7 +284,7 @@ public void moreThanOneStream() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
ScriptProgress progress = new ScriptProgress(scriptInfo, script);
@@ -320,7 +317,7 @@ public void moreThanOneStreamComments() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
ScriptProgress progress = new ScriptProgress(scriptInfo, script);
@@ -353,7 +350,7 @@ public void moreThanOneStreamCommentsFirstFail() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(0);
AstRegion closeAST = connectAST.getStreamables().get(1);
@@ -405,7 +402,7 @@ public void moreThanOneStreamCommentsBothFail() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectOneAST = scriptAST.getStreams().get(0);
AstRegion closeOneAST = connectOneAST.getStreamables().get(1);
AstStreamNode connectTwoAST = scriptAST.getStreams().get(1);
@@ -457,7 +454,7 @@ public void moreThanOneStreamCommentsSecondFail() throws Exception {
"\t#comment 5\n";
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(1);
AstRegion closeAST = connectAST.getStreamables().get(1);
@@ -498,7 +495,7 @@ public void acceptSuccess() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
ScriptProgress progress = new ScriptProgress(scriptInfo, script);
@@ -527,7 +524,7 @@ public void acceptCommentsSuccess() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
ScriptProgress progress = new ScriptProgress(scriptInfo, script);
@@ -556,7 +553,7 @@ public void acceptFailOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode acceptedAST = scriptAST.getStreams().get(1);
AstRegion closeAST = acceptedAST.getStreamables().get(1);
@@ -600,7 +597,7 @@ public void acceptTwoSuccess() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
ScriptProgress progress = new ScriptProgress(scriptInfo, script);
@@ -637,7 +634,7 @@ public void acceptFirstFailOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode acceptedAST = scriptAST.getStreams().get(1);
AstRegion closeAST = acceptedAST.getStreamables().get(1);
@@ -684,7 +681,7 @@ public void acceptSecondFailOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode acceptedAST = scriptAST.getStreams().get(2);
AstRegion closeAST = acceptedAST.getStreamables().get(1);
@@ -731,7 +728,7 @@ public void acceptAllFailOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode acceptedOneAST = scriptAST.getStreams().get(1);
AstRegion closeOneAST = acceptedOneAST.getStreamables().get(1);
AstStreamNode acceptedTwoAST = scriptAST.getStreams().get(2);
@@ -784,7 +781,7 @@ public void acceptAndConnectSuccess() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
ScriptProgress progress = new ScriptProgress(scriptInfo, script);
@@ -814,7 +811,7 @@ public void middleStreamFailsOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(1);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
@@ -857,7 +854,7 @@ public void firstStreamFailsOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(0);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
@@ -900,7 +897,7 @@ public void lastStreamFailsOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(2);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
@@ -947,7 +944,7 @@ public void middleStreamFailsWithCommentsOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(1);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
@@ -995,7 +992,7 @@ public void skipStreamThenAcceptOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(1);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
@@ -1051,7 +1048,7 @@ public void skipStreamThenAcceptWithCommentsOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(1);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
@@ -1094,7 +1091,7 @@ public void acceptNoStreamsOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode acceptedAST = scriptAST.getStreams().get(1);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
@@ -1130,7 +1127,7 @@ public void twoAcceptNoStreamsOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode acceptedOneAST = scriptAST.getStreams().get(1);
AstStreamNode acceptedTwoAST = scriptAST.getStreams().get(3);
@@ -1163,7 +1160,7 @@ public void connectAndAcceptNoStreamsOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode acceptedAST = scriptAST.getStreams().get(1);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
@@ -1195,7 +1192,7 @@ public void connectNoOneHomeOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(0);
AstRegion connectedAST = connectAST.getStreamables().get(0);
@@ -1224,7 +1221,7 @@ public void emptyScriptOK() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
ScriptProgress progress = new ScriptProgress(scriptInfo, script);
@@ -1246,7 +1243,7 @@ public void scriptWithAllFailedOk() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(0);
RegionInfo scriptInfo = scriptAST.getRegionInfo();
@@ -1280,7 +1277,7 @@ public void canEchoWrongOK() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode acceptedAST = scriptAST.getStreams().get(1);
AstRegion readAST = acceptedAST.getStreamables().get(1);
@@ -1323,7 +1320,7 @@ public void canSkipFirstAcceptStreamAndSecondStream() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectOneAST = scriptAST.getStreams().get(1);
AstRegion connectedOneAST = connectOneAST.getStreamables().get(0);
AstStreamNode connectTwoAST = scriptAST.getStreams().get(2);
@@ -1364,7 +1361,7 @@ public void canSkipFirstConnectStreamAndSecondStream() throws Exception {
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(0);
AstRegion connectedOneAST = connectAST.getStreamables().get(0);
AstStreamNode acceptedAST = scriptAST.getStreams().get(2);
@@ -1400,7 +1397,7 @@ public void testCacheResultOk() throws Exception {
"closed\n";
// @formatter:on
ScriptParser parser = new ScriptParserImpl();
- AstScriptNode scriptAST = parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ AstScriptNode scriptAST = parser.parse(script);
AstStreamNode connectAST = scriptAST.getStreams().get(0);
AstRegion closedAST = connectAST.getStreamables().get(2);
diff --git a/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ConnectHandlerTest.java b/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ConnectHandlerTest.java
index 599e5edef..2a30d5b8b 100644
--- a/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ConnectHandlerTest.java
+++ b/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ConnectHandlerTest.java
@@ -20,6 +20,7 @@
import static org.jboss.netty.channel.ChannelState.OPEN;
import static org.jboss.netty.channel.Channels.pipeline;
import static org.junit.Assert.assertFalse;
+import static org.kaazing.k3po.lang.internal.RegionInfo.newSequential;
import org.jboss.netty.channel.ChannelDownstreamHandler;
import org.jboss.netty.channel.ChannelEvent;
@@ -39,6 +40,7 @@
import org.kaazing.k3po.driver.internal.behavior.handler.prepare.PreparationEvent;
import org.kaazing.k3po.driver.internal.jmock.Expectations;
import org.kaazing.k3po.driver.internal.jmock.Mockery;
+import org.kaazing.k3po.lang.internal.RegionInfo;
public class ConnectHandlerTest {
@@ -64,6 +66,7 @@ public void setUp() throws Exception {
execution = new ExecutionHandler();
handler = new ConnectHandler(new LocalAddress("test"));
+ handler.setRegionInfo(newSequential(0, 0));
pipeline = pipeline(new SimpleChannelHandler() {
@Override
diff --git a/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ReadConfigHandlerTest.java b/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ReadConfigHandlerTest.java
index 240bd8ffb..81ce246ef 100644
--- a/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ReadConfigHandlerTest.java
+++ b/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/handler/command/ReadConfigHandlerTest.java
@@ -34,7 +34,7 @@
import org.junit.Before;
import org.junit.Test;
import org.kaazing.k3po.driver.internal.behavior.handler.ExecutionHandler;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigDecoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelDecoder;
import org.kaazing.k3po.driver.internal.behavior.handler.prepare.PreparationEvent;
import org.kaazing.k3po.driver.internal.jmock.Expectations;
import org.kaazing.k3po.driver.internal.jmock.Mockery;
@@ -49,7 +49,7 @@ public class ReadConfigHandlerTest {
private ChannelFactory channelFactory;
private ReadConfigHandler handler;
private ExecutionHandler execution;
- private ConfigDecoder decoder;
+ private ChannelDecoder decoder;
@Before
public void setUp() throws Exception {
@@ -64,7 +64,7 @@ public void setUp() throws Exception {
execution = new ExecutionHandler();
- decoder = context.mock(ConfigDecoder.class);
+ decoder = context.mock(ChannelDecoder.class);
handler = new ReadConfigHandler(decoder);
diff --git a/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/handler/command/WriteConfigHandlerTest.java b/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/handler/command/WriteConfigHandlerTest.java
index 25c012689..11e180b0e 100644
--- a/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/handler/command/WriteConfigHandlerTest.java
+++ b/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/handler/command/WriteConfigHandlerTest.java
@@ -34,7 +34,7 @@
import org.junit.Before;
import org.junit.Test;
import org.kaazing.k3po.driver.internal.behavior.handler.ExecutionHandler;
-import org.kaazing.k3po.driver.internal.behavior.handler.codec.ConfigEncoder;
+import org.kaazing.k3po.driver.internal.behavior.handler.codec.ChannelEncoder;
import org.kaazing.k3po.driver.internal.behavior.handler.prepare.PreparationEvent;
import org.kaazing.k3po.driver.internal.jmock.Expectations;
import org.kaazing.k3po.driver.internal.jmock.Mockery;
@@ -49,7 +49,7 @@ public class WriteConfigHandlerTest {
private ChannelFactory channelFactory;
private WriteConfigHandler handler;
private ExecutionHandler execution;
- private ConfigEncoder encoder;
+ private ChannelEncoder encoder;
@Before
public void setUp() throws Exception {
@@ -64,7 +64,7 @@ public void setUp() throws Exception {
execution = new ExecutionHandler();
- encoder = context.mock(ConfigEncoder.class);
+ encoder = context.mock(ChannelEncoder.class);
handler = new WriteConfigHandler(encoder);
diff --git a/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectEventsVisitorTest.java b/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectEventsVisitorTest.java
index 02e672e12..eefd9a321 100644
--- a/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectEventsVisitorTest.java
+++ b/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/visitor/InjectEventsVisitorTest.java
@@ -15,11 +15,8 @@
*/
package org.kaazing.k3po.driver.internal.behavior.visitor;
-import static org.jboss.netty.util.CharsetUtil.UTF_8;
import static org.junit.Assert.assertEquals;
-import java.io.ByteArrayInputStream;
-
import org.junit.Test;
import org.kaazing.k3po.driver.internal.behavior.parser.Parser;
import org.kaazing.k3po.lang.internal.ast.AstScriptNode;
@@ -319,7 +316,7 @@ public void shouldNotParseScriptWithoutConnect()
"closed\n";
ScriptParser parser = new Parser();
- parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ parser.parse(script);
}
@Test(expected = ScriptParseException.class)
@@ -336,6 +333,6 @@ public void shouldNotParseScriptWithMultiplyClosedStream()
"closed\n";
ScriptParser parser = new Parser();
- parser.parse(new ByteArrayInputStream(script.getBytes(UTF_8)));
+ parser.parse(script);
}
}
diff --git a/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/visitor/ValidateStreamsVisitorTest.java b/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/visitor/ValidateStreamsVisitorTest.java
index 0555a2306..f8e8da4a6 100644
--- a/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/visitor/ValidateStreamsVisitorTest.java
+++ b/driver/src/test/java/org/kaazing/k3po/driver/internal/behavior/visitor/ValidateStreamsVisitorTest.java
@@ -159,8 +159,8 @@ public void shouldNotAllowWriteAfterRequestResponseWithoutSwitchingProtocols() t
inputScript.accept(injectEvents, new ValidateStreamsVisitor.State());
}
- @Test(expected = IllegalStateException.class)
- public void shouldNotAllowWriteConfigAfterWriteClose() throws Exception {
+ @Test
+ public void shouldAllowWriteConfigAfterWriteClose() throws Exception {
// @formatter:off
AstScriptNode inputScript = new AstScriptNodeBuilder()
.addConnectStream()
@@ -183,8 +183,8 @@ public void shouldNotAllowWriteConfigAfterWriteClose() throws Exception {
inputScript.accept(injectEvents, new ValidateStreamsVisitor.State());
}
- @Test(expected = IllegalStateException.class)
- public void shouldNotAllowReadConfigAfterReadClose() throws Exception {
+ @Test
+ public void shouldAllowReadConfigAfterReadClose() throws Exception {
// @formatter:off
AstScriptNode inputScript = new AstScriptNodeBuilder()
.addAcceptStream()
diff --git a/examples/pom.xml b/examples/pom.xml
index 5e62d280d..fc8a99c13 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -5,7 +5,7 @@
org.kaazing
k3po.parent
- 3.0.0-alpha-97
+ 3.1.0
k3po.examples
diff --git a/junit/pom.xml b/junit/pom.xml
index 84611b565..d23328150 100644
--- a/junit/pom.xml
+++ b/junit/pom.xml
@@ -5,7 +5,7 @@
org.kaazing
k3po.parent
- 3.0.0-alpha-97
+ 3.1.0
k3po.junit
diff --git a/k3po-maven-plugin/pom.xml b/k3po-maven-plugin/pom.xml
index 4f3dee071..3fd73be43 100644
--- a/k3po-maven-plugin/pom.xml
+++ b/k3po-maven-plugin/pom.xml
@@ -5,7 +5,7 @@
org.kaazing
k3po.parent
- 3.0.0-alpha-97
+ 3.1.0
k3po-maven-plugin
diff --git a/k3po.pcap.converter/pom.xml b/k3po.pcap.converter/pom.xml
index 462190647..4bd305b9d 100644
--- a/k3po.pcap.converter/pom.xml
+++ b/k3po.pcap.converter/pom.xml
@@ -5,7 +5,7 @@
org.kaazing
k3po.parent
- 3.0.0-alpha-97
+ 3.1.0
k3po.pcap.converter
diff --git a/lang/pom.xml b/lang/pom.xml
index 413c4c18a..6788a77cd 100644
--- a/lang/pom.xml
+++ b/lang/pom.xml
@@ -5,7 +5,7 @@
org.kaazing
k3po.parent
- 3.0.0-alpha-97
+ 3.1.0
k3po.lang
diff --git a/lang/src/main/antlr4/org/kaazing/k3po/lang/parser/v2/Robot.g4 b/lang/src/main/antlr4/org/kaazing/k3po/lang/parser/v2/Robot.g4
index 1e313986e..dd0ec5cc9 100644
--- a/lang/src/main/antlr4/org/kaazing/k3po/lang/parser/v2/Robot.g4
+++ b/lang/src/main/antlr4/org/kaazing/k3po/lang/parser/v2/Robot.g4
@@ -32,7 +32,8 @@ optionName
streamNode
: acceptNode
- | acceptableNode
+ | acceptedNode
+ | rejectedNode
| connectNode
;
@@ -49,10 +50,14 @@ acceptOption
: OptionKeyword optionName writeValue
;
-acceptableNode
+acceptedNode
: AcceptedKeyword ( text=Name )? streamableNode+
;
+rejectedNode
+ : RejectedKeyword ( text=Name )? rejectableNode*
+ ;
+
connectNode
: ConnectKeyword
(AwaitKeyword await=Name)?
@@ -106,24 +111,35 @@ streamableNode
| optionNode
;
+rejectableNode
+ : barrierNode
+ | readConfigNode
+ ;
+
commandNode
- : writeConfigNode
+ : connectAbortNode
+ | writeConfigNode
| writeNode
| writeFlushNode
| writeCloseNode
| writeAbortNode
| readAbortNode
+ | writeAdviseNode
+ | readAdviseNode
| closeNode
;
eventNode
- : openedNode
+ : connectAbortedNode
+ | openedNode
| boundNode
| readConfigNode
| readNode
| readClosedNode
| readAbortedNode
| writeAbortedNode
+ | readAdvisedNode
+ | writeAdvisedNode
| disconnectedNode
| unboundNode
| closedNode
@@ -137,6 +153,14 @@ barrierNode
| writeNotifyNode
;
+connectAbortNode
+ : ConnectKeyword AbortKeyword
+ ;
+
+connectAbortedNode
+ : ConnectKeyword AbortedKeyword
+ ;
+
closeNode
: CloseKeyword
;
@@ -157,6 +181,14 @@ writeAbortedNode
: WriteKeyword AbortedKeyword
;
+writeAdviseNode
+ : WriteKeyword AdviseKeyword QualifiedName writeValue*
+ ;
+
+writeAdvisedNode
+ : WriteKeyword AdvisedKeyword QualifiedName matcher* MissingKeyword?
+ ;
+
disconnectNode
: DisconnectKeyword
;
@@ -209,6 +241,14 @@ readAbortedNode
: ReadKeyword AbortedKeyword
;
+readAdviseNode
+ : ReadKeyword AdviseKeyword QualifiedName writeValue*
+ ;
+
+readAdvisedNode
+ : ReadKeyword AdvisedKeyword QualifiedName matcher* MissingKeyword?
+ ;
+
readClosedNode
: ReadKeyword ClosedKeyword
;
@@ -358,6 +398,14 @@ AcceptedKeyword
: 'accepted'
;
+AdviseKeyword
+ : 'advise'
+ ;
+
+AdvisedKeyword
+ : 'advised'
+ ;
+
AsKeyword
: 'as'
;
@@ -446,6 +494,10 @@ ReadKeyword
: 'read'
;
+RejectedKeyword
+ : 'rejected'
+ ;
+
ShortKeyword
: 'short'
;
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/el/BytesMatcher.java b/lang/src/main/java/org/kaazing/k3po/lang/el/BytesMatcher.java
new file mode 100644
index 000000000..7aacdaea6
--- /dev/null
+++ b/lang/src/main/java/org/kaazing/k3po/lang/el/BytesMatcher.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.lang.el;
+
+import java.nio.ByteBuffer;
+
+public interface BytesMatcher {
+
+ Object match(ByteBuffer buffer) throws Exception;
+
+}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstAcceptableNode.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstAcceptableNode.java
index 014604441..9b65535d2 100644
--- a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstAcceptableNode.java
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstAcceptableNode.java
@@ -17,7 +17,7 @@
import static org.kaazing.k3po.lang.internal.ast.util.AstUtil.equivalent;
-public class AstAcceptableNode extends AstStreamNode {
+public abstract class AstAcceptableNode extends AstStreamNode {
private String acceptName;
@@ -46,25 +46,6 @@ protected boolean equalTo(AstRegion that) {
return that instanceof AstAcceptableNode && equalTo((AstAcceptableNode) that);
}
- @Override
- public R accept(Visitor visitor, P parameter) {
- return visitor.visit(this, parameter);
- }
-
- @Override
- protected void describeLine(StringBuilder sb) {
- super.describeLine(sb);
-
- sb.append("accepted");
-
- if (acceptName != null) {
- sb.append(" as ");
- sb.append(acceptName);
- }
-
- sb.append('\n');
- }
-
protected boolean equalTo(AstAcceptableNode that) {
return super.equalTo(that) && equivalent(this.acceptName, that.acceptName);
}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstAcceptedNode.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstAcceptedNode.java
new file mode 100644
index 000000000..4de687e48
--- /dev/null
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstAcceptedNode.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.lang.internal.ast;
+
+public class AstAcceptedNode extends AstAcceptableNode {
+
+ @Override
+ protected boolean equalTo(AstAcceptableNode that) {
+ return that instanceof AstAcceptedNode && super.equalTo((AstAcceptedNode) that);
+ }
+
+ @Override
+ public R accept(Visitor visitor, P parameter) {
+ return visitor.visit(this, parameter);
+ }
+
+ @Override
+ protected void describeLine(StringBuilder sb) {
+ super.describeLine(sb);
+
+ sb.append("accepted");
+
+ String acceptName = getAcceptName();
+ if (acceptName != null) {
+ sb.append(" as ");
+ sb.append(acceptName);
+ }
+
+ sb.append('\n');
+ }
+}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstConnectAbortNode.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstConnectAbortNode.java
new file mode 100644
index 000000000..074717b81
--- /dev/null
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstConnectAbortNode.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.lang.internal.ast;
+
+public final class AstConnectAbortNode extends AstCommandNode {
+
+ @Override
+ public R accept(Visitor visitor, P parameter) {
+ return visitor.visit(this, parameter);
+ }
+
+ @Override
+ protected int hashTo() {
+ return getClass().hashCode();
+ }
+
+ @Override
+ protected boolean equalTo(AstRegion that) {
+ return that instanceof AstConnectAbortNode;
+ }
+
+ @Override
+ protected void describe(StringBuilder buf) {
+ super.describe(buf);
+ buf.append("connect abort\n");
+ }
+}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstConnectAbortedNode.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstConnectAbortedNode.java
new file mode 100644
index 000000000..a9923a0f1
--- /dev/null
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstConnectAbortedNode.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.lang.internal.ast;
+
+public final class AstConnectAbortedNode extends AstEventNode {
+
+ @Override
+ public R accept(Visitor visitor, P parameter) {
+ return visitor.visit(this, parameter);
+ }
+
+ @Override
+ protected int hashTo() {
+ return getClass().hashCode();
+ }
+
+ @Override
+ protected boolean equalTo(AstRegion that) {
+ return that instanceof AstConnectAbortedNode;
+ }
+
+ @Override
+ protected void describe(StringBuilder buf) {
+ super.describe(buf);
+ buf.append("connect aborted\n");
+ }
+}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstNode.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstNode.java
index 7f5147ae8..84e5c9976 100644
--- a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstNode.java
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstNode.java
@@ -24,9 +24,13 @@ public interface Visitor {
R visit(AstScriptNode node, P parameter);
R visit(AstPropertyNode node, P parameter);
R visit(AstAcceptNode node, P parameter);
- R visit(AstAcceptableNode node, P parameter);
+ R visit(AstAcceptedNode node, P parameter);
+ R visit(AstRejectedNode node, P parameter);
R visit(AstConnectNode node, P parameter);
+ R visit(AstConnectAbortNode node, P parameter);
+ R visit(AstConnectAbortedNode node, P parameter);
+
R visit(AstWriteFlushNode node, P parameter);
R visit(AstWriteValueNode node, P parameter);
R visit(AstWriteCloseNode node, P parameter);
@@ -61,5 +65,10 @@ public interface Visitor {
R visit(AstReadOptionNode node, P parameter);
R visit(AstWriteOptionNode node, P parameter);
+
+ R visit(AstReadAdviseNode node, P parameter);
+ R visit(AstWriteAdviseNode node, P parameter);
+ R visit(AstReadAdvisedNode node, P parameter);
+ R visit(AstWriteAdvisedNode node, P parameter);
}
}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstReadAdviseNode.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstReadAdviseNode.java
new file mode 100644
index 000000000..4bbc43ad4
--- /dev/null
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstReadAdviseNode.java
@@ -0,0 +1,123 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.lang.internal.ast;
+
+import static org.kaazing.k3po.lang.internal.ast.util.AstUtil.equivalent;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.Map;
+
+import org.kaazing.k3po.lang.internal.ast.value.AstValue;
+import org.kaazing.k3po.lang.types.StructuredTypeInfo;
+
+public class AstReadAdviseNode extends AstCommandNode {
+
+ private StructuredTypeInfo type;
+ private Collection> values;
+ private Map> valuesByName;
+
+ public AstReadAdviseNode() {
+ this.valuesByName = new LinkedHashMap<>();
+ this.values = new LinkedList<>();
+ }
+
+ public void setType(StructuredTypeInfo type) {
+ this.type = type;
+ }
+
+ public StructuredTypeInfo getType() {
+ return type;
+ }
+
+ public void setValue(String name, AstValue> value) {
+ valuesByName.put(name, value);
+ }
+
+ public AstValue> getValue(String name) {
+ return valuesByName.get(name);
+ }
+
+ public void addValue(AstValue> value) {
+ values.add(value);
+ }
+
+ public Collection> getValues() {
+ return values;
+ }
+
+ public AstValue> getValue() {
+
+ if (valuesByName.isEmpty()) {
+ switch (values.size()) {
+ case 0:
+ return null;
+ case 1:
+ return values.iterator().next();
+ }
+ }
+
+ throw new IllegalStateException("Multiple values available, yet assuming only one value");
+ }
+
+ @Override
+ public R accept(Visitor visitor, P parameter) {
+ return visitor.visit(this, parameter);
+ }
+
+ @Override
+ protected int hashTo() {
+ int hashCode = getClass().hashCode();
+
+ if (type != null) {
+ hashCode <<= 4;
+ hashCode ^= type.hashCode();
+ }
+ if (valuesByName != null) {
+ hashCode <<= 4;
+ hashCode ^= valuesByName.hashCode();
+ }
+
+ return hashCode;
+ }
+
+ @Override
+ protected boolean equalTo(AstRegion that) {
+ return that instanceof AstReadAdviseNode && equalTo((AstReadAdviseNode) that);
+ }
+
+ protected boolean equalTo(AstReadAdviseNode that) {
+ return equivalent(this.type, that.type) &&
+ equivalent(this.values, that.values) &&
+ equivalent(this.valuesByName, that.valuesByName);
+ }
+
+ @Override
+ protected void describe(StringBuilder buf) {
+ super.describe(buf);
+ buf.append("read advise ").append(type);
+ for (Map.Entry> entry : valuesByName.entrySet()) {
+ String name = entry.getKey();
+ AstValue> value = entry.getValue();
+ buf.append(' ').append(name).append('=').append(value);
+ }
+ for (AstValue> value : values) {
+ buf.append(' ').append(value);
+ }
+ buf.append('\n');
+ }
+}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstReadAdvisedNode.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstReadAdvisedNode.java
new file mode 100644
index 000000000..593124f71
--- /dev/null
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstReadAdvisedNode.java
@@ -0,0 +1,143 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.lang.internal.ast;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Objects;
+
+import org.kaazing.k3po.lang.internal.ast.matcher.AstValueMatcher;
+import org.kaazing.k3po.lang.types.StructuredTypeInfo;
+
+public class AstReadAdvisedNode extends AstEventNode {
+
+ private StructuredTypeInfo type;
+ private Map matchersByName;
+ private Collection matchers;
+ private boolean missing;
+
+ public AstReadAdvisedNode() {
+ this.matchersByName = new LinkedHashMap<>();
+ this.matchers = new LinkedList<>();
+ }
+
+ public void setType(StructuredTypeInfo type) {
+ this.type = type;
+ }
+
+ public StructuredTypeInfo getType() {
+ return type;
+ }
+
+ public void setMissing(boolean missing) {
+ this.missing = missing;
+ }
+
+ public boolean isMissing() {
+ return missing;
+ }
+
+ public AstValueMatcher getMatcher() {
+
+ if (matchersByName.isEmpty()) {
+ switch (matchers.size()) {
+ case 0:
+ return null;
+ case 1:
+ return matchers.iterator().next();
+ }
+ }
+
+ throw new IllegalStateException("Multiple values available, yet assuming only one value");
+ }
+
+ public Collection getMatchers() {
+ return matchers;
+ }
+
+ public AstValueMatcher getMatcher(String name) {
+ return matchersByName.get(name);
+ }
+
+ public void setMatcher(String name, AstValueMatcher matcher) {
+ matchersByName.put(name, matcher);
+ }
+
+ public void addMatcher(AstValueMatcher matcher) {
+ matchers.add(matcher);
+ }
+
+ public void addMatchers(Collection matchers) {
+ this.matchers.addAll(matchers);
+ }
+
+ @Override
+ public R accept(Visitor visitor, P parameter) {
+ return visitor.visit(this, parameter);
+ }
+
+ @Override
+ protected int hashTo() {
+ int hashCode = getClass().hashCode();
+
+ if (type != null) {
+ hashCode <<= 4;
+ hashCode ^= type.hashCode();
+ }
+ if (matchers != null) {
+ hashCode <<= 4;
+ hashCode ^= matchers.hashCode();
+ }
+ if (matchersByName != null) {
+ hashCode <<= 4;
+ hashCode ^= matchersByName.hashCode();
+ }
+
+ hashCode <<= 4;
+ hashCode ^= Boolean.hashCode(missing);
+
+ return hashCode;
+ }
+
+ @Override
+ protected boolean equalTo(AstRegion that) {
+ return that instanceof AstReadAdvisedNode && equalTo((AstReadAdvisedNode) that);
+ }
+
+ protected boolean equalTo(AstReadAdvisedNode that) {
+ return this.missing == that.missing &&
+ Objects.equals(this.type, that.type) &&
+ Objects.equals(this.matchers, that.matchers) &&
+ Objects.equals(this.matchersByName, that.matchersByName);
+ }
+
+ @Override
+ protected void describe(StringBuilder buf) {
+ super.describe(buf);
+ buf.append("read advised ").append(type);
+ for (Map.Entry entry : matchersByName.entrySet()) {
+ String name = entry.getKey();
+ AstValueMatcher matcher = entry.getValue();
+ buf.append(' ').append(name).append('=').append(matcher);
+ }
+ for (AstValueMatcher value : matchers) {
+ buf.append(' ').append(value);
+ }
+ buf.append('\n');
+ }
+}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstRejectedNode.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstRejectedNode.java
new file mode 100644
index 000000000..f6a5737c7
--- /dev/null
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstRejectedNode.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.lang.internal.ast;
+
+public class AstRejectedNode extends AstAcceptableNode {
+
+ @Override
+ protected boolean equalTo(AstAcceptableNode that) {
+ return that instanceof AstRejectedNode && super.equalTo((AstRejectedNode) that);
+ }
+
+ @Override
+ public R accept(Visitor visitor, P parameter) {
+ return visitor.visit(this, parameter);
+ }
+
+ @Override
+ protected void describeLine(StringBuilder sb) {
+ super.describeLine(sb);
+
+ sb.append("rejected");
+
+ String acceptName = getAcceptName();
+ if (acceptName != null) {
+ sb.append(" as ");
+ sb.append(acceptName);
+ }
+
+ sb.append('\n');
+ }
+}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstWriteAdviseNode.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstWriteAdviseNode.java
new file mode 100644
index 000000000..c6af919d3
--- /dev/null
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstWriteAdviseNode.java
@@ -0,0 +1,123 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.lang.internal.ast;
+
+import static org.kaazing.k3po.lang.internal.ast.util.AstUtil.equivalent;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.Map;
+
+import org.kaazing.k3po.lang.internal.ast.value.AstValue;
+import org.kaazing.k3po.lang.types.StructuredTypeInfo;
+
+public class AstWriteAdviseNode extends AstCommandNode {
+
+ private StructuredTypeInfo type;
+ private Collection> values;
+ private Map> valuesByName;
+
+ public AstWriteAdviseNode() {
+ this.valuesByName = new LinkedHashMap<>();
+ this.values = new LinkedList<>();
+ }
+
+ public void setType(StructuredTypeInfo type) {
+ this.type = type;
+ }
+
+ public StructuredTypeInfo getType() {
+ return type;
+ }
+
+ public void setValue(String name, AstValue> value) {
+ valuesByName.put(name, value);
+ }
+
+ public AstValue> getValue(String name) {
+ return valuesByName.get(name);
+ }
+
+ public void addValue(AstValue> value) {
+ values.add(value);
+ }
+
+ public Collection> getValues() {
+ return values;
+ }
+
+ public AstValue> getValue() {
+
+ if (valuesByName.isEmpty()) {
+ switch (values.size()) {
+ case 0:
+ return null;
+ case 1:
+ return values.iterator().next();
+ }
+ }
+
+ throw new IllegalStateException("Multiple values available, yet assuming only one value");
+ }
+
+ @Override
+ public R accept(Visitor visitor, P parameter) {
+ return visitor.visit(this, parameter);
+ }
+
+ @Override
+ protected int hashTo() {
+ int hashCode = getClass().hashCode();
+
+ if (type != null) {
+ hashCode <<= 4;
+ hashCode ^= type.hashCode();
+ }
+ if (valuesByName != null) {
+ hashCode <<= 4;
+ hashCode ^= valuesByName.hashCode();
+ }
+
+ return hashCode;
+ }
+
+ @Override
+ protected boolean equalTo(AstRegion that) {
+ return that instanceof AstWriteAdviseNode && equalTo((AstWriteAdviseNode) that);
+ }
+
+ protected boolean equalTo(AstWriteAdviseNode that) {
+ return equivalent(this.type, that.type) &&
+ equivalent(this.values, that.values) &&
+ equivalent(this.valuesByName, that.valuesByName);
+ }
+
+ @Override
+ protected void describe(StringBuilder buf) {
+ super.describe(buf);
+ buf.append("write advise ").append(type);
+ for (Map.Entry> entry : valuesByName.entrySet()) {
+ String name = entry.getKey();
+ AstValue> value = entry.getValue();
+ buf.append(' ').append(name).append('=').append(value);
+ }
+ for (AstValue> value : values) {
+ buf.append(' ').append(value);
+ }
+ buf.append('\n');
+ }
+}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstWriteAdvisedNode.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstWriteAdvisedNode.java
new file mode 100644
index 000000000..7c14da234
--- /dev/null
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/AstWriteAdvisedNode.java
@@ -0,0 +1,143 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.lang.internal.ast;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Objects;
+
+import org.kaazing.k3po.lang.internal.ast.matcher.AstValueMatcher;
+import org.kaazing.k3po.lang.types.StructuredTypeInfo;
+
+public class AstWriteAdvisedNode extends AstEventNode {
+
+ private StructuredTypeInfo type;
+ private Map matchersByName;
+ private Collection matchers;
+ private boolean missing;
+
+ public AstWriteAdvisedNode() {
+ this.matchersByName = new LinkedHashMap<>();
+ this.matchers = new LinkedList<>();
+ }
+
+ public void setType(StructuredTypeInfo type) {
+ this.type = type;
+ }
+
+ public StructuredTypeInfo getType() {
+ return type;
+ }
+
+ public void setMissing(boolean missing) {
+ this.missing = missing;
+ }
+
+ public boolean isMissing() {
+ return missing;
+ }
+
+ public AstValueMatcher getMatcher() {
+
+ if (matchersByName.isEmpty()) {
+ switch (matchers.size()) {
+ case 0:
+ return null;
+ case 1:
+ return matchers.iterator().next();
+ }
+ }
+
+ throw new IllegalStateException("Multiple values available, yet assuming only one value");
+ }
+
+ public Collection getMatchers() {
+ return matchers;
+ }
+
+ public AstValueMatcher getMatcher(String name) {
+ return matchersByName.get(name);
+ }
+
+ public void setMatcher(String name, AstValueMatcher matcher) {
+ matchersByName.put(name, matcher);
+ }
+
+ public void addMatcher(AstValueMatcher matcher) {
+ matchers.add(matcher);
+ }
+
+ public void addMatchers(Collection matchers) {
+ this.matchers.addAll(matchers);
+ }
+
+ @Override
+ public R accept(Visitor visitor, P parameter) {
+ return visitor.visit(this, parameter);
+ }
+
+ @Override
+ protected int hashTo() {
+ int hashCode = getClass().hashCode();
+
+ if (type != null) {
+ hashCode <<= 4;
+ hashCode ^= type.hashCode();
+ }
+ if (matchers != null) {
+ hashCode <<= 4;
+ hashCode ^= matchers.hashCode();
+ }
+ if (matchersByName != null) {
+ hashCode <<= 4;
+ hashCode ^= matchersByName.hashCode();
+ }
+
+ hashCode <<= 4;
+ hashCode ^= Boolean.hashCode(missing);
+
+ return hashCode;
+ }
+
+ @Override
+ protected boolean equalTo(AstRegion that) {
+ return that instanceof AstWriteAdvisedNode && equalTo((AstWriteAdvisedNode) that);
+ }
+
+ protected boolean equalTo(AstWriteAdvisedNode that) {
+ return this.missing == that.missing &&
+ Objects.equals(this.type, that.type) &&
+ Objects.equals(this.matchers, that.matchers) &&
+ Objects.equals(this.matchersByName, that.matchersByName);
+ }
+
+ @Override
+ protected void describe(StringBuilder buf) {
+ super.describe(buf);
+ buf.append("write advised ").append(type);
+ for (Map.Entry entry : matchersByName.entrySet()) {
+ String name = entry.getKey();
+ AstValueMatcher matcher = entry.getValue();
+ buf.append(' ').append(name).append('=').append(matcher);
+ }
+ for (AstValueMatcher value : matchers) {
+ buf.append(' ').append(value);
+ }
+ buf.append('\n');
+ }
+}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AbstractAstAcceptableNodeBuilder.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AbstractAstAcceptedNodeBuilder.java
similarity index 66%
rename from lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AbstractAstAcceptableNodeBuilder.java
rename to lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AbstractAstAcceptedNodeBuilder.java
index fc3a89375..26fb3b7b7 100644
--- a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AbstractAstAcceptableNodeBuilder.java
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AbstractAstAcceptedNodeBuilder.java
@@ -15,16 +15,16 @@
*/
package org.kaazing.k3po.lang.internal.ast.builder;
-import org.kaazing.k3po.lang.internal.ast.AstAcceptableNode;
+import org.kaazing.k3po.lang.internal.ast.AstAcceptedNode;
-public abstract class AbstractAstAcceptableNodeBuilder
- extends AbstractAstStreamNodeBuilder {
+public abstract class AbstractAstAcceptedNodeBuilder
+ extends AbstractAstStreamNodeBuilder {
- public AbstractAstAcceptableNodeBuilder(R result) {
- super(new AstAcceptableNode(), result);
+ public AbstractAstAcceptedNodeBuilder(R result) {
+ super(new AstAcceptedNode(), result);
}
- protected AbstractAstAcceptableNodeBuilder(AstAcceptableNode node, R result) {
+ protected AbstractAstAcceptedNodeBuilder(AstAcceptedNode node, R result) {
super(node, result);
}
}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AbstractAstRejectableNodeBuilder.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AbstractAstRejectableNodeBuilder.java
new file mode 100644
index 000000000..6d8e8d536
--- /dev/null
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AbstractAstRejectableNodeBuilder.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.lang.internal.ast.builder;
+
+import org.kaazing.k3po.lang.internal.ast.AstNode;
+
+public abstract class AbstractAstRejectableNodeBuilder extends AbstractAstStreamableNodeBuilder {
+
+ public AbstractAstRejectableNodeBuilder(N node, R result) {
+ super(node, result);
+ }
+}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AbstractAstRejectedNodeBuilder.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AbstractAstRejectedNodeBuilder.java
new file mode 100644
index 000000000..4d1fdef43
--- /dev/null
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AbstractAstRejectedNodeBuilder.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.lang.internal.ast.builder;
+
+import org.kaazing.k3po.lang.internal.ast.AstReadAwaitNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadConfigNode;
+import org.kaazing.k3po.lang.internal.ast.AstReadNotifyNode;
+import org.kaazing.k3po.lang.internal.ast.AstRejectedNode;
+
+public abstract class AbstractAstRejectedNodeBuilder extends AbstractAstNodeBuilder {
+
+ public AbstractAstRejectedNodeBuilder(R result) {
+ super(new AstRejectedNode(), result);
+ }
+
+ public abstract AbstractAstRejectableNodeBuilder>
+ addReadAwaitBarrier();
+
+ public abstract AbstractAstRejectableNodeBuilder>
+ addReadNotifyBarrier();
+
+ public abstract AbstractAstRejectableNodeBuilder>
+ addReadConfigEvent();
+
+ protected AbstractAstRejectedNodeBuilder(AstRejectedNode node, R result) {
+ super(node, result);
+ }
+}
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstAcceptNodeBuilder.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstAcceptNodeBuilder.java
index 7f1e75bd7..8bec3e11c 100644
--- a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstAcceptNodeBuilder.java
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstAcceptNodeBuilder.java
@@ -134,8 +134,8 @@ public ScriptNested setOption(String optionName, AstValue> optionValue)
return this;
}
- public AstAcceptableNodeBuilder.AcceptNested> addAcceptedStream() {
- return new AstAcceptableNodeBuilder.AcceptNested<>(this);
+ public AstAcceptedNodeBuilder.AcceptNested> addAcceptedStream() {
+ return new AstAcceptedNodeBuilder.AcceptNested<>(this);
}
@Override
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstAcceptableNodeBuilder.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstAcceptedNodeBuilder.java
similarity index 82%
rename from lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstAcceptableNodeBuilder.java
rename to lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstAcceptedNodeBuilder.java
index 81cc3dd5f..0b41a5849 100644
--- a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstAcceptableNodeBuilder.java
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstAcceptedNodeBuilder.java
@@ -16,161 +16,161 @@
package org.kaazing.k3po.lang.internal.ast.builder;
import org.kaazing.k3po.lang.internal.ast.AstAcceptNode;
-import org.kaazing.k3po.lang.internal.ast.AstAcceptableNode;
+import org.kaazing.k3po.lang.internal.ast.AstAcceptedNode;
import org.kaazing.k3po.lang.internal.ast.AstScriptNode;
-public final class AstAcceptableNodeBuilder extends AbstractAstAcceptableNodeBuilder {
+public final class AstAcceptedNodeBuilder extends AbstractAstAcceptedNodeBuilder {
- public AstAcceptableNodeBuilder() {
- this(new AstAcceptableNode());
+ public AstAcceptedNodeBuilder() {
+ this(new AstAcceptedNode());
}
- public AstAcceptableNodeBuilder setAcceptName(String acceptName) {
+ public AstAcceptedNodeBuilder setAcceptName(String acceptName) {
node.setAcceptName(acceptName);
return this;
}
@Override
- public AstOpenedNodeBuilder.StreamNested addOpenedEvent() {
+ public AstOpenedNodeBuilder.StreamNested addOpenedEvent() {
return new AstOpenedNodeBuilder.StreamNested<>(this);
}
@Override
- public AstBoundNodeBuilder.StreamNested addBoundEvent() {
+ public AstBoundNodeBuilder.StreamNested addBoundEvent() {
return new AstBoundNodeBuilder.StreamNested<>(this);
}
@Override
- public AstConnectedNodeBuilder.StreamNested addConnectedEvent() {
+ public AstConnectedNodeBuilder.StreamNested addConnectedEvent() {
return new AstConnectedNodeBuilder.StreamNested<>(this);
}
@Override
- public AstReadNodeBuilder.StreamNested addReadEvent() {
+ public AstReadNodeBuilder.StreamNested addReadEvent() {
return new AstReadNodeBuilder.StreamNested<>(this);
}
@Override
- public AstDisconnectedNodeBuilder.StreamNested addDisconnectedEvent() {
+ public AstDisconnectedNodeBuilder.StreamNested addDisconnectedEvent() {
return new AstDisconnectedNodeBuilder.StreamNested<>(this);
}
@Override
- public AstUnboundNodeBuilder.StreamNested addUnboundEvent() {
+ public AstUnboundNodeBuilder.StreamNested addUnboundEvent() {
return new AstUnboundNodeBuilder.StreamNested<>(this);
}
@Override
- public AstClosedNodeBuilder.StreamNested addClosedEvent() {
+ public AstClosedNodeBuilder.StreamNested addClosedEvent() {
return new AstClosedNodeBuilder.StreamNested<>(this);
}
@Override
- public AstWriteNodeBuilder.StreamNested addWriteCommand() {
+ public AstWriteNodeBuilder.StreamNested addWriteCommand() {
return new AstWriteNodeBuilder.StreamNested<>(this);
}
@Override
- public AstDisconnectNodeBuilder.StreamNested addDisconnectCommand() {
+ public AstDisconnectNodeBuilder.StreamNested addDisconnectCommand() {
return new AstDisconnectNodeBuilder.StreamNested<>(this);
}
@Override
- public AstUnbindNodeBuilder.StreamNested addUnbindCommand() {
+ public AstUnbindNodeBuilder.StreamNested addUnbindCommand() {
return new AstUnbindNodeBuilder.StreamNested<>(this);
}
@Override
- public AstCloseNodeBuilder.StreamNested addCloseCommand() {
+ public AstCloseNodeBuilder.StreamNested addCloseCommand() {
return new AstCloseNodeBuilder.StreamNested<>(this);
}
@Override
- public AstWriteAbortNodeBuilder.StreamNested addWriteAbortCommand() {
+ public AstWriteAbortNodeBuilder.StreamNested addWriteAbortCommand() {
return new AstWriteAbortNodeBuilder.StreamNested<>(this);
}
@Override
- public AstReadAbortedNodeBuilder.StreamNested addReadAbortedEvent() {
+ public AstReadAbortedNodeBuilder.StreamNested addReadAbortedEvent() {
return new AstReadAbortedNodeBuilder.StreamNested<>(this);
}
@Override
- public AstReadAbortNodeBuilder.StreamNested addReadAbortCommand() {
+ public AstReadAbortNodeBuilder.StreamNested addReadAbortCommand() {
return new AstReadAbortNodeBuilder.StreamNested<>(this);
}
@Override
- public AstWriteAbortedNodeBuilder.StreamNested addWriteAbortedEvent() {
+ public AstWriteAbortedNodeBuilder.StreamNested addWriteAbortedEvent() {
return new AstWriteAbortedNodeBuilder.StreamNested<>(this);
}
@Override
- public AstReadAwaitNodeBuilder.StreamNested addReadAwaitBarrier() {
+ public AstReadAwaitNodeBuilder.StreamNested addReadAwaitBarrier() {
return new AstReadAwaitNodeBuilder.StreamNested<>(this);
}
@Override
- public AstReadNotifyNodeBuilder.StreamNested addReadNotifyBarrier() {
+ public AstReadNotifyNodeBuilder.StreamNested addReadNotifyBarrier() {
return new AstReadNotifyNodeBuilder.StreamNested<>(this);
}
@Override
- public AstWriteAwaitNodeBuilder.StreamNested addWriteAwaitBarrier() {
+ public AstWriteAwaitNodeBuilder.StreamNested addWriteAwaitBarrier() {
return new AstWriteAwaitNodeBuilder.StreamNested<>(this);
}
@Override
- public AstWriteNotifyNodeBuilder.StreamNested addWriteNotifyBarrier() {
+ public AstWriteNotifyNodeBuilder.StreamNested addWriteNotifyBarrier() {
return new AstWriteNotifyNodeBuilder.StreamNested<>(this);
}
@Override
- public AstReadOptionNodeBuilder.StreamNested addReadOption() {
+ public AstReadOptionNodeBuilder.StreamNested addReadOption() {
return new AstReadOptionNodeBuilder.StreamNested<>(this);
}
@Override
- public AstWriteOptionNodeBuilder.StreamNested addWriteOption() {
+ public AstWriteOptionNodeBuilder.StreamNested addWriteOption() {
return new AstWriteOptionNodeBuilder.StreamNested<>(this);
}
@Override
- public AstAcceptableNode done() {
+ public AstAcceptedNode done() {
return result;
}
- private AstAcceptableNodeBuilder(AstAcceptableNode node) {
+ private AstAcceptedNodeBuilder(AstAcceptedNode node) {
super(node, node);
}
@Override
- public AstReadConfigNodeBuilder.StreamNested addReadConfigEvent() {
+ public AstReadConfigNodeBuilder.StreamNested addReadConfigEvent() {
return new AstReadConfigNodeBuilder.StreamNested<>(this);
}
@Override
- public AstWriteConfigNodeBuilder.StreamNested addWriteConfigCommand() {
+ public AstWriteConfigNodeBuilder.StreamNested addWriteConfigCommand() {
return new AstWriteConfigNodeBuilder.StreamNested<>(this);
}
@Override
- public AstFlushNodeBuilder.StreamNested addFlushCommand() {
+ public AstFlushNodeBuilder.StreamNested addFlushCommand() {
return new AstFlushNodeBuilder.StreamNested<>(this);
}
@Override
- public AstReadClosedNodeBuilder.StreamNested addReadCloseCommand() {
+ public AstReadClosedNodeBuilder.StreamNested addReadCloseCommand() {
return new AstReadClosedNodeBuilder.StreamNested<>(this);
}
@Override
- public AstWriteCloseNodeBuilder.StreamNested addWriteCloseCommand() {
+ public AstWriteCloseNodeBuilder.StreamNested addWriteCloseCommand() {
return new AstWriteCloseNodeBuilder.StreamNested<>(this);
}
public static final class ScriptNested> extends
- AbstractAstAcceptableNodeBuilder {
+ AbstractAstAcceptedNodeBuilder {
public ScriptNested(R builder) {
super(builder);
@@ -320,7 +320,7 @@ public AstWriteOptionNodeBuilder.StreamNested> addWriteOption()
}
public static final class AcceptNested> extends
- AbstractAstAcceptableNodeBuilder {
+ AbstractAstAcceptedNodeBuilder {
public AcceptNested(R builder) {
super(builder);
diff --git a/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstConnectAbortNodeBuilder.java b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstConnectAbortNodeBuilder.java
new file mode 100644
index 000000000..20e9c8e44
--- /dev/null
+++ b/lang/src/main/java/org/kaazing/k3po/lang/internal/ast/builder/AstConnectAbortNodeBuilder.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kaazing.k3po.lang.internal.ast.builder;
+
+import org.kaazing.k3po.lang.internal.ast.AstConnectAbortNode;
+import org.kaazing.k3po.lang.internal.ast.AstStreamNode;
+
+public class AstConnectAbortNodeBuilder extends AbstractAstStreamableNodeBuilder {
+
+ public AstConnectAbortNodeBuilder() {
+ this(new AstConnectAbortNode());
+ }
+
+ @Override
+ public AstConnectAbortNode done() {
+ return result;
+ }
+
+ private AstConnectAbortNodeBuilder(AstConnectAbortNode node) {
+ super(node, node);
+ }
+
+ public static class StreamNested