/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.expressions.spatial; import java.io.StringWriter; /** * PUBLIC: * A utility class used to set parameters on spatial operators within TopLink's * expression framework. This class allows the aptial operator parameters to be * passed in directly as a string or to be programatically configured using the * attributes defined and the enum types. Each spatial operator offers different * parameter arguments and values. This class does not enforce these rules but * instead leaves it to the caller to decide what values they want included. * <p> * When providing the parameter string through setParams or the constructor none * of the other values will be used. Instead the string as provided will be used. * <p> * Creating an instance of SpatialParameters without configuring it and passing * it into the SpatialExpressionFactory call is equivalent to passing in null. * The resulting SQL will have NULL writen out for the parameters argument to the * spatial operator. * * @since Oracle TopLink 11.1.1.0.0 */ public class SpatialParameters { private String params = null; private Number minResolution = null; private Number maxResolution = null; private Units units = null; private Number distance = null; private QueryType queryType = null; private Mask[] masks = null; private static String UNIT_PARAM = "UNIT="; private static String MAX_RES_PARAM = "MAX_RESOLUTION="; private static String MIN_RES_PARAM = "MIN_RESOLUTION="; private static String DISTANCE_PARAM = "DISTANCE="; private static String QUERYTYPE_PARAM = "QUERYTYPE="; private static String MASK_PARAM = "MASK="; public SpatialParameters() { } public SpatialParameters(String params) { setParams(params); } /** * PUBLIC: * Set the PARAMS (String) value. If this value is set then no other param * values will be used. * @param params * @return this instance of SpatialParameters */ public SpatialParameters setParams(String params) { this.params = params; return this; } public String getParams() { return params; } /** * PUBLIC: * Set the MIN_RESOLUTION parameter * @param minResolution * @return this instance of SpatialParameters */ public SpatialParameters setMinResolution(Number minResolution) { this.minResolution = minResolution; return this; } public Number getMinResolution() { return minResolution; } /** * PUBLIC: * Set the MAX_RESOLUTION parameter * @param maxResolution * @return this instance of SpatialParameters */ public SpatialParameters setMaxResolution(Number maxResolution) { this.maxResolution = maxResolution; return this; } public Number getMaxResolution() { return maxResolution; } /** * PUBLIC: * Set the UNIT parameter * @param units a value from the SpatialParameters.Units enum * @return this instance of SpatialParameters */ public SpatialParameters setUnits(SpatialParameters.Units units) { this.units = units; return this; } public SpatialParameters.Units getUnits() { return units; } /** * PUBLIC: * Set the DISTANCE parameter * @param distance * @return this instance of SpatialParameters */ public SpatialParameters setDistance(Number distance) { this.distance = distance; return this; } public Number getDistance() { return distance; } /** * PUBLIC: * Set the QUERY_TYPE parameter * @param queryType a value from the SpatialParameters.QueryType enum * @return this instance of SpatialParameters */ public SpatialParameters setQueryType(QueryType queryType) { this.queryType = queryType; return this; } public SpatialParameters.QueryType getQueryType() { return queryType; } /** * PUBLIC: * Set the MASK parameter * @param masks an array of values from the SpatialParmeters.Mask enum * @return this instance of SpatialParameters */ public SpatialParameters setMasks(Mask[] masks) { this.masks = masks; return this; } /** * PUBLIC: * Set the MASK parameter * @param mask a value from the SpatialParmeters.Mask enum * @return this instance of SpatialParameters */ public SpatialParameters setMask(Mask mask) { this.masks = new Mask[] { mask }; return this; } public Mask[] getMasks() { return masks; } /** * PUBLIC: * build a String describing this set of parameters that can be used in conjunction with an Oracle Spatial function * @return */ public String getParameterString() { if (getParams() != null) { return getParams(); } StringWriter writer = new StringWriter(); boolean hasParams = false; hasParams = writeParam(writer, DISTANCE_PARAM, getDistance(), hasParams); hasParams = writeParam(writer, MAX_RES_PARAM, getMaxResolution(), hasParams); hasParams = writeParam(writer, MIN_RES_PARAM, getMinResolution(), hasParams); hasParams = writeParam(writer, UNIT_PARAM, getUnits(), hasParams); hasParams = writeParam(writer, MASK_PARAM, getMasks(), hasParams); hasParams = writeParam(writer, QUERYTYPE_PARAM, getQueryType(), hasParams); return hasParams ? writer.toString() : null; } /** * INTERNAL: * Write the parameter onto the StringWriter being used to construct the * params string. Only write something if there is a value and return * true indicating if a parameter is written. */ private boolean writeParam(StringWriter writer, String paramName, Object paramValue, boolean hasParams) { if (paramValue != null) { if (hasParams) { writer.write(" "); } if (paramValue.getClass().isArray()) { Object[] values = (Object[])paramValue; if (values.length == 0) { return false; } writer.write(paramName); writer.write(values[0].toString()); for (int index = 1; index < values.length; index++) { writer.write("+"); writer.write(values[index].toString()); } } else { writer.write(paramName); writer.write(paramValue.toString()); } return true; } return hasParams; } public enum Units { M, // Meter KM, // Kilometer CM, //Centimeter MM, // Millimeter MILE, // Mile NAUT_MILE, // Nautical Mile FOOT, // Foot INCH, ; // Inch } public enum QueryType { WINDOW, JOIN, FILTER, ; } public enum Mask { TOUCH, OVERLAPBDYDISJOINT, OVERLAPBDYINTERSECT, EQUAL, INSIDE, COVEREDBY, CONTAINS, COVERS, ANYINTERACT, ON, ; } }