package railo.runtime.debug;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import railo.commons.lang.StringUtil;
import railo.runtime.cache.legacy.CacheItem;
import railo.runtime.op.Caster;
import railo.runtime.writer.CFMLWriter;
public class DebugCFMLWriter extends CFMLWriter implements DebugOutputLog {
private CFMLWriter writer;
private List<DebugTextFragment> fragments=new ArrayList<DebugTextFragment>();
public DebugCFMLWriter(CFMLWriter writer) {
super(writer.getBufferSize(), writer.isAutoFlush());
this.writer=writer;
}
@Override
public int getBufferSize() {
return writer.getBufferSize();
}
@Override
public boolean isAutoFlush() {
return writer.isAutoFlush();
}
@Override
public Writer append(CharSequence csq) throws IOException {
log(csq.toString());
return writer.append(csq);
}
@Override
public Writer append(char c) throws IOException {
log(new String(new char[]{c}));
return writer.append(c);
}
@Override
public Writer append(CharSequence csq, int start, int end) throws IOException {
log(csq.subSequence(start, end).toString());
return writer.append(csq, start, end);
}
@Override
public void write(int i) throws IOException {
print(i);
}
@Override
public void write(char[] cbuf) throws IOException {
print(cbuf);
}
@Override
public void write(String str) throws IOException {
print(str);
}
@Override
public void write(String str, int off, int len) throws IOException {
log(StringUtil.substring(str,off,len));
writer.write(str, off, len);
}
@Override
public OutputStream getResponseStream() throws IOException {
return writer.getResponseStream();
}
@Override
public void setClosed(boolean b) {
writer.setClosed(b);
}
@Override
public void setBufferConfig(int interval, boolean b) throws IOException {
writer.setBufferConfig(interval, b);
}
@Override
public void appendHTMLHead(String text) throws IOException {
writer.appendHTMLHead(text);
}
@Override
public void writeHTMLHead(String text) throws IOException {
writer.writeHTMLHead(text);
}
@Override
public String getHTMLHead() throws IOException {
return writer.getHTMLHead();
}
@Override
public void resetHTMLHead() throws IOException {
writer.resetHTMLHead();
}
@Override
public void writeRaw(String str) throws IOException {
print(str);
}
@Override
public void clear() throws IOException {
writer.clear();
}
@Override
public void clearBuffer() throws IOException {
writer.clearBuffer();
}
@Override
public void close() throws IOException {
writer.close();
}
@Override
public void flush() throws IOException {
writer.flush();
}
@Override
public int getRemaining() {
return writer.getRemaining();
}
@Override
public void newLine() throws IOException {
println();
}
@Override
public void print(boolean b) throws IOException {
writer.print(b);
log(b?"true":"false");
}
@Override
public void print(char c) throws IOException {
log(new String(new char[]{c}));
writer.write(c);
}
@Override
public void print(int i) throws IOException {
log(Caster.toString(i));
writer.write(i);
}
@Override
public void print(long l) throws IOException {
log(Caster.toString(l));
writer.print(l);
}
@Override
public void print(float f) throws IOException {
log(Caster.toString(f));
writer.print(f);
}
@Override
public void print(double d) throws IOException {
log(Caster.toString(d));
writer.print(d);
}
@Override
public void print(char[] carr) throws IOException {
log(new String(carr));
writer.write(carr);
}
@Override
public void print(String str) throws IOException {
log(str);
writer.write(str);
}
@Override
public void print(Object obj) throws IOException {
log(String.valueOf(obj));
writer.print(obj);
}
@Override
public void println() throws IOException {
print("\n");
}
@Override
public void println(boolean b) throws IOException {
print(b);
print("\n");
}
@Override
public void println(char c) throws IOException {
print(c);
print("\n");
}
@Override
public void println(int i) throws IOException {
print(i);
print("\n");
}
@Override
public void println(long l) throws IOException {
print(l);
print("\n");
}
@Override
public void println(float f) throws IOException {
print(f);
print("\n");
}
@Override
public void println(double d) throws IOException {
print(d);
print("\n");
}
@Override
public void println(char[] carr) throws IOException {
print(carr);
print("\n");
}
@Override
public void println(String str) throws IOException {
print(str);
print("\n");
}
@Override
public void println(Object obj) throws IOException {
print(obj);
print("\n");
}
@Override
public void write(char[] carr, int off, int len) throws IOException {
log(StringUtil.substring(new String(carr),off,len));
writer.write(carr,off,len);
}
private void log(String str) {
StackTraceElement[] traces = new Throwable().getStackTrace();
StackTraceElement trace;
String template;
int line;
for(int i=0;i<traces.length;i++){
trace=traces[i];
template = trace.getFileName();
line=trace.getLineNumber();
if(line<=0 || template==null || template.endsWith(".java")) continue;
fragments.add(new DebugTextFragment(str, template, line));
break;
}
}
@Override
public DebugTextFragment[] getFragments() {
return fragments.toArray(new DebugTextFragment[fragments.size()]);
}
@Override
public void setAllowCompression(boolean allowCompression) {
writer.setAllowCompression(allowCompression);
}
@Override
public void doCache(CacheItem ci) {
writer.doCache(ci);
}
@Override
public CacheItem getCacheItem() {
return writer.getCacheItem();
}
}