All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bigdata.service.geospatial.GeoSpatialConfig Maven / Gradle / Ivy

/**

Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016.  All rights reserved.

Contact:
     SYSTAP, LLC DBA Blazegraph
     2501 Calvert ST NW #106
     Washington, DC 20008
     [email protected]

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 Feb 10, 2016
 */
package com.bigdata.service.geospatial;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.log4j.Logger;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.openrdf.model.URI;
import org.openrdf.model.impl.URIImpl;

import com.bigdata.rdf.internal.impl.extensions.InvalidGeoSpatialDatatypeConfigurationError;

/**
 * Class providing access to the GeoSpatial index configuration,
 * including datatype definition and default datatype for querying.
 * Initialized and used only if geospatial subsytem is used.
 * 
 * @author Michael Schmidt
 * @version $Id$
 */
public class GeoSpatialConfig implements Serializable {

    private static final long serialVersionUID = 1L;

    private final static String JSON_STR_CONFIG = "config";
    private final static String JSON_STR_URI = "uri";
    private final static String JSON_STR_LITERALSERIALIZER = "literalSerializer";
    private final static String JSON_STR_FIELDS = "fields";

    final static private transient Logger log = Logger.getLogger(GeoSpatialConfig.class);

    /**
     * List containing the configurations for the geospatial datatypes.
     */
    private List datatypeConfigs;

    
    // the default datatype for querying
    private URI defaultDatatype;

    
    public GeoSpatialConfig(final List geoSpatialDatatypeConfigs, final String defaultDatatype) {

        initDatatypes(geoSpatialDatatypeConfigs);
        
        if (defaultDatatype!=null && !defaultDatatype.isEmpty()) {

            try {
                this.defaultDatatype = new URIImpl(defaultDatatype);
            } catch (Exception e) {
                throw new InvalidGeoSpatialDatatypeConfigurationError(
                    "Invalid default datatype (" + defaultDatatype + ") does not represent a URI.");
            }
            
            boolean isRegistered = false;
            for (final GeoSpatialDatatypeConfiguration config : datatypeConfigs) {
                isRegistered |= config.getUri().equals(this.defaultDatatype);
            }

            if (!isRegistered) {
                throw new InvalidGeoSpatialDatatypeConfigurationError(
                        "Invalid default datatype (" + defaultDatatype + ") is not a registered geospatial datatype.");
            }

        } // else: ignore it (no default)
        
    }
    
    private void initDatatypes(List geoSpatialDatatypeConfigs) {
       
        datatypeConfigs = new ArrayList();
       
        if (geoSpatialDatatypeConfigs==null)
            return; // nothing to be done

        /**
         * We expect a JSON config string of the following format (example):
         * 
         * {"config": { 
         *   "uri": "http://my.custom.datatype2.uri", 
         *   "literalSerializer": "com.bigdata.service.GeoSpatialLiteralSerializer",
         *   "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" : "0" , "serviceMapping" : "COORD_SYSTEM"  } 
         *   ] 
         * }}
         */
        for (final String configStr : geoSpatialDatatypeConfigs) {
           
            if (configStr==null || configStr.isEmpty())
                continue; // skip

            try {

                // read values from JSON
                final JSONObject json = new JSONObject(configStr);
                final JSONObject topLevelNode = (JSONObject)json.get(JSON_STR_CONFIG);
                final String uri = (String)topLevelNode.get(JSON_STR_URI);
                final String literalSerializer = topLevelNode.has(JSON_STR_LITERALSERIALIZER) ?
                        (String)topLevelNode.get(JSON_STR_LITERALSERIALIZER) : null;
                final JSONArray fields = (JSONArray)topLevelNode.get(JSON_STR_FIELDS);

                // delegate to GeoSpatialDatatypeConfiguration for construction
                datatypeConfigs.add(new GeoSpatialDatatypeConfiguration(uri, literalSerializer, fields));
                
            } catch (JSONException e) {
                
                log.warn("Illegal JSON configuration: " + e.getMessage());
                throw new IllegalArgumentException(e); // forward exception
            }
           
            // validate that there are no duplicate URIs used for the datatypeConfigs
            final Set uris = new HashSet();
            for (int i=0; i getDatatypeConfigs() {
        return datatypeConfigs;
    }

    public URI getDefaultDatatype() {
        return defaultDatatype;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy