/**
* Copyright 2013 Alexander Erhard
*
* 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.aerhard.oxygen.plugin.dbtagger.util;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.aerhard.oxygen.plugin.dbtagger.TableData;
import ro.sync.exml.workspace.api.Workspace;
/**
* Container for JSON utility functions.
*/
public class JsonUtil {
/** oXygen's workspace object. */
private Workspace workspace;
/** The localization resource bundle. */
private ResourceBundle i18n;
/**
* Instantiates a new JsonUtil object.
*
* @param workspace
* oXygen's workspace object.
*/
public JsonUtil(Workspace workspace) {
this.workspace = workspace;
i18n = ResourceBundle.getBundle("Tagger");
}
/**
* Transforms a JSON string to a TableData object.
*
* @param input
* the input data
* @return the table data object or null if data could not be tranformed for
* further processing.
*/
public TableData getTableData(String input) {
try {
JSONObject responseJSON = new JSONObject(input);
String[] headers = getTableHeaders(responseJSON);
if (headers != null) {
if (!responseJSON.has("data")) {
return new TableData(headers, null);
}
String[][] data = getTableBody(responseJSON, headers.length);
return (data == null) ? null : new TableData(headers, data);
}
} catch (Exception e) {
workspace.showErrorMessage(i18n
.getString("jsonUtil.transformError"));
}
return null;
}
/**
* Gets table headers from the JSON server response.
*
* @param responseJSON
* the JSON response
* @return the headers
*/
private String[] getTableHeaders(JSONObject responseJSON) {
String[] cols = null;
try {
JSONArray colsArray = responseJSON.getJSONArray("cols");
cols = new String[colsArray.length()];
JSONObject fieldObj;
for (int i = 0; i < colsArray.length(); i++) {
fieldObj = (JSONObject) colsArray.get(i);
cols[i] = fieldObj.optString("name");
}
} catch (JSONException e) {
workspace.showErrorMessage(i18n
.getString("jsonUtil.columnNameError"));
}
return cols;
}
/**
* Gets the table body in the JSON server response and calls
* {@link #convertArray(int, int, JSONArray)}.
*
* @param responseJSON
* the JSON response
* @return the body content
*/
private String[][] getTableBody(JSONObject responseJSON, int columns) {
try {
JSONArray dataArray = responseJSON.getJSONArray("data");
if (dataArray != null) {
int rows = dataArray.length();
if (rows > 0) {
return convertArray(rows, columns, dataArray);
}
}
} catch (JSONException e) {
workspace.showErrorMessage(i18n.getString("jsonUtil.dataError")
+ "\n" + e.toString());
} catch (ArrayStoreException e) {
workspace.showErrorMessage(e.toString());
}
return null;
}
/**
* Converts a JSON array to from the JSON server response.
*
* @param columns
* The number of columns.
* @param rows
* The number of rows.
* @param dataArray
* the input data.
*
* @return the body content
*/
private String[][] convertArray(int rows, int columns, JSONArray dataArray) {
String[][] resultTable = new String[rows][];
for (int i = 0; i < rows; i++) {
JSONArray arr = dataArray.getJSONArray(i);
List<String> list = new ArrayList<String>();
if (arr.length() < columns) {
throw new ArrayStoreException(
i18n.getString("jsonUtil.dataColumnError"));
}
for (int j = 0; j < columns; j++) {
list.add(arr.isNull(j) ? "" : arr.getString(j));
}
resultTable[i] = list.toArray(new String[columns]);
}
return resultTable;
}
}