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, "")
}