/*
   * (non-Javadoc)
   *
   * @see com.sun.syndication.io.ModuleParser#parse(org.jdom.Element)
   */
  public Module parse(Element element) {
    GeoRSSModule geoRSSModule = null;
    new SimpleModuleImpl();

    Element pointElement = element.getChild("point", GeoRSSModule.SIMPLE_NS);
    Element lineElement = element.getChild("line", GeoRSSModule.SIMPLE_NS);
    Element polygonElement = element.getChild("polygon", GeoRSSModule.SIMPLE_NS);
    Element boxElement = element.getChild("box", GeoRSSModule.SIMPLE_NS);
    if (pointElement != null) {
      geoRSSModule = new SimpleModuleImpl();
      String coordinates = pointElement.getText();
      String[] coord = coordinates.trim().split(" ");
      Position pos = new Position(Double.parseDouble(coord[1]), Double.parseDouble(coord[0]));
      geoRSSModule.setGeometry(new Point(pos));
    } else if (lineElement != null) {
      geoRSSModule = new SimpleModuleImpl();
      PositionList posList = parsePosList(lineElement);
      geoRSSModule.setGeometry(new LineString(posList));
    } else if (polygonElement != null) {
      geoRSSModule = new SimpleModuleImpl();
      PositionList posList = parsePosList(polygonElement);
      Polygon poly = new Polygon();
      poly.setExterior(new LinearRing(posList));
      geoRSSModule.setGeometry(poly);
    } else {
      geoRSSModule = (GeoRSSModule) GMLParser.parseGML(element);
    }

    return geoRSSModule;
  }
  /*
   * (non-Javadoc)
   * @see com.rometools.rome.io.ModuleGenerator#generate(com.rometools.rome.feed.module.Module,
   * org.jdom2.Element)
   */
  @Override
  public void generate(final Module module, final Element element) {
    // this is not necessary, it is done to avoid the namespace definition
    // in every item.
    Element root = element;
    while (root.getParent() != null && root.getParent() instanceof Element) {
      root = (Element) element.getParent();
    }
    root.addNamespaceDeclaration(GeoRSSModule.SIMPLE_NS);
    root.addNamespaceDeclaration(GeoRSSModule.GML_NS);

    final Element whereElement = new Element("where", GeoRSSModule.SIMPLE_NS);
    element.addContent(whereElement);

    final GeoRSSModule geoRSSModule = (GeoRSSModule) module;
    final AbstractGeometry geometry = geoRSSModule.getGeometry();

    if (geometry instanceof Point) {
      final Position pos = ((Point) geometry).getPosition();

      final Element pointElement = new Element("Point", GeoRSSModule.GML_NS);
      whereElement.addContent(pointElement);

      final Element posElement = new Element("pos", GeoRSSModule.GML_NS);
      posElement.addContent(
          String.valueOf(pos.getLatitude()) + " " + String.valueOf(pos.getLongitude()));
      pointElement.addContent(posElement);
    } else if (geometry instanceof LineString) {
      final PositionList posList = ((LineString) geometry).getPositionList();

      final Element lineElement = new Element("LineString", GeoRSSModule.GML_NS);
      lineElement.addContent(createPosListElement(posList));
      whereElement.addContent(lineElement);
    } else if (geometry instanceof Polygon) {
      final Element polygonElement = new Element("Polygon", GeoRSSModule.GML_NS);
      {
        final AbstractRing ring = ((Polygon) geometry).getExterior();
        if (ring instanceof LinearRing) {
          final Element exteriorElement = new Element("exterior", GeoRSSModule.GML_NS);
          polygonElement.addContent(exteriorElement);
          final Element ringElement = new Element("LinearRing", GeoRSSModule.GML_NS);
          exteriorElement.addContent(ringElement);
          ringElement.addContent(createPosListElement(((LinearRing) ring).getPositionList()));

        } else {
          System.err.println(
              "GeoRSS GML format can't handle rings of type: " + ring.getClass().getName());
        }
      }
      final List<AbstractRing> interiorList = ((Polygon) geometry).getInterior();
      final Iterator<AbstractRing> it = interiorList.iterator();
      while (it.hasNext()) {
        final AbstractRing ring = it.next();
        if (ring instanceof LinearRing) {
          final Element interiorElement = new Element("interior", GeoRSSModule.GML_NS);
          polygonElement.addContent(interiorElement);
          final Element ringElement = new Element("LinearRing", GeoRSSModule.GML_NS);
          interiorElement.addContent(ringElement);
          ringElement.addContent(createPosListElement(((LinearRing) ring).getPositionList()));

        } else {
          System.err.println(
              "GeoRSS GML format can't handle rings of type: " + ring.getClass().getName());
        }
      }
      whereElement.addContent(polygonElement);
    } else if (geometry instanceof Envelope) {
      final Envelope envelope = (Envelope) geometry;
      final Element envelopeElement = new Element("Envelope", GeoRSSModule.GML_NS);
      whereElement.addContent(envelopeElement);

      final Element lowerElement = new Element("lowerCorner", GeoRSSModule.GML_NS);
      lowerElement.addContent(
          String.valueOf(envelope.getMinLatitude())
              + " "
              + String.valueOf(envelope.getMinLongitude()));
      envelopeElement.addContent(lowerElement);

      final Element upperElement = new Element("upperCorner", GeoRSSModule.GML_NS);
      upperElement.addContent(
          String.valueOf(envelope.getMaxLatitude())
              + " "
              + String.valueOf(envelope.getMaxLongitude()));
      envelopeElement.addContent(upperElement);

    } else {
      System.err.println(
          "GeoRSS GML format can't handle geometries of type: " + geometry.getClass().getName());
    }
  }