private DataServicesAtomEntry parseDSAtomEntry(
     String etag, XMLEventReader2 reader, XMLEvent2 event) {
   DataServicesAtomEntry dsae = new DataServicesAtomEntry();
   dsae.etag = etag;
   dsae.properties = Enumerable.create(parseProperties(reader, event.asStartElement())).toList();
   return dsae;
 }
  private AtomEntry parseEntry(XMLEventReader2 reader, StartElement2 entryElement) {

    String id = null;
    String categoryTerm = null;
    String categoryScheme = null;
    String title = null;
    String summary = null;
    String updated = null;
    String contentType = null;
    List<AtomLink> atomLinks = new ArrayList<AtomLink>();

    String etag = getAttributeValueIfExists(entryElement, M_ETAG);

    AtomEntry rt = null;

    while (reader.hasNext()) {
      XMLEvent2 event = reader.nextEvent();

      if (event.isEndElement() && event.asEndElement().getName().equals(entryElement.getName())) {
        rt.id = id; // http://localhost:8810/Oneoff01.svc/Comment(1)
        rt.title = title;
        rt.summary = summary;
        rt.updated = updated;
        rt.categoryScheme =
            categoryScheme; // http://schemas.microsoft.com/ado/2007/08/dataservices/scheme
        rt.categoryTerm = categoryTerm; // NorthwindModel.Customer
        rt.contentType = contentType;
        rt.atomLinks = atomLinks;

        if (rt instanceof DataServicesAtomEntry) {
          DataServicesAtomEntry dsae = (DataServicesAtomEntry) rt;
          String entitySetName = this.entitySetName;
          if (rt.id != null && rt.id.endsWith(")")) entitySetName = parseEntitySetName(rt.id);
          EdmEntitySet ees = metadata.findEdmEntitySet(entitySetName);
          if (ees == null) {
            // panic! could not determine the entity-set, is it a function?
            EdmFunctionImport efi = metadata.findEdmFunctionImport(entitySetName);
            if (efi != null) ees = efi.entitySet;
          }
          if (ees == null)
            throw new RuntimeException("Could not derive the entity-set for entry: " + rt.id);
          dsae.setOEntity(entityFromAtomEntry(metadata, ees, dsae, fcMapping));
        }
        return rt;
      }

      if (isStartElement(event, ATOM_ID)) {
        id = reader.getElementText();
      } else if (isStartElement(event, ATOM_TITLE)) {
        title = reader.getElementText();
      } else if (isStartElement(event, ATOM_SUMMARY)) {
        summary = reader.getElementText();
      } else if (isStartElement(event, ATOM_UPDATED)) {
        updated = reader.getElementText();
      } else if (isStartElement(event, ATOM_CATEGORY)) {
        categoryTerm = getAttributeValueIfExists(event.asStartElement(), "term");
        categoryScheme = getAttributeValueIfExists(event.asStartElement(), "scheme");

      } else if (isStartElement(event, ATOM_LINK)) {
        AtomLink link = parseAtomLink(reader, event.asStartElement());
        atomLinks.add(link);
      } else if (isStartElement(event, M_PROPERTIES)) {
        rt = parseDSAtomEntry(etag, reader, event);
      } else if (isStartElement(event, ATOM_CONTENT)) {
        contentType = getAttributeValueIfExists(event.asStartElement(), "type");

        if (contentType.equals(MediaType.APPLICATION_XML)) {

          StartElement2 contentElement = event.asStartElement();
          StartElement2 valueElement = null;
          while (reader.hasNext()) {

            XMLEvent2 event2 = reader.nextEvent();

            if (valueElement == null && event2.isStartElement()) {
              valueElement = event2.asStartElement();

              if (isStartElement(event2, M_PROPERTIES)) {
                rt = parseDSAtomEntry(etag, reader, event2);
              } else {
                BasicAtomEntry bae = new BasicAtomEntry();
                bae.content = innerText(reader, event2.asStartElement());
                rt = bae;
              }
            }
            if (event2.isEndElement()
                && event2.asEndElement().getName().equals(contentElement.getName())) {

              break;
            }
          }

        } else {
          BasicAtomEntry bae = new BasicAtomEntry();
          bae.content = innerText(reader, event.asStartElement());
          rt = bae;
        }
      }
    }

    throw new RuntimeException();
  }