package com.flickr4java.flickr;
import com.flickr4java.flickr.util.XMLUtilities;
import org.apache.axis.message.SOAPBody;
import org.apache.axis.message.SOAPEnvelope;
import org.apache.axis.message.SOAPFault;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/**
* Flickr SOAP Response object.
*
* @author Matt Ray
*/
public class SOAPResponse implements Response {
private static Logger _log = Logger.getLogger(SOAPResponse.class);
private List<Element> payload;
private String errorCode;
private String errorMessage;
private final SOAPEnvelope envelope;
public SOAPResponse(SOAPEnvelope envelope) {
this.envelope = envelope;
}
@Override
public void parse(Document document) {
try {
SOAPBody body = (SOAPBody) envelope.getBody();
if (Flickr.debugStream) {
_log.debug("SOAP RESPONSE.parse");
_log.debug(body.getAsString());
}
SOAPFault fault = (SOAPFault) body.getFault();
if (fault != null) {
_log.warn("FAULT: " + fault.getAsString());
errorCode = fault.getFaultCode();
errorMessage = fault.getFaultString();
} else {
for (@SuppressWarnings("unchecked")
Iterator<Element> i = body.getChildElements(); i.hasNext();) {
Element bodyelement = i.next();
bodyelement.normalize();
// TODO: Verify that the payload is always a single XML node
payload = (List<Element>) XMLUtilities.getChildElements(bodyelement);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public String getStat() {
return null;
}
@Override
public Element getPayload() {
if (payload.isEmpty()) {
throw new RuntimeException("SOAP response payload has no elements");
}
return payload.get(0);
}
@Override
public Collection<Element> getPayloadCollection() {
return payload;
}
@Override
public boolean isError() {
return errorCode != null;
}
@Override
public String getErrorCode() {
return errorCode;
}
@Override
public String getErrorMessage() {
return errorMessage;
}
}