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

org.geotools.data.ows.AbstractRequest Maven / Gradle / Ivy

Go to download

The main module contains the GeoTools public interfaces that are used by other GeoTools modules (and GeoTools applications). Where possible we make use industry standard terms as provided by OGC and ISO standards. The formal GeoTools public api consists of gt-metadata, jts and the gt-main module. The main module contains the default implementations that are available provided to other GeoTools modules using our factory system. Factories are obtained from an appropriate FactoryFinder, giving applications a chance configure the factory used using the Factory Hints facilities. FilterFactory ff = CommonFactoryFinder.getFilterFactory(); Expression expr = ff.add( expression1, expression2 ); If you find yourself using implementation specific classes chances are you doing it wrong: Expression expr = new AddImpl( expression1, expressiom2 );

The newest version!
/*
 *    GeoTools - The Open Source Java GIS Toolkit
 *    http://geotools.org
 *
 *    (C) 2004-2008, Open Source Geospatial Foundation (OSGeo)
 *
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU Lesser General Public
 *    License as published by the Free Software Foundation;
 *    version 2.1 of the License.
 *
 *    This library 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
 *    Lesser General Public License for more details.
 */
package org.geotools.data.ows;

import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;

/**
 * A class that provides functionality for performing basic requests
 *
 * @author Richard Gould
 */
public abstract class AbstractRequest implements Request {
    /** Represents OGC Exception MIME types */
    public static final String EXCEPTION_XML = "application/vnd.ogc.se_xml"; // $NON-NLS-1$

    protected URL onlineResource;
    protected Properties properties;
    protected Map hints;

    /**
     * Creates an AbstractRequest.
     *
     * 

If properties isn't null, it will use them instead of creating a new * Properties object. * *

This constructor will strip all the query parameters off of onlineResource and put them in * the properties map. This allows clients to provide their own parameters and have them saved * and used along with the OWS specific ones. * *

However, certain parameters will be over-written by individual requests themselves. * Examples of such parameters include, but are not limited to: * *

    *
  • WMTVER *
  • REQUEST *
  • VERSION *
  • SERVICE *
* * @param onlineResource the URL to construct the Request for * @param properties a map of pre-set parameters to be used. Can be null. */ public AbstractRequest(URL onlineResource, Properties properties) { if (properties == null) { this.properties = new Properties(); } else { this.properties = properties; } // Need to strip off the query, as getFinalURL will add it back // on, with all the other properties. If we don't, elements will // be duplicated. int index = onlineResource.toExternalForm().lastIndexOf("?"); // $NON-NLS-1$ String urlWithoutQuery = null; if (index <= 0) { urlWithoutQuery = onlineResource.toExternalForm(); if (!isFileUrl(onlineResource)) { urlWithoutQuery += "?"; } } else { urlWithoutQuery = onlineResource.toExternalForm().substring(0, index); boolean once = true; // Doing this preserves all of the query parameters while // enforcing the mandatory ones if (onlineResource.getQuery() != null) { StringTokenizer tokenizer = new StringTokenizer(onlineResource.getQuery(), "&"); // $NON-NLS-1$ while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); String[] param = token.split("="); // $NON-NLS-1$' if (param != null && param.length > 0 && param[0] != null) { String key = param[0]; String value; if (param.length == 1) { // some servers like to keep a few additional settings in their URL // (even though this is not part of the specification we gotta // let them get away with it) if (once) { urlWithoutQuery += "?" + param[0] + "&"; once = false; } else { urlWithoutQuery += param[0] + "&"; } } else { value = param[1]; setProperty(key.toUpperCase(), value); } } } } if (once) { urlWithoutQuery += "?"; } } try { this.onlineResource = new URL(urlWithoutQuery); } catch (MalformedURLException e) { throw new RuntimeException("Error parsing URL. This is likely a bug in the code."); } initService(); initRequest(); initVersion(); } static boolean isFileUrl(URL url) { return url.getProtocol().equalsIgnoreCase("file"); } /** @see org.geotools.data.wms.request.Request#getFinalURL() */ public URL getFinalURL() { if (isFileUrl(onlineResource)) { return onlineResource; } String url = onlineResource.toExternalForm(); if (!url.contains("?")) { // $NON-NLS-1$ url = url.concat("?"); // $NON-NLS-1$ } Iterator iter = properties.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); String value = (String) entry.getValue(); /* * Some servers do not follow the rule that parameter names * must be case insensitive. We will let each specification * implementation deal with it in their own way. */ String param = processKey((String) entry.getKey()); if (value != null && param.length() != 0) { param += "=" + value; } if (iter.hasNext()) { param = param.concat("&"); // $NON-NLS-1$ } url = url.concat(param); } try { return new URL(url); } catch (MalformedURLException e) { java.util.logging.Logger.getGlobal().log(java.util.logging.Level.INFO, "", e); // If something is wrong here, this is something wrong with the code above. } return null; } /** * Some Open Web Servers do not abide by the fact that parameter keys should be case * insensitive. * *

This method will allow a specification to determine the way that the parameter keys should * be encoded in requests made by the server. * * @param key the key to be processed * @return the key, after being processed. (made upper case, for example) */ protected String processKey(String key) { return key; } public void setProperty(String name, String value) { if (value == null) { properties.remove(name); } else { properties.setProperty(name, value); } } /** @return a copy of this request's properties */ public Properties getProperties() { return (Properties) properties.clone(); } protected abstract void initRequest(); /** * Implementing subclass requests must specify their own "SERVICE" value. Example: * setProperty("SERVICE", "WFS"); */ protected abstract void initService(); /** * Sets up the version number for this request. Typically something like setProperty("VERSION", * "1.1.1"); */ protected abstract void initVersion(); /** Default POST content type is xml */ public String getPostContentType() { return "application/xml"; } /** Default to not requiring POST. Implementors can override if they need to. */ public void performPostOutput(OutputStream outputStream) throws IOException {} /** Default to not requiring POST. Implementors can override if they need to. */ public boolean requiresPost() { return false; } @Override public Map getRequestHints() { return hints == null ? Collections.emptyMap() : hints; } @Override public void setRequestHints(Map hints) { this.hints = hints; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy