/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 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.gce.imagemosaic.jdbc;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.geotools.data.jdbc.datasource.DBCPDataSourceFactory;
import org.geotools.data.jdbc.datasource.JNDIDataSourceFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
/**
* Class for holding the config info read from the xml config file
*
* @author mcr
*
*/
public class Config {
static private Map<String, Config> ConfigMap = new Hashtable<String, Config>(); // Hashtable
// is
// synchronized
private String xmlUrl;
private String coverageName;
private String geoRasterAttribute;
private String coordsys;
private SpatialExtension spatialExtension;
private String dstype;
private String username;
private String password;
private String jdbcUrl;
private String driverClassName;
private Integer maxActive;
private Integer maxIdle;
private String jndiReferenceName;
private String coverageNameAttribute;
private String blobAttributeNameInTileTable;
private String keyAttributeNameInTileTable;
private String keyAttributeNameInSpatialTable;
private String geomAttributeNameInSpatialTable;
private String maxXAttribute;
private String maxYAttribute;
private String minXAttribute;
private String minYAttribute;
private String masterTable;
private String resXAttribute;
private String resYAttribute;
private String tileTableNameAtribute;
private String spatialTableNameAtribute;
private String sqlUpdateMosaicStatement;
private String sqlSelectCoverageStatement;
private String sqlUpdateResStatement;
private Boolean verifyCardinality;
private Integer interpolation;
private String tileMaxXAttribute;
private String tileMaxYAttribute;
private String tileMinXAttribute;
private String tileMinYAttribute;
private String jdbcAccessClassName;
protected Config() {
}
public static Config readFrom(URL xmlURL) throws Exception {
Config result = ConfigMap.get(xmlURL.toString());
if (result != null) {
return result;
}
InputStream in = xmlURL.openStream();
InputSource input = new InputSource(xmlURL.toString());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setIgnoringElementContentWhitespace(true);
dbf.setIgnoringComments(true);
DocumentBuilder db = dbf.newDocumentBuilder();
// db.setEntityResolver(new ConfigEntityResolver(xmlURL));
Document dom = db.parse(input);
in.close();
result = new Config();
result.xmlUrl = xmlURL.toString();
result.dstype = readValueString(dom, "dstype");
result.username = readValueString(dom, "username");
result.password = readValueString(dom, "password");
result.jdbcUrl = readValueString(dom, "jdbcUrl");
result.driverClassName = readValueString(dom, "driverClassName");
result.jndiReferenceName = readValueString(dom, "jndiReferenceName");
result.maxActive = readValueInteger(dom, "maxActive");
result.maxIdle = readValueInteger(dom, "maxIdle");
result.coordsys = readNameString(dom.getDocumentElement(), "coordsys");
result.coverageName = readNameString(dom.getDocumentElement(), "coverageName");
Node tmp = dom.getElementsByTagName("scaleop").item(0);
NamedNodeMap map = tmp.getAttributes();
String s = map.getNamedItem("interpolation").getNodeValue();
result.interpolation = new Integer(s);
// db mapping
result.spatialExtension = SpatialExtension.fromString(readNameString(dom
.getDocumentElement(), "spatialExtension"));
if (SpatialExtension.GEORASTER.equals(result.spatialExtension))
readForOracleGeoRaster(result, dom);
else if (SpatialExtension.CUSTOM.equals(result.spatialExtension)) {
readForCustom(result, dom);
}
else {
readMapping(result, dom);
result.initStatements();
}
ConfigMap.put(xmlURL.toString(), result);
return result;
}
static void readMapping(Config result, Document dom) {
result.masterTable = readNameString(dom.getDocumentElement(), "masterTable");
Element masterTableElem = (Element) dom.getElementsByTagName("masterTable").item(0);
result.coverageNameAttribute = readNameString(masterTableElem, "coverageNameAttribute");
result.maxXAttribute = readNameString(masterTableElem, "maxXAttribute");
result.maxYAttribute = readNameString(masterTableElem, "maxYAttribute");
result.minXAttribute = readNameString(masterTableElem, "minXAttribute");
result.minYAttribute = readNameString(masterTableElem, "minYAttribute");
result.resXAttribute = readNameString(masterTableElem, "resXAttribute");
result.resYAttribute = readNameString(masterTableElem, "resYAttribute");
result.tileTableNameAtribute = readNameString(masterTableElem, "tileTableNameAtribute");
result.spatialTableNameAtribute = readNameString(masterTableElem,
"spatialTableNameAtribute");
Element tileTableElem = (Element) dom.getElementsByTagName("tileTable").item(0);
result.blobAttributeNameInTileTable = readNameString(tileTableElem, "blobAttributeName");
result.keyAttributeNameInTileTable = readNameString(tileTableElem, "keyAttributeName");
Element spatialTableElem = (Element) dom.getElementsByTagName("spatialTable").item(0);
result.keyAttributeNameInSpatialTable = readNameString(spatialTableElem, "keyAttributeName");
result.geomAttributeNameInSpatialTable = readNameString(spatialTableElem,
"geomAttributeName");
result.tileMaxXAttribute = readNameString(spatialTableElem, "tileMaxXAttribute");
result.tileMaxYAttribute = readNameString(spatialTableElem, "tileMaxYAttribute");
result.tileMinXAttribute = readNameString(spatialTableElem, "tileMinXAttribute");
result.tileMinYAttribute = readNameString(spatialTableElem, "tileMinYAttribute");
Node tmp = dom.getElementsByTagName("verify").item(0);
NamedNodeMap map = tmp.getAttributes();
String s = map.getNamedItem("cardinality").getNodeValue();
result.verifyCardinality = new Boolean(s);
}
static void readForOracleGeoRaster(Config result, Document dom) {
result.masterTable = readNameString(dom.getDocumentElement(), "masterTable");
Element masterTableElem = (Element) dom.getElementsByTagName("masterTable").item(0);
result.coverageNameAttribute = readNameString(masterTableElem, "coverageNameAttribute");
result.geoRasterAttribute = readNameString(masterTableElem, "geoRasterAttribute");
}
static void readForCustom(Config result, Document dom) {
result.jdbcAccessClassName = readNameString(dom.getDocumentElement(), "jdbcAccessClassName");
}
private void initStatements() {
StringBuffer buff = null;
buff = new StringBuffer("update ").append(masterTable).append(" set ");
buff.append(maxXAttribute).append(" = ?,");
buff.append(maxYAttribute).append(" = ?,");
buff.append(minXAttribute).append(" = ?,");
buff.append(minYAttribute).append(" = ?");
buff.append(" where ").append(coverageNameAttribute).append(" = ? ");
buff.append(" and ").append(tileTableNameAtribute).append(" = ? ");
buff.append(" and ").append(spatialTableNameAtribute).append(" = ? ");
sqlUpdateMosaicStatement = buff.toString();
buff = new StringBuffer("select * from ").append(masterTable).append(" where ").append(
coverageNameAttribute).append(" = ? ");
sqlSelectCoverageStatement = buff.toString();
buff = new StringBuffer("update ").append(masterTable).append(" set ");
buff.append(resXAttribute).append(" = ?,");
buff.append(resYAttribute).append(" = ? ");
buff.append(" where ").append(coverageNameAttribute).append(" = ? ");
buff.append(" and ").append(tileTableNameAtribute).append(" = ? ");
buff.append(" and ").append(spatialTableNameAtribute).append(" = ? ");
sqlUpdateResStatement = buff.toString();
}
static private String readValueString(Document dom, String elemName) {
Node n = readValueAttribute(dom, elemName);
if (n == null) {
return null;
}
return n.getNodeValue();
}
static private String readNameString(Element elem, String elemName) {
Node n = readNameAttribute(elem, elemName);
if (n == null) {
return null;
}
return n.getNodeValue();
}
static private Integer readValueInteger(Document dom, String elemName) {
Node n = readValueAttribute(dom, elemName);
if (n == null) {
return null;
}
return new Integer(n.getNodeValue());
}
static private Node readValueAttribute(Document dom, String elemName) {
NodeList list = dom.getElementsByTagName(elemName);
Node n = list.item(0);
if (n == null) {
return null;
}
return n.getAttributes().getNamedItem("value");
}
static private Node readNameAttribute(Element elem, String elemName) {
NodeList list = elem.getElementsByTagName(elemName);
Node n = list.item(0);
if (n == null) {
return null;
}
return n.getAttributes().getNamedItem("name");
}
public Map<String, Object> getDataSourceParams() {
Map<String, Object> result = new HashMap<String, Object>();
if ("DBCP".equals(dstype)) {
result.put(DBCPDataSourceFactory.DSTYPE.key, dstype);
result.put(DBCPDataSourceFactory.USERNAME.key, username);
result.put(DBCPDataSourceFactory.PASSWORD.key, password);
result.put(DBCPDataSourceFactory.JDBC_URL.key, jdbcUrl);
result.put(DBCPDataSourceFactory.DRIVERCLASS.key, driverClassName);
result.put(DBCPDataSourceFactory.MAXACTIVE.key, maxActive);
result.put(DBCPDataSourceFactory.MAXIDLE.key, maxIdle);
}
if ("JNDI".equals(dstype)) {
result.put(JNDIDataSourceFactory.DSTYPE.key, dstype);
result.put(JNDIDataSourceFactory.JNDI_REFNAME.key, jndiReferenceName);
}
return result;
}
public String getBlobAttributeNameInTileTable() {
return blobAttributeNameInTileTable;
}
public String getKeyAttributeNameInSpatialTable() {
return keyAttributeNameInSpatialTable;
}
public String getKeyAttributeNameInTileTable() {
return keyAttributeNameInTileTable;
}
public String getJdbcUrl() {
return jdbcUrl;
}
public String getJndiReferenceName() {
return jndiReferenceName;
}
public String getSqlUpdateMosaicStatement() {
return sqlUpdateMosaicStatement;
}
public String getSqlSelectCoverageStatement() {
return sqlSelectCoverageStatement;
}
public String getSpatialTableNameAtribute() {
return spatialTableNameAtribute;
}
public String getTileTableNameAtribute() {
return tileTableNameAtribute;
}
public String getSqlUpdateResStatement() {
return sqlUpdateResStatement;
}
// String getTileTableSelectString(String tileTableName) {
// StringBuffer buff = new StringBuffer ("select
// ").append(blobAttributeNameInTileTable ).append(" from ")
// .append(tileTableName).append(" where ")
// .append(keyAttributeNameInTileTable).append( " = ? ");
// return buff.toString();
// }
public String getMaxXAttribute() {
return maxXAttribute;
}
public String getMaxYAttribute() {
return maxYAttribute;
}
public String getMinXAttribute() {
return minXAttribute;
}
public String getMinYAttribute() {
return minYAttribute;
}
public String getResXAttribute() {
return resXAttribute;
}
public String getResYAttribute() {
return resYAttribute;
}
public String getCoordsys() {
return coordsys;
}
public String getCoverageName() {
return coverageName;
}
public Integer getInterpolation() {
return interpolation;
}
public String getXmlUrl() {
return xmlUrl;
}
public Boolean getVerifyCardinality() {
return verifyCardinality;
}
public String getDriverClassName() {
return driverClassName;
}
public String getMasterTable() {
return masterTable;
}
public String getCoverageNameAttribute() {
return coverageNameAttribute;
}
public String getGeoRasterAttribute() {
return geoRasterAttribute;
}
public String getPassword() {
return password;
}
public String getUsername() {
return username;
}
public String getTileMaxXAttribute() {
return tileMaxXAttribute;
}
public String getTileMaxYAttribute() {
return tileMaxYAttribute;
}
public String getTileMinXAttribute() {
return tileMinXAttribute;
}
public String getTileMinYAttribute() {
return tileMinYAttribute;
}
public String getGeomAttributeNameInSpatialTable() {
return geomAttributeNameInSpatialTable;
}
public SpatialExtension getSpatialExtension() {
return spatialExtension;
}
public String getJdbcAccessClassName() {
return jdbcAccessClassName;
}
}