/**
   * It parses the gml:MultiPolygon tag
   *
   * @param parser The XML parser
   * @param handler The GPE parser that contains the content handler and the error handler
   * @return A multipolygon
   * @throws XmlStreamException
   * @throws IOException
   */
  public Object parse(IXmlStreamReader parser, GPEDefaultGmlParser handler)
      throws XmlStreamException, IOException {
    boolean endFeature = false;
    int currentTag;
    Object multiPolygon = null;

    super.setAtributtes(parser, handler.getErrorHandler());

    multiPolygon = handler.getContentHandler().startMultiPolygon(id, srsName);

    QName tag = parser.getName();
    currentTag = parser.getEventType();

    while (!endFeature) {
      switch (currentTag) {
        case IXmlStreamReader.START_ELEMENT:
          parseTag(parser, handler, tag, id, multiPolygon, srsName);
          break;
        case IXmlStreamReader.END_ELEMENT:
          endFeature = parseLastTag(parser, handler, tag);
          if (endFeature) {
            handler.getContentHandler().endMultiPolygon(multiPolygon);
          }
          break;
        case IXmlStreamReader.CHARACTERS:
          break;
      }
      if (!endFeature) {
        currentTag = parser.next();
        tag = parser.getName();
      }
    }
    return multiPolygon;
  }
  /**
   * It parses the gml:LinearRing tag and return the Object
   *
   * @param parser The XML parser
   * @param handler The GPE parser that contains the content handler and the error handler
   * @return A linear ring
   * @throws XmlStreamException
   * @throws IOException
   */
  public Object parse(IXmlStreamReader parser, GPEDefaultGmlParser handler)
      throws XmlStreamException, IOException {
    Object linearRing = null;

    super.setAtributtes(parser, handler.getErrorHandler());

    ICoordinateIterator coordinatesIteartor = parseCoordinates(parser, handler);

    linearRing = handler.getContentHandler().startLinearRing(id, coordinatesIteartor, srsName);
    handler.getContentHandler().endLinearRing(linearRing);

    return linearRing;
  }
  /**
   * It parses the gml:MultiPoint tag
   *
   * @param parser The XML parser
   * @param handler The GPE parser that contains the content handler and the error handler
   * @return A multipoint
   * @throws XmlStreamException
   * @throws IOException
   */
  public Object parse(IXmlStreamReader parser, GPEDefaultGmlParser handler)
      throws XmlStreamException, IOException {
    boolean endFeature = false;
    int currentTag;
    Object multiPoint = null;

    super.setAtributtes(parser, handler.getErrorHandler());

    multiPoint = handler.getContentHandler().startMultiPoint(id, srsName);

    QName tag = parser.getName();
    currentTag = parser.getEventType();

    while (!endFeature) {
      switch (currentTag) {
        case IXmlStreamReader.START_ELEMENT:
          if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_POINTMEMBER)) {
            Object point = handler.getProfile().getPointMemberTypeBinding().parse(parser, handler);
            handler.getContentHandler().addPointToMultiPoint(point, multiPoint);
          }
          break;
        case IXmlStreamReader.END_ELEMENT:
          if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIPOINT)) {
            endFeature = true;
            handler.getContentHandler().endMultiPoint(multiPoint);
          }
          break;
        case IXmlStreamReader.CHARACTERS:
          break;
      }
      if (!endFeature) {
        currentTag = parser.next();
        tag = parser.getName();
      }
    }
    return multiPoint;
  }
  /**
   * It parses the gml:multiPointProperty tag
   *
   * @param parser The XML parser
   * @param handler The GPE parser that contains the content handler and the error handler
   * @return A multipoint
   * @throws XmlStreamException
   * @throws IOException
   */
  public Object parse(IXmlStreamReader parser, GPEDefaultGmlParser handler)
      throws XmlStreamException, IOException {
    boolean endFeature = false;
    int currentTag;
    Object multiPoint = null;

    super.setAtributtes(parser, handler.getErrorHandler());

    QName tag = parser.getName();
    currentTag = parser.getEventType();

    while (!endFeature) {
      switch (currentTag) {
        case IXmlStreamReader.START_ELEMENT:
          if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIPOINT)) {
            multiPoint = handler.getProfile().getMultiPointTypeBinding().parse(parser, handler);
          }
          break;
        case IXmlStreamReader.END_ELEMENT:
          if ((CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIPOINTPROPERTY))
              || (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTILOCATION))
              || (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTICENTEROF))
              || (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIPOSITION))) {
            endFeature = true;
          }
          break;
        case IXmlStreamReader.CHARACTERS:
          break;
      }
      if (!endFeature) {
        currentTag = parser.next();
        tag = parser.getName();
      }
    }
    return multiPoint;
  }