| /* |
| * 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("<", "<"); |
| xmlText = xmlText.replaceAll(">", ">"); |
| Label xml = new HTML("<pre>" + xmlText + "</pre>", false); |
| xml.setStyleName(XML_LABEL_STYLE); |
| xmlSource.add(xml); |
| } |
| } |