/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.catalog.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.Reader;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.geoserver.ows.util.XmlCharsetDetector;
import org.w3c.dom.Element;
/**
* Reads a legacy coverage info.xml file.
*
* @author Justin Deoliveira, The Open Planning Project
*
*/
public class LegacyCoverageInfoReader {
/**
* Root catalog element.
*/
Element coverage;
/**
* The directory containing the feature type info.xml file
*/
File parentDirectory;
/**
* Parses the info.xml file into a DOM.
* <p>
* This method *must* be called before any other methods.
* </p>
*
* @param file The info.xml file.
*
* @throws IOException In event of a parser error.
*/
public void read(File file) throws IOException {
parentDirectory = file.getParentFile();
Reader reader = XmlCharsetDetector.getCharsetAwareReader(new FileInputStream(file));
try {
coverage = ReaderUtils.parse(reader);
} finally {
reader.close();
}
}
public String format() {
return coverage.getAttribute( "format" );
}
public String name() {
return ReaderUtils.getChildText(coverage, "name");
}
public String description() {
return ReaderUtils.getChildText(coverage, "description");
}
public String label() {
return ReaderUtils.getChildText(coverage, "label");
}
public Map<String,String> metadataLink() {
HashMap<String,String> ml = new HashMap<String, String>();
ml.put( "about", ReaderUtils.getChildAttribute(coverage, "metadataLink", "about" ) );
ml.put( "metadataType", ReaderUtils.getChildAttribute(coverage, "metadataLink", ",metadataType" ) );
return ml;
}
public List<String> keywords() {
String raw = ReaderUtils.getChildText( coverage, "keywords" );
StringTokenizer st = new StringTokenizer( raw, ", " );
ArrayList keywords = new ArrayList();
while( st.hasMoreTokens() ) {
keywords.add( st.nextToken() );
}
return keywords;
}
public String defaultStyle() throws Exception {
Element styles = ReaderUtils.getChildElement(coverage, "styles" );
return ReaderUtils.getAttribute( styles, "default", true );
}
public List<String> styles() throws Exception {
Element styleRoot = ReaderUtils.getChildElement(coverage, "styles" );
if(styleRoot != null) {
List<String> styleNames = new ArrayList<String>();
Element[] styles = ReaderUtils.getChildElements(styleRoot, "style");
for (Element style : styles) {
styleNames.add(style.getTextContent().trim());
}
return styleNames;
} else {
return Collections.emptyList();
}
}
public Map<String,Object> envelope() throws Exception {
Element envelopeElement = ReaderUtils.getChildElement(coverage, "envelope");
HashMap<String,Object> e = new HashMap<String, Object>();
String nativeCrsWkt = ReaderUtils.getAttribute(envelopeElement, "crs", false);
nativeCrsWkt = nativeCrsWkt.replaceAll("'", "\"");
e.put( "crs", nativeCrsWkt);
e.put( "srsName", ReaderUtils.getAttribute(envelopeElement, "srsName", false));
Element[] posElements = ReaderUtils.getChildElements(envelopeElement, "pos" );
String[] pos1 = posElements[0].getFirstChild().getTextContent().split( " " );
String[] pos2 = posElements[1].getFirstChild().getTextContent().split( " " );
e.put( "x1", Double.parseDouble(pos1[0]) );
e.put( "y1", Double.parseDouble(pos1[1]) );
e.put( "x2", Double.parseDouble(pos2[0]) );
e.put( "y2", Double.parseDouble(pos2[1]) );
return e;
}
public Map<String,Object> grid() throws Exception {
Element gridElement = ReaderUtils.getChildElement(coverage, "grid");
if (gridElement == null) {
return null;
}
HashMap<String,Object> grid = new HashMap<String, Object>();
grid.put( "dimension",
Integer.parseInt( ReaderUtils.getAttribute(gridElement, "dimension", true ) ) );
Element lowElement = ReaderUtils.getChildElement(gridElement, "low");
String[] lows = lowElement.getFirstChild().getTextContent().trim().split( " ");
int[] low = new int[lows.length];
for ( int i = 0; i < low.length; i++ ) {
low[i] = Integer.parseInt( lows[i] );
}
grid.put( "low", low );
Element highElement = ReaderUtils.getChildElement(gridElement, "high" );
String[] highs = highElement.getFirstChild().getTextContent().trim().split( " ");
int[] high = new int[highs.length];
for ( int i = 0; i < high.length; i++ ) {
high[i] = Integer.parseInt( highs[i] );
}
grid.put( "high", high );
Element[] axisNameElements = ReaderUtils.getChildElements( gridElement, "axisName" );
String[] axisName = new String[ axisNameElements.length ];
for ( int i = 0; i < axisName.length; i++ ) {
axisName[i] = axisNameElements[i].getFirstChild().getTextContent();
}
grid.put( "axisName", axisName );
Element geoTransformElement = ReaderUtils.getChildElement( gridElement, "geoTransform" );
if ( geoTransformElement != null) {
Map<String,Double> geoTransform = new HashMap<String, Double>();
String scaleX = ReaderUtils.getChildText( geoTransformElement, "scaleX" );
String scaleY = ReaderUtils.getChildText( geoTransformElement, "scaleY" );
String shearX = ReaderUtils.getChildText( geoTransformElement, "shearX" );
String shearY = ReaderUtils.getChildText( geoTransformElement, "shearY" );
String translateX = ReaderUtils.getChildText( geoTransformElement, "translateX" );
String translateY = ReaderUtils.getChildText( geoTransformElement, "translateY" );
geoTransform.put( "scaleX", scaleX != null ? new Double( scaleX ) : null );
geoTransform.put( "scaleY", scaleY != null ? new Double( scaleY ) : null );
geoTransform.put( "shearX", shearX != null ? new Double( shearX ) : null );
geoTransform.put( "shearY", shearY != null ? new Double( shearY ) : null );
geoTransform.put( "translateX", translateX != null ? new Double( translateX ) : null );
geoTransform.put( "translateY", translateY != null ? new Double( translateY ) : null );
grid.put( "geoTransform", geoTransform );
}
return grid;
}
public List<Map> coverageDimensions() throws Exception {
Element[] cdElements = ReaderUtils.getChildElements( coverage, "CoverageDimension" );
List<Map> cds = new ArrayList<Map>();
for ( int i = 0; i < cdElements.length; i++ ) {
HashMap cd = new HashMap();
cd.put( "name", ReaderUtils.getChildText( cdElements[i], "name" ) );
cd.put( "description", ReaderUtils.getChildText( cdElements[i], "description" ) );
Element intervalElement = ReaderUtils.getChildElement(cdElements[i], "interval");
double min = Double.parseDouble( ReaderUtils.getChildText(intervalElement, "min") );
double max = Double.parseDouble( ReaderUtils.getChildText(intervalElement, "max") );
cd.put( "min", min );
cd.put( "max", max );
cds.add( cd );
}
return cds;
}
public List<String> requestCRSs() throws Exception {
Element supportedCRS = ReaderUtils.getChildElement(coverage, "supportedCRSs" );
String[] requestCRS = ReaderUtils.getChildText( supportedCRS, "requestCRSs" ).trim().split(",");
return Arrays.asList(requestCRS);
}
public List<String> responseCRSs() throws Exception {
Element supportedCRS = ReaderUtils.getChildElement(coverage, "supportedCRSs" );
String[] responseCRS = ReaderUtils.getChildText( supportedCRS, "responseCRSs" ).trim().split(",");
return Arrays.asList(responseCRS);
}
public String nativeFormat() throws Exception {
Element supportedFormats = ReaderUtils.getChildElement(coverage, "supportedFormats" );
return ReaderUtils.getAttribute(supportedFormats, "nativeFormat", true);
}
public List<String> supportedFormats() throws Exception {
Element supportedFormats = ReaderUtils.getChildElement(coverage, "supportedFormats" );
String[] formats = ReaderUtils.getChildText(supportedFormats, "formats" ).split(",");
return Arrays.asList(formats);
}
public String defaultInterpolation() throws Exception {
Element supportedFormats = ReaderUtils.getChildElement(coverage, "supportedInterpolations" );
return ReaderUtils.getAttribute(supportedFormats, "default", true);
}
public List<String> supportedInterpolations() throws Exception {
Element supportedFormats = ReaderUtils.getChildElement(coverage, "supportedInterpolations" );
String[] interpolations = ReaderUtils.getChildText(supportedFormats, "interpolationMethods" ).split(",");
return Arrays.asList(interpolations);
}
public Map<String,Serializable> parameters() {
Element parameters = ReaderUtils.getChildElement(coverage, "parameters");
if ( parameters == null ) {
return Collections.EMPTY_MAP;
}
HashMap<String,Serializable> map = new HashMap<String, Serializable>();
Element[] parameter = ReaderUtils.getChildElements( parameters, "parameter" );
for ( int i = 0; i < parameter.length; i++ ) {
String name = parameter[i].getAttribute("name");
String value = parameter[i].getAttribute( "value" );
map.put( name, value );
}
return map;
}
public String wmsPath() {
return ReaderUtils.getChildText(coverage, "wmspath");
}
public String parentDirectoryName() {
return parentDirectory.getName();
}
}