/* * Copyright 2014 Red Hat, Inc. and/or its affiliates. * * 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 org.dashbuilder.dataset.json; import java.util.Date; import java.util.List; import org.dashbuilder.dataset.ColumnType; import org.dashbuilder.dataset.DataColumn; import org.dashbuilder.dataset.DataSet; import org.dashbuilder.dataset.DataSetFactory; import org.dashbuilder.json.Json; import org.dashbuilder.json.JsonArray; import org.dashbuilder.json.JsonException; import org.dashbuilder.json.JsonObject; public class DataSetJSONMarshaller { private static final String DATASET_COLUMN = "column"; private static final String DATASET_COLUMN_ID = "id"; private static final String DATASET_COLUMN_TYPE = "type"; private static final String DATASET_COLUMN_VALUES = "values"; private static DataSetJSONMarshaller SINGLETON = new DataSetJSONMarshaller(); public static DataSetJSONMarshaller get() { return SINGLETON; } public JsonObject toJson(DataSet dataSet) throws JsonException { JsonObject json = Json.createObject(); if (dataSet != null) { int i = 0; for (DataColumn dataColumn: dataSet.getColumns()) { json.put(DATASET_COLUMN + "." + i++, formatDataColumn(dataColumn)); } } return json; } private JsonObject formatDataColumn(DataColumn dataColumn) throws JsonException { JsonObject columnJson = Json.createObject(); if (dataColumn != null) { columnJson.put(DATASET_COLUMN_ID, dataColumn.getId()); columnJson.put(DATASET_COLUMN_TYPE, dataColumn.getColumnType().toString()); columnJson.put(DATASET_COLUMN_VALUES, formatColumnValues(dataColumn, dataColumn.getValues())); } return columnJson; } private JsonArray formatColumnValues(DataColumn dataColumn, List values) throws JsonException { JsonArray valuesJson = Json.createArray(); if ( values != null ) { int i = 0; for (Object value : values) { switch (dataColumn.getColumnType()) { case DATE: { String l = Long.toString(((Date) value).getTime()); valuesJson.set(i++, l); break; } default: valuesJson.set(i++, value.toString()); break; } } } return valuesJson; } public DataSet fromJson(String jsonString) throws JsonException { if (jsonString == null || jsonString.trim().isEmpty()) { return null; } JsonObject json = Json.parse(jsonString); return fromJson(json); } public DataSet fromJson(JsonObject dataSetJson) throws JsonException { if (dataSetJson == null) { return null; } DataSet dataSet = DataSetFactory.newEmptyDataSet(); for (int i = 0; i < dataSetJson.size(); i++) { JsonObject columnJson = dataSetJson.getObject(DATASET_COLUMN + "." + Integer.toString(i)); parseDataColumn(dataSet, columnJson); } return dataSet; } private void parseDataColumn( DataSet dataSet, JsonObject columnJson ) throws JsonException { if ( columnJson != null) { String columnId = columnJson.getString(DATASET_COLUMN_ID); String columnType = columnJson.getString(DATASET_COLUMN_TYPE); if ( columnId == null || columnType == null ) throw new RuntimeException("Dataset column id or type not specified"); dataSet.addColumn(columnId, ColumnType.valueOf(columnType)); DataColumn dataColumn = dataSet.getColumnById(columnId); parseColumnValues( dataColumn, columnJson ); } } private void parseColumnValues( DataColumn dataColumn, JsonObject columnJson) throws JsonException { JsonArray valueArray = columnJson.getArray(DATASET_COLUMN_VALUES); if (valueArray != null) { List values = dataColumn.getValues(); for ( int i = 0; i < valueArray.length(); i++ ) { String stringJson = valueArray.getString(i); switch ( dataColumn.getColumnType() ) { case DATE: values.add( parseDateValue(stringJson)); break; case NUMBER: values.add( parseNumberValue(stringJson)); break; case LABEL: values.add(stringJson); break; case TEXT: values.add(stringJson); break; } } } } private Date parseDateValue(String stringValue) { Long dateLong = Long.parseLong(stringValue, 10); return new Date(dateLong); } private Double parseNumberValue(String stringValue) { return Double.parseDouble(stringValue); } }