package at.gv.util.client.szr; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import javax.xml.namespace.QName; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; import org.apache.commons.lang.StringUtils; import org.apache.cxf.message.Message; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import at.gv.util.MiscUtil; import at.gv.util.xsd.szr.pvp.Param; import at.gv.util.xsd.szr.pvp.PvpTokenType; import at.gv.util.xsd.szr.pvp.PvpTokenType.Accounting; import at.gv.util.xsd.szr.pvp.PvpTokenType.Accounting.GvCostCenterId; import at.gv.util.xsd.szr.pvp.Role; public class SZRHTTPHeaderHandler implements SOAPHandler { private PvpTokenType pvpTokenType = null; private Logger log = LoggerFactory.getLogger(SZRHTTPHeaderHandler.class); public static final String PVP_HEADER_COSTCENTERID_DEFAULT = ""; public static final String PVP_HEADER_VALUE_DELIMITER = ","; public static final String PVP_HEADER_ROLE_VALUE_DELIMITER = ";"; public void close(MessageContext arg0) { } public boolean handleFault(SOAPMessageContext arg0) { return true; } public void configure(PvpTokenType pvpToken) { MiscUtil.assertNotNull(pvpToken, "pvpToken"); this.pvpTokenType = pvpToken; } public boolean handleMessage(SOAPMessageContext smc) { log.trace("Initializing SZR SOAP message handler."); boolean isOutMessage = ((Boolean) smc.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue(); log.trace("Outbound message: " + isOutMessage); if (pvpTokenType == null) { throw new NullPointerException("Please configure first the PVP token."); } if (!isOutMessage) { return true; } Map headers = (Map) smc.get(Message.PROTOCOL_HEADERS); setHeader(headers, "X-VERSION", pvpTokenType.getVersion()); setHeader(headers, "X-AUTHENTICATE-UserID", pvpTokenType.getAuthenticate().getUserPrincipal().getUserId()); setHeader(headers, "X-AUTHENTICATE-GVGID", pvpTokenType.getAuthenticate().getUserPrincipal().getGvGid()); setHeader(headers, "X-AUTHENTICATE-PARTICIPANTID", pvpTokenType.getAuthenticate().getParticipantId()); setHeader(headers, "X-AUTHENTICATE-GVOUID", pvpTokenType.getAuthenticate().getUserPrincipal().getGvOuId()); setHeader(headers, "X-AUTHENTICATE-OU", pvpTokenType.getAuthenticate().getUserPrincipal().getOu()); setHeader(headers, "X-AUTHENTICATE-GVFUNCTION", pvpTokenType.getAuthenticate().getUserPrincipal().getGvFunction()); setHeader(headers, "X-AUTHENTICATE-gvSecClass", String.valueOf(pvpTokenType.getAuthenticate().getUserPrincipal().getGvSecClass().intValue())); setHeader(headers, "X-AUTHENTICATE-cn",pvpTokenType.getAuthenticate().getUserPrincipal().getCn()); //set roles attribute String roleString = null; List roles = pvpTokenType.getAuthorize().getRole(); if (roles != null && !roles.isEmpty()) { for (Role role : roles) { String roleElement = role.getValue(); List roleParams = role.getParam(); if (roleParams != null && !roleParams.isEmpty()) { roleElement = roleElement + "("; for (Param el : roleParams) { roleElement = roleElement + el.getKey() + "=" + el.getValue() + PVP_HEADER_VALUE_DELIMITER; } roleElement = roleElement.substring(0, roleElement.length()-1) + ")"; } if (roleString == null) roleString = roleElement; else roleString = roleString + PVP_HEADER_ROLE_VALUE_DELIMITER + roleElement; } } setHeader(headers, "X-AUTHORIZE-ROLES", roleString); //set optional headers String costCenterId = null; String invoiceRecptId = null; Accounting accounting = pvpTokenType.getAccounting(); if (accounting != null) { invoiceRecptId = accounting.getInvoiceRecptId(); if (accounting.getGvCostCenterId() != null && !accounting.getGvCostCenterId().isEmpty()) { for (GvCostCenterId el : accounting.getGvCostCenterId()) { String value = StringUtils.EMPTY; if (el.isDefault()) value = PVP_HEADER_COSTCENTERID_DEFAULT; value = value + el.getValue(); if (costCenterId == null) costCenterId = value; else costCenterId = PVP_HEADER_VALUE_DELIMITER + value; } } } setHeader(headers, "X-ACCOUNTING-CostCenterId", costCenterId); setHeader(headers, "X-ACCOUNTING-InvoiceRecptId", invoiceRecptId); return true; } public Set getHeaders() { return null; } private void setHeader(Map headers, String name, String value) { if (MiscUtil.isEmpty(value)) headers.put(name, null); else headers.put(name, Collections.singletonList(value)); } }