/**
Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016. All rights reserved.
Contact:
SYSTAP, LLC DBA Blazegraph
2501 Calvert ST NW #106
Washington, DC 20008
licenses@blazegraph.com
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Created on February 22, 2016
*/
package com.bigdata.rdf.sparql.ast.eval.service;
import java.util.ArrayList;
import java.util.List;
import com.bigdata.rdf.internal.impl.extensions.InvalidGeoSpatialDatatypeConfigurationError;
import com.bigdata.rdf.sparql.ast.eval.AbstractDataDrivenSPARQLTestCase;
import com.bigdata.service.geospatial.GeoSpatialConfig;
import com.bigdata.service.geospatial.GeoSpatialDatatypeConfiguration;
import com.bigdata.service.geospatial.GeoSpatialDatatypeFieldConfiguration;
import com.bigdata.service.geospatial.GeoSpatialDatatypeFieldConfiguration.ServiceMapping;
import com.bigdata.service.geospatial.GeoSpatialDatatypeFieldConfiguration.ValueType;
/**
* Test suite testing the form-JSON parsing facilities for the GeoSpatial service configuration.
*
* @author <a href="mailto:ms@metaphacts.com">Michael Schmidt</a>
* @version $Id$
*/
public class TestGeoSpatialServiceConfigurationParsing extends AbstractDataDrivenSPARQLTestCase {
/**
*
*/
public TestGeoSpatialServiceConfigurationParsing() {
}
/**
* @param name
*/
public TestGeoSpatialServiceConfigurationParsing(String name) {
super(name);
}
public void testAcceptSingleDatatypeConfig() {
final String config1Uri = "http://my.custom.datatype1.uri";
final String config1 = sampleConfigComplete(config1Uri);
final List<String> datatypeConfigs = new ArrayList<String>();
datatypeConfigs.add(config1);
final GeoSpatialConfig conf = new GeoSpatialConfig(datatypeConfigs, "http://my.custom.datatype1.uri");
final List<GeoSpatialDatatypeConfiguration> parsedDatatypeConfigs = conf.getDatatypeConfigs();
assertEquals(parsedDatatypeConfigs.size(),1);
final GeoSpatialDatatypeConfiguration parsedDatatypeConfig = parsedDatatypeConfigs.get(0);
assertEquals(parsedDatatypeConfig.getUri().stringValue(), config1Uri);
final List<GeoSpatialDatatypeFieldConfiguration> fields = parsedDatatypeConfig.getFields();
assertEquals(fields.size(), 5);
// field 0 validation
final GeoSpatialDatatypeFieldConfiguration field0 = fields.get(0);
assertEquals(field0.getValueType(), ValueType.DOUBLE);
assertEquals(field0.getMultiplier(), 100000);
assertEquals(field0.getMinValue(), null);
assertEquals(field0.getServiceMapping(), ServiceMapping.LATITUDE);
assertEquals(field0.getCustomServiceMapping(), null);
// field 1 validation
final GeoSpatialDatatypeFieldConfiguration field1 = fields.get(1);
assertEquals(field1.getValueType(), ValueType.DOUBLE);
assertEquals(field1.getMultiplier(), 100000);
assertEquals(field1.getMinValue(), null);
assertEquals(field1.getServiceMapping(), ServiceMapping.LONGITUDE);
assertEquals(field1.getCustomServiceMapping(), null);
// field 2 validation
final GeoSpatialDatatypeFieldConfiguration field2 = fields.get(2);
assertEquals(field2.getValueType(), ValueType.LONG);
assertEquals(field2.getMultiplier(), 1);
assertEquals(field2.getMinValue(), Long.valueOf(0));
assertEquals(field2.getServiceMapping(), ServiceMapping.TIME);
assertEquals(field2.getCustomServiceMapping(), null);
// field 3 validation
final GeoSpatialDatatypeFieldConfiguration field3 = fields.get(3);
assertEquals(field3.getValueType(), ValueType.LONG);
assertEquals(field3.getMultiplier(), 1);
assertEquals(field3.getMinValue(), Long.valueOf(1));
assertEquals(field3.getServiceMapping(), ServiceMapping.COORD_SYSTEM);
assertEquals(field3.getCustomServiceMapping(), null);
// field 4 validation
final GeoSpatialDatatypeFieldConfiguration field4 = fields.get(4);
assertEquals(field4.getValueType(), ValueType.DOUBLE);
assertEquals(field4.getMultiplier(), 5);
assertEquals(field4.getMinValue(), Long.valueOf(2));
assertEquals(field4.getServiceMapping(), ServiceMapping.CUSTOM);
assertEquals(field4.getCustomServiceMapping(), "myCustomMappingStr");
}
public void testAcceptMultipleDatatypeConfigs() {
final String config1Uri = "http://my.custom.datatype1.uri";
final String config2Uri = "http://my.custom.datatype2.uri";
final String config3Uri = "http://my.custom.datatype3.uri";
/**
* Three times exactly the same configuration, just different URIs
*/
final String config1 = sampleConfigComplete(config1Uri);
final String config2 = sampleConfigComplete(config2Uri);
final String config3 = sampleConfigComplete(config3Uri);
// parse config
final List<String> datatypeConfigs = new ArrayList<String>();
datatypeConfigs.add(config1);
datatypeConfigs.add(config2);
datatypeConfigs.add(config3);
final GeoSpatialConfig conf = new GeoSpatialConfig(datatypeConfigs, config1Uri);
// run tests
final List<GeoSpatialDatatypeConfiguration> parsedDatatypeConfigs = conf.getDatatypeConfigs();
assertEquals(parsedDatatypeConfigs.size(),3);
for (int i=0; i<parsedDatatypeConfigs.size(); i++) {
final GeoSpatialDatatypeConfiguration parsedDatatypeConfig = parsedDatatypeConfigs.get(i);
if (i==0) {
assertEquals(parsedDatatypeConfig.getUri().stringValue(), config1Uri);
} else if (i==1) {
assertEquals(parsedDatatypeConfig.getUri().stringValue(), config2Uri);
} else if (i==2) {
assertEquals(parsedDatatypeConfig.getUri().stringValue(), config3Uri);
}
final List<GeoSpatialDatatypeFieldConfiguration> fields = parsedDatatypeConfig.getFields();
assertEquals(fields.size(), 5);
// field 0 validation
final GeoSpatialDatatypeFieldConfiguration field0 = fields.get(0);
assertEquals(field0.getValueType(), ValueType.DOUBLE);
assertEquals(field0.getMultiplier(), 100000);
assertEquals(field0.getMinValue(), null);
assertEquals(field0.getServiceMapping(), ServiceMapping.LATITUDE);
assertEquals(field0.getCustomServiceMapping(), null);
// field 1 validation
final GeoSpatialDatatypeFieldConfiguration field1 = fields.get(1);
assertEquals(field1.getValueType(), ValueType.DOUBLE);
assertEquals(field1.getMultiplier(), 100000);
assertEquals(field1.getMinValue(), null);
assertEquals(field1.getServiceMapping(), ServiceMapping.LONGITUDE);
assertEquals(field1.getCustomServiceMapping(), null);
// field 2 validation
final GeoSpatialDatatypeFieldConfiguration field2 = fields.get(2);
assertEquals(field2.getValueType(), ValueType.LONG);
assertEquals(field2.getMultiplier(), 1);
assertEquals(field2.getMinValue(), Long.valueOf(0));
assertEquals(field2.getServiceMapping(), ServiceMapping.TIME);
assertEquals(field2.getCustomServiceMapping(), null);
// field 3 validation
final GeoSpatialDatatypeFieldConfiguration field3 = fields.get(3);
assertEquals(field3.getValueType(), ValueType.LONG);
assertEquals(field3.getMultiplier(), 1);
assertEquals(field3.getMinValue(), Long.valueOf(1));
assertEquals(field3.getServiceMapping(), ServiceMapping.COORD_SYSTEM);
assertEquals(field3.getCustomServiceMapping(), null);
// field 4 validation
final GeoSpatialDatatypeFieldConfiguration field4 = fields.get(4);
assertEquals(field4.getValueType(), ValueType.DOUBLE);
assertEquals(field4.getMultiplier(), 5);
assertEquals(field4.getMinValue(), Long.valueOf(2));
assertEquals(field4.getServiceMapping(), ServiceMapping.CUSTOM);
assertEquals(field4.getCustomServiceMapping(), "myCustomMappingStr");
}
}
public void testRejectConfigWithNoFields() {
final String config1Uri = "http://my.custom.datatype1.uri";
final String config1 = sampleConfigNoFields(config1Uri);
final List<String> datatypeConfigs = new ArrayList<String>();
datatypeConfigs.add(config1);
try {
new GeoSpatialConfig(datatypeConfigs, config1Uri);
} catch (InvalidGeoSpatialDatatypeConfigurationError e) {
return; // expected !
}
throw new RuntimeException("Expected to run into exception, but did not.");
}
public void testRejectSyntacticallyInvalidConfig() {
final String config1Uri = "http://my.custom.datatype1.uri";
final String config1 = sampleConfigSyntacticallyInvalid(config1Uri);
final List<String> datatypeConfigs = new ArrayList<String>();
datatypeConfigs.add(config1);
try {
new GeoSpatialConfig(datatypeConfigs, config1Uri);
} catch (IllegalArgumentException e) {
return; // expected !
}
throw new RuntimeException("Expected to run into exception, but did not.");
}
public void testRejectMissingDatatypeConfiguration() {
final String configUri = "http://my.custom.datatype1.uri";
final String config = sampleConfigWithMissingValueType(configUri);
final List<String> datatypeConfigs = new ArrayList<String>();
datatypeConfigs.add(config);
try {
new GeoSpatialConfig(datatypeConfigs, configUri);
} catch (InvalidGeoSpatialDatatypeConfigurationError e) {
return; // expected !
}
throw new RuntimeException("Expected to run into exception, but did not.");
}
public void testRejectMissingServiceMappingConfiguration() {
final String configUri = "http://my.custom.datatype1.uri";
final String config = sampleConfigWithMissingServiceMapping(configUri);
final List<String> datatypeConfigs = new ArrayList<String>();
datatypeConfigs.add(config);
try {
new GeoSpatialConfig(datatypeConfigs, configUri);
} catch (InvalidGeoSpatialDatatypeConfigurationError e) {
return; // expected !
}
throw new RuntimeException("Expected to run into exception, but did not.");
}
public void testRejectMappingConflict() {
final String configUri = "http://my.custom.datatype1.uri";
final String config = sampleConfigWithMappingConflict(configUri);
final List<String> datatypeConfigs = new ArrayList<String>();
datatypeConfigs.add(config);
try {
new GeoSpatialConfig(datatypeConfigs, configUri);
} catch (InvalidGeoSpatialDatatypeConfigurationError e) {
return; // expected !
}
throw new RuntimeException("Expected to run into exception, but did not.");
}
public void testRejectInvalidUri() {
final String configUri = "this is not a valid uri";
final String config = sampleConfigWithMappingConflict(configUri);
final List<String> datatypeConfigs = new ArrayList<String>();
datatypeConfigs.add(config);
try {
new GeoSpatialConfig(datatypeConfigs, configUri);
} catch (InvalidGeoSpatialDatatypeConfigurationError e) {
return; // expected !
}
throw new RuntimeException("Expected to run into exception, but did not.");
}
public void testRejectUriConflict() {
final String configUri = "http://my.custom.datatype1.uri";
final String config1 = sampleConfigWithMappingConflict(configUri);
final String config2 = sampleConfigWithMappingConflict(configUri); // same URI -> invalid!
final List<String> datatypeConfigs = new ArrayList<String>();
datatypeConfigs.add(config1);
datatypeConfigs.add(config2);
try {
new GeoSpatialConfig(datatypeConfigs, configUri);
} catch (InvalidGeoSpatialDatatypeConfigurationError e) {
return; // expected !
}
throw new RuntimeException("Expected to run into exception, but did not.");
}
/**
* Test helper that returns a sample configuration of the given URI.
*/
String sampleConfigComplete(String uri) {
final String config =
"{\"config\": "
+ "{ \"uri\": \"" + uri + "\", "
+ " \"fields\": [ "
+ " { \"valueType\": \"DOUBLE\", \"multiplier\": \"100000\", \"serviceMapping\": \"LATITUDE\" }, "
+ " { \"valueType\": \"DOUBLE\", \"multiplier\": \"100000\", \"serviceMapping\": \"LONGITUDE\" }, "
+ " { \"valueType\": \"LONG\", \"multiplier\": \"1\", \"minValue\" : \"0\" , \"serviceMapping\": \"TIME\" }, "
+ " { \"valueType\": \"LONG\", \"multiplier\": \"1\", \"minValue\" : \"1\" , \"serviceMapping\" : \"COORD_SYSTEM\" }, "
+ " { \"valueType\": \"DOUBLE\", \"multiplier\": \"5\", \"minValue\" : \"2\" , \"serviceMapping\" : \"myCustomMappingStr\" } "
+ " ]"
+ " }"
+ "}";
return config;
}
/**
* Test helper that returns a syntactically valid configuration with no fields.
*/
String sampleConfigNoFields(String uri) {
final String config =
"{\"config\": "
+ "{ \"uri\": \"" + uri + "\", "
+ " \"fields\": [] "
+ " }"
+ "}";
return config;
}
/**
* Test helper that returns a syntactically invalid configuration
*/
String sampleConfigSyntacticallyInvalid(String uri) {
final String config =
"{\"config\": "
+ "{ \"uri\": \"" + uri + "\", "
+ " \"fields\": " // opening "[" bracked for field missing
+ " { \"valueType\": \"DOUBLE\", \"multiplier\": \"100000\", \"serviceMapping\": \"LATITUDE\" }, "
+ " { \"valueType\": \"DOUBLE\", \"multiplier\": \"100000\", \"serviceMapping\": \"LONGITUDE\" }, "
+ " { \"valueType\": \"LONG\", \"multiplier\": \"1\", \"minValue\" : \"0\" , \"serviceMapping\": \"TIME\" }, "
+ " { \"valueType\": \"LONG\", \"multiplier\": \"1\", \"minValue\" : \"1\" , \"serviceMapping\" : \"COORD_SYSTEM\" }, "
+ " { \"valueType\": \"DOUBLE\", \"multiplier\": \"5\", \"minValue\" : \"2\" , \"serviceMapping\" : \"myCustomMappingStr\" } "
+ " ]"
+ " }"
+ "}";
return config;
}
/**
* Test helper that returns a syntactically invalid configuration
*/
String sampleConfigWithMappingConflict(String uri) {
final String config =
"{\"config\": "
+ "{ \"uri\": \"" + uri + "\", "
+ " \"fields\": [ "
+ " { \"valueType\": \"DOUBLE\", \"multiplier\": \"100000\", \"serviceMapping\": \"LATITUDE\" }, "
+ " { \"valueType\": \"DOUBLE\", \"multiplier\": \"100000\", \"serviceMapping\": \"LONGITUDE\" }, "
+ " { \"valueType\": \"LONG\", \"multiplier\": \"1\", \"minValue\" : \"0\" , \"serviceMapping\": \"LATITUDE\" }, " // twice latitude
+ " { \"valueType\": \"LONG\", \"multiplier\": \"1\", \"minValue\" : \"1\" , \"serviceMapping\" : \"COORD_SYSTEM\" }, "
+ " { \"valueType\": \"DOUBLE\", \"multiplier\": \"5\", \"minValue\" : \"2\" , \"serviceMapping\" : \"myCustomMappingStr\" } "
+ " ]"
+ " }"
+ "}";
return config;
}
/**
* Test helper that returns a syntactically invalid configuration
*/
String sampleConfigWithMissingValueType(String uri) {
final String config =
"{\"config\": "
+ "{ \"uri\": \"" + uri + "\", "
+ " \"fields\": [ "
+ " { \"multiplier\": \"100000\", \"serviceMapping\": \"LATITUDE\" } "
+ " ]"
+ " }"
+ "}";
return config;
}
/**
* Test helper that returns a syntactically invalid configuration
*/
String sampleConfigWithMissingServiceMapping(String uri) {
final String config =
"{\"config\": "
+ "{ \"uri\": \"" + uri + "\", "
+ " \"fields\": [ "
+ " { \"valueType\": \"DOUBLE\", \"multiplier\": \"100000\" } "
+ " ]"
+ " }"
+ "}";
return config;
}
}