/* See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * Esri Inc. licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * 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 com.esri.gpt.server.csw.client; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; import org.apache.commons.httpclient.HttpClient; import org.xml.sax.InputSource; import org.xml.sax.SAXException; /** * Maintains information of CSW Catalog * * The catalogs contain all the information like url, profile information * credentials and capabilities. */ public class CswCatalog implements Comparable { /** The base url. */ private String baseUrl; /** The capabilities. */ private CswCatalogCapabilities capabilities = null; /** The credentials. */ private UsernamePasswordCredentials credentials; /** The id. */ private String id; /** The ID counter. */ private static int IDCounter = 1; /** The is connected. */ private boolean isConnected = false; /** The locking. */ private boolean locking = false; /** The name. */ private String name; /** The profile. */ private CswProfile profile; /** The url. */ private String url; /** The request timeout ms. */ private int responseTimeoutMs; /** The connection timeout ms. */ private int connectionTimeoutMs; private HttpClient batchHttpClient; /** * Instantiates a new csw catalog. */ public CswCatalog() { } /** * Creates instance of the catalog. * * @param url the url * @param name the name * @param profile the profile */ public CswCatalog(String url, String name, CswProfile profile) { this.url = url; this.id = this.url; this.name = name; this.profile = profile; } /** * Gets the underlying Apache HttpClient to be used for batch requests to the * same server. * * @return the batch client */ public HttpClient getBatchHttpClient() { return this.batchHttpClient; } /** * Sets the underlying Apache HttpClient to be used for batch requests to the * same server. * * @param batchHttpClient the batch client */ public void setBatchHttpClient(HttpClient batchHttpClient) { this.batchHttpClient = batchHttpClient; } /** * Gets the base url. * * @return the base url */ public String getBaseUrl() { return baseUrl; } /** * Sets the base url. * * @param baseUrl the new base url */ public void setBaseUrl(String baseUrl) { this.baseUrl = baseUrl; } /** * Gets the connection timeout ms. * * @return the connection timeout ms */ public int getConnectionTimeoutMs() { return connectionTimeoutMs; } /** * Sets the connection timeout ms. * * @param connectionTimeoutMs the new connection timeout ms */ public void setConnectionTimeoutMs(int connectionTimeoutMs) { this.connectionTimeoutMs = connectionTimeoutMs; } /** * Gets the request timeout ms. * * @return the request timeout ms */ public int getResponseTimeoutMs() { return responseTimeoutMs; } /** * Sets the request timeout ms. * * @param requestTimeoutMs the new request timeout ms */ public void setResponseTimeoutMs(int requestTimeoutMs) { this.responseTimeoutMs = requestTimeoutMs; } /** * Execute GetCapabilities using SAX objects. Send GetCapabilities request, * receive the response from a service, and parse the response to get URLs for * "GetRecords" and "GetRecordsById". * * @return the csw catalog capabilities * @throws SAXException the sAX exception * @throws IOException Signals that an I/O exception has occurred. * @throws ParserConfigurationException the parser configuration exception * @return Csw Capabilities object */ private CswCatalogCapabilities executeGetCapabilitiesWithSAX() throws SAXException, IOException, ParserConfigurationException { CswCatalogCapabilities capabilities = new CswCatalogCapabilities(); CswClient client = new CswClient(); client.setConnectTimeout(this.getConnectionTimeoutMs()); client.setReadTimeout(this.getResponseTimeoutMs()); client.setBatchHttpClient(getBatchHttpClient()); // Execute submission and parsing into response element InputStream responseStream = client.submitHttpRequest("GET", url, ""); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(true); CapabilitiesParse cParse = new CapabilitiesParse(capabilities); factory.newSAXParser().parse(new InputSource(responseStream), cParse); this.capabilities = capabilities; Utils.close(responseStream); return capabilities; } /** * Gets the capabilities. * * @return the capabilities */ public CswCatalogCapabilities getCapabilities() { return this.capabilities; } /** * Sets the capabilities. * * @param capabilities the new capabilities */ public void setCapabilities(CswCatalogCapabilities capabilities) { this.capabilities = capabilities; } /** * Gets the credentials. * * @return the credentials */ public UsernamePasswordCredentials getCredentials() { return credentials; } /** * Sets the credentials. * * @param credentials the new credentials */ public void setCredentials(UsernamePasswordCredentials credentials) { this.credentials = credentials; } /** * Gets the id. * * @return the id */ public String getId() { return id; } /** * Sets the id. * * @param id the new id */ public void setId(String id) { this.id = id; } /** * Gets the name. * * @return the name */ public String getName() { return name; } /** * Sets the name. * * @param name the new name */ public void setName(String name) { // if there is no input for name, use url as a name if (name == null || name.length() == 0) { name = url; } this.name = name; } /** * Gets the profile. * * @return the profile */ public CswProfile getProfile() { return profile; } /** * Sets the profile. * * @param profile the new profile */ public void setProfile(CswProfile profile) { this.profile = profile; } /** * Gets the url. * * @return the url */ public String getUrl() { return url; } /** * Sets the url. * * @param url the new url */ public void setUrl(String url) { this.url = url; } /** * To connect to a catalog service. The capabilties details are populated based * on the service. * * @return true if connection can be made to the csw service * @throws ParserConfigurationException the parser configuration exception * @throws IOException Signals that an I/O exception has occurred. * @throws SAXException the sAX exception */ public boolean connect() throws SAXException, IOException, ParserConfigurationException { // Execute getCapabilites and setup URLs for "GetRecords" and "GetRecordById" CswCatalogCapabilities capabilities = executeGetCapabilitiesWithSAX(); this.isConnected = capabilities.isReady(); return this.isConnected; } /** * To test if already connected to a catalog service. * * @return true if connection has already been made to the csw service else * false */ public boolean IsConnected() { return this.isConnected; } /** * Locking. * * @return true, if successful */ public boolean Locking() { return false; } public int compareTo(Object arg0) { // TODO: IMPLEMENT THIS LATER return 0; } }