package com.pkrete.xrd4j.server.deserializer; import com.pkrete.xrd4j.common.deserializer.AbstractHeaderDeserializer; import com.pkrete.xrd4j.common.exception.XRd4JException; import com.pkrete.xrd4j.common.exception.XRd4JMissingMemberException; import com.pkrete.xrd4j.common.member.ConsumerMember; import com.pkrete.xrd4j.common.member.ProducerMember; import com.pkrete.xrd4j.common.member.SecurityServer; import com.pkrete.xrd4j.common.message.ServiceRequest; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class offers methods for deserializing SOAPMessages to ServiceRequest * objects. This class serializes only SOAP headers as SOAP body contains * application specific content, and therefore an application specific * deserializer is needed for SOAP body. * * This deserializer can be used by an adapter service for handling incoming * requests. SOAP header contains the information about the service that the * consumer is calling, and the information can be accessed through the * ServiceRequest object returned by this class. Application specific * deserializers must extend the abstract AbstractCustomRequestDeserializer * class. * * @author Petteri Kivimäki */ public class ServiceRequestDeserializerImpl extends AbstractHeaderDeserializer implements ServiceRequestDeserializer { private static final Logger logger = LoggerFactory.getLogger(ServiceRequestDeserializerImpl.class); /** * Deserializes the given SOAPMessage object to ServiceRequest object. Only * SOAP header is deserialized. An application specific serializer is needed * for SOAP body. * * @param message SOAP message to be deserialized * @return ServiceRequest object that represents the given SOAPMessage * object or null if the operation failed * @throws SOAPException if there's a SOAP error * @throws XRd4JException if there's a XRd4J error */ @Override public final ServiceRequest deserialize(final SOAPMessage message) throws XRd4JException, SOAPException { logger.debug("Deserialize SOAP message."); SOAPPart mySPart = message.getSOAPPart(); SOAPEnvelope envelope = mySPart.getEnvelope(); // Desearialize header ServiceRequest request = this.deserializeHeader(envelope.getHeader()); request.setSoapMessage(message); logger.debug("SOAP message header was succesfully deserialized."); return request; } /** * Deserializes the given SOAPHeader object to ServiceRequest object. * * @param header SOAP header to be deserialized * @return ServiceRequest object that contains the given SOAP header * @throws SOAPException if there's a SOAP error * @throws XRd4JException if there's a XRd4J exception */ private ServiceRequest deserializeHeader(final SOAPHeader header) throws SOAPException, XRd4JException { logger.debug("Deserialize SOAP header."); // Check that SOAP header exists if (header == null || header.getChildNodes().getLength() == 0) { logger.warn("No SOAP header or an empty SOAP header was found."); return new ServiceRequest(); } // Client headers String id = super.deserializeId(header); String userId = super.deserializeUserId(header); String issue = super.deserializeIssue(header); String protocolVersion = super.deserializeProtocolVersion(header); // Create objects ConsumerMember consumer = null; ProducerMember producer = null; SecurityServer securityServer = null; try { consumer = super.deserializeConsumer(header); } catch (XRd4JMissingMemberException ex) { logger.warn("Deserializing \"ConsumerMember\" failed."); } try { producer = super.deserializeProducer(header); } catch (XRd4JMissingMemberException ex) { logger.warn("Deserializing \"ProducerMember\" failed."); } try { // Not mandatory - can be null securityServer = super.deserializeSecurityServer(header); } catch (XRd4JException ex) { logger.warn("Deserializing \"SecurityServer\" failed."); } ServiceRequest request = new ServiceRequest(consumer, producer, id); request.setSecurityServer(securityServer); request.setUserId(userId); request.setIssue(issue); request.setProtocolVersion(protocolVersion); logger.debug("SOAP header was succesfully deserialized."); // Return request return request; } }