outWriter.append(",");
outWriter.write("\"focus\":\""+ getPaintableId(f) +"\"");
}
- outWriter.print("}");
+
+ outWriter.print("}, \"resources\" : {");
// Precache custom layouts
// TODO Rewrite this to print to outWriter a custom json attribute. Don't use paintTarget !!
// TODO Does not support theme-get param or different themes in different windows -> Allways preload layouts with the theme specified by the applications
-// String themeName = application.getTheme() != null ? application.getTheme() : ApplicationServlet.DEFAULT_THEME;
-// // TODO We should only precache the layouts that are not cached already
-// for (Iterator i=((AjaxPaintTarget) paintTarget).getPreCachedResources().iterator(); i.hasNext();) {
-// String resource = (String) i.next();
-// InputStream is = null;
-// try {
-// is = themeSource.getResource(themeName + "/" + resource);
-// } catch (ThemeSource.ThemeException e) {
-// Log.info(e.getMessage());
-// }
-// if (is != null) {
-// paintTarget.startTag("precache");
-// paintTarget.addAttribute("resource", resource);
-// StringBuffer layout = new StringBuffer();
-//
-// try {
-// InputStreamReader r = new InputStreamReader(is);
-// char[] buffer = new char[20000];
-// int charsRead = 0;
-// while ((charsRead = r.read(buffer)) > 0)
-// layout.append(buffer, 0, charsRead);
-// r.close();
-// } catch (java.io.IOException e) {
-// Log.info("Resource transfer failed: " + request.getRequestURI()
-// + ". (" + e.getMessage() + ")");
-// }
-// paintTarget.addCharacterData(layout.toString());
-// paintTarget.endTag("precache");
-// }
-// }
+ String themeName = application.getTheme() != null ? application.getTheme() : ApplicationServlet.DEFAULT_THEME;
+ // TODO We should only precache the layouts that are not cached already
+ int resourceIndex = 0;
+ for (Iterator i=((AjaxPaintTarget) paintTarget).getPreCachedResources().iterator(); i.hasNext();) {
+ String resource = (String) i.next();
+ InputStream is = null;
+ try {
+ is = themeSource.getResource(themeName + "/" + resource);
+ } catch (ThemeSource.ThemeException e) {
+ Log.info(e.getMessage());
+ }
+ if (is != null) {
+
+ outWriter.print((resourceIndex++ > 0 ? ", " : "") + "\""+resource + "\" : ");
+ StringBuffer layout = new StringBuffer();
+
+ try {
+ InputStreamReader r = new InputStreamReader(is);
+ char[] buffer = new char[20000];
+ int charsRead = 0;
+ while ((charsRead = r.read(buffer)) > 0)
+ layout.append(buffer, 0, charsRead);
+ r.close();
+ } catch (java.io.IOException e) {
+ Log.info("Resource transfer failed: " + request.getRequestURI()
+ + ". (" + e.getMessage() + ")");
+ }
+ outWriter.print("\"" + AjaxJsonPaintTarget.escapeJSON(layout.toString()) + "\"");
+ }
+ }
+ outWriter.print("}");
+
outWriter.flush();
outWriter.close();
out.flush();
private final static String UIDL_ARG_ID = "id";
private Stack mOpenTags;
-
+
private Stack openJsonTags;
private boolean mTagArgumentListOpen;
private boolean trackPaints = false;
private int numberOfPaints = 0;
-
+
private int changes = 0;
-
+
Set preCachedResources = new HashSet();
+
private boolean customLayoutArgumentsOpen = false;
private JsonTag tag;
// Sets the variable map
this.variableMap = variableMap;
-
// Sets the target for UIDL writing
this.uidlBuffer = outWriter;
* Prints the element start tag.
*
* <pre>
- * Todo:
- * Checking of input values
- *
+ * Todo:
+ * Checking of input values
+ *
* </pre>
*
* @param tagName
* if the paint operation failed.
*
*/
- public void startTag(String tagName, boolean isChildNode) throws PaintException {
+ public void startTag(String tagName, boolean isChildNode)
+ throws PaintException {
// In case of null data output nothing:
if (tagName == null)
throw new NullPointerException();
if (this.closed)
throw new PaintException(
"Attempted to write to a closed PaintTarget.");
-
- if(tag != null) {
+
+ if (tag != null) {
openJsonTags.push(tag);
}
// Checks tagName and attributes here
mOpenTags.push(tagName);
-
+
tag = new JsonTag(tagName);
mTagArgumentListOpen = true;
-
- if ("customlayout".equals(tagName))
- customLayoutArgumentsOpen = true;
+
+ customLayoutArgumentsOpen = "customlayout".equals(tagName);
}
/**
if (this.closed)
throw new PaintException(
"Attempted to write to a closed PaintTarget.");
-
- if(openJsonTags.size() > 0) {
+
+ if (openJsonTags.size() > 0) {
JsonTag parent = (JsonTag) openJsonTags.pop();
String lastTag = "";
if (!tagName.equalsIgnoreCase(lastTag))
throw new PaintException("Invalid UIDL: wrong ending tag: '"
+ tagName + "' expected: '" + lastTag + "'.");
-
+
parent.addData(tag.getJSON());
tag = parent;
} else {
changes++;
- this.uidlBuffer.print(
- ( (changes > 1) ? "," : "") +
- tag.getJSON());
+ this.uidlBuffer.print(((changes > 1) ? "," : "") + tag.getJSON());
tag = null;
}
}
}
return result;
}
-
+
static public String escapeJSON(String s) {
- if(s==null)
+ if (s == null)
return "";
- StringBuffer sb=new StringBuffer();
- for(int i=0;i<s.length();i++){
- char ch=s.charAt(i);
- switch(ch){
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < s.length(); i++) {
+ char ch = s.charAt(i);
+ switch (ch) {
case '"':
sb.append("\\\"");
break;
sb.append("\\/");
break;
default:
- if(ch>='\u0000' && ch<='\u001F'){
- String ss=Integer.toHexString(ch);
+ if (ch >= '\u0000' && ch <= '\u001F') {
+ String ss = Integer.toHexString(ch);
sb.append("\\u");
- for(int k=0;k<4-ss.length();k++){
+ for (int k = 0; k < 4 - ss.length(); k++) {
sb.append('0');
}
sb.append(ss.toUpperCase());
- }
- else{
+ } else {
sb.append(ch);
}
}
throw new NullPointerException(
"Parameters must be non-null strings");
-
tag.addAttribute("\"" + name + "\": \"" + escapeJSON(value) + "\"");
-
+
+ if (customLayoutArgumentsOpen && "style".equals(name))
+ getPreCachedResources().add("layout/" + value + ".html");
+
}
public void addAttribute(String name, Object[] values) {
throw new NullPointerException(
"Parameters must be non-null strings");
StringBuffer buf = new StringBuffer();
- buf.append("\""+name+"\":[");
+ buf.append("\"" + name + "\":[");
for (int i = 0; i < values.length; i++) {
- if(i>0)
+ if (i > 0)
buf.append(",");
buf.append("\"");
buf.append(escapeJSON(values[i].toString()));
buf.append("]");
tag.addAttribute(buf.toString());
}
-
+
/**
* Adds a string type variable.
*
*/
public void addVariable(VariableOwner owner, String name, String value)
throws PaintException {
- tag.addVariable(new StringVariable(owner,name,value));
+ tag.addVariable(new StringVariable(owner, name, value));
}
/**
*/
public void addVariable(VariableOwner owner, String name, int value)
throws PaintException {
- tag.addVariable(new IntVariable(owner,name,value));
+ tag.addVariable(new IntVariable(owner, name, value));
}
/**
*/
public void addVariable(VariableOwner owner, String name, boolean value)
throws PaintException {
- tag.addVariable(new BooleanVariable(owner,name,value));
+ tag.addVariable(new BooleanVariable(owner, name, value));
}
/**
*/
public void addVariable(VariableOwner owner, String name, String[] value)
throws PaintException {
- tag.addVariable(new ArrayVariable(owner,name,value));
+ tag.addVariable(new ArrayVariable(owner, name, value));
}
/**
*/
public void addSection(String sectionTagName, String sectionData)
throws PaintException {
- tag.addData("{\"" + sectionTagName + "\":\"" + escapeJSON(sectionData) + "\"}");
+ tag.addData("{\"" + sectionTagName + "\":\"" + escapeJSON(sectionData)
+ + "\"}");
}
/**
// Escape and write what was given
if (xml != null)
- tag.addData("\""+escapeJSON(xml)+"\"");
+ tag.addData("\"" + escapeJSON(xml) + "\"");
}
if (namespace != null)
addAttribute("xmlns", namespace);
mTagArgumentListOpen = false;
+ customLayoutArgumentsOpen = false;
if (sectionData != null)
- tag.addData("\""+escapeJSON(sectionData) + "\"");
+ tag.addData("\"" + escapeJSON(sectionData) + "\"");
endTag(sectionTagName);
}
* if the paint operation failed.
*/
public void close() throws PaintException {
- if(tag != null)
+ if (tag != null)
uidlBuffer.append(tag.getJSON());
flush();
this.closed = true;
this.trackPaints = enabled;
this.numberOfPaints = 0;
}
-
+
/**
- * This is basically a container for UI components variables, that will be
+ * This is basically a container for UI components variables, that will be
* added at the end of JSON object.
+ *
* @author mattitahvonen
- *
+ *
*/
class JsonTag {
boolean firstField = false;
-
+
Vector variables = new Vector();
-
+
Vector children = new Vector();
Vector attr = new Vector();
-
+
private HashMap childTagCounters = new HashMap();
StringBuffer data = new StringBuffer();
-
+
public boolean childrenArrayOpen = false;
private boolean childNode = false;
private boolean tagClosed = false;
-
+
public JsonTag(String tagName) {
- data.append("[\"" + tagName +"\"");
+ data.append("[\"" + tagName + "\"");
}
-
+
private void closeTag() {
- if(!tagClosed) {
+ if (!tagClosed) {
data.append(attributesAsJsonObject());
data.append(getData());
// Writes the end (closing) tag
data.append("]");
- this.tagClosed = true;
+ this.tagClosed = true;
}
}
-
+
public String getJSON() {
- if(!tagClosed) {
+ if (!tagClosed) {
this.closeTag();
}
return data.toString();
}
public void openChildrenArray() {
- if(!childrenArrayOpen) {
-// append("c : [");
+ if (!childrenArrayOpen) {
+ // append("c : [");
childrenArrayOpen = true;
-// firstField = true;
+ // firstField = true;
}
}
-
+
public void closeChildrenArray() {
-// append("]");
-// firstField = false;
+ // append("]");
+ // firstField = false;
}
public void setChildNode(boolean b) {
this.childNode = b;
}
-
- public boolean isChildNode(){
+
+ public boolean isChildNode() {
return childNode;
}
public String startField() {
- if(firstField) {
+ if (firstField) {
firstField = false;
return "";
} else {
return ",";
}
}
-
+
/**
*
- * @param s json string, object or array
+ * @param s
+ * json string, object or array
*/
public void addData(String s) {
children.add(s);
}
-
+
public String getData() {
StringBuffer buf = new StringBuffer();
Iterator it = children.iterator();
- while(it.hasNext()) {
+ while (it.hasNext()) {
buf.append(startField());
buf.append(it.next());
}
return buf.toString();
}
-
+
public void addAttribute(String jsonNode) {
attr.add(jsonNode);
}
-
+
private String attributesAsJsonObject() {
StringBuffer buf = new StringBuffer();
buf.append(startField());
for (Iterator iter = attr.iterator(); iter.hasNext();) {
String element = (String) iter.next();
buf.append(element);
- if(iter.hasNext())
+ if (iter.hasNext())
buf.append(",");
}
buf.append(tag.variablesAsJsonObject());
buf.append("}");
return buf.toString();
}
-
+
public void addVariable(Variable v) {
variables.add(v);
}
-
+
private String variablesAsJsonObject() {
- if(variables.size() == 0)
+ if (variables.size() == 0)
return "";
StringBuffer buf = new StringBuffer();
buf.append(startField());
while (iter.hasNext()) {
Variable element = (Variable) iter.next();
buf.append(element.getJsonPresentation());
- if(iter.hasNext())
+ if (iter.hasNext())
buf.append(",");
}
buf.append("}");
return buf.toString();
}
-
+
class TagCounter {
int count;
+
public TagCounter() {
count = 0;
}
+
public void increment() {
count++;
}
+
public String postfix(String s) {
- if(count > 0) {
+ if (count > 0) {
return s + count;
}
return s;
abstract class Variable {
String code;
+
String name;
+
public abstract String getJsonPresentation();
}
-
+
class BooleanVariable extends Variable {
boolean value;
}
public String getJsonPresentation() {
- return "\""+name +"\":" + (value == true ? "true" : "false");
+ return "\"" + name + "\":" + (value == true ? "true" : "false");
}
-
+
}
-
+
class StringVariable extends Variable {
String value;
public StringVariable(VariableOwner owner, String name, String v) {
value = v;
this.name = name;
- code = variableMap.registerVariable(name, String.class,
- value, owner);
+ code = variableMap.registerVariable(name, String.class, value,
+ owner);
}
public String getJsonPresentation() {
- return "\""+name +"\":\"" + value + "\"";
+ return "\"" + name + "\":\"" + value + "\"";
}
-
+
}
class IntVariable extends Variable {
}
public String getJsonPresentation() {
- return "\""+name +"\":" + value ;
+ return "\"" + name + "\":" + value;
}
}
public ArrayVariable(VariableOwner owner, String name, String[] v) {
value = v;
this.name = name;
- code = variableMap.registerVariable(name, String[].class,
- value, owner);
+ code = variableMap.registerVariable(name, String[].class, value,
+ owner);
}
public String getJsonPresentation() {
- String pres = "\""+name +"\":[";
+ String pres = "\"" + name + "\":[";
for (int i = 0; i < value.length;) {
- pres += "\"" + value[i] + "\"" ;
+ pres += "\"" + value[i] + "\"";
i++;
- if(i < value.length)
+ if (i < value.length)
pres += ",";
}
pres += "]";
}
public Set getPreCachedResources() {
- return new HashSet();
+ return preCachedResources;
}
public void setPreCachedResources(Set preCachedResources) {
// TODO Auto-generated method stub
-
+
}
-
}