]> source.dussan.org Git - vaadin-framework.git/commitdiff
Precaching customlayouts
authorJoonas Lehtinen <joonas.lehtinen@itmill.com>
Fri, 15 Jun 2007 06:09:18 +0000 (06:09 +0000)
committerJoonas Lehtinen <joonas.lehtinen@itmill.com>
Fri, 15 Jun 2007 06:09:18 +0000 (06:09 +0000)
svn changeset:1741/svn branch:trunk

src/com/itmill/toolkit/terminal/web/AjaxApplicationManager.java
src/com/itmill/toolkit/terminal/web/AjaxJsonPaintTarget.java

index 08650836db30bb039a1ccaf7ec6a340865ca498d..fb737e60b3b864d2b70ce667fe24a86b8c181922 100644 (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();
index 4cc897201dd8f1e2ac72e8b65a72d48c788854cb..ec2d520df4fa90d9619bfbc3207f631738a40283 100644 (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
-               
+
        }
 
-       
 }