/*
* Copyright 2015 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.
*
* 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 org.apache.commons.io.IOUtils;
import org.dashbuilder.dataprovider.DataSetProvider;
import org.dashbuilder.dataprovider.DataSetProviderRegistry;
import org.dashbuilder.dataprovider.DataSetProviderType;
import org.dashbuilder.dataprovider.DefaultProviderType;
import org.dashbuilder.dataset.ColumnType;
import org.dashbuilder.dataset.def.BeanDataSetDef;
import org.dashbuilder.dataset.def.CSVDataSetDef;
import org.dashbuilder.dataset.def.DataColumnDef;
import org.dashbuilder.dataset.def.DataSetDef;
import org.dashbuilder.dataset.filter.ColumnFilter;
import org.dashbuilder.dataset.filter.CoreFunctionFilter;
import org.dashbuilder.dataset.filter.CoreFunctionType;
import org.dashbuilder.dataset.filter.DataSetFilter;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.junit.Assert.*;
public class DataSetDefJsonTest {
private static final String UTF_8 = "UTF-8";
private static final String BEAN_DEF_PATH = "beanDataSetDef.dset";
private static final String FILTER_DEF_PATH = "dataSetDefFilter.dset";
private static final String EXPENSES_DEF_PATH = "expenseReports.dset";
private static final String CSV_DEF_PATH = "csvDataSetDef.dset";
private static final String CUSTOM_DEF_PATH = "customDataSetDef.dset";
private static final DataSetProviderType CUSTOM_PROVIDER_TYPE = new DefaultProviderType("CUSTOM");
DataSetDefJSONMarshaller jsonMarshaller = new DataSetDefJSONMarshaller(new DataSetProviderRegistry() {
@Override
public void registerDataProvider(DataSetProvider dataProvider) {
}
@Override
public DataSetProvider getDataSetProvider(DataSetProviderType type) {
return null;
}
@Override
public DataSetProviderType getProviderTypeByName(String name) {
switch (name) {
case "BEAN":
return DataSetProviderType.BEAN;
case "CSV":
return DataSetProviderType.CSV;
case "SQL":
return DataSetProviderType.SQL;
case "CUSTOM":
return CUSTOM_PROVIDER_TYPE;
}
return null;
}
@Override
public Set<DataSetProviderType> getAvailableTypes() {
return new HashSet<>(Arrays.asList(
DataSetProviderType.BEAN,
DataSetProviderType.CSV,
DataSetProviderType.SQL));
}
});
@Test
public void testBean() throws Exception {
final BeanDataSetDef dataSetDef = new BeanDataSetDef();
dataSetDef.setName("bean data set name");
dataSetDef.setUUID("bean-test-uuid");
dataSetDef.setProvider(DataSetProviderType.BEAN);
dataSetDef.setCacheEnabled(false);
dataSetDef.setCacheMaxRows(100);
dataSetDef.setPublic(true);
dataSetDef.setPushEnabled(false);
dataSetDef.setPushMaxSize(10);
dataSetDef.setRefreshAlways(false);
dataSetDef.setRefreshTime("1second");
dataSetDef.setGeneratorClass("org.dashbuilder.DataSetGenerator");
dataSetDef.setProperty("ignore", "this");
final Map<String, String> parameterMap = new LinkedHashMap<String, String>();
parameterMap.put("p1", "v1");
parameterMap.put("p2", "v2");
dataSetDef.setParamaterMap(parameterMap);
String json = jsonMarshaller.toJsonString(dataSetDef);
String beanJSONContent = getFileAsString(BEAN_DEF_PATH);
assertDataSetDef(json, beanJSONContent);
}
@Test
public void testCSV() throws Exception {
try {
String json = getFileAsString(CSV_DEF_PATH);
CSVDataSetDef def = (CSVDataSetDef) jsonMarshaller.fromJson(json);
assertEquals(def.getColumns().size(), 5);
DataColumnDef column1 = def.getColumnById("office");
DataColumnDef column2 = def.getColumnById("department");
DataColumnDef column3 = def.getColumnById("employee");
DataColumnDef column4 = def.getColumnById("amount");
DataColumnDef column5 = def.getColumnById("date");
assertNotNull(column1);
assertNotNull(column2);
assertNotNull(column3);
assertNotNull(column4);
assertNotNull(column5);
assertEquals(column1.getColumnType(), ColumnType.LABEL);
assertEquals(column2.getColumnType(), ColumnType.LABEL);
assertEquals(column3.getColumnType(), ColumnType.LABEL);
assertEquals(column4.getColumnType(), ColumnType.NUMBER);
assertEquals(column5.getColumnType(), ColumnType.DATE);
assertEquals(def.getFilePath(), "expenseReports.csv");
assertNull(def.getFileURL());
assertEquals(def.getDatePattern(), "MM-dd-yyyy");
assertEquals(def.getNumberPattern(), "#,###.##");
assertEquals(def.getDatePattern("date"), "MM-dd-yyyy");
assertEquals(def.getNumberPattern("amount"), "#,###.##");
assertEquals(def.getSeparatorChar(), Character.valueOf(';'));
assertEquals(def.getQuoteChar(), Character.valueOf('\"'));
}
catch (ClassCastException e) {
fail("Not a CSV dataset def");
}
}
@Test
public void testCustom() throws Exception {
final DataSetDef dataSetDef = new DataSetDef();
dataSetDef.setName("custom data set name");
dataSetDef.setUUID("custom-test-uuid");
dataSetDef.setProvider(CUSTOM_PROVIDER_TYPE);
dataSetDef.setCacheEnabled(false);
dataSetDef.setCacheMaxRows(100);
dataSetDef.setPublic(true);
dataSetDef.setPushEnabled(false);
dataSetDef.setPushMaxSize(10);
dataSetDef.setRefreshAlways(false);
dataSetDef.setRefreshTime("1second");
dataSetDef.setProperty("prop1", "Hello");
String json = jsonMarshaller.toJsonString(dataSetDef);
String customJSONContent = getFileAsString(CUSTOM_DEF_PATH);
assertDataSetDef(json, customJSONContent);
DataSetDef fromJson = jsonMarshaller.fromJson(customJSONContent);
assertEquals(dataSetDef, fromJson);
}
@Test
public void testColumns() throws Exception {
String json = getFileAsString(EXPENSES_DEF_PATH);
DataSetDef def = jsonMarshaller.fromJson(json);
assertEquals(def.getColumns().size(), 6);
DataColumnDef column1 = def.getColumnById("EXPENSES_ID");
DataColumnDef column2 = def.getColumnById("DEPARTMENT");
DataColumnDef column3 = def.getColumnById("AMOUNT");
DataColumnDef column4 = def.getColumnById("CREATION_DATE");
DataColumnDef column5 = def.getColumnById("EMPLOYEE");
DataColumnDef column6 = def.getColumnById("CITY");
assertNotNull(column1);
assertNotNull(column2);
assertNotNull(column3);
assertNotNull(column4);
assertNotNull(column5);
assertNotNull(column6);
assertEquals(column1.getColumnType(), ColumnType.NUMBER);
assertEquals(column2.getColumnType(), ColumnType.LABEL);
assertEquals(column3.getColumnType(), ColumnType.NUMBER);
assertEquals(column4.getColumnType(), ColumnType.DATE);
assertEquals(column5.getColumnType(), ColumnType.LABEL);
assertEquals(column6.getColumnType(), ColumnType.LABEL);
}
@Test
public void testFilters() throws Exception {
final BeanDataSetDef dataSetDef = new BeanDataSetDef();
dataSetDef.setName("filter data set name");
dataSetDef.setUUID("filter-test-uuid");
dataSetDef.setProvider(DataSetProviderType.BEAN);
dataSetDef.setCacheEnabled(false);
dataSetDef.setCacheMaxRows(100);
dataSetDef.setPublic(true);
dataSetDef.setPushEnabled(false);
dataSetDef.setPushMaxSize(10);
dataSetDef.setRefreshAlways(false);
dataSetDef.setRefreshTime("1second");
dataSetDef.setGeneratorClass("org.dashbuilder.dataprovider.SalesPerYearDataSetGenerator");
final Map<String, String> parameterMap = new LinkedHashMap<String, String>();
parameterMap.put("multiplier", "1");
dataSetDef.setParamaterMap(parameterMap);
final DataSetFilter filter = new DataSetFilter();
final List<Comparable> params1 = new ArrayList<Comparable>();
params1.add("JANUARY");
ColumnFilter columnFilter = new CoreFunctionFilter("month", CoreFunctionType.EQUALS_TO, params1);
filter.addFilterColumn(columnFilter);
final List<Comparable> params2 = new ArrayList<Comparable>();
params2.add(0d);
params2.add(100.35d);
columnFilter = new CoreFunctionFilter("amount", CoreFunctionType.BETWEEN, params2);
filter.addFilterColumn(columnFilter);
dataSetDef.setDataSetFilter(filter);
String json = jsonMarshaller.toJsonString(dataSetDef);
String filteredDataSetDefJSONContent = getFileAsString(FILTER_DEF_PATH);
assertDataSetDef(json, filteredDataSetDefJSONContent);
}
private void assertDataSetDef(final String def1, final String def2) throws Exception {
if (def1 == null && def2 != null) Assert.assertTrue("JSON string for Def1 is null and for Def2 is not null", false);
if (def1 != null && def2 == null) Assert.assertTrue("JSON string for Def1 is not null and for Def2 is null", false);
if (def1 == null) Assert.assertTrue("JSON string for both definitions is null", false);
DataSetDef def1Object = jsonMarshaller.fromJson(def1);
DataSetDef def2Object = jsonMarshaller.fromJson(def2);
Assert.assertEquals(def1Object, def2Object);
}
protected static String getFileAsString(String file) throws Exception {
InputStream mappingsFileUrl = Thread.currentThread().getContextClassLoader().getResourceAsStream(file);
StringWriter writer = null;
String fileContent = null;
try {
writer = new StringWriter();
IOUtils.copy(mappingsFileUrl, writer, UTF_8);
fileContent = writer.toString();
} finally {
if (writer != null) writer.close();
}
// Ensure newline characters meet the HTTP specification formatting requirements.
return fileContent.replaceAll("\n","\r\n");
}
}