1 16 package com.google.gwt.sample.json.client; 17 18 import com.google.gwt.json.client.JSONArray; 19 import com.google.gwt.json.client.JSONException; 20 import com.google.gwt.json.client.JSONObject; 21 import com.google.gwt.json.client.JSONParser; 22 import com.google.gwt.json.client.JSONString; 23 import com.google.gwt.json.client.JSONValue; 24 import com.google.gwt.user.client.HTTPRequest; 25 import com.google.gwt.user.client.ResponseTextHandler; 26 import com.google.gwt.user.client.Window; 27 import com.google.gwt.user.client.ui.Button; 28 import com.google.gwt.user.client.ui.ClickListener; 29 import com.google.gwt.user.client.ui.RootPanel; 30 import com.google.gwt.user.client.ui.Tree; 31 import com.google.gwt.user.client.ui.TreeItem; 32 import com.google.gwt.user.client.ui.Widget; 33 34 import java.util.Iterator ; 35 import java.util.Set ; 36 37 47 public class JSON { 48 53 private class JSONResponseTextHandler implements ResponseTextHandler { 54 public void onCompletion(String responseText) { 55 try { 56 JSONValue jsonValue = JSONParser.parse(responseText); 57 displayJSONObject(jsonValue); 58 } catch (JSONException e) { 59 displayError(responseText); 60 } 61 searchButton.setText(SEARCH_BUTTON_DEFAULT_TEXT); 62 } 63 } 64 65 68 private class SearchButtonClickListener implements ClickListener { 69 public void onClick(Widget sender) { 70 jsonTree.setVisible(false); 71 doFetchURL(); 72 } 73 } 74 75 82 private static final String DEFAULT_SEARCH_URL = "search-results.js"; 83 84 87 private static final String SEARCH_BUTTON_DEFAULT_TEXT = "Search"; 88 89 92 private static final String SEARCH_BUTTON_WAITING_TEXT = "Waiting for JSON Response..."; 93 94 private Tree jsonTree = new Tree(); 95 96 private Button searchButton = new Button(); 97 98 102 public void onModuleLoad() { 103 initializeMainForm(); 104 } 105 106 110 private void addChildren(TreeItem treeItem, JSONValue jsonValue) { 111 JSONArray jsonArray; 112 JSONObject jsonObject; 113 JSONString jsonString; 114 115 if ((jsonArray = jsonValue.isArray()) != null) { 116 for (int i = 0; i < jsonArray.size(); ++i) { 117 TreeItem child = treeItem.addItem(getChildText("[" 118 + Integer.toString(i) + "]")); 119 addChildren(child, jsonArray.get(i)); 120 } 121 } else if ((jsonObject = jsonValue.isObject()) != null) { 122 Set keys = jsonObject.keySet(); 123 for (Iterator iter = keys.iterator(); iter.hasNext();) { 124 String key = (String ) iter.next(); 125 TreeItem child = treeItem.addItem(getChildText(key)); 126 addChildren(child, jsonObject.get(key)); 127 } 128 } else if ((jsonString = jsonValue.isString()) != null) { 129 treeItem.addItem(jsonString.stringValue()); 131 } else { 132 treeItem.addItem(getChildText(jsonValue.toString())); 134 } 135 } 136 137 private void displayError(String responseText) { 138 jsonTree.removeItems(); 139 jsonTree.setVisible(true); 140 TreeItem treeItem = jsonTree.addItem("Failed to parse JSON response"); 141 treeItem.addItem(responseText); 142 treeItem.setStyleName("JSON-JSONResponseObject"); 143 treeItem.setState(true); 144 } 145 146 149 private void displayJSONObject(JSONValue jsonValue) { 150 jsonTree.removeItems(); 151 jsonTree.setVisible(true); 152 TreeItem treeItem = jsonTree.addItem("JSON Response"); 153 addChildren(treeItem, jsonValue); 154 treeItem.setStyleName("JSON-JSONResponseObject"); 155 treeItem.setState(true); 156 } 157 158 161 private void doFetchURL() { 162 searchButton.setText(SEARCH_BUTTON_WAITING_TEXT); 163 if (!HTTPRequest.asyncGet(DEFAULT_SEARCH_URL, new JSONResponseTextHandler())) { 164 searchButton.setText(SEARCH_BUTTON_DEFAULT_TEXT); 167 } 168 } 169 170 173 private String getChildText(String text) { 174 return "<span style='white-space:normal'>" + text + "</span>"; 175 } 176 177 180 private void initializeMainForm() { 181 searchButton.setStyleName("JSON-SearchButton"); 182 searchButton.setText(SEARCH_BUTTON_DEFAULT_TEXT); 183 searchButton.addClickListener(new SearchButtonClickListener()); 184 185 jsonTree.setVisible(false); 187 188 RootPanel searchButtonSlot = RootPanel.get("search"); 191 if (searchButtonSlot == null) { 192 Window.alert("Please define a container element whose id is 'search'"); 193 return; 194 } 195 196 RootPanel treeViewSlot = RootPanel.get("tree"); 199 if (treeViewSlot == null) { 200 Window.alert("Please define a container element whose id is 'tree'"); 201 return; 202 } 203 204 searchButtonSlot.add(searchButton); 207 treeViewSlot.add(jsonTree); 208 } 209 } 210 | Popular Tags |