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> 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, 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;
  }
  /**
   * Parses the info.xml file into a DOM.
   *
   * <p>This method *must* be called before any other methods.
   *
   * @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 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 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 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 String wmsPath() {
   return ReaderUtils.getChildText(coverage, "wmspath");
 }
 public String defaultStyle() throws Exception {
   Element styles = ReaderUtils.getChildElement(coverage, "styles");
   return ReaderUtils.getAttribute(styles, "default", true);
 }
 public String label() {
   return ReaderUtils.getChildText(coverage, "label");
 }
 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 name() {
   return ReaderUtils.getChildText(coverage, "name");
 }
 public String description() {
   return ReaderUtils.getChildText(coverage, "description");
 }
 public String nativeFormat() throws Exception {
   Element supportedFormats = ReaderUtils.getChildElement(coverage, "supportedFormats");
   return ReaderUtils.getAttribute(supportedFormats, "nativeFormat", true);
 }
  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<String> supportedFormats() throws Exception {
   Element supportedFormats = ReaderUtils.getChildElement(coverage, "supportedFormats");
   String[] formats = ReaderUtils.getChildText(supportedFormats, "formats").split(",");
   return Arrays.asList(formats);
 }
 public List<String> supportedInterpolations() throws Exception {
   Element supportedFormats = ReaderUtils.getChildElement(coverage, "supportedInterpolations");
   String[] interpolations =
       ReaderUtils.getChildText(supportedFormats, "interpolationMethods").split(",");
   return Arrays.asList(interpolations);
 }
 public String defaultInterpolation() throws Exception {
   Element supportedFormats = ReaderUtils.getChildElement(coverage, "supportedInterpolations");
   return ReaderUtils.getAttribute(supportedFormats, "default", true);
 }