package at.gv.egovernment.moa.id.protocols.stork2; import java.io.StringWriter; import java.util.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPConnection; import javax.xml.soap.SOAPConnectionFactory; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import at.gv.egovernment.moa.id.auth.builder.BPKBuilder; import at.gv.egovernment.moa.id.auth.data.AuthenticationSession; import at.gv.egovernment.moa.id.auth.exception.MOAIDException; import at.gv.egovernment.moa.id.config.auth.OAAuthParameter; import at.gv.egovernment.moa.logging.Logger; import eu.stork.peps.auth.commons.IPersonalAttributeList; import eu.stork.peps.auth.commons.PersonalAttribute; import eu.stork.peps.auth.commons.PersonalAttributeList; import eu.stork.peps.complex.attributes.IsHealthCareProfessionalType; import eu.stork.peps.complex.attributes.ObjectFactory; /** * Fetches the attribute IsHealthcareProfessional from the BAGDAD SOAP service */ public class EHvdAttributeProviderPlugin implements AttributeProvider { /** The destination. */ private Object destination; /** The attributes. */ private String attributes; /** * Instantiates a new e hvd attribute provider plugin. * * @param url the service url * @param attributes */ public EHvdAttributeProviderPlugin(String url, String supportedAttributes) { destination = url; attributes = supportedAttributes; } /* (non-Javadoc) * @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#acquire(eu.stork.peps.auth.commons.PersonalAttribute) */ public IPersonalAttributeList acquire(PersonalAttribute attribute, String spCountryCode, AuthenticationSession moasession) throws UnsupportedAttributeException, ExternalAttributeRequestRequiredException, MOAIDException { // break when we cannot handle the requested attribute if(!attributes.contains(attribute.getName())) throw new UnsupportedAttributeException(); try { Logger.debug("initializing SOAP connections..."); // create SOAP connection SOAPConnection soapConnection = SOAPConnectionFactory.newInstance().createConnection(); // assemble SOAP request MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage requestMessage = messageFactory.createMessage(); SOAPPart requestPart = requestMessage.getSOAPPart(); // (soap 1.1 relevant part. could not find a solution to use soap 1.2 in time. requestMessage.getMimeHeaders().setHeader("SOAPAction", "http://gesundheit.gv.at/BAGDAD/DataAccessService/IsHealthcareProfessional"); /* Construct SOAP Request Message: string see https://stork.ehealth.gv.at/GDAService.asmx?op=IsHealthcareProfessional */ // SOAP Envelope SOAPEnvelope envelope = requestPart.getEnvelope(); // SOAP Body SOAPBody requestBody = envelope.getBody(); SOAPElement requestBodyElem = requestBody.addChildElement("IsHealthcareProfessional"); requestBodyElem.addAttribute(envelope.createName("xmlns"), "http://gesundheit.gv.at/BAGDAD/DataAccessService"); SOAPElement requestBodyElem1 = requestBodyElem.addChildElement("bPK"); requestBodyElem1.addTextNode(new BPKBuilder().buildBPK(moasession.getIdentityLink().getIdentificationValue(), "GH")); requestMessage.saveChanges(); // perform SOAP call Logger.debug("call..."); SOAPMessage responseMessage = soapConnection.call(requestMessage, destination); // parse SOAP response /* boolean string boolean string string string see https://stork.ehealth.gv.at/GDAService.asmx?op=IsHealthcareProfessional */ Logger.debug("call successful. Parse..."); SOAPBody responseBody = responseMessage.getSOAPBody(); // iterate through tree SOAPElement responseElement = (SOAPElement) responseBody.getChildElements().next(); SOAPElement resultElement = (SOAPElement) responseElement.getChildElements().next(); // collect all info in a map Iterator it = resultElement.getChildElements(); Map collection = new HashMap(); while (it.hasNext()) { SOAPElement current = (SOAPElement) it.next(); collection.put(current.getNodeName(), current.getTextContent()); } // check if there is anything valid in the map if (collection.isEmpty() || collection.size() != 6) { Logger.warn("eHVD returned an unexpected count of values. Expected 6 got " + collection.size()); throw new IndexOutOfBoundsException("response attributes not like specified"); } // - fetch request validity if (collection.get("RequestOK").equals("false")) { Logger.warn("eHVD reported an invalid request. The error message is: " + collection.get("Message")); throw new Exception("eHVD reported an invalid request"); } PersonalAttribute acquiredAttribute = null; if (collection.get("IsHealthcareProfessional").equals("false")) { // the citizen is no HCP acquiredAttribute = new PersonalAttribute("isHealthCareProfessional", false, new ArrayList(), "NotAvailable"); } else { // go on and parse the data IsHealthCareProfessionalType result = new IsHealthCareProfessionalType(); result.setNameOfOrganisation(collection.get("NameOfOrganisation")); if (collection.get("Type").equals("Medical doctor")) result.setHCPType("D"); else result.setHCPType("?"); if (collection.get("Specialization").contains("Arzt für Allgemeinmedizin")) result.setSpecialisation("GP"); else result.setSpecialisation("??"); result.setAQAA(4); final Marshaller m = JAXBContext.newInstance(IsHealthCareProfessionalType.class).createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); StringWriter stringWriter = new StringWriter(); m.marshal(new ObjectFactory().createIsHealthCareProfessional(result), stringWriter); ArrayList value = new ArrayList(); value.add(stringWriter.toString()); acquiredAttribute = new PersonalAttribute("isHealthCareProfessional", false, value, "Available"); } // pack and return the result PersonalAttributeList result = new PersonalAttributeList(); result.add(acquiredAttribute); // add stork id for verification ArrayList value = new ArrayList(); value.add(new BPKBuilder().buildStorkeIdentifier(moasession.getIdentityLink(), spCountryCode)); result.add(new PersonalAttribute("eIdentifier", false, value, "Available")); return result; } catch (Exception e) { throw new MOAIDException("stork.13", new Object[] { e }); } } @Override public IPersonalAttributeList acquire(List attributes, String spCountyCode, AuthenticationSession moasession) throws UnsupportedAttributeException, ExternalAttributeRequestRequiredException, MOAIDException { if (attributes.size() == 1) { return acquire(attributes.get(0), spCountyCode, moasession); } else { throw new MOAIDException("stork.13", new Object[] { }); // TODO message only one attribute supported by this provider } } /* (non-Javadoc) * @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#performRedirect(java.lang.String, java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, at.gv.egovernment.moa.id.config.auth.OAAuthParameter) */ public void performRedirect(String url, HttpServletRequest req, HttpServletResponse resp, OAAuthParameter oaParam) throws MOAIDException { // there is no redirect required } /* (non-Javadoc) * @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#parse(javax.servlet.http.HttpServletRequest) */ public IPersonalAttributeList parse(HttpServletRequest httpReq) throws UnsupportedAttributeException, MOAIDException { // there is no redirect required, so we throw an exception when someone asks us to parse a response throw new UnsupportedAttributeException(); } }