Fix various error reporting issues:
Strict root element requirements
CellPanelParser NPE on bad child
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6547 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/uibinder/parsers/CellPanelParser.java b/user/src/com/google/gwt/uibinder/parsers/CellPanelParser.java
index 665ead2..4bdede2 100644
--- a/user/src/com/google/gwt/uibinder/parsers/CellPanelParser.java
+++ b/user/src/com/google/gwt/uibinder/parsers/CellPanelParser.java
@@ -84,7 +84,8 @@
String ns = child.getNamespaceUri();
String tagName = child.getLocalName();
- if (ns.equals(elem.getNamespaceUri()) && localTagNameIsCell(tagName)) {
+ if (ns != null && ns.equals(elem.getNamespaceUri())
+ && localTagNameIsCell(tagName)) {
// It's a cell element, so parse its single child as a widget.
XMLElement widget = child.consumeSingleChildElement();
String childFieldName = writer.parseElementToField(widget);
@@ -93,6 +94,10 @@
// Parse the cell tag's alignment & size attributes.
parseCellAttributes(child, fieldName, childFieldName, writer);
} else {
+ if (!writer.isWidgetElement(child)) {
+ writer.die("In %s, expected a widget or <%s:%s>, found %s", elem,
+ elem.getPrefix(), CELL_TAG.toLowerCase(), child);
+ }
// It's just a normal child, so parse it as a widget.
String childFieldName = writer.parseElementToField(child);
writer.addStatement("%1$s.add(%2$s);", fieldName, childFieldName);
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
index 26579e3..e746a44 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
@@ -77,6 +77,7 @@
// guice!!!
private static final String IMPORT_ATTRIBUTE = "import";
+ private static final String TAG = "UiBinder";
private final UiBinderWriter writer;
private final TypeOracle oracle;
private final MessagesWriter messagesWriter;
@@ -105,6 +106,18 @@
* the document.
*/
public String parse(XMLElement elem) throws UnableToCompleteException {
+ if (!writer.isBinderElement(elem)) {
+ writer.die("Bad prefix on <%s:%s>? The root element must be in "
+ + "xml namespace \"%s\" (usually with prefix \"ui:\"), "
+ + "but this has prefix \"%s\"", elem.getPrefix(),
+ elem.getLocalName(), UiBinderWriter.BINDER_URI, elem.getPrefix());
+ }
+
+ if (!TAG.equals(elem.getLocalName())) {
+ writer.die("Root element must be %s:%s, but found %s", elem.getPrefix(),
+ TAG, elem);
+ }
+
findResources(elem);
messagesWriter.findMessagesConfig(elem);
XMLElement uiRoot = elem.consumeSingleChildElement();
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
index 144c44e..7f0a9e5 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
@@ -69,7 +69,7 @@
*/
@SuppressWarnings("deprecation")
public class UiBinderWriter {
- private static final String BINDER_URI = "urn:ui:com.google.gwt.uibinder";
+ static final String BINDER_URI = "urn:ui:com.google.gwt.uibinder";
private static final String BUNDLE_URI_SCHEME = "urn:with:";
private static final String PACKAGE_URI_SCHEME = "urn:import:";
@@ -644,7 +644,7 @@
public String getUiFieldAttributeName() {
return gwtPrefix + ":field";
}
-
+
public boolean isBinderElement(XMLElement elem) {
String uri = elem.getNamespaceUri();
return uri != null && BINDER_URI.equals(uri);
diff --git a/user/src/com/google/gwt/uibinder/rebind/XMLElement.java b/user/src/com/google/gwt/uibinder/rebind/XMLElement.java
index 6d59267..9ef7461 100644
--- a/user/src/com/google/gwt/uibinder/rebind/XMLElement.java
+++ b/user/src/com/google/gwt/uibinder/rebind/XMLElement.java
@@ -391,8 +391,8 @@
XMLElement ret = null;
for (XMLElement child : consumeChildElements()) {
if (ret != null) {
- writer.die("%s may only contain a single child element, but found"
- + "%s and %s.", getLocalName(), ret, child);
+ writer.die("%s may only contain a single child element, but found "
+ + "%s and %s.", this, ret, child);
}
ret = child;
diff --git a/user/src/com/google/gwt/uibinder/sample/client/HandlerDemo.ui.xml b/user/src/com/google/gwt/uibinder/sample/client/HandlerDemo.ui.xml
index 6e9f727..6640802 100644
--- a/user/src/com/google/gwt/uibinder/sample/client/HandlerDemo.ui.xml
+++ b/user/src/com/google/gwt/uibinder/sample/client/HandlerDemo.ui.xml
@@ -1,4 +1,4 @@
-<gwt:UiBinder
+<ui:UiBinder
xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:gwt='urn:import:com.google.gwt.user.client.ui'>
@@ -16,4 +16,4 @@
<gwt:TextBox ui:field="textBoxValueChange"/>
</gwt:FlowPanel>
-</gwt:UiBinder>
+</ui:UiBinder>