/*
* Copyright 2003 Federal Chancellery Austria
* MOA-SPSS has been developed in a cooperation between BRZ, the Federal
* Chancellery Austria - ICT staff unit, and Graz University of Technology.
*
* Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
* the European Commission - subsequent versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
* http://www.osor.eu/eupl/
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*
* This product combines work with different licenses. See the "NOTICE" text
* file for details on the various modules and licenses.
* The "NOTICE" text file is part of the distribution. Any derivative works
* that you distribute must include a readable copy of the "NOTICE" text file.
*/
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.spss.MOAException;
import at.gv.egovernment.moa.spss.MOASystemException;
import at.gv.egovernment.moa.spss.api.cmssign.CreateCMSSignatureRequest;
import at.gv.egovernment.moa.spss.api.cmssign.CreateCMSSignatureResponse;
import at.gv.egovernment.moa.spss.api.xmlbind.CreateCMSSignatureRequestParser;
import at.gv.egovernment.moa.spss.api.xmlbind.CreateCMSSignatureResponseBuilder;
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.CMSSignatureCreationInvoker;
import at.gv.egovernment.moa.spss.server.invoke.XMLSignatureCreationInvoker;
import at.gv.egovernment.moa.spss.server.transaction.TransactionContext;
import at.gv.egovernment.moa.spss.server.transaction.TransactionContextManager;
import at.gv.egovernment.moa.spss.server.xmlbind.CreatePDFRequest;
import at.gv.egovernment.moa.spss.server.xmlbind.CreatePDFRespone;
import at.gv.egovernment.moa.spss.server.xmlbind.CreatePDFSignatureRequestParser;
import at.gv.egovernment.moa.spss.server.xmlbind.CreatePDFSignatureResponseBuilder;
import at.gv.egovernment.moaspss.logging.Logger;
import at.gv.egovernment.moaspss.util.Constants;
import at.gv.egovernment.moaspss.util.StreamUtils;
/**
* The service endpoint for the SignatureCreation
web service.
*
* @author Patrick Peck
* @version $Id$
*/
public class SignatureCreationService {
/**
* Handle a CreatePDFSignatureRequest
.
*
* @param request The CreatePDFSignatureRequest
to work on
* (contained in the 0th element of the array).
* @return A CreatePDFSignatureResponse
as the only element of the
* Element
array.
* @throws AxisFault An error occurred during handling of the message.
*/
public Element[] CreatePDFSignatureRequest(Element[] request)
throws AxisFault {
Logger.trace("---- Entering SignatureCreationService");
// PDFSignatureCreationInvoker invoker =
// PDFSignatureCreationInvoker.getInstance();
final 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_PDF_REQUEST.equals(request[0].getLocalName()) ||
!Constants.MOA_NS_URI.equals(request[0].getNamespaceURI())) {
final 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
final CreatePDFSignatureRequestParser requestParser =
new CreatePDFSignatureRequestParser();
final CreatePDFSignatureResponseBuilder responseBuilder =
new CreatePDFSignatureResponseBuilder();
Element reparsedReq;
CreatePDFRequest requestObj;
final CreatePDFRespone responseObj = null;
// since Axis (1.1 ff) has problem with namespaces we take the raw request
// stored by the Axishandler.
final TransactionContext context = TransactionContextManager.getInstance().getTransactionContext();
// validate the request
reparsedReq = ServiceUtils.reparseRequest(request[0]);// context.getRequest());
// convert to API objects
Logger.trace(">>> preparsing Request");
requestObj = requestParser.parse(reparsedReq);
Logger.trace("<<< preparsed Request");
Logger.trace(">>> creating Signature");
// invoke the core logic
// responseObj = PDFASInvoker.getInstance().createPDFSignature(requestObj,
// context.getTransactionID());
Logger.trace("<<< created Signature");
Logger.trace(">>> building Response");
// map back to XML
response[0] = responseBuilder.build(responseObj).getDocumentElement();
Logger.trace("<<< built Response");
// save response in transaction
context.setResponse(response[0]);
Logger.trace("---- Leaving SignatureCreationService");
// TODO: remove if PDF signatures are supported
throw new MOASystemException("Create PAdES signatures is currently NOT supported by MOA-SIG", null);
// return response;
} catch (final MOAException e) {
final 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 (final Throwable t) {
final MOASystemException e = new MOASystemException("2900", null, t);
final 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;
}
}
/**
* 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[] CreateCMSSignatureRequest(Element[] request)
throws AxisFault {
Logger.trace("---- Entering SignatureCreationService");
final CMSSignatureCreationInvoker invoker =
CMSSignatureCreationInvoker.getInstance();
final 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_CMS_REQUEST.equals(request[0].getLocalName()) ||
!Constants.MOA_NS_URI.equals(request[0].getNamespaceURI())) {
final 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
final CreateCMSSignatureRequestParser requestParser =
new CreateCMSSignatureRequestParser();
final CreateCMSSignatureResponseBuilder responseBuilder =
new CreateCMSSignatureResponseBuilder();
Element reparsedReq;
CreateCMSSignatureRequest requestObj;
CreateCMSSignatureResponse responseObj;
// since Axis (1.1 ff) has problem with namespaces we take the raw request
// stored by the Axishandler.
final TransactionContext context = TransactionContextManager.getInstance().getTransactionContext();
// validate the request
reparsedReq = ServiceUtils.reparseRequest(request[0]);// context.getRequest());
// convert to API objects
Logger.trace(">>> preparsing Request");
requestObj = requestParser.parse(reparsedReq);
Logger.trace("<<< preparsed Request");
Logger.trace(">>> creating Signature");
// invoke the core logic
responseObj = invoker.createCMSSignature(requestObj, Collections.EMPTY_SET);
Logger.trace("<<< created Signature");
Logger.trace(">>> building Response");
// map back to XML
response[0] = responseBuilder.build(responseObj).getDocumentElement();
Logger.trace("<<< built Response");
// save response in transaction
context.setResponse(response[0]);
Logger.trace("---- Leaving SignatureCreationService");
} catch (final MOAException e) {
final 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 (final Throwable t) {
final MOASystemException e = new MOASystemException("2900", null, t);
final 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;
}
/**
* 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 {
Logger.trace("---- Entering SignatureCreationService");
final XMLSignatureCreationInvoker invoker =
XMLSignatureCreationInvoker.getInstance();
final 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())) {
final 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
final CreateXMLSignatureRequestParser requestParser =
new CreateXMLSignatureRequestParser();
final CreateXMLSignatureResponseBuilder responseBuilder =
new CreateXMLSignatureResponseBuilder();
Element reparsedReq;
CreateXMLSignatureRequest requestObj;
CreateXMLSignatureResponse responseObj;
// since Axis (1.1 ff) has problem with namespaces we take the raw request
// stored by the Axishandler.
final TransactionContext context = TransactionContextManager.getInstance().getTransactionContext();
// validate the request
reparsedReq = ServiceUtils.reparseRequest(request[0]);// context.getRequest());
// convert to API objects
Logger.trace(">>> preparsing Request");
requestObj = requestParser.parse(reparsedReq);
Logger.trace("<<< preparsed Request");
Logger.trace(">>> creating Signature");
// invoke the core logic
responseObj = invoker.createXMLSignature(requestObj, Collections.EMPTY_SET);
Logger.trace("<<< created Signature");
Logger.trace(">>> building Response");
// map back to XML
response[0] = responseBuilder.build(responseObj).getDocumentElement();
Logger.trace("<<< built Response");
// save response in transaction
context.setResponse(response[0]);
Logger.trace("---- Leaving SignatureCreationService");
} catch (final MOAException e) {
final 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 (final Throwable t) {
final MOASystemException e = new MOASystemException("2900", null, t);
final 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;
}
}