diff options
Diffstat (limited to 'moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service')
8 files changed, 1146 insertions, 1164 deletions
diff --git a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/AxisHandler.java b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/AxisHandler.java index 4ee4e07..804c7ad 100644 --- a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/AxisHandler.java +++ b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/AxisHandler.java @@ -35,9 +35,7 @@ import java.util.Iterator; import javax.servlet.http.HttpServletRequest; -import org.apache.axis.AxisEngine; import org.apache.axis.AxisFault; -import org.apache.axis.AxisProperties; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.attachments.AttachmentPart; @@ -49,7 +47,6 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; import at.gv.egovernment.moa.spss.MOASystemException; import at.gv.egovernment.moa.spss.server.config.ConfigurationProvider; @@ -66,447 +63,434 @@ import at.gv.egovernment.moaspss.util.DOMUtils; /** * An handler that is invoked on each web service request and performs some * central message handling. - * + * * Mainly sets up the <code>TransactionContext</code> for the current * transaction (i.e. web service request). - * + * * @author Patrick Peck * @author Stefan Knirsch * @version $Id$ */ public class AxisHandler extends BasicHandler { - /** - * - */ - private static final long serialVersionUID = 2520698947819506866L; - - /** The resource names of the messages to load. */ - private static final String MOA_SPSS_WSDL_RESOURCE_ = "/resources/wsdl/MOA-SPSS-2.0.0.wsdl"; - - /** The property name for accessing the HTTP request. */ - private static final String REQUEST_PROPERTY = HTTPConstants.MC_HTTP_SERVLETREQUEST; - - /** The property name for accessing the X509 client certificate chain. */ - private static final String X509_CERTIFICATE_PROPERTY = "javax.servlet.request.X509Certificate"; - - /** The property name for accessing the SOAP action header. */ - private static final String SOAP_ACTION_HEADER = "soapaction"; - - /** URI of the SOAP XML namespace. */ - public static final String SOAP_NS_URI = "http://schemas.xmlsoap.org/soap/envelope/"; - - /** Prefix used for the SOAP XML namespace */ - public static final String SOAP_PREFIX = "soapenv"; - - /** Simple string contains the front part of the enveloping SOAP wrapping */ - private static final String SOAP_PART_PRE = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body>"; - - /** Simple string contains the post part of the enveloping SOAP wrapping */ - private static final String SOAP_PART_POST = "</soapenv:Body></soapenv:Envelope>"; - - /** - * Handle an invocation of this handler. - * - * @param msgContext - * Information about this request/response. - * @throws AxisFault - * An error occurred during processing of the request. - * @see org.apache.axis.Handler#invoke(MessageContext) - */ - public void invoke(MessageContext msgContext) throws AxisFault { - if (!msgContext.getPastPivot()) { - handleRequest(msgContext); - } else { - handleResponse(msgContext); - } - } - - /** - * This method is called by <code>invoke</code> to handle incoming requests. - * - * @param msgContext - * The context as provided to <code>invoke</code>. - * @throws AxisFault - * An error occurred during processing of the request. - */ - private void handleRequest(MessageContext msgContext) throws AxisFault { - Message soapMessage = null; - try { - Logger.trace("---- Entering Axishandler"); - // generate a unique transaction id and build the TransactionContext - // for this request - HttpServletRequest request = (HttpServletRequest) msgContext.getProperty(REQUEST_PROPERTY); - - X509Certificate[] clientCert = (X509Certificate[]) request.getAttribute(X509_CERTIFICATE_PROPERTY); - - if (Logger.isTraceEnabled()) { - Enumeration<String> allHeaders = request.getHeaderNames(); - if (allHeaders != null) { - while(allHeaders.hasMoreElements()) { - String header = allHeaders.nextElement(); - Logger.trace("Header: " + header + " : " + request.getHeader(header)); - - } - } - } - - // Configure Axis - // AxisProperties.setProperty(AxisEngine.PROP_ENABLE_NAMESPACE_PREFIX_OPTIMIZATION,"false"); - // AxisProperties.setProperty(AxisEngine.PROP_DOMULTIREFS,"false"); - // AxisProperties.setProperty(AxisEngine.PROP_SEND_XSI,"true"); - // msgContext.setProperty(org.apache.axis.SOAPPart.ALLOW_FORM_OPTIMIZATION, - // Boolean.FALSE); - // msgContext.setProperty(org.apache.axis. - // AxisEngine.PROP_ENABLE_NAMESPACE_PREFIX_OPTIMIZATION,"false"); - //AxisProperties.setProperty(AxisEngine.PROP_ATTACHMENT_IMPLEMENTATION, AxisEngine.DEFAULT_ATTACHMENT_IMPL); - soapMessage = msgContext.getCurrentMessage(); - - ConfigurationProvider configuration = ConfigurationProvider.getInstance(); - new String(soapMessage.getSOAPPartAsBytes()); - Element xmlRequest = null; - // log.info(soapMessage.getSOAPPartAsString()); - Element soapPart = DOMUtils - .parseDocument(new ByteArrayInputStream(soapMessage.getSOAPPartAsBytes()), false, null, null) - .getDocumentElement(); - if (soapPart != null) { - // TODO: check if DOM Version is intolerant when white spaces - // are between tags (preceding normalization would be necessary) - NodeList soapBodies = soapPart.getElementsByTagNameNS(SOAP_NS_URI, "Body"); - if (soapBodies != null && soapBodies.getLength() > 0) { - xmlRequest = DOMUtils.getElementFromNodeList(soapBodies.item(0).getChildNodes()); - } - // oder TODO: Evaluierung ob XPATH schneller - /* - * HashMap nSMap = new HashMap(); nSMap.put((String)SOAP_PREFIX, - * SOAP_NS_URI); Element soapBody = (Element) - * XPathUtils.selectSingleNode(soapPart, nSMap, - * "/"+SOAP_PREFIX+":Envelope/"+SOAP_PREFIX+":Body"); if - * (soapBody!=null) { xmlRequest = - * DOMUtils.getElementFromNodeList(soapBody.getChildNodes()); } - */ - } - - TransactionContext context = new TransactionContext(TransactionIDGenerator.nextID(), clientCert, - configuration, xmlRequest, null); - - String soapAction = (String) request.getHeader(SOAP_ACTION_HEADER); - if ("\"\"".equals(soapAction)) { - // if http soap action header is empty - soapAction = msgContext.getTargetService(); - } - context.setRequestName(soapAction); - - if (soapMessage.getAttachmentsImpl() != null) { - Logger.info("Attachments is NOT null!"); - Logger.trace(">>> Get AttachmentCount"); - int attachmentCount = soapMessage.getAttachmentsImpl().getAttachmentCount(); - Logger.trace("<<< Finished Get AttachmentCount"); - if (attachmentCount > 0) { - - // add SOAP attachments to transaction context - @SuppressWarnings("rawtypes") - Iterator iterator = soapMessage.getAttachments(); - while (iterator.hasNext()) { - AttachmentPart attachment = (AttachmentPart) iterator.next(); - String id = attachment.getContentId(); - String type = attachment.getContentType(); - - // Now get the InputStream (note: we could also get the - // content with Object content = - // attachment.getContent();) - InputStream is = null; - javax.activation.DataHandler datahandler = attachment.getDataHandler(); - - int TYPE = 2; - switch (TYPE) { - case 1: { - org.apache.axis.attachments.ManagedMemoryDataSource mmds = (org.apache.axis.attachments.ManagedMemoryDataSource) datahandler - .getDataSource(); - context.addAttachment(id, type, mmds); - break; - } - case 2: { - is = datahandler.getDataSource().getInputStream(); - context.addAttachment(id, type, is, datahandler.getDataSource().getName()); - break; - } - } - debug("handler.06", new Object[] { id, type }); - } - } - } else { - Logger.info("Attachments is null!"); - } - - setUpContexts(context); - - // log some information about the request - info("handler.00", new Object[] { context.getTransactionID(), msgContext.getTargetService() }); - info("handler.01", new Object[] { request.getRemoteAddr() }); - if (clientCert != null) { - info("handler.02", new Object[] { clientCert[0].getSubjectDN(), clientCert[0].getSerialNumber(), - clientCert[0].getIssuerDN() }); - - } else { - info("handler.03", null); - } - if (Logger.isTraceEnabled()) { - // OutputFormat format = new OutputFormat((Document) - // xmlRequest.getOwnerDocument()); - // format.setLineSeparator("\n"); - // format.setIndenting(false); - // format.setPreserveSpace(true); - // format.setOmitXMLDeclaration(false); - // format.setEncoding("UTF-8"); - // ByteArrayOutputStream baos = new ByteArrayOutputStream(); - // XMLSerializer conSerializer = new XMLSerializer(baos, - // format); - // conSerializer.serialize(xmlRequest); - // Logger.debug(new LogMsg("Request:" + baos.toString())); - - String msg = soapMessage.getSOAPPartAsString(); - Logger.trace(new LogMsg(msg)); - } - } catch (MOASystemException e) { - MOASystemException se = new MOASystemException("2900", null, e); - AxisFault fault = AxisFault.makeFault(se); - fault.setFaultDetail(new Element[] { se.toErrorResponse() }); - throw fault; - - } catch (SAXException t ) { - if (soapMessage != null && soapMessage.getSOAPPartAsBytes() != null) { - try { - Logger.debug("Req: " + new String(soapMessage.getSOAPPartAsBytes(), "UTF-8")); - } catch (UnsupportedEncodingException e1) { - e1.printStackTrace(); - } - - } - - t.printStackTrace(); - Logger.info(new LogMsg(t.getStackTrace())); - MOASystemException e = new MOASystemException("2900", null, t); - AxisFault fault = AxisFault.makeFault(e); - fault.setFaultDetail(new Element[] { e.toErrorResponse() }); - throw fault; - - } catch (Throwable t) { - t.printStackTrace(); - Logger.info(new LogMsg(t.getStackTrace())); - MOASystemException e = new MOASystemException("2900", null, t); - AxisFault fault = AxisFault.makeFault(e); - fault.setFaultDetail(new Element[] { e.toErrorResponse() }); - throw fault; - } - Logger.trace("---- Leaving Axishandler"); - } - - /** - * This method is called by <code>invoke</code> to handle outgoing - * responses. - * - * @param msgContext - * The context as provided to <code>invoke</code>. - * @throws AxisFault - * An error occurred during processing of the response. - */ - private void handleResponse(MessageContext msgContext) throws AxisFault { - String xmlResponseString = null; - String soapResponseString = null; - - TransactionContext context = TransactionContextManager.getInstance().getTransactionContext(); - Element xmlResponse = context.getResponse(); - - if (xmlResponse != null) { - try { - xmlResponseString = DOMUtils.serializeNode(xmlResponse, true); - /* - * Soll die Antwort nur \n enthalten, so gibt es 2 - * Möglichkeiten: 1.) Xalan Version und xmlResponseString = - * DOMUtils.serializeNode(xmlResponse, true, "\n"); 2.) - * OutputFormat serializerFormat = new OutputFormat((Document) - * xmlResponse.getOwnerDocument()); - * serializerFormat.setLineSeparator("\n"); - * serializerFormat.setIndenting(false); - * serializerFormat.setPreserveSpace(true); - * serializerFormat.setOmitXMLDeclaration(true); - * serializerFormat.setEncoding("UTF-8"); ByteArrayOutputStream - * serializedBytes = new ByteArrayOutputStream(); XMLSerializer - * serializer = new XMLSerializer(serializedBytes, - * serializerFormat); serializer.serialize(xmlResponse); - * serializedBytes.close(); xmlResponseString = - * serializedBytes.toString("UTF-8"); - */ - if (Logger.isTraceEnabled()) { - Logger.trace(new LogMsg(xmlResponseString)); - } - soapResponseString = SOAP_PART_PRE + xmlResponseString + SOAP_PART_POST; - // override axis response-message - msgContext.setResponseMessage(new Message(soapResponseString)); - } catch (Throwable t) { - t.printStackTrace(); - Logger.info(new LogMsg(t.getStackTrace())); - MOASystemException e = new MOASystemException("2900", null, t); - AxisFault fault = AxisFault.makeFault(e); - fault.setFaultDetail(new Element[] { e.toErrorResponse() }); - throw fault; - } - - } else { - // Fallback: if functions do not set the resulting response in the - // transaction, the original one from axis will be used - soapResponseString = msgContext.getCurrentMessage().getSOAPPartAsString(); - } - - info("handler.04", null); - if (Logger.isDebugEnabled()) { - Logger.debug(new LogMsg(soapResponseString)); - } - tearDownContexts(); - } - - /** - * Called, when the processing of the web service fails. - * - * @param msgContext - * Information about the current request. - * @see org.apache.axis.Handler#onFault(org.apache.axis.MessageContext) - */ - public void onFault(MessageContext msgContext) { - info("handler.05", null); - tearDownContexts(); - } - - /** - * Set up the thread-local contexts (<code>TransactionContext</code> and - * <code>LoggingContext</code>). - * - * @param context - * The <code>TransactionContext</code> to set for the current - * request. - */ - private void setUpContexts(TransactionContext context) { - // set the transaction context in the TransactionContextManager - TransactionContextManager tcm = TransactionContextManager.getInstance(); - tcm.setTransactionContext(context); - - // set the logging context in the LoggingContextManager - LoggingContextManager lcm = LoggingContextManager.getInstance(); - LoggingContext lc = new LoggingContext(context.getTransactionID()); - lcm.setLoggingContext(lc); - } - - /** - * Tear down the thread-local contexts. - */ - private void tearDownContexts() { - TransactionContextManager tcm = TransactionContextManager.getInstance(); - - // delete temporary files - TransactionContext context = tcm.getTransactionContext(); - context.cleanAttachmentCache(); - - // unset the transaction context - tcm.setTransactionContext(null); - - // unset the logging context - LoggingContextManager lcm = LoggingContextManager.getInstance(); - lcm.setLoggingContext(null); - } - - /** - * Generate the WSDL into the <code>msgContext</code>. - * - * The code of this method is more or less copied from the - * <code>org.apache.axis.handlers.soap.SOAPService</code> class contained in - * the 1.1 release of Axis to allow for a missing <code>wsdlFile</code> (so - * that a resource by the same name is searched for in the classpath). The - * implementation of this method should be obsolete if Axis 1.1 or higher is - * used. - * - * @param msgContext - * The <code>MessageContext</code> that will contain the WSDL - * description of the current web service. - * @throws AxisFault - * An error occurred producing the WSDL. - */ - public void generateWSDL(MessageContext msgContext) throws AxisFault { - InputStream instream = null; - - try { - String filename = MOA_SPSS_WSDL_RESOURCE_; - - File file = new File(filename); - if (file.exists()) { - // if this resolves to a file, load it - instream = new FileInputStream(filename); - } else { - // else load a named resource in our classloader. - instream = this.getClass().getResourceAsStream(filename); - if (instream == null) { - String errorText = Messages.getMessage("wsdlFileMissing", filename); - throw new AxisFault(errorText); - } - } - Document doc = XMLUtils.newDocument(instream); - msgContext.setProperty("WSDL", doc); - } catch (Exception e) { - throw AxisFault.makeFault(e); - } finally { - if (instream != null) { - try { - instream.close(); - } catch (IOException e) { - // ok to do nothing here - } - } - } - } - - /** - * Utility function to issue an info message to the log. - * - * @param messageId - * The ID of the message to log. - * @param parameters - * Additional message parameters. - */ - private static void info(String messageId, Object[] parameters) { - MessageProvider msg = MessageProvider.getInstance(); - - Logger.info(new LogMsg(msg.getMessage(messageId, parameters))); - } - - /** - * Utility function to issue an debug message to the log. - * - * @param messageId - * The ID of the message to log. - * @param parameters - * Additional message parameters. - */ - private static void debug(String messageId, Object[] parameters) { - MessageProvider msg = MessageProvider.getInstance(); - - Logger.debug(new LogMsg(msg.getMessage(messageId, parameters))); - } - - // private byte[] toByteArray(AttachmentPart attachment) throws - // SOAPException, IOException - // { - // ByteArrayOutputStream outputStream = new - // ByteArrayOutputStream(attachment.getSize()); - // InputStream inputStream = (InputStream) attachment.getContent(); - // int currentByte = -1; - // while ((currentByte = inputStream.read()) != -1) - // outputStream.write(currentByte); - // - // inputStream.close(); - // outputStream.close(); - // - // return outputStream.toByteArray(); - // - // } + /** + * + */ + private static final long serialVersionUID = 2520698947819506866L; + + /** The resource names of the messages to load. */ + private static final String MOA_SPSS_WSDL_RESOURCE_ = "/resources/wsdl/MOA-SPSS-2.0.0.wsdl"; + + /** The property name for accessing the HTTP request. */ + private static final String REQUEST_PROPERTY = HTTPConstants.MC_HTTP_SERVLETREQUEST; + + /** The property name for accessing the X509 client certificate chain. */ + private static final String X509_CERTIFICATE_PROPERTY = "javax.servlet.request.X509Certificate"; + + /** The property name for accessing the SOAP action header. */ + private static final String SOAP_ACTION_HEADER = "soapaction"; + + /** URI of the SOAP XML namespace. */ + public static final String SOAP_NS_URI = "http://schemas.xmlsoap.org/soap/envelope/"; + + /** Prefix used for the SOAP XML namespace */ + public static final String SOAP_PREFIX = "soapenv"; + + /** Simple string contains the front part of the enveloping SOAP wrapping */ + private static final String SOAP_PART_PRE = + "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body>"; + + /** Simple string contains the post part of the enveloping SOAP wrapping */ + private static final String SOAP_PART_POST = "</soapenv:Body></soapenv:Envelope>"; + + /** + * Handle an invocation of this handler. + * + * @param msgContext Information about this request/response. + * @throws AxisFault An error occurred during processing of the request. + * @see org.apache.axis.Handler#invoke(MessageContext) + */ + @Override + public void invoke(MessageContext msgContext) throws AxisFault { + if (!msgContext.getPastPivot()) { + handleRequest(msgContext); + } else { + handleResponse(msgContext); + } + } + + /** + * This method is called by <code>invoke</code> to handle incoming requests. + * + * @param msgContext The context as provided to <code>invoke</code>. + * @throws AxisFault An error occurred during processing of the request. + */ + private void handleRequest(MessageContext msgContext) throws AxisFault { + Message soapMessage = null; + try { + Logger.trace("---- Entering Axishandler"); + // generate a unique transaction id and build the TransactionContext + // for this request + final HttpServletRequest request = (HttpServletRequest) msgContext.getProperty(REQUEST_PROPERTY); + + final X509Certificate[] clientCert = (X509Certificate[]) request.getAttribute( + X509_CERTIFICATE_PROPERTY); + + if (Logger.isTraceEnabled()) { + final Enumeration<String> allHeaders = request.getHeaderNames(); + if (allHeaders != null) { + while (allHeaders.hasMoreElements()) { + final String header = allHeaders.nextElement(); + Logger.trace("Header: " + header + " : " + request.getHeader(header)); + + } + } + } + + // Configure Axis + // AxisProperties.setProperty(AxisEngine.PROP_ENABLE_NAMESPACE_PREFIX_OPTIMIZATION,"false"); + // AxisProperties.setProperty(AxisEngine.PROP_DOMULTIREFS,"false"); + // AxisProperties.setProperty(AxisEngine.PROP_SEND_XSI,"true"); + // msgContext.setProperty(org.apache.axis.SOAPPart.ALLOW_FORM_OPTIMIZATION, + // Boolean.FALSE); + // msgContext.setProperty(org.apache.axis. + // AxisEngine.PROP_ENABLE_NAMESPACE_PREFIX_OPTIMIZATION,"false"); + // AxisProperties.setProperty(AxisEngine.PROP_ATTACHMENT_IMPLEMENTATION, + // AxisEngine.DEFAULT_ATTACHMENT_IMPL); + soapMessage = msgContext.getCurrentMessage(); + + final ConfigurationProvider configuration = ConfigurationProvider.getInstance(); + new String(soapMessage.getSOAPPartAsBytes()); + Element xmlRequest = null; + // log.info(soapMessage.getSOAPPartAsString()); + final Element soapPart = DOMUtils + .parseDocument(new ByteArrayInputStream(soapMessage.getSOAPPartAsBytes()), false, null, null) + .getDocumentElement(); + if (soapPart != null) { + // TODO: check if DOM Version is intolerant when white spaces + // are between tags (preceding normalization would be necessary) + final NodeList soapBodies = soapPart.getElementsByTagNameNS(SOAP_NS_URI, "Body"); + if (soapBodies != null && soapBodies.getLength() > 0) { + xmlRequest = DOMUtils.getElementFromNodeList(soapBodies.item(0).getChildNodes()); + } + // oder TODO: Evaluierung ob XPATH schneller + /* + * HashMap nSMap = new HashMap(); nSMap.put((String)SOAP_PREFIX, SOAP_NS_URI); + * Element soapBody = (Element) XPathUtils.selectSingleNode(soapPart, nSMap, + * "/"+SOAP_PREFIX+":Envelope/"+SOAP_PREFIX+":Body"); if (soapBody!=null) { + * xmlRequest = DOMUtils.getElementFromNodeList(soapBody.getChildNodes()); } + */ + } + + final TransactionContext context = new TransactionContext(TransactionIDGenerator.nextID(), clientCert, + configuration, xmlRequest, null); + + String soapAction = request.getHeader(SOAP_ACTION_HEADER); + if ("\"\"".equals(soapAction)) { + // if http soap action header is empty + soapAction = msgContext.getTargetService(); + } + context.setRequestName(soapAction); + + if (soapMessage.getAttachmentsImpl() != null) { + Logger.info("Attachments is NOT null!"); + Logger.trace(">>> Get AttachmentCount"); + final int attachmentCount = soapMessage.getAttachmentsImpl().getAttachmentCount(); + Logger.trace("<<< Finished Get AttachmentCount"); + if (attachmentCount > 0) { + + // add SOAP attachments to transaction context + @SuppressWarnings("rawtypes") + final Iterator iterator = soapMessage.getAttachments(); + while (iterator.hasNext()) { + final AttachmentPart attachment = (AttachmentPart) iterator.next(); + final String id = attachment.getContentId(); + final String type = attachment.getContentType(); + + // Now get the InputStream (note: we could also get the + // content with Object content = + // attachment.getContent();) + InputStream is = null; + final javax.activation.DataHandler datahandler = attachment.getDataHandler(); + + final int TYPE = 2; + switch (TYPE) { + case 1: { + final org.apache.axis.attachments.ManagedMemoryDataSource mmds = + (org.apache.axis.attachments.ManagedMemoryDataSource) datahandler + .getDataSource(); + context.addAttachment(id, type, mmds); + break; + } + case 2: { + is = datahandler.getDataSource().getInputStream(); + context.addAttachment(id, type, is, datahandler.getDataSource().getName()); + break; + } + } + debug("handler.06", new Object[] { id, type }); + } + } + } else { + Logger.info("Attachments is null!"); + } + + setUpContexts(context); + + // log some information about the request + info("handler.00", new Object[] { context.getTransactionID(), msgContext.getTargetService() }); + info("handler.01", new Object[] { request.getRemoteAddr() }); + if (clientCert != null) { + info("handler.02", new Object[] { clientCert[0].getSubjectDN(), clientCert[0].getSerialNumber(), + clientCert[0].getIssuerDN() }); + + } else { + info("handler.03", null); + } + if (Logger.isTraceEnabled()) { + // OutputFormat format = new OutputFormat((Document) + // xmlRequest.getOwnerDocument()); + // format.setLineSeparator("\n"); + // format.setIndenting(false); + // format.setPreserveSpace(true); + // format.setOmitXMLDeclaration(false); + // format.setEncoding("UTF-8"); + // ByteArrayOutputStream baos = new ByteArrayOutputStream(); + // XMLSerializer conSerializer = new XMLSerializer(baos, + // format); + // conSerializer.serialize(xmlRequest); + // Logger.debug(new LogMsg("Request:" + baos.toString())); + + final String msg = soapMessage.getSOAPPartAsString(); + Logger.trace(new LogMsg(msg)); + } + } catch (final MOASystemException e) { + final MOASystemException se = new MOASystemException("2900", null, e); + final AxisFault fault = AxisFault.makeFault(se); + fault.setFaultDetail(new Element[] { se.toErrorResponse() }); + throw fault; + + } catch (final SAXException t) { + if (soapMessage != null && soapMessage.getSOAPPartAsBytes() != null) { + try { + Logger.debug("Req: " + new String(soapMessage.getSOAPPartAsBytes(), "UTF-8")); + } catch (final UnsupportedEncodingException e1) { + e1.printStackTrace(); + } + + } + + t.printStackTrace(); + Logger.info(new LogMsg(t.getStackTrace())); + final MOASystemException e = new MOASystemException("2900", null, t); + final AxisFault fault = AxisFault.makeFault(e); + fault.setFaultDetail(new Element[] { e.toErrorResponse() }); + throw fault; + + } catch (final Throwable t) { + t.printStackTrace(); + Logger.info(new LogMsg(t.getStackTrace())); + final MOASystemException e = new MOASystemException("2900", null, t); + final AxisFault fault = AxisFault.makeFault(e); + fault.setFaultDetail(new Element[] { e.toErrorResponse() }); + throw fault; + } + Logger.trace("---- Leaving Axishandler"); + } + + /** + * This method is called by <code>invoke</code> to handle outgoing responses. + * + * @param msgContext The context as provided to <code>invoke</code>. + * @throws AxisFault An error occurred during processing of the response. + */ + private void handleResponse(MessageContext msgContext) throws AxisFault { + String xmlResponseString = null; + String soapResponseString = null; + + final TransactionContext context = TransactionContextManager.getInstance().getTransactionContext(); + final Element xmlResponse = context.getResponse(); + + if (xmlResponse != null) { + try { + xmlResponseString = DOMUtils.serializeNode(xmlResponse, true); + /* + * Soll die Antwort nur \n enthalten, so gibt es 2 Möglichkeiten: 1.) Xalan + * Version und xmlResponseString = DOMUtils.serializeNode(xmlResponse, true, + * "\n"); 2.) OutputFormat serializerFormat = new OutputFormat((Document) + * xmlResponse.getOwnerDocument()); serializerFormat.setLineSeparator("\n"); + * serializerFormat.setIndenting(false); + * serializerFormat.setPreserveSpace(true); + * serializerFormat.setOmitXMLDeclaration(true); + * serializerFormat.setEncoding("UTF-8"); ByteArrayOutputStream serializedBytes + * = new ByteArrayOutputStream(); XMLSerializer serializer = new + * XMLSerializer(serializedBytes, serializerFormat); + * serializer.serialize(xmlResponse); serializedBytes.close(); xmlResponseString + * = serializedBytes.toString("UTF-8"); + */ + if (Logger.isTraceEnabled()) { + Logger.trace(new LogMsg(xmlResponseString)); + } + soapResponseString = SOAP_PART_PRE + xmlResponseString + SOAP_PART_POST; + // override axis response-message + msgContext.setResponseMessage(new Message(soapResponseString)); + } catch (final Throwable t) { + t.printStackTrace(); + Logger.info(new LogMsg(t.getStackTrace())); + final MOASystemException e = new MOASystemException("2900", null, t); + final AxisFault fault = AxisFault.makeFault(e); + fault.setFaultDetail(new Element[] { e.toErrorResponse() }); + throw fault; + } + + } else { + // Fallback: if functions do not set the resulting response in the + // transaction, the original one from axis will be used + soapResponseString = msgContext.getCurrentMessage().getSOAPPartAsString(); + } + + info("handler.04", null); + if (Logger.isDebugEnabled()) { + Logger.debug(new LogMsg(soapResponseString)); + } + tearDownContexts(); + } + + /** + * Called, when the processing of the web service fails. + * + * @param msgContext Information about the current request. + * @see org.apache.axis.Handler#onFault(org.apache.axis.MessageContext) + */ + @Override + public void onFault(MessageContext msgContext) { + info("handler.05", null); + tearDownContexts(); + } + + /** + * Set up the thread-local contexts (<code>TransactionContext</code> and + * <code>LoggingContext</code>). + * + * @param context The <code>TransactionContext</code> to set for the current + * request. + */ + private void setUpContexts(TransactionContext context) { + // set the transaction context in the TransactionContextManager + final TransactionContextManager tcm = TransactionContextManager.getInstance(); + tcm.setTransactionContext(context); + + // set the logging context in the LoggingContextManager + final LoggingContextManager lcm = LoggingContextManager.getInstance(); + final LoggingContext lc = new LoggingContext(context.getTransactionID()); + lcm.setLoggingContext(lc); + } + + /** + * Tear down the thread-local contexts. + */ + private void tearDownContexts() { + final TransactionContextManager tcm = TransactionContextManager.getInstance(); + + // delete temporary files + final TransactionContext context = tcm.getTransactionContext(); + context.cleanAttachmentCache(); + + // unset the transaction context + tcm.setTransactionContext(null); + + // unset the logging context + final LoggingContextManager lcm = LoggingContextManager.getInstance(); + lcm.setLoggingContext(null); + } + + /** + * Generate the WSDL into the <code>msgContext</code>. + * + * The code of this method is more or less copied from the + * <code>org.apache.axis.handlers.soap.SOAPService</code> class contained in the + * 1.1 release of Axis to allow for a missing <code>wsdlFile</code> (so that a + * resource by the same name is searched for in the classpath). The + * implementation of this method should be obsolete if Axis 1.1 or higher is + * used. + * + * @param msgContext The <code>MessageContext</code> that will contain the WSDL + * description of the current web service. + * @throws AxisFault An error occurred producing the WSDL. + */ + @Override + public void generateWSDL(MessageContext msgContext) throws AxisFault { + InputStream instream = null; + + try { + final String filename = MOA_SPSS_WSDL_RESOURCE_; + + final File file = new File(filename); + if (file.exists()) { + // if this resolves to a file, load it + instream = new FileInputStream(filename); + } else { + // else load a named resource in our classloader. + instream = this.getClass().getResourceAsStream(filename); + if (instream == null) { + final String errorText = Messages.getMessage("wsdlFileMissing", filename); + throw new AxisFault(errorText); + } + } + final Document doc = XMLUtils.newDocument(instream); + msgContext.setProperty("WSDL", doc); + } catch (final Exception e) { + throw AxisFault.makeFault(e); + } finally { + if (instream != null) { + try { + instream.close(); + } catch (final IOException e) { + // ok to do nothing here + } + } + } + } + + /** + * Utility function to issue an info message to the log. + * + * @param messageId The ID of the message to log. + * @param parameters Additional message parameters. + */ + private static void info(String messageId, Object[] parameters) { + final MessageProvider msg = MessageProvider.getInstance(); + + Logger.info(new LogMsg(msg.getMessage(messageId, parameters))); + } + + /** + * Utility function to issue an debug message to the log. + * + * @param messageId The ID of the message to log. + * @param parameters Additional message parameters. + */ + private static void debug(String messageId, Object[] parameters) { + final MessageProvider msg = MessageProvider.getInstance(); + + Logger.debug(new LogMsg(msg.getMessage(messageId, parameters))); + } + + // private byte[] toByteArray(AttachmentPart attachment) throws + // SOAPException, IOException + // { + // ByteArrayOutputStream outputStream = new + // ByteArrayOutputStream(attachment.getSize()); + // InputStream inputStream = (InputStream) attachment.getContent(); + // int currentByte = -1; + // while ((currentByte = inputStream.read()) != -1) + // outputStream.write(currentByte); + // + // inputStream.close(); + // outputStream.close(); + // + // return outputStream.toByteArray(); + // + // } }
\ No newline at end of file diff --git a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/CertificateProviderServlet.java b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/CertificateProviderServlet.java index 43804a2..bc2c3b6 100644 --- a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/CertificateProviderServlet.java +++ b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/CertificateProviderServlet.java @@ -1,9 +1,5 @@ package at.gv.egovernment.moa.spss.server.service; -import iaik.server.modules.keys.KeyEntryID; -import iaik.server.modules.keys.KeyModule; -import iaik.server.modules.keys.KeyModuleFactory; - import java.io.IOException; import java.math.BigInteger; import java.security.Principal; @@ -26,155 +22,158 @@ import at.gv.egovernment.moa.spss.server.config.KeyGroupEntry; import at.gv.egovernment.moa.spss.server.logging.TransactionId; import at.gv.egovernment.moa.spss.server.transaction.TransactionIDGenerator; import at.gv.egovernment.moaspss.logging.Logger; +import iaik.server.modules.keys.KeyEntryID; +import iaik.server.modules.keys.KeyModule; +import iaik.server.modules.keys.KeyModuleFactory; /** - * + * * @author Andreas Fitzek * @version $Id$ */ public class CertificateProviderServlet extends HttpServlet { - /** - * - */ - private static final long serialVersionUID = -6907582473072190122L; - - /** The property name for accessing the X509 client certificate chain. */ - private static final String X509_CERTIFICATE_PROPERTY = "javax.servlet.request.X509Certificate"; - - public static final String PARAM_KEYID = "id"; - - /** - * Build the set of <code>KeyEntryID</code>s available to the given - * <code>keyGroupID</code>. - * - * @param keyGroupID - * The keygroup ID for which the available keys should be - * returned. - * @return The <code>Set</code> of <code>KeyEntryID</code>s identifying the - * available keys. - * @throws ConfigurationException - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - private Set buildKeySet(String keyGroupID, X509Certificate cert, KeyModule module) - throws ConfigurationException { - ConfigurationProvider config = ConfigurationProvider.getInstance(); - Set keyGroupEntries; - - // get the KeyGroup entries from the configuration - if (cert != null) { - Principal issuer = cert.getIssuerDN(); - BigInteger serialNumber = cert.getSerialNumber(); - - keyGroupEntries = config.getKeyGroupEntries(issuer, serialNumber, - keyGroupID); - } else { - keyGroupEntries = config.getKeyGroupEntries(null, null, keyGroupID); - } - - // map the KeyGroup entries to a set of KeyEntryIDs - if (keyGroupEntries == null) { - return null; - } else if (keyGroupEntries.size() == 0) { - return Collections.EMPTY_SET; - } else { - - Set keyEntryIDs = module.getPrivateKeyEntryIDs(); - Set keySet = new HashSet(); - Iterator iter; - - // filter out the keys that do not exist in the IAIK configuration - // by walking through the key entries and checking if the exist in - // the - // keyGroupEntries - for (iter = keyEntryIDs.iterator(); iter.hasNext();) { - KeyEntryID entryID = (KeyEntryID) iter.next(); - KeyGroupEntry entry = new KeyGroupEntry(entryID.getModuleID(), - entryID.getCertificateIssuer(), - entryID.getCertificateSerialNumber()); - if (keyGroupEntries.contains(entry)) { - keySet.add(entryID); - } - } - return keySet; - } - } - - private X509Certificate getClientCertificate(HttpServletRequest request) { - X509Certificate[] clientCert = (X509Certificate[]) request - .getAttribute(X509_CERTIFICATE_PROPERTY); - if(clientCert != null) { - return clientCert[0]; - } - return null; - } - - @SuppressWarnings("rawtypes") - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - try { - X509Certificate cert = getClientCertificate(request); - String keyId = request.getParameter(PARAM_KEYID); - - if(keyId == null) { - Logger.warn(PARAM_KEYID + " not provided in Request. Returning: " + HttpServletResponse.SC_BAD_REQUEST); - response.sendError(HttpServletResponse.SC_BAD_REQUEST); - return; - } - - String transactionId = TransactionIDGenerator.nextID(); - - KeyModule module = KeyModuleFactory.getInstance(new TransactionId( - transactionId)); - - Set keySet = buildKeySet(keyId, cert, module); - - if(keySet == null || keySet.isEmpty()) { - Logger.warn("No keys available for Key Identifier " + keyId + " and given authentication."); - response.sendError(HttpServletResponse.SC_NOT_FOUND); - return; - } - - - if(keySet.size() != 1) { - Logger.warn("Too many keys available for Key Identifier " + keyId + " and given authentication."); - response.sendError(HttpServletResponse.SC_CONFLICT); - return; - } - - Iterator iter; - - // filter out the keys that do not exist in the IAIK configuration - // by walking through the key entries and checking if the exist in - // the - // keyGroupEntries - for (iter = keySet.iterator(); iter.hasNext();) { - KeyEntryID entryID = (KeyEntryID) iter.next(); - - List certChain = module.getPrivateKeyEntry(entryID).getCertificateChain(); - - if(certChain != null && !certChain.isEmpty()) { - Logger.trace("Returning Certificate!"); - Certificate keyCert = ((Certificate)certChain.get(0)); - byte[] certData = keyCert.getEncoded(); - response.setStatus(HttpServletResponse.SC_OK); - response.setContentType("application/pkix-cert"); - response.setHeader("Content-disposition","attachment; filename=\"" + keyId + ".cer\""); - response.getOutputStream().write(certData); - response.getOutputStream().close(); - return; - } - - break; - } - - // No Certificate could be found! - Logger.warn("Failed to find keys available for Key Identifier " + keyId + " and given authentication."); - response.sendError(HttpServletResponse.SC_NOT_FOUND); - return; - } catch(Throwable e) { - Logger.error("Unhandled Exception when providing certificate", e); - response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); - } - } + /** + * + */ + private static final long serialVersionUID = -6907582473072190122L; + + /** The property name for accessing the X509 client certificate chain. */ + private static final String X509_CERTIFICATE_PROPERTY = "javax.servlet.request.X509Certificate"; + + public static final String PARAM_KEYID = "id"; + + /** + * Build the set of <code>KeyEntryID</code>s available to the given + * <code>keyGroupID</code>. + * + * @param keyGroupID The keygroup ID for which the available keys should be + * returned. + * @return The <code>Set</code> of <code>KeyEntryID</code>s identifying the + * available keys. + * @throws ConfigurationException + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + private Set buildKeySet(String keyGroupID, X509Certificate cert, KeyModule module) + throws ConfigurationException { + final ConfigurationProvider config = ConfigurationProvider.getInstance(); + Set keyGroupEntries; + + // get the KeyGroup entries from the configuration + if (cert != null) { + final Principal issuer = cert.getIssuerDN(); + final BigInteger serialNumber = cert.getSerialNumber(); + + keyGroupEntries = config.getKeyGroupEntries(issuer, serialNumber, + keyGroupID); + } else { + keyGroupEntries = config.getKeyGroupEntries(null, null, keyGroupID); + } + + // map the KeyGroup entries to a set of KeyEntryIDs + if (keyGroupEntries == null) { + return null; + } else if (keyGroupEntries.size() == 0) { + return Collections.EMPTY_SET; + } else { + + final Set keyEntryIDs = module.getPrivateKeyEntryIDs(); + final Set keySet = new HashSet(); + Iterator iter; + + // filter out the keys that do not exist in the IAIK configuration + // by walking through the key entries and checking if the exist in + // the + // keyGroupEntries + for (iter = keyEntryIDs.iterator(); iter.hasNext();) { + final KeyEntryID entryID = (KeyEntryID) iter.next(); + final KeyGroupEntry entry = new KeyGroupEntry(entryID.getModuleID(), + entryID.getCertificateIssuer(), + entryID.getCertificateSerialNumber()); + if (keyGroupEntries.contains(entry)) { + keySet.add(entryID); + } + } + return keySet; + } + } + + private X509Certificate getClientCertificate(HttpServletRequest request) { + final X509Certificate[] clientCert = (X509Certificate[]) request + .getAttribute(X509_CERTIFICATE_PROPERTY); + if (clientCert != null) { + return clientCert[0]; + } + return null; + } + + @Override + @SuppressWarnings("rawtypes") + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + try { + final X509Certificate cert = getClientCertificate(request); + final String keyId = request.getParameter(PARAM_KEYID); + + if (keyId == null) { + Logger.warn(PARAM_KEYID + " not provided in Request. Returning: " + + HttpServletResponse.SC_BAD_REQUEST); + response.sendError(HttpServletResponse.SC_BAD_REQUEST); + return; + } + + final String transactionId = TransactionIDGenerator.nextID(); + + final KeyModule module = KeyModuleFactory.getInstance(new TransactionId( + transactionId)); + + final Set keySet = buildKeySet(keyId, cert, module); + + if (keySet == null || keySet.isEmpty()) { + Logger.warn("No keys available for Key Identifier " + keyId + " and given authentication."); + response.sendError(HttpServletResponse.SC_NOT_FOUND); + return; + } + + if (keySet.size() != 1) { + Logger.warn("Too many keys available for Key Identifier " + keyId + " and given authentication."); + response.sendError(HttpServletResponse.SC_CONFLICT); + return; + } + + Iterator iter; + + // filter out the keys that do not exist in the IAIK configuration + // by walking through the key entries and checking if the exist in + // the + // keyGroupEntries + for (iter = keySet.iterator(); iter.hasNext();) { + final KeyEntryID entryID = (KeyEntryID) iter.next(); + + final List certChain = module.getPrivateKeyEntry(entryID).getCertificateChain(); + + if (certChain != null && !certChain.isEmpty()) { + Logger.trace("Returning Certificate!"); + final Certificate keyCert = (Certificate) certChain.get(0); + final byte[] certData = keyCert.getEncoded(); + response.setStatus(HttpServletResponse.SC_OK); + response.setContentType("application/pkix-cert"); + response.setHeader("Content-disposition", "attachment; filename=\"" + keyId + ".cer\""); + response.getOutputStream().write(certData); + response.getOutputStream().close(); + return; + } + + break; + } + + // No Certificate could be found! + Logger.warn("Failed to find keys available for Key Identifier " + keyId + " and given authentication."); + response.sendError(HttpServletResponse.SC_NOT_FOUND); + return; + } catch (final Throwable e) { + Logger.error("Unhandled Exception when providing certificate", e); + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } } diff --git a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/ConfigurationServlet.java b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/ConfigurationServlet.java index 6164154..135d652 100644 --- a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/ConfigurationServlet.java +++ b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/ConfigurationServlet.java @@ -21,7 +21,6 @@ * that you distribute must include a readable copy of the "NOTICE" text file. */ - package at.gv.egovernment.moa.spss.server.service; import java.io.IOException; @@ -37,7 +36,7 @@ import javax.servlet.http.HttpServletResponse; import at.gv.egovernment.moa.spss.server.config.ConfigurationProvider; import at.gv.egovernment.moa.spss.server.iaik.config.IaikConfigurator; -import at.gv.egovernment.moa.spss.server.init.*; +import at.gv.egovernment.moa.spss.server.init.SystemInitializer; import at.gv.egovernment.moa.spss.util.MessageProvider; import at.gv.egovernment.moaspss.logging.LogMsg; import at.gv.egovernment.moaspss.logging.Logger; @@ -46,36 +45,38 @@ import at.gv.egovernment.moaspss.logging.LoggingContextManager; /** * A servlet to initialize and update the MOA configuration. - * + * * @author Fatemeh Philippi * @author Patrick Peck * @version $Id$ */ public class ConfigurationServlet extends HttpServlet { /** - * - */ - private static final long serialVersionUID = 8372961105222028696L; -/** The document type of the HTML to generate. */ + * + */ + private static final long serialVersionUID = 8372961105222028696L; + /** The document type of the HTML to generate. */ private static final String DOC_TYPE = - "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"; + "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"; /** - * Handle a HTTP GET request, used to indicated that the MOA - * configuration needs to be updated (reloaded). - * - * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest, HttpServletResponse) + * Handle a HTTP GET request, used to indicated that the MOA configuration needs + * to be updated (reloaded). + * + * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest, + * HttpServletResponse) */ + @Override @SuppressWarnings({ "rawtypes", "unchecked" }) public void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + throws ServletException, IOException { - MessageProvider msg = MessageProvider.getInstance(); + final MessageProvider msg = MessageProvider.getInstance(); PrintWriter out; // set up a logging context for logging the reconfiguration LoggingContextManager.getInstance().setLoggingContext( - new LoggingContext("configuration update")); + new LoggingContext("configuration update")); response.setContentType("text/html"); out = response.getWriter(); @@ -84,8 +85,8 @@ public class ConfigurationServlet extends HttpServlet { out.println("<body bgcolor=\"#FFFFFF\">"); try { // reconfigure the system - ConfigurationProvider config = ConfigurationProvider.reload(); - IaikConfigurator iaikConfigurator = new IaikConfigurator(); + final ConfigurationProvider config = ConfigurationProvider.reload(); + final IaikConfigurator iaikConfigurator = new IaikConfigurator(); iaikConfigurator.configure(config); @@ -95,12 +96,12 @@ public class ConfigurationServlet extends HttpServlet { if (!config.getWarnings().isEmpty()) { // print the warnings - List allWarnings = new ArrayList(); + final List allWarnings = new ArrayList(); Iterator iter; - + allWarnings.addAll(config.getWarnings()); allWarnings.addAll(iaikConfigurator.getWarnings()); - + out.println("<p><b>" + msg.getMessage("config.29", null) + "</b></p>"); for (iter = allWarnings.iterator(); iter.hasNext();) { out.println(iter.next() + "<br />"); @@ -108,7 +109,7 @@ public class ConfigurationServlet extends HttpServlet { out.println("<p><b>" + msg.getMessage("config.28", null) + "</b></p>"); } - } catch (Throwable t) { + } catch (final Throwable t) { out.println("<p><b>" + msg.getMessage("config.20", null) + "</b></p>"); out.println("<p><b>" + msg.getMessage("config.28", null) + "</b></p>"); Logger.warn(new LogMsg(msg.getMessage("config.20", null)), t); @@ -117,30 +118,33 @@ public class ConfigurationServlet extends HttpServlet { out.flush(); out.close(); - + // tear down the logging context LoggingContextManager.getInstance().setLoggingContext(null); } /** * Do the same as <code>doGet</code>. - * - * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest, HttpServletResponse) + * + * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest, + * HttpServletResponse) */ + @Override public void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + throws ServletException, IOException { doGet(request, response); } /** * Perform some initial initialization tasks for the MOA web services * application. - * + * * Does an initial load of the MOA configuration to test if a working web * service can be provided. - * + * * @see javax.servlet.GenericServlet#init() */ + @Override public void init() throws ServletException { SystemInitializer.init(); } diff --git a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/DeleteableDataSourceWrapper.java b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/DeleteableDataSourceWrapper.java index 1d49cd7..f5350af 100644 --- a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/DeleteableDataSourceWrapper.java +++ b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/DeleteableDataSourceWrapper.java @@ -8,36 +8,35 @@ import at.gv.egovernment.moa.spss.server.transaction.DeleteableDataSource; public class DeleteableDataSourceWrapper implements DeleteableDataSource { - private org.apache.axis.attachments.ManagedMemoryDataSource wrapped; - - public DeleteableDataSourceWrapper(org.apache.axis.attachments.ManagedMemoryDataSource wrapped) { - this.wrapped = wrapped; - } - - @Override - public String getContentType() { - return this.wrapped.getContentType(); - } - - @Override - public InputStream getInputStream() throws IOException { - return this.wrapped.getInputStream(); - } - - @Override - public String getName() { - return this.wrapped.getName(); - } - - @Override - public OutputStream getOutputStream() throws IOException { - return this.wrapped.getOutputStream(); - } - - @Override - public void delete() { - this.wrapped.delete(); - } - - + private final org.apache.axis.attachments.ManagedMemoryDataSource wrapped; + + public DeleteableDataSourceWrapper(org.apache.axis.attachments.ManagedMemoryDataSource wrapped) { + this.wrapped = wrapped; + } + + @Override + public String getContentType() { + return this.wrapped.getContentType(); + } + + @Override + public InputStream getInputStream() throws IOException { + return this.wrapped.getInputStream(); + } + + @Override + public String getName() { + return this.wrapped.getName(); + } + + @Override + public OutputStream getOutputStream() throws IOException { + return this.wrapped.getOutputStream(); + } + + @Override + public void delete() { + this.wrapped.delete(); + } + } diff --git a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/ServiceUtils.java b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/ServiceUtils.java index 697c69e..c4ad498 100644 --- a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/ServiceUtils.java +++ b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/ServiceUtils.java @@ -21,7 +21,6 @@ * that you distribute must include a readable copy of the "NOTICE" text file. */ - package at.gv.egovernment.moa.spss.server.service; import java.io.ByteArrayInputStream; @@ -37,7 +36,7 @@ import at.gv.egovernment.moaspss.util.MOAErrorHandler; /** * Helper methods for the Service classes. - * + * * @author Patrick Peck * @version $Id$ */ @@ -45,59 +44,59 @@ public class ServiceUtils { /** * Schema-validate a request. - * + * * @param request The request to validate. * @throws MOAApplicationException An error occurred validating the requst. */ public static void validateRequest(Element[] request) - throws MOAApplicationException { + throws MOAApplicationException { // validate the request try { DOMUtils.validateElement( - request[0], - Constants.ALL_SCHEMA_LOCATIONS, - null, - new MOASPSSEntityResolver()); - } catch (Exception e) { + request[0], + Constants.ALL_SCHEMA_LOCATIONS, + null, + new MOASPSSEntityResolver()); + } catch (final Exception e) { throw new MOAApplicationException( - "1100", - new Object[] { e.getMessage()}, - e); + "1100", + new Object[] { e.getMessage() }, + e); } } /** * Reparse the request with schema-validation turned on so that ID references * are resolved. - * + * * @param request The request to reparse. * @return The reparsed request. * @throws MOAApplicationException An error occurred parsing the request. */ public static Element reparseRequest(Element request) - throws MOAApplicationException { + throws MOAApplicationException { try { - byte[] requestBytes = DOMUtils.serializeNode(request, "UTF-8"); - Document validatedRequest = DOMUtils.parseDocument(new ByteArrayInputStream(requestBytes), - true, - Constants.ONLY_MOASIG_SCHEMA_LOCATIONS, - null, - new MOASPSSEntityResolver(), - new MOAErrorHandler()); - + final byte[] requestBytes = DOMUtils.serializeNode(request, "UTF-8"); + final Document validatedRequest = DOMUtils.parseDocument(new ByteArrayInputStream(requestBytes), + true, + Constants.ONLY_MOASIG_SCHEMA_LOCATIONS, + null, + new MOASPSSEntityResolver(), + new MOAErrorHandler()); + // DOMUtils.parseDocument( // new ByteArrayInputStream(requestBytes), // true, // Constants.ALL_SCHEMA_LOCATIONS, // null); return validatedRequest.getDocumentElement(); - } catch (Exception e) { + } catch (final Exception e) { throw new MOAApplicationException( - "1100", - new Object[] { e.getMessage()}, - e); + "1100", + new Object[] { e.getMessage() }, + e); } } diff --git a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/SignatureCreationService.java b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/SignatureCreationService.java index 839d8ba..4030883 100644 --- a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/SignatureCreationService.java +++ b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/SignatureCreationService.java @@ -21,7 +21,6 @@ * 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; @@ -43,7 +42,6 @@ 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.PDFASInvoker; 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; @@ -57,260 +55,261 @@ import at.gv.egovernment.moaspss.util.StreamUtils; /** * The service endpoint for the <code>SignatureCreation</code> web service. - * + * * @author Patrick Peck * @version $Id$ */ public class SignatureCreationService { - - /** - * Handle a <code>CreatePDFSignatureRequest</code>. - * - * @param request The <code>CreatePDFSignatureRequest</code> to work on - * (contained in the 0th element of the array). - * @return A <code>CreatePDFSignatureResponse</code> as the only element of - * the <code>Element</code> 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(); - 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())) - { - 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 - CreatePDFSignatureRequestParser requestParser = - new CreatePDFSignatureRequestParser(); - CreatePDFSignatureResponseBuilder responseBuilder = - new CreatePDFSignatureResponseBuilder(); - Element reparsedReq; - CreatePDFRequest requestObj; - CreatePDFRespone responseObj = null; - - //since Axis (1.1 ff) has problem with namespaces we take the raw request stored by the Axishandler. - 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 (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; - } - - - } - - /** - * Handle a <code>CreateXMLSignatureRequest</code>. - * - * @param request The <code>CreateXMLSignatureRequest</code> to work on - * (contained in the 0th element of the array). - * @return A <code>CreateXMLSignatureResponse</code> as the only element of - * the <code>Element</code> array. - * @throws AxisFault An error occurred during handling of the message. - */ - public Element[] CreateCMSSignatureRequest(Element[] request) - throws AxisFault { - Logger.trace("---- Entering SignatureCreationService"); - CMSSignatureCreationInvoker invoker = - CMSSignatureCreationInvoker.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_CMS_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 - CreateCMSSignatureRequestParser requestParser = - new CreateCMSSignatureRequestParser(); - 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. - 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 (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; - } + + /** + * Handle a <code>CreatePDFSignatureRequest</code>. + * + * @param request The <code>CreatePDFSignatureRequest</code> to work on + * (contained in the 0th element of the array). + * @return A <code>CreatePDFSignatureResponse</code> as the only element of the + * <code>Element</code> 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 <code>CreateXMLSignatureRequest</code>. * * @param request The <code>CreateXMLSignatureRequest</code> to work on - * (contained in the 0th element of the array). - * @return A <code>CreateXMLSignatureResponse</code> as the only element of - * the <code>Element</code> array. + * (contained in the 0th element of the array). + * @return A <code>CreateXMLSignatureResponse</code> as the only element of the + * <code>Element</code> 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 <code>CreateXMLSignatureRequest</code>. + * + * @param request The <code>CreateXMLSignatureRequest</code> to work on + * (contained in the 0th element of the array). + * @return A <code>CreateXMLSignatureResponse</code> as the only element of the + * <code>Element</code> array. * @throws AxisFault An error occurred during handling of the message. */ public Element[] CreateXMLSignatureRequest(Element[] request) - throws AxisFault { - Logger.trace("---- Entering SignatureCreationService"); - XMLSignatureCreationInvoker invoker = - XMLSignatureCreationInvoker.getInstance(); - Element[] response = new Element[1]; + 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())) - { - QName qname = - new QName(request[0].getNamespaceURI(), 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 + 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(); + 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. - TransactionContext context = TransactionContextManager.getInstance().getTransactionContext(); - + // 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()); + reparsedReq = ServiceUtils.reparseRequest(request[0]);// context.getRequest()); // convert to API objects - Logger.trace(">>> preparsing Request"); + Logger.trace(">>> preparsing Request"); requestObj = requestParser.parse(reparsedReq); - Logger.trace("<<< preparsed Request"); - - Logger.trace(">>> creating Signature"); + 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("<<< created Signature"); - Logger.trace(">>> building Response"); + Logger.trace(">>> building Response"); // map back to XML response[0] = responseBuilder.build(responseObj).getDocumentElement(); - Logger.trace("<<< built Response"); - + Logger.trace("<<< built Response"); + // save response in transaction context.setResponse(response[0]); - Logger.trace("---- Leaving SignatureCreationService"); - - - } 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)); + 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 (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)); + } 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; } diff --git a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/SignatureVerificationService.java b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/SignatureVerificationService.java index e4d93a7..55cc5c6 100644 --- a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/SignatureVerificationService.java +++ b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/SignatureVerificationService.java @@ -21,21 +21,21 @@ * that you distribute must include a readable copy of the "NOTICE" text file. */ - package at.gv.egovernment.moa.spss.server.service; +import java.util.List; + +import org.apache.axis.AxisFault; +import org.w3c.dom.Element; + import at.gv.egiz.asic.api.ASiC; import at.gv.egiz.asic.api.ASiCFactory; -import at.gv.egiz.asic.api.ASiCFormat; import at.gv.egiz.asic.api.ASiCVerificationResult; import at.gv.egiz.asic.impl.ASiCMOAVerifier; import at.gv.egiz.asic.xmlbind.VerifyASICSignatureRequestParser; import at.gv.egiz.asic.xmlbind.VerifyASICSignatureResponseBuilder; import at.gv.egiz.asic.xmlbind.VerifyASiCRequest; import at.gv.egovernment.moa.spss.MOAApplicationException; -import org.apache.axis.AxisFault; -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.cmsverify.VerifyCMSSignatureRequest; @@ -54,192 +54,189 @@ import at.gv.egovernment.moa.spss.server.transaction.TransactionContextManager; import at.gv.egovernment.moaspss.logging.Logger; import at.gv.egovernment.moaspss.util.StreamUtils; -import java.io.FileInputStream; -import java.util.List; - /** * The service endpoint for the <code>SignatureVerification</code> web service. - * + * * @author Patrick Peck * @version $Id$ */ public class SignatureVerificationService { - /** - * Handle a <code>VerifyPDFSignatureRequest</code>. - * - * @param request The <code>VerifyPDFSignatureRequest</code> to work on - * (contained in the 0th element of the array). - * @return A <code>VerifyPDFSignatureResponse</code> as the only element of - * the <code>Element</code> array. - * @throws AxisFault An error occurred during handling of the message. - */ - public Element[] VerifyPDFSignatureRequest(Element[] request) - throws AxisFault { - CMSSignatureVerificationInvoker invoker = - CMSSignatureVerificationInvoker.getInstance(); - Element[] response = new Element[1]; - - try { - - // create a parser and builder for binding API objects to/from XML - VerifyCMSSignatureRequestParser requestParser = - new VerifyCMSSignatureRequestParser(); - VerifyPDFSignatureResponseBuilder responseBuilder = - new VerifyPDFSignatureResponseBuilder(); - Element reparsedReq; - VerifyCMSSignatureRequest requestObj; - VerifyCMSSignatureResponse responseObj; - // create a parser and builder for binding API objects to/from XML - /*VerifyPDFRequestParser requestParser = - new VerifyPDFRequestParser(); - VerifyPDFResponseBuilder responseBuilder = - new VerifyPDFResponseBuilder(); - Element reparsedReq; - VerifyPDFRequest requestObj; - VerifyPDFResponse responseObj;*/ - - //since Axis (1.1 ff) has problem with namespaces we take the raw request stored by the Axishandler. - TransactionContext context = TransactionContextManager.getInstance().getTransactionContext(); - // validate the request - reparsedReq = ServiceUtils.reparseRequest(request[0]);//context.getRequest()); - - // convert to API objects - requestObj = requestParser.parsePDF(reparsedReq); - - // invoke the core logic - responseObj = invoker.verifyCMSSignature(requestObj); - - // map back to XML - response[0] = responseBuilder.build(responseObj).getDocumentElement(); - - // save response in transaction - context.setResponse(response[0]); - - - } catch (MOAException e) { - AxisFault fault = AxisFault.makeFault(e); - fault.setFaultDetail(new Element[] { e.toErrorResponse()}); - Logger.debug("Anfrage zur Signaturpruefung 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 Signaturpruefung wurde nicht erfolgreich beendet:" - + System.getProperty("line.separator") + StreamUtils.getStackTraceAsString(e)); - throw fault; - } - - return response; - } - - - /** - * Handle a <code>VerifyPDFSignatureRequest</code>. - * - * @param request The <code>VerifyPDFSignatureRequest</code> to work on - * (contained in the 0th element of the array). - * @return A <code>VerifyPDFSignatureResponse</code> as the only element of - * the <code>Element</code> array. - * @throws AxisFault An error occurred during handling of the message. - */ - public Element[] VerifyASICSignatureRequest(Element[] request) - throws AxisFault { - CMSSignatureVerificationInvoker invoker = - CMSSignatureVerificationInvoker.getInstance(); - Element[] response = new Element[1]; - - try { - - // create a parser and builder for binding API objects to/from XML - VerifyASICSignatureRequestParser requestParser = - new VerifyASICSignatureRequestParser(); - VerifyASICSignatureResponseBuilder responseBuilder = - new VerifyASICSignatureResponseBuilder(); - Element reparsedReq; - VerifyASiCRequest requestObj; - VerifyCMSSignatureResponse responseObj; - // create a parser and builder for binding API objects to/from XML - - //since Axis (1.1 ff) has problem with namespaces we take the raw request stored by the Axishandler. - TransactionContext context = TransactionContextManager.getInstance().getTransactionContext(); - // validate the request - reparsedReq = ServiceUtils.reparseRequest(request[0]);//context.getRequest()); - - // convert to API objects - requestObj = requestParser.parseASIC(reparsedReq); - - if(requestObj.getFormat() == null) { - throw new MOAApplicationException("asic.0006", null); - } - - ASiC aSiC = ASiCFactory.parseASiC(requestObj.getAsicInput(), - requestObj.getFormat()); - - Logger.debug("Got ASiC " + aSiC); - - // invoke the core logic - ASiCMOAVerifier v = new ASiCMOAVerifier(); - List<ASiCVerificationResult> results = v.verify(aSiC, - requestObj.getTrustProfile(), requestObj.getDate()); - - // map back to XML - response[0] = responseBuilder.build(results).getDocumentElement(); - - // save response in transaction - context.setResponse(response[0]); - - } catch (MOAException e) { - AxisFault fault = AxisFault.makeFault(e); - fault.setFaultDetail(new Element[] { e.toErrorResponse()}); - Logger.debug("Anfrage zur Signaturpruefung 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 Signaturpruefung wurde nicht erfolgreich beendet:" - + System.getProperty("line.separator") + StreamUtils.getStackTraceAsString(e)); - throw fault; - } - - return response; + /** + * Handle a <code>VerifyPDFSignatureRequest</code>. + * + * @param request The <code>VerifyPDFSignatureRequest</code> to work on + * (contained in the 0th element of the array). + * @return A <code>VerifyPDFSignatureResponse</code> as the only element of the + * <code>Element</code> array. + * @throws AxisFault An error occurred during handling of the message. + */ + public Element[] VerifyPDFSignatureRequest(Element[] request) + throws AxisFault { + final CMSSignatureVerificationInvoker invoker = + CMSSignatureVerificationInvoker.getInstance(); + final Element[] response = new Element[1]; + + try { + + // create a parser and builder for binding API objects to/from XML + final VerifyCMSSignatureRequestParser requestParser = + new VerifyCMSSignatureRequestParser(); + final VerifyPDFSignatureResponseBuilder responseBuilder = + new VerifyPDFSignatureResponseBuilder(); + Element reparsedReq; + VerifyCMSSignatureRequest requestObj; + VerifyCMSSignatureResponse responseObj; + // create a parser and builder for binding API objects to/from XML + /* + * VerifyPDFRequestParser requestParser = new VerifyPDFRequestParser(); + * VerifyPDFResponseBuilder responseBuilder = new VerifyPDFResponseBuilder(); + * Element reparsedReq; VerifyPDFRequest requestObj; VerifyPDFResponse + * 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 + requestObj = requestParser.parsePDF(reparsedReq); + + // invoke the core logic + responseObj = invoker.verifyCMSSignature(requestObj); + + // map back to XML + response[0] = responseBuilder.build(responseObj).getDocumentElement(); + + // save response in transaction + context.setResponse(response[0]); + + } catch (final MOAException e) { + final AxisFault fault = AxisFault.makeFault(e); + fault.setFaultDetail(new Element[] { e.toErrorResponse() }); + Logger.debug("Anfrage zur Signaturpruefung 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 Signaturpruefung wurde nicht erfolgreich beendet:" + + System.getProperty("line.separator") + StreamUtils.getStackTraceAsString(e)); + throw fault; } - + + return response; + } + + /** + * Handle a <code>VerifyPDFSignatureRequest</code>. + * + * @param request The <code>VerifyPDFSignatureRequest</code> to work on + * (contained in the 0th element of the array). + * @return A <code>VerifyPDFSignatureResponse</code> as the only element of the + * <code>Element</code> array. + * @throws AxisFault An error occurred during handling of the message. + */ + public Element[] VerifyASICSignatureRequest(Element[] request) + throws AxisFault { + final CMSSignatureVerificationInvoker invoker = + CMSSignatureVerificationInvoker.getInstance(); + final Element[] response = new Element[1]; + + try { + + // create a parser and builder for binding API objects to/from XML + final VerifyASICSignatureRequestParser requestParser = + new VerifyASICSignatureRequestParser(); + final VerifyASICSignatureResponseBuilder responseBuilder = + new VerifyASICSignatureResponseBuilder(); + Element reparsedReq; + VerifyASiCRequest requestObj; + final VerifyCMSSignatureResponse responseObj; + // create a parser and builder for binding API objects to/from XML + + // 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 + requestObj = requestParser.parseASIC(reparsedReq); + + if (requestObj.getFormat() == null) { + throw new MOAApplicationException("asic.0006", null); + } + + final ASiC aSiC = ASiCFactory.parseASiC(requestObj.getAsicInput(), + requestObj.getFormat()); + + Logger.debug("Got ASiC " + aSiC); + + // invoke the core logic + final ASiCMOAVerifier v = new ASiCMOAVerifier(); + final List<ASiCVerificationResult> results = v.verify(aSiC, + requestObj.getTrustProfile(), requestObj.getDate()); + + // map back to XML + response[0] = responseBuilder.build(results).getDocumentElement(); + + // save response in transaction + context.setResponse(response[0]); + + } catch (final MOAException e) { + final AxisFault fault = AxisFault.makeFault(e); + fault.setFaultDetail(new Element[] { e.toErrorResponse() }); + Logger.debug("Anfrage zur Signaturpruefung 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 Signaturpruefung wurde nicht erfolgreich beendet:" + + System.getProperty("line.separator") + StreamUtils.getStackTraceAsString(e)); + throw fault; + } + + return response; + } + /** * Handle a <code>VerifyCMSSignatureRequest</code>. - * + * * @param request The <code>VerifyCMSSignatureRequest</code> to work on - * (contained in the 0th element of the array). - * @return A <code>VerifyCMSSignatureResponse</code> as the only element of - * the <code>Element</code> array. + * (contained in the 0th element of the array). + * @return A <code>VerifyCMSSignatureResponse</code> as the only element of the + * <code>Element</code> array. * @throws AxisFault An error occurred during handling of the message. */ public Element[] VerifyCMSSignatureRequest(Element[] request) - throws AxisFault { - CMSSignatureVerificationInvoker invoker = - CMSSignatureVerificationInvoker.getInstance(); - Element[] response = new Element[1]; - + throws AxisFault { + final CMSSignatureVerificationInvoker invoker = + CMSSignatureVerificationInvoker.getInstance(); + final Element[] response = new Element[1]; + try { - + // create a parser and builder for binding API objects to/from XML - VerifyCMSSignatureRequestParser requestParser = - new VerifyCMSSignatureRequestParser(); - VerifyCMSSignatureResponseBuilder responseBuilder = - new VerifyCMSSignatureResponseBuilder(); + final VerifyCMSSignatureRequestParser requestParser = + new VerifyCMSSignatureRequestParser(); + final VerifyCMSSignatureResponseBuilder responseBuilder = + new VerifyCMSSignatureResponseBuilder(); Element reparsedReq; VerifyCMSSignatureRequest requestObj; VerifyCMSSignatureResponse responseObj; - //since Axis (1.1 ff) has problem with namespaces we take the raw request stored by the Axishandler. - TransactionContext context = TransactionContextManager.getInstance().getTransactionContext(); + // 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()); - + reparsedReq = ServiceUtils.reparseRequest(request[0]);// context.getRequest()); + // convert to API objects requestObj = requestParser.parse(reparsedReq); @@ -251,20 +248,19 @@ public class SignatureVerificationService { // save response in transaction context.setResponse(response[0]); - - - } catch (MOAException e) { - AxisFault fault = AxisFault.makeFault(e); - fault.setFaultDetail(new Element[] { e.toErrorResponse()}); - Logger.debug("Anfrage zur Signaturpruefung wurde nicht erfolgreich beendet:" - + System.getProperty("line.separator") + StreamUtils.getStackTraceAsString(e)); + + } catch (final MOAException e) { + final AxisFault fault = AxisFault.makeFault(e); + fault.setFaultDetail(new Element[] { e.toErrorResponse() }); + Logger.debug("Anfrage zur Signaturpruefung 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 Signaturpruefung wurde nicht erfolgreich beendet:" - + System.getProperty("line.separator") + StreamUtils.getStackTraceAsString(e)); + } 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 Signaturpruefung wurde nicht erfolgreich beendet:" + + System.getProperty("line.separator") + StreamUtils.getStackTraceAsString(e)); throw fault; } @@ -273,60 +269,60 @@ public class SignatureVerificationService { /** * Handle a <code>VerifyXMLSignatureRequest</code>. - * + * * @param request The <code>VerifyXMLSignatureRequest</code> to work on - * (contained in the 0th element of the array). - * @return A <code>VerifyXMLSignatureResponse</code> as the only element of - * the <code>Element</code> array. + * (contained in the 0th element of the array). + * @return A <code>VerifyXMLSignatureResponse</code> as the only element of the + * <code>Element</code> array. * @throws AxisFault An error occurred during handling of the message. */ public Element[] VerifyXMLSignatureRequest(Element[] request) - throws AxisFault { - XMLSignatureVerificationInvoker invoker = - XMLSignatureVerificationInvoker.getInstance(); - Element[] response = new Element[1]; + throws AxisFault { + final XMLSignatureVerificationInvoker invoker = + XMLSignatureVerificationInvoker.getInstance(); + final Element[] response = new Element[1]; try { - - // create a parser and builder for binding API objects to/from XML - VerifyXMLSignatureRequestParser requestParser = - new VerifyXMLSignatureRequestParser(); - VerifyXMLSignatureResponseBuilder responseBuilder = - new VerifyXMLSignatureResponseBuilder(); + + // create a parser and builder for binding API objects to/from XML + final VerifyXMLSignatureRequestParser requestParser = + new VerifyXMLSignatureRequestParser(); + final VerifyXMLSignatureResponseBuilder responseBuilder = + new VerifyXMLSignatureResponseBuilder(); Element reparsedReq; VerifyXMLSignatureRequest requestObj; VerifyXMLSignatureResponse responseObj; - //since Axis (1.1 ff) has problem with namespaces we take the raw request stored by the Axishandler. - TransactionContext context = TransactionContextManager.getInstance().getTransactionContext(); + // 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(context.getRequest()); - + // convert to API objects requestObj = requestParser.parse(reparsedReq); - + // invoke the core logic responseObj = invoker.verifyXMLSignature(requestObj); // map back to XML response[0] = responseBuilder.build(responseObj).getDocumentElement(); - + // save response in transaction context.setResponse(response[0]); - - } catch (MOAException e) { - AxisFault fault = AxisFault.makeFault(e); - fault.setFaultDetail(new Element[] { e.toErrorResponse()}); - Logger.debug("Anfrage zur Signaturpruefung wurde nicht erfolgreich beendet:" - + System.getProperty("line.separator") + StreamUtils.getStackTraceAsString(e)); + } catch (final MOAException e) { + final AxisFault fault = AxisFault.makeFault(e); + fault.setFaultDetail(new Element[] { e.toErrorResponse() }); + Logger.debug("Anfrage zur Signaturpruefung 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 Signaturpruefung wurde nicht erfolgreich beendet:" - + System.getProperty("line.separator") + StreamUtils.getStackTraceAsString(e)); + } 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 Signaturpruefung wurde nicht erfolgreich beendet:" + + System.getProperty("line.separator") + StreamUtils.getStackTraceAsString(e)); throw fault; } diff --git a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/TSLClientStatusServlet.java b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/TSLClientStatusServlet.java index d763c44..3bf9a37 100644 --- a/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/TSLClientStatusServlet.java +++ b/moaSig/moa-sig/src/main/java/at/gv/egovernment/moa/spss/server/service/TSLClientStatusServlet.java @@ -10,72 +10,74 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import at.gv.egovernment.moa.sig.tsl.TslClientFactory; import at.gv.egovernment.moa.sig.tsl.engine.data.TSLProcessingResultElement; import at.gv.egovernment.moa.spss.server.monitoring.ServiceStatusContainer; -import at.gv.egovernment.moa.spss.tsl.TSLServiceFactory; public class TSLClientStatusServlet extends HttpServlet { - /** - * - */ - private static final long serialVersionUID = 1L; + /** + * + */ + private static final long serialVersionUID = 1L; - - public static final String STATUS_RESP = "'{'\"EUTSLStatus\":\"{0}\", \"EUTSLStatusMsg\":\"{1}\"{2}'}'"; - public static final String DETAIL_INFO = ", \"Details\":'{'{0}'}'"; - //public static final String DETAIL_ENTRY = "\"{0}\":'{'\"verified\":\"{1}\", \"processed\":\"{2}\"'}'"; - public static final String DETAIL_ENTRY = "\"{0}\":'{'\"processed\":\"{2}\"'}'"; - - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - if (ServiceStatusContainer.getStatus()) - response.setStatus(200); - else - response.setStatus(500); - - response.setContentType("application/json"); - PrintWriter out = response.getWriter(); - out.println(MessageFormat.format(STATUS_RESP, - new Object[] { - String.valueOf(ServiceStatusContainer.getStatus()), - ServiceStatusContainer.getStatusMsg(), - getTSLClientDetailInfos() - })); - out.flush(); - out.close(); - - } - - private String getTSLClientDetailInfos() { - String detailInfo = ""; - List<TSLProcessingResultElement> tslDetailStatus = ServiceStatusContainer.getTslDetailStatus(); - if (tslDetailStatus != null) { - String detailElements = null; - - for (TSLProcessingResultElement el : tslDetailStatus) { - String entry = MessageFormat.format(DETAIL_ENTRY, - new Object[] { - el.getCountryCode(), - String.valueOf(el.isVerified()), - String.valueOf(el.isProcessed()) - }); - if (detailElements == null) - detailElements = entry; - else - detailElements += ", " + entry; - - } - - if (detailElements != null) - detailInfo = MessageFormat.format(DETAIL_INFO, - new Object[] { - detailElements - }); - } - - return detailInfo; - } + public static final String STATUS_RESP = "'{'\"EUTSLStatus\":\"{0}\", \"EUTSLStatusMsg\":\"{1}\"{2}'}'"; + public static final String DETAIL_INFO = ", \"Details\":'{'{0}'}'"; + // public static final String DETAIL_ENTRY = "\"{0}\":'{'\"verified\":\"{1}\", + // \"processed\":\"{2}\"'}'"; + public static final String DETAIL_ENTRY = "\"{0}\":'{'\"processed\":\"{2}\"'}'"; + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + if (ServiceStatusContainer.getStatus()) { + response.setStatus(200); + } else { + response.setStatus(500); + } + + response.setContentType("application/json"); + final PrintWriter out = response.getWriter(); + out.println(MessageFormat.format(STATUS_RESP, + new Object[] { + String.valueOf(ServiceStatusContainer.getStatus()), + ServiceStatusContainer.getStatusMsg(), + getTSLClientDetailInfos() + })); + out.flush(); + out.close(); + + } + + private String getTSLClientDetailInfos() { + String detailInfo = ""; + final List<TSLProcessingResultElement> tslDetailStatus = ServiceStatusContainer.getTslDetailStatus(); + if (tslDetailStatus != null) { + String detailElements = null; + + for (final TSLProcessingResultElement el : tslDetailStatus) { + final String entry = MessageFormat.format(DETAIL_ENTRY, + new Object[] { + el.getCountryCode(), + String.valueOf(el.isVerified()), + String.valueOf(el.isProcessed()) + }); + if (detailElements == null) { + detailElements = entry; + } else { + detailElements += ", " + entry; + } + + } + + if (detailElements != null) { + detailInfo = MessageFormat.format(DETAIL_INFO, + new Object[] { + detailElements + }); + } + } + + return detailInfo; + } } |