]> source.dussan.org Git - vaadin-framework.git/commitdiff
Split method at roughly 30000 chars to avoid size limit (#10221) 38/338/1
authorLeif Åstrand <leif@vaadin.com>
Thu, 22 Nov 2012 11:13:06 +0000 (13:13 +0200)
committerLeif Åstrand <leif@vaadin.com>
Thu, 22 Nov 2012 11:13:15 +0000 (13:13 +0200)
Change-Id: Ib7f03f1d5dbd66bc5478cf424664e89672069c8d

client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java

index 9d833f51bb3ccd37b531c5ab18dac752f5a867e7..ac9d80f5448280aaad028830be247e7221848d0a 100644 (file)
@@ -54,6 +54,122 @@ import com.vaadin.shared.ui.Connect;
 import com.vaadin.shared.ui.Connect.LoadStyle;
 
 public class ConnectorBundleLoaderFactory extends Generator {
+    /**
+     * Special SourceWriter that approximates the number of written bytes to
+     * support splitting long methods into shorter chunks to avoid hitting the
+     * 65535 byte limit.
+     */
+    private class SplittingSourceWriter implements SourceWriter {
+        private final SourceWriter target;
+        private final String baseName;
+        private final int splitSize;
+
+        // Seems to be undercounted by about 15%
+        private int approximateChars = 0;
+        private int wrapCount = 0;
+
+        public SplittingSourceWriter(SourceWriter target, String baseName,
+                int splitSize) {
+            this.target = target;
+            this.baseName = baseName;
+            this.splitSize = splitSize;
+        }
+
+        @Override
+        public void beginJavaDocComment() {
+            target.beginJavaDocComment();
+            addChars(10);
+        }
+
+        private void addChars(int i) {
+            approximateChars += i;
+        }
+
+        private void addChars(String s) {
+            addChars(s.length());
+        }
+
+        private void addChars(String s, Object[] args) {
+            addChars(String.format(s, args));
+        }
+
+        @Override
+        public void commit(TreeLogger logger) {
+            target.commit(logger);
+        }
+
+        @Override
+        public void endJavaDocComment() {
+            target.endJavaDocComment();
+            addChars(10);
+        }
+
+        @Override
+        public void indent() {
+            target.indent();
+            addChars(10);
+        }
+
+        @Override
+        public void indentln(String s) {
+            target.indentln(s);
+            addChars(s);
+        }
+
+        @Override
+        public void indentln(String s, Object... args) {
+            target.indentln(s, args);
+            addChars(s, args);
+        }
+
+        @Override
+        public void outdent() {
+            target.outdent();
+        }
+
+        @Override
+        public void print(String s) {
+            target.print(s);
+            addChars(s);
+        }
+
+        @Override
+        public void print(String s, Object... args) {
+            target.print(s, args);
+            addChars(s, args);
+        }
+
+        @Override
+        public void println() {
+            target.println();
+            addChars(5);
+        }
+
+        @Override
+        public void println(String s) {
+            target.println(s);
+            addChars(s);
+        }
+
+        @Override
+        public void println(String s, Object... args) {
+            target.println(s, args);
+            addChars(s, args);
+        }
+
+        public void splitIfNeeded() {
+            if (approximateChars > splitSize) {
+                String newMethod = baseName + wrapCount++;
+                println("%s();", newMethod);
+                outdent();
+                println("}");
+                println("private void %s() {", newMethod);
+                indent();
+
+                approximateChars = 0;
+            }
+        }
+    }
 
     @Override
     public String generate(TreeLogger logger, GeneratorContext context,
@@ -188,8 +304,12 @@ public class ConnectorBundleLoaderFactory extends Generator {
         w.commit(logger);
     }
 
-    private void printBundleData(TreeLogger logger, SourceWriter w,
+    private void printBundleData(TreeLogger logger, SourceWriter sourceWriter,
             ConnectorBundle bundle) throws UnableToCompleteException {
+        // Split into new load method when reaching approximately 30000 bytes
+        SplittingSourceWriter w = new SplittingSourceWriter(sourceWriter,
+                "load", 30000);
+
         writeIdentifiers(w, bundle);
         writeGwtConstructors(w, bundle);
         writeReturnTypes(w, bundle);
@@ -205,18 +325,20 @@ public class ConnectorBundleLoaderFactory extends Generator {
         writeDelegateToWidget(logger, w, bundle);
     }
 
-    private void writeDelegateToWidget(TreeLogger logger, SourceWriter w,
-            ConnectorBundle bundle) {
+    private void writeDelegateToWidget(TreeLogger logger,
+            SplittingSourceWriter w, ConnectorBundle bundle) {
         Set<Property> needsDelegateToWidget = bundle.getNeedsDelegateToWidget();
         for (Property property : needsDelegateToWidget) {
             w.println("store.setDelegateToWidget(%s, \"%s\", \"%s\");",
                     getClassLiteralString(property.getBeanType()),
                     property.getName(),
                     property.getAnnotation(DelegateToWidget.class).value());
+
+            w.splitIfNeeded();
         }
     }
 
-    private void writeSerializers(TreeLogger logger, SourceWriter w,
+    private void writeSerializers(TreeLogger logger, SplittingSourceWriter w,
             ConnectorBundle bundle) throws UnableToCompleteException {
         Map<JType, GeneratedSerializer> serializers = bundle.getSerializers();
         for (Entry<JType, GeneratedSerializer> entry : serializers.entrySet()) {
@@ -240,10 +362,12 @@ public class ConnectorBundleLoaderFactory extends Generator {
             w.outdent();
             w.print("}");
             w.println(");");
+
+            w.splitIfNeeded();
         }
     }
 
-    private void writeGetters(TreeLogger logger, SourceWriter w,
+    private void writeGetters(TreeLogger logger, SplittingSourceWriter w,
             ConnectorBundle bundle) {
         Set<Property> properties = bundle.getNeedsSetter();
         for (Property property : properties) {
@@ -265,10 +389,12 @@ public class ConnectorBundleLoaderFactory extends Generator {
 
             w.outdent();
             w.println("});");
+
+            w.splitIfNeeded();
         }
     }
 
-    private void writeSetters(TreeLogger logger, SourceWriter w,
+    private void writeSetters(TreeLogger logger, SplittingSourceWriter w,
             ConnectorBundle bundle) {
         Set<Property> properties = bundle.getNeedsSetter();
         for (Property property : properties) {
@@ -291,10 +417,13 @@ public class ConnectorBundleLoaderFactory extends Generator {
 
             w.outdent();
             w.println("});");
+
+            w.splitIfNeeded();
         }
     }
 
-    private void writePropertyTypes(SourceWriter w, ConnectorBundle bundle) {
+    private void writePropertyTypes(SplittingSourceWriter w,
+            ConnectorBundle bundle) {
         Set<Property> properties = bundle.getNeedsType();
         for (Property property : properties) {
             w.print("store.setPropertyType(");
@@ -304,10 +433,12 @@ public class ConnectorBundleLoaderFactory extends Generator {
             w.print("\", ");
             writeTypeCreator(w, property.getPropertyType());
             w.println(");");
+
+            w.splitIfNeeded();
         }
     }
 
-    private void writeProperites(TreeLogger logger, SourceWriter w,
+    private void writeProperites(TreeLogger logger, SplittingSourceWriter w,
             ConnectorBundle bundle) throws UnableToCompleteException {
         Set<JClassType> needsPropertyListing = bundle.getNeedsPropertyListing();
         for (JClassType type : needsPropertyListing) {
@@ -335,10 +466,13 @@ public class ConnectorBundleLoaderFactory extends Generator {
             }
 
             w.println("});");
+
+            w.splitIfNeeded();
         }
     }
 
-    private void wirteDelayedInfo(SourceWriter w, ConnectorBundle bundle) {
+    private void wirteDelayedInfo(SplittingSourceWriter w,
+            ConnectorBundle bundle) {
         Map<JClassType, Set<JMethod>> needsDelayedInfo = bundle
                 .getNeedsDelayedInfo();
         Set<Entry<JClassType, Set<JMethod>>> entrySet = needsDelayedInfo
@@ -362,12 +496,14 @@ public class ConnectorBundleLoaderFactory extends Generator {
                         w.print(escape(method.getName()));
                         w.println("\");");
                     }
+
+                    w.splitIfNeeded();
                 }
             }
         }
     }
 
-    private void writeProxys(SourceWriter w, ConnectorBundle bundle) {
+    private void writeProxys(SplittingSourceWriter w, ConnectorBundle bundle) {
         Set<JClassType> needsProxySupport = bundle.getNeedsProxySupport();
         for (JClassType type : needsProxySupport) {
             w.print("store.setProxyHandler(");
@@ -439,10 +575,11 @@ public class ConnectorBundleLoaderFactory extends Generator {
             w.outdent();
             w.println("});");
 
+            w.splitIfNeeded();
         }
     }
 
-    private void writeParamTypes(SourceWriter w, ConnectorBundle bundle) {
+    private void writeParamTypes(SplittingSourceWriter w, ConnectorBundle bundle) {
         Map<JClassType, Set<JMethod>> needsParamTypes = bundle
                 .getNeedsParamTypes();
         for (Entry<JClassType, Set<JMethod>> entry : needsParamTypes.entrySet()) {
@@ -463,11 +600,12 @@ public class ConnectorBundleLoaderFactory extends Generator {
 
                 w.println("});");
 
+                w.splitIfNeeded();
             }
         }
     }
 
-    private void writeInvokers(SourceWriter w, ConnectorBundle bundle) {
+    private void writeInvokers(SplittingSourceWriter w, ConnectorBundle bundle) {
         Map<JClassType, Set<JMethod>> needsInvoker = bundle.getNeedsInvoker();
         for (Entry<JClassType, Set<JMethod>> entry : needsInvoker.entrySet()) {
             JClassType type = entry.getKey();
@@ -515,11 +653,13 @@ public class ConnectorBundleLoaderFactory extends Generator {
                 w.outdent();
                 w.println("});");
 
+                w.splitIfNeeded();
             }
         }
     }
 
-    private void writeReturnTypes(SourceWriter w, ConnectorBundle bundle) {
+    private void writeReturnTypes(SplittingSourceWriter w,
+            ConnectorBundle bundle) {
         Map<JClassType, Set<JMethod>> methodReturnTypes = bundle
                 .getMethodReturnTypes();
         for (Entry<JClassType, Set<JMethod>> entry : methodReturnTypes
@@ -537,11 +677,14 @@ public class ConnectorBundleLoaderFactory extends Generator {
                 w.print("\", ");
                 writeTypeCreator(w, method.getReturnType());
                 w.println(");");
+
+                w.splitIfNeeded();
             }
         }
     }
 
-    private void writeGwtConstructors(SourceWriter w, ConnectorBundle bundle) {
+    private void writeGwtConstructors(SplittingSourceWriter w,
+            ConnectorBundle bundle) {
         Set<JClassType> constructors = bundle.getGwtConstructors();
         for (JClassType type : constructors) {
             w.print("store.setConstructor(");
@@ -563,6 +706,8 @@ public class ConnectorBundleLoaderFactory extends Generator {
 
             w.outdent();
             w.println("});");
+
+            w.splitIfNeeded();
         }
     }
 
@@ -574,7 +719,8 @@ public class ConnectorBundleLoaderFactory extends Generator {
         return type.getQualifiedSourceName() + ".class";
     }
 
-    private void writeIdentifiers(SourceWriter w, ConnectorBundle bundle) {
+    private void writeIdentifiers(SplittingSourceWriter w,
+            ConnectorBundle bundle) {
         Map<JClassType, Set<String>> identifiers = bundle.getIdentifiers();
         for (Entry<JClassType, Set<String>> entry : identifiers.entrySet()) {
             Set<String> ids = entry.getValue();
@@ -585,6 +731,8 @@ public class ConnectorBundleLoaderFactory extends Generator {
                 w.print("\", ");
                 writeClassLiteral(w, type);
                 w.println(");");
+
+                w.splitIfNeeded();
             }
         }
     }