[twxproxy-ep commit] r60 - in trunk/twxbbs/src: main/java/org/twdata/twxbbs/config main/java/org/twdata/twxbbs/config/...

1 view
Skip to first unread message

codesite...@google.com

unread,
Aug 29, 2008, 12:40:57 PM8/29/08
to twxp...@googlegroups.com
Author: donald.brown
Date: Fri Aug 29 09:39:15 2008
New Revision: 60

Removed:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/script/
Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/Configuration.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/GlobalKey.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/ProxyKey.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/WebKey.java

trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/impl/IniConfiguration.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApi.java

trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApiImpl.java

trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptIoFilter.java

trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptLexer.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/util/CircularFifoBuffer.java

trunk/twxbbs/src/main/java/org/twdata/twxbbs/web/ConfigurationServlet.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/web/JettyWebManager.java
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/web/config-reload.mt
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/web/config.mt
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/web/public/global.css
trunk/twxbbs/src/test/java/org/twdata/twxbbs/AppIntegrationTest.java

trunk/twxbbs/src/test/java/org/twdata/twxbbs/proxy/script/ScriptLexerTest.java

trunk/twxbbs/src/test/java/org/twdata/twxbbs/util/CircularFifoBufferTest.java

Log:
Adding capturing text triggers, cleaned up unused code, improved
configuration UI, turned
off web client by default


Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/Configuration.java
==============================================================================
--- trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/Configuration.java
(original)
+++ trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/Configuration.java
Fri Aug 29 09:39:15 2008
@@ -24,6 +24,8 @@

boolean isSetup();

+ boolean isWebClientEnabled();
+
void refresh(File baseDir);

String get(SectionKey key);

Modified: trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/GlobalKey.java
==============================================================================
--- trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/GlobalKey.java
(original)
+++ trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/GlobalKey.java Fri
Aug 29 09:39:15 2008
@@ -17,7 +17,8 @@
*/
public enum GlobalKey implements SectionKey {
Setup("0", "Setup"),
- BaseDirectory(new File(".").getAbsolutePath(), "Base Directory");
+ BaseDirectory(new File(".").getAbsolutePath(), "Base Directory"),
+ WebClient("0", "Enable web client");

private String defaultValue;

@@ -41,6 +42,8 @@
List<String> errors = new ArrayList<String>();
switch (this) {
case Setup : if (!Validate.isIntegerInRange(value,
0, 1)) errors.add("Invalid value: "+value);
+ break;
+ case WebClient: if (!Validate.isIntegerInRange(value,
0, 1)) errors.add("Invalid value: "+value);
break;
case BaseDirectory : if (!Validate.isNotEmpty(value))
errors.add("Base directory is required");
else {

Modified: trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/ProxyKey.java
==============================================================================
--- trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/ProxyKey.java
(original)
+++ trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/ProxyKey.java Fri
Aug 29 09:39:15 2008
@@ -41,7 +41,7 @@
List<String> errors = new ArrayList<String>();
switch (this) {
case Port : if (!Validate.isIntegerInRange(value, 1,
65500)) errors.add("Invalid proxy port number: "+value);
- if (!Validate.isPortFree(value))
errors.add("Proxy port "+value+" is currently in use");
+ else if (!Validate.isPortFree(value))
errors.add("Proxy port "+value+" is currently in use");
break;
case Host : if (!Validate.isNotEmpty(value))
errors.add("Proxy host must be defined");
break;

Modified: trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/WebKey.java
==============================================================================
--- trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/WebKey.java
(original)
+++ trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/WebKey.java Fri Aug
29 09:39:15 2008
@@ -37,8 +37,8 @@
public List<String> validate(String value) {
List<String> errors = new ArrayList<String>();
switch (this) {
- case Port : if (!Validate.isIntegerInRange(value, 1,
65500)) errors.add("Invalid port number: "+value);
- if (!Validate.isPortFree(value))
errors.add("Port "+value+" is currently in use");
+ case Port : if (!Validate.isIntegerInRange(value, 1,
65500)) errors.add("Invalid web port number: "+value);
+ else if (!Validate.isPortFree(value))
errors.add("Web port "+value+" is currently in use");
break;
case BaseURL: if (!Validate.isNotEmpty(value))
errors.add("Web base URL must be defined"); else {
if
(!value.toLowerCase().startsWith("http")) errors.add("Web base URL should
be either HTTP or HTTPS");

Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/impl/IniConfiguration.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/impl/IniConfiguration.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/config/impl/IniConfiguration.java
Fri Aug 29 09:39:15 2008
@@ -118,6 +118,10 @@
return getInt(GlobalKey.Setup) == 1;
}

+ public boolean isWebClientEnabled() {
+ return getInt(GlobalKey.WebClient) == 1;
+ }
+
public int getInt(SectionKey key) {
return Integer.parseInt(values.get(key));
}

Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApi.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApi.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApi.java
Fri Aug 29 09:39:15 2008
@@ -10,6 +10,10 @@

void setTextLineTrigger(String id, String text);

+ void setCapturingTextTrigger(String id, String text);
+
+ void setCapturingTextLineTrigger(String id, String text);
+
void send(String text) throws Exception;

String pause();

Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApiImpl.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApiImpl.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApiImpl.java
Fri Aug 29 09:39:15 2008
@@ -1,10 +1,5 @@
package org.twdata.twxbbs.proxy.script;

-import org.apache.mina.common.IoSession;
-import org.apache.mina.common.IoHandler;
-import org.apache.mina.common.ByteBuffer;
-import org.apache.mina.common.IoFilter;
-
import java.io.IOException;

/**
@@ -29,7 +24,7 @@
}

public String getMatchedLine() {
- return (lastMatch != null ? lastMatch.getLastLine() : null);
+ return (lastMatch != null ? lastMatch.getMatchedText() : null);
}

public void setTextTrigger(String id, String text) {
@@ -38,6 +33,14 @@

public void setTextLineTrigger(String id, String text) {
lexer.addTextLineTrigger(id, text);
+ }
+
+ public void setCapturingTextTrigger(String id, String text) {
+ lexer.addCapturingTextTrigger(id, text);
+ }
+
+ public void setCapturingTextLineTrigger(String id, String text) {
+ lexer.addCapturingTextLineTrigger(id, text);
}

public void send(String text) throws Exception {

Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptIoFilter.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptIoFilter.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptIoFilter.java
Fri Aug 29 09:39:15 2008
@@ -26,7 +26,7 @@
if (o instanceof ByteBuffer) {
ByteBuffer buffer = (ByteBuffer) o;
for (ScriptLexer lexer : getPlayerLexers(ioSession)) {
- lexer.parse(buffer);
+ buffer = lexer.parse(buffer);
buffer.flip();
}
nextFilter.messageReceived(ioSession, buffer);
@@ -40,7 +40,7 @@
if (o instanceof ByteBuffer) {
ByteBuffer buffer = (ByteBuffer) o;
for (ScriptLexer lexer : getGameLexers(ioSession)) {
- lexer.parse(buffer);
+ buffer = lexer.parse(buffer);
buffer.flip();
}
nextFilter.messageSent(ioSession, buffer);

Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptLexer.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptLexer.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptLexer.java
Fri Aug 29 09:39:15 2008
@@ -16,26 +16,56 @@
*/
public class ScriptLexer {
private final Map<String,Trigger> activeTriggers;
+
+ // The current line
private final StringBuffer currentLine;
- private CircularFifoBuffer backBuffer;
+
+ // Contains text that isn't being actively matched, but may
+ private final CircularFifoBuffer backBuffer;
+
+ // Contains captured text
+ private final StringBuffer captureBuffer;
+
+ // Buffer for read data that may be used to create a modified write
buffer if a capturing trigger is used
+ private final ByteBuffer readCopyBuffer;
+
+ // Whether we are waiting for triggers to be matched or not
private boolean waiting;
+
+ // The last match a trigger matched
private Match lastMatch;
+
+ // The timeout for waiting for a match
private long timeout = 1000 * 60;

public ScriptLexer() {
activeTriggers = new LinkedHashMap<String,Trigger>();
currentLine = new StringBuffer();
backBuffer = new CircularFifoBuffer(1024);
+ captureBuffer = new StringBuffer();
+ readCopyBuffer = ByteBuffer.allocate(1024);
+ readCopyBuffer.setAutoExpand(true);
+
}

public synchronized void addTextTrigger(String id, String text) {
if (waiting) throw new IllegalStateException("Cannot accept new
triggers while lexing text");
- activeTriggers.put(id, new Trigger(id, text, false));
+ activeTriggers.put(id, new DefaultTrigger(id, text, false));
}

public synchronized void addTextLineTrigger(String id, String text) {
if (waiting) throw new IllegalStateException("Cannot accept new
triggers while lexing text");
- activeTriggers.put(id, new Trigger(id, text, true));
+ activeTriggers.put(id, new DefaultTrigger(id, text, true));
+ }
+
+ public synchronized void addCapturingTextTrigger(String id, String
text) {
+ if (waiting) throw new IllegalStateException("Cannot accept new
triggers while lexing text");
+ activeTriggers.put(id, new CapturingTrigger(id, text, false));
+ }
+
+ public synchronized void addCapturingTextLineTrigger(String id, String
text) {
+ if (waiting) throw new IllegalStateException("Cannot accept new
triggers while lexing text");
+ activeTriggers.put(id, new CapturingTrigger(id, text, true));
}

public synchronized void removeTextTrigger(String id) {
@@ -48,45 +78,97 @@
}

public synchronized Match waitForTriggers() throws IOException,
InterruptedException {
- waiting = true;
- lastMatch = null;
- if (backBuffer.hasRemaining()) {
- parse(backBuffer);
- }
- if (lastMatch == null) {
- wait(timeout);
+ try {
+ waiting = true;
+ lastMatch = null;
+ if (backBuffer.hasRemaining()) {
+ parse(backBuffer);
+ }
+ if (lastMatch == null) {
+ wait(timeout);
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
}
return lastMatch;
}

- public synchronized void parse(ByteBuffer buffer) throws IOException {
+ public synchronized ByteBuffer parse(ByteBuffer buffer) throws
IOException {
+ readCopyBuffer.clear();

+ int bytesRead = 0;
while (buffer.hasRemaining()) {
if (!waiting && buffer == backBuffer) {
- return;
+ return buffer;
}
byte b = buffer.get();
+ bytesRead++;
+
if (!waiting) {
backBuffer.put(b);
+ readCopyBuffer.put(b);
} else {
char c = (char) b;
for (Trigger trigger : activeTriggers.values()) {
- if (c != '\n') {
- if (c != '\r')
- currentLine.append(c);
+ putInCurrentLine(c);
+
+ if (trigger.potentialMatch(c)) {
+ captureBuffer.append(c);
} else {
- currentLine.setLength(0);
+ for (int x=0; x<captureBuffer.length(); x++) {
+
readCopyBuffer.putChar(captureBuffer.charAt(x));
+ }
+ captureBuffer.setLength(0);
+ readCopyBuffer.put(b);
}
+
if (trigger.match(c)) {
handleMatch(trigger);
}
}
}
}
+
+ return createResultingBuffer(buffer, bytesRead);
+ }
+
+ private ByteBuffer createResultingBuffer(ByteBuffer buffer, int
bytesRead) {
+ readCopyBuffer.flip();
+ if (bytesRead > readCopyBuffer.limit()) {
+ // Lazily create a new buffer to store our output that will
now be modified
+ ByteBuffer writeBuffer =
ByteBuffer.allocate(readCopyBuffer.limit());
+ while (readCopyBuffer.hasRemaining()) {
+ writeBuffer.put(readCopyBuffer.get());
+ }
+ return writeBuffer;
+ } else {
+ return buffer;
+ }
+ }
+
+ private void putInCurrentLine(char c) {
+ if (c != '\n') {
+ if (c != '\r')
+ currentLine.append(c);
+ } else {
+ currentLine.setLength(0);
+ }
}

private void handleMatch(Trigger trigger) {
- Match match = new Match(trigger.getId(), currentLine.toString());
+ String matchedText;
+ if (trigger instanceof CapturingTrigger) {
+ matchedText = captureBuffer.toString();
+ } else {
+ matchedText = currentLine.toString();
+ }
+ if (matchedText.length() > 0 &&
matchedText.charAt(matchedText.length()-1) == '\r') {
+ matchedText = matchedText.substring(0, matchedText.length()
-1);
+ }
+ Match match = new Match(trigger.getId(), matchedText);
+ if (trigger.shouldBeRemovedAfterMatch()) {
+ activeTriggers.remove(trigger.getId());
+ }
waiting = false;
lastMatch = match;
notifyAll();
@@ -98,35 +180,46 @@

public static class Match {
private final String matchedId;
- private final String lastLine;
+ private final String matchedText;

- public Match(String matchedId, String lastLine) {
+ public Match(String matchedId, String matchedText) {
this.matchedId = matchedId;
- this.lastLine = lastLine;
+ this.matchedText = matchedText;
}

public String getMatchedId() {
return matchedId;
}

- public String getLastLine() {
- return lastLine;
+ public String getMatchedText() {
+ return matchedText;
}
}

- static class Trigger {
+ static interface Trigger {
+ boolean match(char c);
+ String getId();
+ boolean shouldBeRemovedAfterMatch();
+
+ boolean potentialMatch(char c);
+ }
+
+ static class DefaultTrigger implements Trigger{
private final String id;
private final boolean waitForLine;
private final char[] text;
private int pos;
private boolean triggered;

- public Trigger(String id, String line, boolean waitForLine) {
+ public DefaultTrigger(String id, String line, boolean waitForLine)
{
this.id = id;
text = line.toCharArray();
this.waitForLine = waitForLine;
pos = 0;
- triggered = false;
+ }
+
+ public boolean potentialMatch(char c) {
+ return triggered || text[pos] == c;
}

public boolean match(char c) {
@@ -159,6 +252,21 @@

public String getId() {
return id;
+ }
+
+ public boolean shouldBeRemovedAfterMatch() {
+ return false;
+ }
+ }
+
+ class CapturingTrigger extends DefaultTrigger {
+
+ public CapturingTrigger(String id, String line, boolean
waitForLine) {
+ super(id, line, waitForLine);
+ }
+
+ public boolean shouldBeRemovedAfterMatch() {
+ return true;
}
}
}

Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/util/CircularFifoBuffer.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/util/CircularFifoBuffer.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/util/CircularFifoBuffer.java
Fri Aug 29 09:39:15 2008
@@ -55,6 +55,32 @@
return start != pos;
}

+ @Override
+ public int remaining() {
+ if (hasRemaining()) {
+ if (pos > start) {
+ return pos - start;
+ } else {
+ return (buffer.length) - (start - pos);
+ }
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public byte[] array() {
+ byte[] result = new byte[remaining()];
+ int rpos = start;
+ for (int x=0; x<result.length; x++) {
+ result[x] = buffer[rpos++];
+ if (rpos == buffer.length) {
+ rpos = 0;
+ }
+ }
+ return result;
+ }
+
public byte get(int i) {
throw new UnsupportedOperationException();
}
@@ -304,10 +330,6 @@
}

public ByteBuffer asReadOnlyBuffer() {
- throw new UnsupportedOperationException();
- }
-
- public byte[] array() {
throw new UnsupportedOperationException();
}


Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/web/ConfigurationServlet.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/web/ConfigurationServlet.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/web/ConfigurationServlet.java
Fri Aug 29 09:39:15 2008
@@ -45,23 +45,24 @@
private void renderForm(final HttpServletRequest req,
HttpServletResponse httpServletResponse, final Map<String,List<String>>
errors) throws IOException {
generator.render("config.mt", httpServletResponse, new
TemplateGenerator.TemplateCallback() {
public void initTemplate(MiniTemplator template) throws
MiniTemplator.VariableNotDefinedException,
MiniTemplator.BlockNotDefinedException {
- if (errors != null) {
- for (Map.Entry<String,List<String>> entry :
errors.entrySet()) {
- for (String err : entry.getValue()) {
- template.setVariable("msg", err);
- template.addBlock("error");
- }
- }
- template.addBlock("errors");
- }
- setAll(template, GlobalKey.values());
- setAll(template, WebKey.values());
- setAll(template, ProxyKey.values());
+ setAll(template, GlobalKey.values(), errors);
+ setAll(template, WebKey.values(), errors);
+ setAll(template, ProxyKey.values(), errors);
}
- private void setAll(MiniTemplator template, SectionKey[] keys)
throws MiniTemplator.VariableNotDefinedException,
MiniTemplator.BlockNotDefinedException {
+ private void setAll(MiniTemplator template, SectionKey[] keys,
Map<String,List<String>> errors) throws
MiniTemplator.VariableNotDefinedException,
MiniTemplator.BlockNotDefinedException {
for (SectionKey key : keys) {
if (GlobalKey.Setup == key) {
continue;
+ }
+ if (errors != null) {
+ List<String> fieldErrors =
errors.get(key.getFullName());
+ if (fieldErrors != null && !fieldErrors.isEmpty())
{
+ for (String err : fieldErrors) {
+ template.setVariable("fieldError", err);
+ template.addBlock("fieldError");
+ }
+ template.addBlock("fieldErrors");
+ }
}
String val = req.getParameter(key.getFullName());
if (val == null) {

Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/web/JettyWebManager.java
==============================================================================
--- trunk/twxbbs/src/main/java/org/twdata/twxbbs/web/JettyWebManager.java
(original)
+++ trunk/twxbbs/src/main/java/org/twdata/twxbbs/web/JettyWebManager.java
Fri Aug 29 09:39:15 2008
@@ -54,21 +54,23 @@
File web = new File(config.getBaseDir(), "web");
if (web.exists()) {
ResourceHandler baseDirHandler=new ResourceHandler();
- baseDirHandler.setBaseResource(Resource.newResource(new
File(config.getBaseDir(), "web").toURL()));
+ baseDirHandler.setBaseResource(Resource.newResource(new
File(config.getBaseDir(), "web").toURI().toURL()));
handlers.addHandler(baseDirHandler);
}
handlers.addHandler(internalHandler);
server.setHandler(handlers);

Context root = new Context(server,"/", Context.SESSIONS);
- root.setWelcomeFiles(new String[]{"games.xhtml"});
- if (!config.isSetup()) {
+
+ if (!config.isSetup() || !config.isWebClientEnabled()) {
root.addServlet(new ServletHolder(new
ConfigurationServlet(config, templateGenerator)), "/*");
} else {
+ root.setWelcomeFiles(new String[]{"games.xhtml"});
for (Map.Entry<String,Servlet> entry :
servlets.entrySet()) {
root.addServlet(new ServletHolder(entry.getValue()),
entry.getKey());
}
root.addServlet(new
ServletHolder(servlets.get("/games")), "*.xhtml");
+ root.addServlet(new ServletHolder(new
ConfigurationServlet(config, templateGenerator)), "/admin");
}
} catch (MalformedURLException e) {
throw new RuntimeException("Unable to set resource directory");

Modified:
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/web/config-reload.mt
==============================================================================
--- trunk/twxbbs/src/main/resources/org/twdata/twxbbs/web/config-reload.mt
(original)
+++ trunk/twxbbs/src/main/resources/org/twdata/twxbbs/web/config-reload.mt
Fri Aug 29 09:39:15 2008
@@ -3,7 +3,7 @@
<head>
<title>TWX BBS Admin</title>
<link href="global.css" rel="stylesheet" type="text/css"></link>
- <meta http-equiv="refresh" content="5;url=${baseUrl}:${port}"/>
+ <meta http-equiv="refresh" content="3;url=${baseUrl}:${port}"/>
</head>

<body>

Modified: trunk/twxbbs/src/main/resources/org/twdata/twxbbs/web/config.mt
==============================================================================
--- trunk/twxbbs/src/main/resources/org/twdata/twxbbs/web/config.mt
(original)
+++ trunk/twxbbs/src/main/resources/org/twdata/twxbbs/web/config.mt Fri Aug
29 09:39:15 2008
@@ -2,30 +2,37 @@

<head>
<title>TWX BBS Administration</title>
-<link href="global.css" rel="stylesheet" type="text/css"></link>
+<link href="global.css" rel="stylesheet" type="text/css" />
</head>

<body>

<h3>TWX BBS Adminstration</h3>
-
- <!-- $BeginBlock errors -->
- <div id="errors">
- There were errors:
- <ul>
- <!-- $BeginBlock error -->
- <li>${msg}</li>
- <!-- $EndBlock error -->
- </ul>
- </div>
- <!-- $EndBlock errors -->
+ <p>
+ Welcome to TWX BBS! The following settings allow you to configure
TWX BBS without having to edit the twxbbs.ini file or restart
+ the server manually. After submitting the configuration, the
affected services will be restarted automatically.
+ </p>
+ <p>
+ The web client is an experimental web interface to TradeWars that
is disabled by default as it is just in the early stages of
+ development.
+ </p>
<form method="post">
<input type="hidden" name="Global.Setup" value="1" />
<table>
<!-- $BeginBlock setting -->
<tr>
<th>${displayName}</th>
- <td><input type="text" name="${key}" value="${value}"
size="50"/></td>
+ <td>
+ <!-- $BeginBlock fieldErrors -->
+ <div class="error">
+ <ul>
+ <!-- $BeginBlock fieldError -->
+ <li>${fieldError}</li>
+ <!-- $EndBlock fieldError -->
+ </ul>
+ </div>
+ <!-- $EndBlock fieldErrors -->
+ <input type="text" name="${key}" value="${value}"
size="50"/></td>
</tr>
<!-- $EndBlock setting -->
</table>

Modified:
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/web/public/global.css
==============================================================================
--- trunk/twxbbs/src/main/resources/org/twdata/twxbbs/web/public/global.css
(original)
+++ trunk/twxbbs/src/main/resources/org/twdata/twxbbs/web/public/global.css
Fri Aug 29 09:39:15 2008
@@ -4,6 +4,10 @@

}

+th {
+ text-align: left;
+}
+
#ceiling {
border-style: groove;
border-color: #0000CC;

Modified:
trunk/twxbbs/src/test/java/org/twdata/twxbbs/AppIntegrationTest.java
==============================================================================
--- trunk/twxbbs/src/test/java/org/twdata/twxbbs/AppIntegrationTest.java
(original)
+++ trunk/twxbbs/src/test/java/org/twdata/twxbbs/AppIntegrationTest.java
Fri Aug 29 09:39:15 2008
@@ -69,7 +69,7 @@
FileUtils.writeStringToFile(new File(baseDir, "twxbbs.ini"),
"[Proxy]\n" +
"Port = 8023\n" +
- "TWGSPort = 2222" +
+ "TWGSPort = "+(runThroughProxy ? 2222 : 3333) +
"\n" +
"[Web]\n" +
"Port = 8084\n" +
@@ -97,14 +97,15 @@
Socket incomingSocket = server.accept();
byte[] buffer = new byte[1024];
int len = 0;
- int lastLen = 0;
+ int dataReceived = 0;
while ((len =
incomingSocket.getInputStream().read(buffer)) > 0) {
- lastLen = len;
+ dataReceived += len;
+ //System.out.println("received: "+dataReceived);
if (buffer[len-1] == -1) {
break;
}
}
- //System.out.println("received data: "+new
String(buffer, 0, lastLen-1));
+ System.out.println("received data: "+dataReceived);
incomingSocket.close();
server.close();
} catch (IOException e) {
@@ -123,7 +124,12 @@
InputStream in =
getClass().getResourceAsStream("/bible12.txt");
socket = new Socket("localhost", port);
Thread.sleep(1000);
- IOUtils.copy(in, socket.getOutputStream());
+ byte[] buffer = new byte[5024];
+ int len = 0;
+ while ((len = in.read(buffer)) > 0) {
+ socket.getOutputStream().write(buffer, 0, len);
+ socket.getOutputStream().flush();
+ }
socket.getOutputStream().write((byte)255);
socket.getOutputStream().flush();
//System.out.println("data sent");
@@ -136,6 +142,7 @@
});
sendingThread.start();
t.join();
+ sendingThread.interrupt();
container.stop();
}
}

Modified:
trunk/twxbbs/src/test/java/org/twdata/twxbbs/proxy/script/ScriptLexerTest.java
==============================================================================
---
trunk/twxbbs/src/test/java/org/twdata/twxbbs/proxy/script/ScriptLexerTest.java
(original)
+++
trunk/twxbbs/src/test/java/org/twdata/twxbbs/proxy/script/ScriptLexerTest.java
Fri Aug 29 09:39:15 2008
@@ -5,6 +5,7 @@
import java.io.IOException;

import org.apache.mina.common.ByteBuffer;
+import org.apache.commons.io.output.ByteArrayOutputStream;

/**
* Created by IntelliJ IDEA.
@@ -17,33 +18,33 @@

public void testSimple() throws IOException, InterruptedException {
ScriptLexer lexer = new ScriptLexer();
- lexer.addTextTrigger("foo", "don");
- lexer.parse(ByteBuffer.wrap("This guy don is great".getBytes()));
+ lexer.addTextTrigger("foo", "bob");
+ lexer.parse(ByteBuffer.wrap("This guy bob is great".getBytes()));
ScriptLexer.Match match = lexer.waitForTriggers();
assertNotNull(match);
assertEquals("foo", match.getMatchedId());
- assertEquals("This guy don", match.getLastLine());
+ assertEquals("This guy bob", match.getMatchedText());
}

public void testSimpleLine() throws IOException, InterruptedException {
ScriptLexer lexer = new ScriptLexer();
- lexer.addTextLineTrigger("foo", "don");
- lexer.parse(ByteBuffer.wrap("This guy don is
great\r\n".getBytes()));
+ lexer.addTextLineTrigger("foo", "bob");
+ lexer.parse(ByteBuffer.wrap("This guy bob is
great\r\n".getBytes()));
ScriptLexer.Match match = lexer.waitForTriggers();
assertNotNull(match);
assertEquals("foo", match.getMatchedId());
- assertEquals("This guy don is great", match.getLastLine());
+ assertEquals("This guy bob is great", match.getMatchedText());
}

public void testSimpleMultiThread() throws IOException,
InterruptedException {
final ScriptLexer lexer = new ScriptLexer();
- lexer.addTextTrigger("foo", "don");
+ lexer.addTextTrigger("foo", "bob");
lexer.setTimeout(2000);
Thread t = new Thread(new Runnable() {
public void run() {
try {
for (int x=0; x<4; x++) {
- lexer.parse(ByteBuffer.wrap("This guy don is
great\r\n".getBytes()));
+ lexer.parse(ByteBuffer.wrap("This guy bob is
great\r\n".getBytes()));
Thread.sleep(500);
}
} catch (Exception e) {
@@ -52,13 +53,70 @@
}
}
});
- t.run();
+ t.start();
for (int x=0; x<4; x++) {
ScriptLexer.Match match = lexer.waitForTriggers();
assertNotNull(match);
assertEquals("foo", match.getMatchedId());
- assertEquals("This guy don", match.getLastLine());
+ assertEquals("This guy bob", match.getMatchedText());
}
assertNull(lexer.waitForTriggers());
+ }
+
+ public void testCapturingTrigger() throws IOException,
InterruptedException {
+ final ScriptLexer lexer = new ScriptLexer();
+ lexer.addCapturingTextTrigger("foo", "bob");
+ lexer.setTimeout(5000);
+ Thread t = new Thread(new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(500);
+ ByteBuffer outBuffer =
lexer.parse(ByteBuffer.wrap("This guy bob is great\r\n".getBytes()));
+ String bufferAsStr = readBufferIntoString(outBuffer);
+ assertEquals("This guy is great\r\n", bufferAsStr);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("bad exception: "+ e);
+ }
+ }
+ });
+ t.start();
+ ScriptLexer.Match match = lexer.waitForTriggers();
+ assertNotNull(match);
+ assertEquals("foo", match.getMatchedId());
+ assertEquals("bob", match.getMatchedText());
+ }
+
+ public void testCapturingTriggerForLine() throws IOException,
InterruptedException {
+ final ScriptLexer lexer = new ScriptLexer();
+ lexer.addCapturingTextLineTrigger("foo", "bob");
+ lexer.setTimeout(5000);
+ Thread t = new Thread(new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(500);
+ ByteBuffer outBuffer =
lexer.parse(ByteBuffer.wrap("This guy bob is great\r\nyeah".getBytes()));
+ String bufferAsStr = readBufferIntoString(outBuffer);
+ assertEquals("This guy \nyeah", bufferAsStr);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("bad exception: "+ e);
+ }
+ }
+ });
+ t.start();
+ ScriptLexer.Match match = lexer.waitForTriggers();
+ assertNotNull(match);
+ assertEquals("foo", match.getMatchedId());
+ assertEquals("bob is great", match.getMatchedText());
+ }
+
+ private String readBufferIntoString(ByteBuffer buffer) {
+ buffer.flip();
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ while (buffer.hasRemaining()) {
+ bout.write(buffer.get());
+ }
+ return new String(bout.toByteArray());
}
}

Modified:
trunk/twxbbs/src/test/java/org/twdata/twxbbs/util/CircularFifoBufferTest.java
==============================================================================
---
trunk/twxbbs/src/test/java/org/twdata/twxbbs/util/CircularFifoBufferTest.java
(original)
+++
trunk/twxbbs/src/test/java/org/twdata/twxbbs/util/CircularFifoBufferTest.java
Fri Aug 29 09:39:15 2008
@@ -15,11 +15,15 @@
CircularFifoBuffer buffer = new CircularFifoBuffer(5);
buffer.put((byte) 1);
buffer.put((byte) 3);
+ assertEquals(2, buffer.remaining());
assertTrue(buffer.hasRemaining());
assertEquals((byte) 1, buffer.get());
+ assertEquals(1, buffer.remaining());
assertTrue(buffer.hasRemaining());
assertEquals((byte) 3, buffer.get());
+ assertEquals(0, buffer.remaining());
assertFalse(buffer.hasRemaining());
+
}

public void testPutPastEnd() {
@@ -28,10 +32,13 @@
buffer.put((byte) 3);
buffer.put((byte) 5);
buffer.put((byte) 7);
+ assertEquals(2, buffer.remaining());
assertTrue(buffer.hasRemaining());
assertEquals((byte) 5, buffer.get());
+ assertEquals(1, buffer.remaining());
assertTrue(buffer.hasRemaining());
assertEquals((byte) 7, buffer.get());
+ assertEquals(0, buffer.remaining());
assertFalse(buffer.hasRemaining());
}
}

Reply all
Reply to author
Forward
0 new messages