package de.gmorling.moapa.videorental.ws.xmlbeans;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.Provider;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceProvider;
import javax.xml.ws.Service.Mode;
import org.apache.xmlbeans.XmlObject;
import org.w3c.dom.Node;
import xmlbeans.FindMoviesByDirectorRequestDocument;
import xmlbeans.FindMoviesByDirectorResponseDocument;
import xmlbeans.GetMovieByIdRequestDocument;
import xmlbeans.GetMovieByIdResponseDocument;
import xmlbeans.FindMoviesByDirectorRequest;
import xmlbeans.GetMovieByIdRequest;
@WebServiceProvider
@ServiceMode(value=Mode.MESSAGE)
public class VideoRentalProvider implements Provider<SOAPMessage> {
public SOAPMessage invoke(SOAPMessage request) {
try {
VideoRentalPortType videoRentalPort = new VideoRentalPort();
Node root = request.getSOAPBody().getFirstChild();
if(root.getNodeName().contains(GetMovieByIdRequest.class.getSimpleName())) {
GetMovieByIdRequestDocument requestDocument = GetMovieByIdRequestDocument.Factory.parse(root);
GetMovieByIdResponseDocument responseDocument = GetMovieByIdResponseDocument.Factory.newInstance();
responseDocument.setGetMovieByIdResponse(videoRentalPort.getMovieById(requestDocument.getGetMovieByIdRequest()));
return createSOAPMessage(responseDocument);
}
else if(root.getNodeName().contains(FindMoviesByDirectorRequest.class.getSimpleName())) {
FindMoviesByDirectorRequestDocument requestDocument = FindMoviesByDirectorRequestDocument.Factory.parse(root);
FindMoviesByDirectorResponseDocument responseDocument = FindMoviesByDirectorResponseDocument.Factory.newInstance();
responseDocument.setFindMoviesByDirectorResponse(videoRentalPort.findMoviesByDirector(requestDocument.getFindMoviesByDirectorRequest()));
return createSOAPMessage(responseDocument);
}
else {
throw new UnsupportedOperationException();
}
}
catch(Exception e) {
throw new RuntimeException(e);
}
}
private SOAPMessage createSOAPMessage(XmlObject responseDocument) {
try {
SOAPMessage message = MessageFactory.newInstance().createMessage();
Node node = message.getSOAPBody().getOwnerDocument().importNode(responseDocument.getDomNode().getFirstChild(), true);
message.getSOAPBody().appendChild(node);
return message;
}
catch(Exception e) {
throw new RuntimeException(e);
}
}
}