Mercurial Hosting > nabble
comparison src/nabble/naml/compiler/BlockWrapper.java @ 0:7ecd1a4ef557
add content
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 21 Mar 2019 19:15:52 -0600 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:7ecd1a4ef557 |
---|---|
1 package nabble.naml.compiler; | |
2 | |
3 import java.io.StringWriter; | |
4 import nabble.model.Init; | |
5 | |
6 | |
7 class BlockWrapper { | |
8 private static final int blockWriterLimit = Init.get("blockWriterLimit",10 * 1024 * 1024); | |
9 | |
10 private final Chunk block; | |
11 private final RunState runState; | |
12 | |
13 BlockWrapper(Chunk block,RunState runState) { | |
14 this.block = block; | |
15 this.runState = runState; | |
16 } | |
17 | |
18 private static class BlockWriter extends TemplatePrintWriter { | |
19 private final StringWriter sw; | |
20 private boolean isNull = false; | |
21 | |
22 BlockWriter(StringWriter sw) { | |
23 super(sw); | |
24 this.sw = sw; | |
25 } | |
26 | |
27 public void print(Object obj) { | |
28 if( obj == null && sw.getBuffer().length() == 0 && !isNull ) { | |
29 isNull = true; | |
30 return; | |
31 } | |
32 super.print(obj); | |
33 checkSize(); | |
34 } | |
35 | |
36 public void print(String s) { | |
37 if( s == null && sw.getBuffer().length() == 0 && !isNull ) { | |
38 isNull = true; | |
39 return; | |
40 } | |
41 super.print(s); | |
42 checkSize(); | |
43 } | |
44 | |
45 private void checkSize() { | |
46 if( sw.getBuffer().length() > blockWriterLimit ) | |
47 throw new RuntimeException("BlockWriter too big"); | |
48 } | |
49 | |
50 String value() { | |
51 if( isNull ) { | |
52 if( sw.getBuffer().length() > 0 ) | |
53 throw new NullPointerException("null written to stream"); | |
54 return null; | |
55 } | |
56 return sw.toString(); | |
57 } | |
58 } | |
59 | |
60 public final String toString() { | |
61 BlockWriter out = new BlockWriter(new StringWriter()); | |
62 printTo(out); | |
63 out.close(); | |
64 return out.value(); | |
65 } | |
66 | |
67 void printTo(IPrintWriter out) { | |
68 block.run(out,runState); | |
69 } | |
70 } |