Browse Source

Precaching customlayouts

svn changeset:1741/svn branch:trunk
tags/6.7.0.beta1
Joonas Lehtinen 17 years ago
parent
commit
227c3c0709

+ 34
- 31
src/com/itmill/toolkit/terminal/web/AjaxApplicationManager.java View File

@@ -346,41 +346,44 @@ public class AjaxApplicationManager implements
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();

+ 104
- 97
src/com/itmill/toolkit/terminal/web/AjaxJsonPaintTarget.java View File

@@ -71,7 +71,7 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
private final static String UIDL_ARG_ID = "id";

private Stack mOpenTags;
private Stack openJsonTags;

private boolean mTagArgumentListOpen;
@@ -87,10 +87,11 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
private boolean trackPaints = false;

private int numberOfPaints = 0;
private int changes = 0;
Set preCachedResources = new HashSet();

private boolean customLayoutArgumentsOpen = false;

private JsonTag tag;
@@ -113,7 +114,6 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
// Sets the variable map
this.variableMap = variableMap;


// Sets the target for UIDL writing
this.uidlBuffer = outWriter;

@@ -135,9 +135,9 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
* Prints the element start tag.
*
* <pre>
* Todo:
* Checking of input values
*
* Todo:
* Checking of input values
*
* </pre>
*
* @param tagName
@@ -146,7 +146,8 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
* 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();
@@ -160,19 +161,18 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
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);
}

/**
@@ -195,8 +195,8 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
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 = "";
@@ -205,15 +205,13 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
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;
}
}
@@ -258,14 +256,14 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
}
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;
@@ -291,15 +289,14 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
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);
}
}
@@ -449,9 +446,11 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
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) {
@@ -460,9 +459,9 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
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()));
@@ -471,7 +470,7 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
buf.append("]");
tag.addAttribute(buf.toString());
}
/**
* Adds a string type variable.
*
@@ -487,7 +486,7 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
*/
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));
}

/**
@@ -505,7 +504,7 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
*/
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));
}

/**
@@ -523,7 +522,7 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
*/
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));
}

/**
@@ -541,7 +540,7 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
*/
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));
}

/**
@@ -581,7 +580,8 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
*/
public void addSection(String sectionTagName, String sectionData)
throws PaintException {
tag.addData("{\"" + sectionTagName + "\":\"" + escapeJSON(sectionData) + "\"}");
tag.addData("{\"" + sectionTagName + "\":\"" + escapeJSON(sectionData)
+ "\"}");
}

/**
@@ -604,7 +604,7 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {

// Escape and write what was given
if (xml != null)
tag.addData("\""+escapeJSON(xml)+"\"");
tag.addData("\"" + escapeJSON(xml) + "\"");

}

@@ -635,9 +635,10 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
if (namespace != null)
addAttribute("xmlns", namespace);
mTagArgumentListOpen = false;
customLayoutArgumentsOpen = false;

if (sectionData != null)
tag.addData("\""+escapeJSON(sectionData) + "\"");
tag.addData("\"" + escapeJSON(sectionData) + "\"");
endTag(sectionTagName);
}

@@ -665,7 +666,7 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
* if the paint operation failed.
*/
public void close() throws PaintException {
if(tag != null)
if (tag != null)
uidlBuffer.append(tag.getJSON());
flush();
this.closed = true;
@@ -729,105 +730,107 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
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());
@@ -835,20 +838,20 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
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());
@@ -857,23 +860,26 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
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;
@@ -883,10 +889,12 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {

abstract class Variable {
String code;

String name;

public abstract String getJsonPresentation();
}
class BooleanVariable extends Variable {
boolean value;

@@ -898,25 +906,25 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
}

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 {
@@ -930,7 +938,7 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
}

public String getJsonPresentation() {
return "\""+name +"\":" + value ;
return "\"" + name + "\":" + value;
}
}

@@ -940,16 +948,16 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
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 += "]";
@@ -958,13 +966,12 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
}

public Set getPreCachedResources() {
return new HashSet();
return preCachedResources;
}

public void setPreCachedResources(Set preCachedResources) {
// TODO Auto-generated method stub
}

}

Loading…
Cancel
Save