/* 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.control.rest.repositories;
import com.esri.gpt.framework.context.RequestContext;
import com.esri.gpt.framework.sql.ManagedConnection;
import com.esri.gpt.framework.util.Val;
import com.esri.gpt.framework.xml.XmlIoUtil;
import com.esri.gpt.framework.xml.XsltTemplate;
import com.esri.gpt.framework.xml.XsltTemplates;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.xml.transform.TransformerException;
import org.xml.sax.SAXException;
/**
* Provides utility functions associated with registered CSW reposirories.
*/
public class CswRepository {
/** class variables ============================================================ */
/** Cached templates */
private static XsltTemplates XSLTTEMPLATES = new XsltTemplates();
/** XSLT for transforming CSW capabilities to HTML: "gpt/metadata/ogc/csw-to-html.xslt" */
public static final String XSLT_CSW_TO_HTML = "gpt/metadata/ogc/csw-to-html.xslt";
/** constructors ============================================================ */
/** Default constructor. */
public CswRepository() {}
/** methods ================================================================= */
/**
* Gets a compiled XSLT template.
* @param xsltPath the path to an XSLT
* @return the compiled template
* @throws IOException if an IO exception occurs
* @throws TransformerException if a transformation exception occurs
* @throws SAXException if a SAX parsing exception occurs
*/
private synchronized XsltTemplate getCompiledTemplate(String xsltPath)
throws TransformerException {
String sKey = xsltPath;
XsltTemplate template = XSLTTEMPLATES.get(sKey);
if (template == null) {
template = XsltTemplate.makeTemplate(xsltPath);
XSLTTEMPLATES.put(sKey,template);
}
return template;
}
/**
* Returns the URL associated with a registered CSW repository.
* @param context request context
* @param rid the remote CSW repository id
* @return the registered URL for the remote repository
* @throws SQLException if an exception occurs
*/
public String queryCswUrl(RequestContext context, String rid) throws SQLException {
PreparedStatement st = null;
ManagedConnection mcon = null;
rid = Val.chkStr(rid);
if (rid.length() > 0) {
try {
int nId = -1;
String field = "UUID";
try {
nId = Integer.parseInt(rid);
field = "ID";
} catch (NumberFormatException nfe) {}
String table = context.getCatalogConfiguration().getResourceTableName();
String sql = "SELECT PROTOCOL_TYPE,HOST_URL FROM "+table+" WHERE "+field+"=?";
mcon = context.getConnectionBroker().returnConnection("");
st = mcon.getJdbcConnection().prepareStatement(sql);
if (field.equalsIgnoreCase("ID")) {
st.setInt(1,nId);
} else {
st.setString(1,rid);
}
ResultSet rs = st.executeQuery();
if (rs.next()) {
if (Val.chkStr(rs.getString(1)).equalsIgnoreCase("CSW")) {
return rs.getString(2);
}
}
} finally {
try {if (st != null) st.close();} catch (Exception ef) {}
context.getConnectionBroker().closeConnection(mcon);
}
}
return null;
}
/**
* Transforms the response of a CSW GetCapabilities request to an HTML
* suitable for display within the GPt searach page.
* <br/>gpt/metadata/ogc/csw-to-html.xslt
* @param url the CSW GetCapabilities URL
* @return the HTML representation
* @throws TransformerException if an exception occurs
*/
public String transformToHtml(String url) throws TransformerException {
XsltTemplate template = getCompiledTemplate(CswRepository.XSLT_CSW_TO_HTML);
String xml = template.transform(XmlIoUtil.readXml(url));
return xml;
}
}