def parseDoc()

in app/helpers/S3XMLProcessor.scala [92:149]


  def parseDoc(xml:XMLEventReader)(cb:Either[S3Error, ListBucketResultContents]=>Unit): Unit = {
    def loop(currNode: List[String], bucketName:String, inBucketName:Boolean=false): Unit = {
      logger.debug(s"in loop: $currNode")
      logger.debug(s"xml.hasNext: ${xml.hasNext}")
      if(xml.hasNext){
        xml.next() match {
          case EvElemStart(prefix, label, attrs, scope)=>
            logger.debug(s"start element: $label")
            if(label=="Contents"){
              logger.debug("Got contents")
              parseContentNode(xml, bucketName) match {
                case Some(result)=>
                  logger.debug(s"Got $result")
                  cb(Right(result))
                case None=>logger.error(s"Could not build ListBucketResult")
              }
            } else if(label=="Error"){
              val errorData = captureFromXml(xml, List.empty, Map.empty)
              S3Error.fromMap(errorData) match {
                case Success(err)=>cb(Left(err))
                case Failure(excp)=>
                  logger.error("Could not generate error entity: ", excp)
              }
            }

            if(label=="Name"){
              loop(label::currNode, bucketName, inBucketName = true)
            } else {
              loop(label::currNode, bucketName)
            }

          case EvElemEnd(prefix, label)=>
            logger.debug(s"end element: $label")
            if(label=="Bucket"){
              loop(currNode.tail, bucketName)
            } else {
              loop(currNode.tail, bucketName, inBucketName)
            }
          case EvText(text)=>
            logger.debug(s"text: '$text'")
            if(inBucketName){
              logger.debug(s"Got bucketname $text")
              loop(currNode, bucketName + text.trim, inBucketName)
            } else {
              loop(currNode, bucketName, inBucketName)
            }

          case EvEntityRef(entity)=>
            logger.debug(s"entity: $entity")
            loop(currNode, bucketName, inBucketName)
          case _=>
            logger.debug("Got nothing")
            loop(currNode, bucketName, inBucketName)
        }
      }
    }
    loop(List.empty, "")
  }