Skip to content

Commit

Permalink
Merge branch 'app-engine' of git@github.com:grails/grails into app-en…
Browse files Browse the repository at this point in the history
…gine
  • Loading branch information
graemerocher committed Apr 16, 2009
2 parents b73f3f6 + 7d070a7 commit c4d2c6e
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 7 deletions.
2 changes: 1 addition & 1 deletion grails/.classpath
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
<classpathentry kind="lib" path="lib/oscache-2.4.1.jar"/>
<classpathentry kind="lib" path="lib/ejb3-persistence-3.3.0.jar"/>
<classpathentry kind="lib" path="lib/gant_groovy1.6-1.6.0.jar"/>
<classpathentry kind="lib" path="lib/groovy-all-1.6.0.jar"/>
<classpathentry kind="lib" path="lib/groovy-all-1.6.1.jar"/>
<classpathentry kind="lib" path="lib/hibernate-annotations-3.3.0.jar"/>
<classpathentry kind="lib" path="lib/hsqldb-1.8.0.5.jar"/>
<classpathentry kind="lib" path="lib/jasper-compiler-5.5.15.jar"/>
Expand Down
2 changes: 1 addition & 1 deletion grails/src/grails/templates/ide-support/eclipse/.launch
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; javaProject=&quot;@grails.project.name@&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GRAILS_HOME/dist/grails-bootstrap-@grails.version@.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GRAILS_HOME/lib/groovy-all-1.6.0.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;GRAILS_HOME/lib/groovy-all-1.6.1.jar&quot; path=&quot;3&quot; type=&quot;3&quot;/&gt;&#10;"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="grails.util.GrailsMain"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public int[] getLineNumberMatrix() {

public InputStream parse() {
StreamCharBuffer streamBuffer=new StreamCharBuffer(1024);
StreamByteBuffer byteOutputBuffer=new StreamByteBuffer(1024);
StreamByteBuffer byteOutputBuffer=new StreamByteBuffer(1024, StreamByteBuffer.ReadMode.RETAIN_AFTER_READING);

try {
streamBuffer.connectTo(new OutputStreamWriter(byteOutputBuffer.getOutputStream(), GROOVY_SOURCE_CHAR_ENCODING), true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.*;
import java.util.Iterator;
import java.util.LinkedList;

/**
Expand All @@ -33,13 +34,26 @@ public class StreamByteBuffer {
private StreamByteBufferOutputStream output;
private StreamByteBufferInputStream input;
private int totalBytesUnreadInList = 0;
private int totalBytesUnreadInIterator = 0;
private ReadMode readMode;
private Iterator<StreamByteBufferChunk> readIterator;

public enum ReadMode {
REMOVE_AFTER_READING,
RETAIN_AFTER_READING
}

public StreamByteBuffer() {
this(DEFAULT_CHUNK_SIZE);
}

public StreamByteBuffer(int chunkSize) {
this(chunkSize, ReadMode.REMOVE_AFTER_READING);
}

public StreamByteBuffer(int chunkSize, ReadMode readMode) {
this.chunkSize = chunkSize;
this.readMode = readMode;
currentWriteChunk = new StreamByteBufferChunk(chunkSize);
output = new StreamByteBufferOutputStream();
input = new StreamByteBufferInputStream();
Expand Down Expand Up @@ -113,12 +127,22 @@ public String readAsString(Charset charset) throws CharacterCodingException {
}

public int totalBytesUnread() {
int total = totalBytesUnreadInList;
int total=0;
if(readMode == ReadMode.REMOVE_AFTER_READING) {
total = totalBytesUnreadInList;
} else if (readMode == ReadMode.RETAIN_AFTER_READING) {
prepareRetainAfterReading();
total = totalBytesUnreadInIterator;
}
if (currentReadChunk != null) {
total += currentReadChunk.bytesUnread();
}
if (currentWriteChunk != currentReadChunk && currentWriteChunk != null) {
total += currentWriteChunk.bytesUnread();
if(readMode == ReadMode.REMOVE_AFTER_READING) {
total += currentWriteChunk.bytesUnread();
} else if (readMode == ReadMode.RETAIN_AFTER_READING) {
total += currentWriteChunk.bytesUsed();
}
}
return total;
}
Expand All @@ -135,13 +159,19 @@ protected int allocateSpace() {
}

protected int prepareRead() {
prepareRetainAfterReading();
int bytesUnread = (currentReadChunk != null) ? currentReadChunk
.bytesUnread() : 0;
if (bytesUnread == 0) {
if (!chunks.isEmpty()) {
if (readMode==ReadMode.REMOVE_AFTER_READING && !chunks.isEmpty()) {
currentReadChunk = chunks.removeFirst();
bytesUnread = currentReadChunk.bytesUnread();
totalBytesUnreadInList -= bytesUnread;
} else if (readMode==ReadMode.RETAIN_AFTER_READING && readIterator.hasNext()) {
currentReadChunk = readIterator.next();
currentReadChunk.reset();
bytesUnread = currentReadChunk.bytesUnread();
totalBytesUnreadInIterator -= bytesUnread;
} else if (currentReadChunk != currentWriteChunk) {
currentReadChunk = currentWriteChunk;
bytesUnread = currentReadChunk.bytesUnread();
Expand All @@ -151,6 +181,36 @@ protected int prepareRead() {
}
return bytesUnread;
}

public void reset() {
if(readMode==ReadMode.RETAIN_AFTER_READING) {
readIterator=null;
prepareRetainAfterReading();
if(currentWriteChunk != null) {
currentWriteChunk.reset();
}
}
}

private void prepareRetainAfterReading() {
if(readMode==ReadMode.RETAIN_AFTER_READING && readIterator==null) {
readIterator=chunks.iterator();
totalBytesUnreadInIterator = totalBytesUnreadInList;
currentReadChunk=null;
}
}

public ReadMode getReadMode() {
return readMode;
}

public void setReadMode(ReadMode readMode) {
this.readMode = readMode;
}

public void retainAfterReadingMode() {
setReadMode(ReadMode.RETAIN_AFTER_READING);
}

class StreamByteBufferChunk {
private int pointer = 0;
Expand Down Expand Up @@ -207,6 +267,10 @@ public void writeTo(OutputStream target) throws IOException {
public void reset() {
this.pointer = 0;
}

public int bytesUsed() {
return used;
}

public int bytesUnread() {
return used - pointer;
Expand Down Expand Up @@ -261,6 +325,10 @@ public void write(int b) throws IOException {
allocateSpace();
currentWriteChunk.write((byte) b);
}

public StreamByteBuffer getBuffer() {
return StreamByteBuffer.this;
}
}

class StreamByteBufferInputStream extends InputStream {
Expand Down Expand Up @@ -301,8 +369,22 @@ int readImpl(byte[] b, int off, int len) {
}
}

@Override
public synchronized void reset() throws IOException {
if(readMode==ReadMode.RETAIN_AFTER_READING) {
StreamByteBuffer.this.reset();
} else {
// reset isn't supported in ReadMode.REMOVE_AFTER_READING
super.reset();
}
}

public int available() throws IOException {
return totalBytesUnread();
}

public StreamByteBuffer getBuffer() {
return StreamByteBuffer.this;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,17 @@ public void testToString() throws IOException {
assertEquals("Hello öäåÖÄÅ", byteBuffer.readAsString("UTF-8"));
}

public void testToStringRetain() throws IOException {
StreamByteBuffer byteBuffer = new StreamByteBuffer(1024, StreamByteBuffer.ReadMode.RETAIN_AFTER_READING);
PrintWriter pw=new PrintWriter(new OutputStreamWriter(byteBuffer.getOutputStream(),"UTF-8"));
pw.print("Hello öäåÖÄÅ");
pw.close();
assertEquals("Hello öäåÖÄÅ", byteBuffer.readAsString("UTF-8"));
byteBuffer.reset();
// call a second time to test if the RETAIN_AFTER_READING mode works as expected
assertEquals("Hello öäåÖÄÅ", byteBuffer.readAsString("UTF-8"));
}

public void testToInputStream() throws IOException {
StreamByteBuffer byteBuffer = createTestInstance();
InputStream input = byteBuffer.getInputStream();
Expand Down

0 comments on commit c4d2c6e

Please sign in to comment.