)]}'
{
  "commit": "7127d08a23bd05996fd4d49bb0039227ba352f58",
  "tree": "2b7f1c4f34deb43c3a3068756af22f0d094b3e2f",
  "parents": [
    "9ebdf786a58e8c3f096fce0d99918cb8d423ad2c"
  ],
  "author": {
    "name": "jlabanca@google.com",
    "email": "jlabanca@google.com@8db76d5a-ed1c-0410-87a9-c151d255dfc7",
    "time": "Tue Jun 28 22:49:07 2011 +0000"
  },
  "committer": {
    "name": "jlabanca@google.com",
    "email": "jlabanca@google.com@8db76d5a-ed1c-0410-87a9-c151d255dfc7",
    "time": "Tue Jun 28 22:49:07 2011 +0000"
  },
  "message": "Adding a new ElementBuilder API to build DOM Elements using the builder pattern. There are two implementations: one that builds using DOM manipulation, and another that builds using String concatenation and innerHtml.  The latter can be user in a regular JVM to create an HTML string, which will hopefully help with server side rendering in the future. Both can be used on the client, which allows an app to optimize depending on which is faster. Once I incorporate this into Cell Widgets, I\u0027ll do performance metrics on real apps to compare the difference.\n\nThere are a lot of classes here, so I\u0027ll explain what they are. At the core, we have the ElementBuilderBase interface and its subclasses, one for each element type (ex. DivBuilder, SelectBuilder).  These interfaces mirror the Element JSO types, with short method names to reduce the verbosity of the builder. You can build an element by doing something like divBuilder.id(\"myDiv\").title(\"my title\").end(). If you start a sub element, you get a builder with methods specific to the new element.  For example, selectBuilder.startOption() returns an OptionBuilder, with methods like disabled() and defaultSelected(). Note that currently, the only builder subclasses are Div, Select, and Option.  There is also a StylesBuilder for building the style attribute (similar to SafeStylesBuilder, but generic enough to work for DOM or HTML).  I\u0027ll add the rest once we\u0027ve finalized the design.  The return value of the end() method can be paraneterized with the builder class of the containing element, so you can continue chaining with the parent builder.\n\nNext, we have the two implementations of these interfaces: one for DOM and one for HTML.  For example, DomDivBuilder is a concrete class to build a div using DOM manipulation, while HtmlDivBuilder is a concrete class to build a div using HTML manipulation.  The HTML versions expose asSafeHtml(), which allows users to access the string (useful for server side rendering).\n\nThen, there are two impl clases: DomBuilderImpl and HtmlBuilderImpl.  In practice, the concrete implementations of the ElementBuilder interfaces actually just delegate to a shared instance of one of these impl classes.  That has the benefit that we don\u0027t create an object for every single element that is created (just one object for every element type).  The impl classes are responsible for builder the Element/String, and they maintain state to ensure that they fire IllegalStateExceptions in similar circumstances.  For example, technically DomBuilderImpl can set an attribute after setting innerHtml, but that wouldn\u0027t work in HtmlBuilderImpl, so both fire an exception in this case.\n\nFinally, there are the ElementFactory classes, which return a new top level element builder.  ElementFactory#get() will return either DomBuilderFactory or HtmlBuilderFactory, depending on which is optimal for the platform.  Alternatively, user can access the DomBuilderFactory or HtmlBuilderFactory directly.  The factory has createXXXBuilder() methods to create a builder for each element.\n\nReview at http://gwt-code-reviews.appspot.com/1455802\n\nReview by: skybrian@google.com\n\ngit-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10412 8db76d5a-ed1c-0410-87a9-c151d255dfc7\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "e190367f1c2d0492dd0fa8b4527b9a32b13c66b7",
      "old_mode": 33188,
      "old_path": "doc/build.xml",
      "new_id": "a66d05810687d95fd9460eea86d829d655118fe4",
      "new_mode": 33188,
      "new_path": "doc/build.xml"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "21936d653d4a4f72359e894f186de033926e31e1",
      "new_mode": 33188,
      "new_path": "user/javadoc/com/google/gwt/examples/dom/builder/ElementBuilderFactoryChainingExample.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "24ee07368e51fb8939c3ecd97c8f791a98d6c0f3",
      "new_mode": 33188,
      "new_path": "user/javadoc/com/google/gwt/examples/dom/builder/ElementBuilderFactoryNonChainingExample.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "db1b7ecc28723047733f79600f43186a3b0b4580",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/DomBuilder.gwt.xml"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "72e7e33d1d85c787491413c94fc123ff55a8479a",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/client/DomBuilderFactory.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7b97fc0e2c86a4022cbc2b46e5bf88ad3b7e086c",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f0bb3e3c3e5eba00548e413ce7a29b9e1bbb0653",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/client/DomDivBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "88d9b764cd473134870e369dcb6516c2a0470546",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/client/DomElementBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f1d07baca2002b2089667286badcf5c8db89ce47",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/client/DomElementBuilderBase.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "cd5d2a72a4fe654514a4a1b92d6c29e2f0f44560",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/client/DomOptionBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a94f2d6c3885fb544c7d883f3d20d5b6f3efd453",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/client/DomSelectBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8a2412056fe0a5e6cb05d80626518010d77b841c",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/client/DomStylesBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "efb817a210e7fcb7d248df45a24e9300dfd09d90",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/client/package-info.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4ee444d4b42b4f9a75c28cdd5cf55ffc632a64ff",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/DivBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "75d515352ae3a1da57a058a8d011c6c5dbbab5ce",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/ElementBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9797326809de2cd2798e906990387db078593383",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/ElementBuilderBase.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4126a2dbd7029bb3fabd884c728e157a4004b832",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/ElementBuilderFactory.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bc25b5a5f301bfaf03df494ab41fb6f57eedb4c0",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/ElementBuilderImpl.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e044370ceff7e440e897bab1a8edc78abf62312b",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/HtmlBuilderFactory.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e21686d8dcc3d1993360c90b791049c415cfc25f",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7e0fa3a77d062ea3a4894499bf0dd9205e3f04c1",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/HtmlDivBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b0f538f45164d7178327eedb7cb5b4c4e1562924",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/HtmlElementBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fcc9f99fdf1cb6ea12339d2cfb5d4dbf9584c6ad",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/HtmlElementBuilderBase.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a48f5e4e527d5fc1818c2663862156057471e285",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/HtmlOptionBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9b46ed27eeafd7f4de8a90238bca64da9031b34d",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/HtmlSelectBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "29b87e24c90913ec703bac263c7f516062cccab8",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/HtmlStylesBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "124f427672234213009b6e6b2897d5b1c004a5ac",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/OptionBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3f4cb3d66f01326191ce046f7843557fdc0782d8",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/SelectBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "49b35ff36514a6aabecc58332dcc4d584d33463a",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/StylesBuilder.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bc7dfb9db99ae6668379683ad293c3b4ab25a8f2",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/dom/builder/shared/package-info.java"
    },
    {
      "type": "modify",
      "old_id": "105532c2bdc83eb7e9029188c5ca0c920559a5e9",
      "old_mode": 33188,
      "old_path": "user/src/com/google/gwt/safecss/shared/SafeStylesHostedModeUtils.java",
      "new_id": "b347aafb1fb16dd9fc1da1b1e54d74974139a71e",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/safecss/shared/SafeStylesHostedModeUtils.java"
    },
    {
      "type": "modify",
      "old_id": "7c32c1d44f857bc93ddbfeb2aced5aa70fd55348",
      "old_mode": 33188,
      "old_path": "user/src/com/google/gwt/user/User.gwt.xml",
      "new_id": "9b4f391974d9eff4bef6476c2bfb98a5a652c102",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/user/User.gwt.xml"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c4b1726c849447d337dd60267c889fb7ad4b557c",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/DomBuilderGwtSuite.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f4e0935c8b8dc0f9ebb2a0b98193e7f05372ed28",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/HtmlBuilderGwtSuite.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "01d54643a52fd2ec20032337e1a8c895d356913a",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/HtmlBuilderJreSuite.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "5ca44d480ad097f0e4b227bcdee3f6c1ad43d258",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/client/GwtDomBuilderImplTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "74ea5b1577c299f247dc0d488dc3896682ffb29c",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/client/GwtDomDivBuilderTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6f986d4a8827ff0bf02efd88cb1f5ec9f32df988",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/client/GwtDomOptionBuilderTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0bc2fb6404ec18d1bb153c7f12beb50ee16fac9a",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/client/GwtDomSelectBuilderTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "01e0d78e761ae9bb82c926e4869545cdbafd64bc",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/client/GwtDomStylesBuilderTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "575fb9fe005b1bbd8725db8a509cfc929dd6edad",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/shared/ElementBuilderTestBase.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "48f1d06b68ba86e583a2118f5fc76454ab1e5ed0",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/shared/GwtElementBuilderImplTestBase.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3b5289139a8d5670e9efd8cbf0e50d8c20be4dd4",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/shared/GwtHtmlBuilderImplTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e49c5058f6cc319a166db8b89476f5d741360026",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/shared/GwtHtmlDivBuilderTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7fb5c6c3e114d88d691d348f5905cb217f0dbc7c",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/shared/GwtHtmlOptionBuilderTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1a9a939cab7aaca26387470e141f2fcf2e2d6ff6",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/shared/GwtHtmlSelectBuilderTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bbe1a25e0def3f0747670e359fe9418033d26d35",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/shared/GwtHtmlStylesBuilderTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d759c5a919b4b3489574020255ecf9d9e3561692",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/shared/GwtStylesBuilderTestBase.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dfb8bf1e248059421d68208737256c52a1f8393a",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/shared/HtmlDivBuilderTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fc958b3c46c2b91f2abaab4cf6f487482228f3f5",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/shared/HtmlOptionBuilderTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e0d57ae988ca090f99aed4c2667eab76c173e785",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/dom/builder/shared/HtmlSelectBuilderTest.java"
    },
    {
      "type": "modify",
      "old_id": "fa3b59150be45e8d475405215ecf57dea3d83aea",
      "old_mode": 33188,
      "old_path": "user/test/com/google/gwt/safecss/shared/GwtSafeStylesUtilsTest.java",
      "new_id": "2c6a37baaca4cff232ec4e6afea3b424d06c4225",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/safecss/shared/GwtSafeStylesUtilsTest.java"
    }
  ]
}
