blob: e1b4a25b9d5612ea2914b5de7dd79c75af14bc01 [file] [log] [blame]
/*
* Copyright 2007 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.sample.simplexml.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.xml.client.Document;
import com.google.gwt.xml.client.Element;
import com.google.gwt.xml.client.Node;
import com.google.gwt.xml.client.NodeList;
import com.google.gwt.xml.client.XMLParser;
/**
* A very simple XML Example where we take a customer profile and display it on
* a page.
*/
public class SimpleXML implements EntryPoint {
private static final String XML_LABEL_STYLE = "xmlLabel";
private static final String USER_TABLE_LABEL_STYLE = "userTableLabel";
private static final String USER_TABLE_STYLE = "userTable";
private static final String NOTES_STYLE = "notes";
public void onModuleLoad() {
RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET,
"customerRecord.xml");
try {
requestBuilder.sendRequest(null, new RequestCallback() {
public void onError(Request request, Throwable exception) {
requestFailed(exception);
}
public void onResponseReceived(Request request, Response response) {
renderXML(response.getText());
}
});
} catch (RequestException ex) {
requestFailed(ex);
}
}
private FlexTable createOrderTable(FlowPanel xmlParsed, String label) {
HTML orderTableLabel = new HTML("<h2>" + label + "</h2>");
xmlParsed.add(orderTableLabel);
FlexTable orderTable = new FlexTable();
orderTable.setStyleName(USER_TABLE_STYLE);
orderTable.setBorderWidth(3);
orderTable.getRowFormatter().setStyleName(0, USER_TABLE_LABEL_STYLE);
orderTable.setText(0, 0, "Order ID");
orderTable.setText(0, 1, "Item");
orderTable.setText(0, 2, "Ordered On");
orderTable.setText(0, 3, "Street");
orderTable.setText(0, 4, "City");
orderTable.setText(0, 5, "State");
orderTable.setText(0, 6, "Zip");
xmlParsed.add(orderTable);
return orderTable;
}
/**
* Creates the xml representation of xmlText. xmlText is assumed to have been
* validated for structure on the server.
*
* @param xmlText xml text
* @param xmlParsed panel to display customer record
*/
private void customerPane(String xmlText, FlowPanel xmlParsed) {
Document customerDom = XMLParser.parse(xmlText);
Element customerElement = customerDom.getDocumentElement();
// Must do this if you ever use a raw node list that you expect to be
// all elements.
XMLParser.removeWhitespace(customerElement);
// Customer Name
String nameValue = getElementTextValue(customerElement, "name");
String title = "<h1>" + nameValue + "</h1>";
HTML titleHTML = new HTML(title);
xmlParsed.add(titleHTML);
// Customer Notes
String notesValue = getElementTextValue(customerElement, "notes");
Label notesText = new Label();
notesText.setStyleName(NOTES_STYLE);
notesText.setText(notesValue);
xmlParsed.add(notesText);
// Pending orders UI setup
FlexTable pendingTable = createOrderTable(xmlParsed, "Pending Orders");
FlexTable completedTable = createOrderTable(xmlParsed, "Completed");
completedTable.setText(0, 7, "Shipped by");
// Fill Orders Table
NodeList orders = customerElement.getElementsByTagName("order");
int pendingRowPos = 0;
int completedRowPos = 0;
for (int i = 0; i < orders.getLength(); i++) {
Element order = (Element) orders.item(i);
HTMLTable table;
int rowPos;
if (order.getAttribute("status").equals("pending")) {
table = pendingTable;
rowPos = ++pendingRowPos;
} else {
table = completedTable;
rowPos = ++completedRowPos;
}
int columnPos = 0;
fillInOrderTableRow(customerElement, order, table, rowPos, columnPos);
}
}
private void fillInOrderTableRow(Element customerElement, Element order,
HTMLTable table, int rowPos, int columnPos) {
// Order ID
String orderId = order.getAttribute("id");
table.setText(rowPos, columnPos++, orderId);
// Item
Element item = (Element) order.getElementsByTagName("item").item(0);
String itemUPC = item.getAttribute("upc");
String itemName = item.getFirstChild().getNodeValue();
Label itemLabel = new Label(itemUPC);
itemLabel.setTitle(itemName);
table.setWidget(rowPos, columnPos++, itemLabel);
// Ordered On
String orderedOnValue = getElementTextValue(customerElement, "orderedOn");
table.setText(rowPos, columnPos++, orderedOnValue);
// Address
Element address = (Element) order.getElementsByTagName("address").item(0);
XMLParser.removeWhitespace(address);
NodeList lst = address.getChildNodes();
for (int j = 0; j < lst.getLength(); j++) {
Element next = (Element) lst.item(j);
String addressPartText = next.getFirstChild().getNodeValue();
table.setText(rowPos, columnPos++, addressPartText);
}
// Shipped By (optional attribute)
NodeList shippedByList = order.getElementsByTagName("shippingInfo");
if (shippedByList.getLength() == 1) {
Element shippedBy = (Element) shippedByList.item(0);
// Depending upon the shipper, different attributes might be
// available, so XML carries the display info
FlexTable shippedByTable = new FlexTable();
shippedByTable.getRowFormatter().setStyleName(0, USER_TABLE_LABEL_STYLE);
shippedByTable.setBorderWidth(1);
NodeList shippedByParts = shippedBy.getChildNodes();
for (int j = 0; j < shippedByParts.getLength(); j++) {
Node next = shippedByParts.item(j);
Element elem = (Element) next;
shippedByTable.setText(0, j, elem.getAttribute("title"));
shippedByTable.setText(1, j, elem.getFirstChild().getNodeValue());
}
table.setWidget(rowPos, columnPos++, shippedByTable);
}
}
/**
* Utility method to return the values of elements of the form <myTag>tag
* value</myTag>
*/
private String getElementTextValue(Element parent, String elementTag) {
// If the xml is not coming from a known good source, this method would
// have to include safety checks.
return parent.getElementsByTagName(elementTag).item(0).getFirstChild().getNodeValue();
}
private void renderXML(String xmlText) {
final TabPanel tab = new TabPanel();
final FlowPanel xmlSource = new FlowPanel();
final FlowPanel xmlParsed = new FlowPanel();
tab.add(xmlParsed, "Customer Pane");
tab.add(xmlSource, "XML Source");
tab.selectTab(0);
RootPanel.get().add(tab);
xmlPane(xmlText, xmlSource);
customerPane(xmlText, xmlParsed);
}
private void requestFailed(Throwable exception) {
Window.alert("Failed to send the request. The error message was: "
+ exception.getMessage());
}
/**
* Show the raw XML.
*
* @param xmlText
* @param xmlSource
*/
private void xmlPane(String xmlText, final FlowPanel xmlSource) {
xmlText = xmlText.replaceAll("<", "&#60;");
xmlText = xmlText.replaceAll(">", "&#62;");
Label xml = new HTML("<pre>" + xmlText + "</pre>", false);
xml.setStyleName(XML_LABEL_STYLE);
xmlSource.add(xml);
}
}