package at.gv.egovernment.moa.spss.server.service; import java.util.Collections; import javax.xml.namespace.QName; import org.apache.axis.AxisFault; import org.apache.axis.i18n.Messages; import org.w3c.dom.Element; import at.gv.egovernment.moa.logging.Logger; import at.gv.egovernment.moa.spss.MOAException; import at.gv.egovernment.moa.spss.MOASystemException; import at.gv.egovernment.moa.spss.api.xmlbind.CreateXMLSignatureRequestParser; import at.gv.egovernment.moa.spss.api.xmlbind.CreateXMLSignatureResponseBuilder; import at.gv.egovernment.moa.spss.api.xmlsign.CreateXMLSignatureRequest; import at.gv.egovernment.moa.spss.api.xmlsign.CreateXMLSignatureResponse; import at.gv.egovernment.moa.spss.server.invoke.XMLSignatureCreationInvoker; import at.gv.egovernment.moa.util.Constants; import at.gv.egovernment.moa.util.StreamUtils; /** * The service endpoint for the SignatureCreation web service. * * @author Patrick Peck * @version $Id$ */ public class SignatureCreationService { /** * Handle a CreateXMLSignatureRequest. * * @param request The CreateXMLSignatureRequest to work on * (contained in the 0th element of the array). * @return A CreateXMLSignatureResponse as the only element of * the Element array. * @throws AxisFault An error occurred during handling of the message. */ public Element[] CreateXMLSignatureRequest(Element[] request) throws AxisFault { XMLSignatureCreationInvoker invoker = XMLSignatureCreationInvoker.getInstance(); Element[] response = new Element[1]; // check that we have a CreateXMLSignatureRequest; if not, create an // AxisFault, just like the org.apache.axis.providers.java.MsgProvider if (!Constants.MOA_SPSS_CREATE_XML_REQUEST.equals(request[0].getLocalName()) || !Constants.MOA_NS_URI.equals(request[0].getNamespaceURI())) { QName qname = new QName(request[0].getNamespaceURI(), request[0].getLocalName()); throw new AxisFault( Messages.getMessage("noOperationForQName", qname.toString())); // TODO GK Operation name does not make it into the error repsonse } // handle the request try { // create a parser and builder for binding API objects to/from XML CreateXMLSignatureRequestParser requestParser = new CreateXMLSignatureRequestParser(); CreateXMLSignatureResponseBuilder responseBuilder = new CreateXMLSignatureResponseBuilder(); Element reparsedReq; CreateXMLSignatureRequest requestObj; CreateXMLSignatureResponse responseObj; // validate the request reparsedReq = ServiceUtils.reparseRequest(request[0]); // convert to API objects requestObj = requestParser.parse(reparsedReq); // invoke the core logic responseObj = invoker.createXMLSignature(requestObj, Collections.EMPTY_SET); // map back to XML response[0] = responseBuilder.build(responseObj).getDocumentElement(); } catch (MOAException e) { AxisFault fault = AxisFault.makeFault(e); fault.setFaultDetail(new Element[] { e.toErrorResponse()}); Logger.debug("Anfrage zur Signaturerstellung wurde nicht erfolgreich beendet:" + System.getProperty("line.separator") + StreamUtils.getStackTraceAsString(e)); throw fault; } catch (Throwable t) { MOASystemException e = new MOASystemException("2900", null, t); AxisFault fault = AxisFault.makeFault(e); fault.setFaultDetail(new Element[] { e.toErrorResponse()}); Logger.debug("Anfrage zur Signaturerstellung wurde nicht erfolgreich beendet:" + System.getProperty("line.separator") + StreamUtils.getStackTraceAsString(e)); throw fault; } return response; } }