package at.gv.egovernment.moa.id.auth.invoke;
import java.util.Vector;
import javax.xml.namespace.QName;
import javax.xml.rpc.Call;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import org.apache.axis.message.SOAPBodyElement;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import at.gv.egovernment.moa.id.ServiceException;
import at.gv.egovernment.moa.id.config.ConnectionParameter;
import at.gv.egovernment.moa.id.config.auth.AuthConfigurationProvider;
import at.gv.egovernment.moa.logging.Logger;
import at.gv.egovernment.moa.spss.api.SignatureVerificationService;
import at.gv.egovernment.moa.spss.api.xmlbind.VerifyXMLSignatureRequestParser;
import at.gv.egovernment.moa.spss.api.xmlbind.VerifyXMLSignatureResponseBuilder;
import at.gv.egovernment.moa.spss.api.xmlverify.VerifyXMLSignatureRequest;
import at.gv.egovernment.moa.spss.api.xmlverify.VerifyXMLSignatureResponse;
/**
* Invoker of the SignatureVerification
web service of MOA-SPSS.
* Either invokes the web service, or calls the corresponding API, depending on configuration data.
*
* @author Stefan Knirsch
* @version $Id$
*/
public class SignatureVerificationInvoker {
/** This QName Object identifies the SignatureVerification endpoint of the web service */
private static final QName SERVICE_QNAME = new QName("SignatureVerification");
/**
* Method verifyXMLSignature.
* @param request to be sent
* @return Element with the answer
* @throws ServiceException if an error occurs
*/
public Element verifyXMLSignature(Element request) throws ServiceException {
return doCall(SERVICE_QNAME, request);
}
/**
* Method doCall.
* @param serviceName the name of the service
* @param request the request to be sent
* @return Element the answer
* @throws ServiceException if an error occurs
*/
protected Element doCall(QName serviceName, Element request) throws ServiceException {
ConnectionParameter authConnParam = null;
try {
Service service = ServiceFactory.newInstance().createService(serviceName);
Call call = service.createCall();
SOAPBodyElement body = new SOAPBodyElement(request);
SOAPBodyElement[] params = new SOAPBodyElement[] { body };
Vector responses;
SOAPBodyElement response;
String endPoint;
AuthConfigurationProvider authConfigProvider = AuthConfigurationProvider.getInstance();
authConnParam = authConfigProvider.getMoaSpConnectionParameter();
//If the ConnectionParameter do NOT exist, we try to get the api to work....
if (authConnParam != null) {
endPoint = authConnParam.getUrl();
call.setTargetEndpointAddress(endPoint);
responses = (Vector) call.invoke(serviceName, params);
response = (SOAPBodyElement) responses.get(0);
return response.getAsDOM();
}
else {
SignatureVerificationService svs = SignatureVerificationService.getInstance();
VerifyXMLSignatureRequest vsrequest = new VerifyXMLSignatureRequestParser().parse(request);
VerifyXMLSignatureResponse vsresponse = svs.verifyXMLSignature(vsrequest);
Document result = new VerifyXMLSignatureResponseBuilder().build(vsresponse);
Logger.setHierarchy("moa.id.auth");
return result.getDocumentElement();
}
}
catch (Exception ex) {
if (authConnParam != null) {
throw new ServiceException("service.00", new Object[] { ex.toString()}, ex);
} else {
throw new ServiceException("service.03", new Object[] { ex.toString()}, ex);
}
}
}
}