/** * Enforces message processiong rules defined in the spec. * * @param message a message * @param requestMessageID the request messageID if we are checking a response message or null if * we are checking a request message * @param isServer true if this is a server * @throws SOAPBindingException if the message violates rules on client. * @throws SOAPFaultException if the message violates rules on server. */ public static void enforceProcessingRules( Message message, String requestMessageID, boolean isServer) throws SOAPBindingException, SOAPFaultException { CorrelationHeader corrH = message.getCorrelationHeader(); String messageID = corrH.getMessageID(); checkCorrelationHeader(corrH, requestMessageID, isServer); checkProviderHeader(message.getProviderHeader(), messageID, isServer); checkProcessingContextHeader(message.getProcessingContextHeader(), messageID, isServer); checkConsentHeader(message.getConsentHeader(), messageID, isServer); List usagHs = message.getUsageDirectiveHeaders(); if (usagHs != null && !usagHs.isEmpty()) { Iterator iter = usagHs.iterator(); while (iter.hasNext()) { UsageDirectiveHeader usagH = (UsageDirectiveHeader) iter.next(); checkUsageDirectiveHeader(usagH, messageID, isServer); } } }
/** * Enforces message Correlation header processiong rules defined in the spec. * * @param corrH a Correlation header * @param requestMessageID the request messageID if we are checking a response message or null if * we are checking a request message * @param isServer true if this is a server * @throws SOAPBindingException if the Correlation header violates rules on client side * @throws SOAPFaultException if the Correlation header violates rules on server side */ static void checkCorrelationHeader( CorrelationHeader corrH, String requestMessageID, boolean isServer) throws SOAPBindingException, SOAPFaultException { if (corrH == null) { if (isServer) { SOAPFault sf = new SOAPFault( FAULT_CODE_SERVER, faultStringServerError, null, new SOAPFaultDetail(SOAPFaultDetail.ID_STAR_MSG_NOT_UNSTD, null, null)); throw new SOAPFaultException(new Message(sf)); } else { throw new SOAPBindingException(bundle.getString("CorrelationHeaderNull")); } } String messageID = corrH.getMessageID(); try { checkActorAndMustUnderstand(corrH.getActor(), corrH.getMustUnderstand(), messageID, isServer); } catch (SOAPFaultException sfe) { sfe.getSOAPFaultMessage().getSOAPFault().getDetail().setCorrelationHeader(corrH); throw sfe; } Date timestamp = corrH.getTimestamp(); Date now = new Date(); if ((now.getTime() - timestamp.getTime()) > stale_time_limit) { if (isServer) { SOAPFaultDetail sfd = new SOAPFaultDetail(SOAPFaultDetail.STALE_MSG, messageID, null); sfd.setCorrelationHeader(corrH); SOAPFault sf = new SOAPFault(FAULT_CODE_SERVER, faultStringServerError, null, sfd); throw new SOAPFaultException(new Message(sf)); } else { throw new SOAPBindingException(bundle.getString("staleMsg")); } } Long prevMsgIDTime = (Long) messageIDMap.get(messageID); long currentTime = System.currentTimeMillis(); if (prevMsgIDTime != null && currentTime - prevMsgIDTime.longValue() < stale_time_limit) { if (isServer) { SOAPFaultDetail sfd = new SOAPFaultDetail(SOAPFaultDetail.DUPLICATE_MSG, messageID, null); sfd.setCorrelationHeader(corrH); SOAPFault sf = new SOAPFault(FAULT_CODE_SERVER, faultStringServerError, null, sfd); throw new SOAPFaultException(new Message(sf)); } else { throw new SOAPBindingException(bundle.getString("dupMsg")); } } else { synchronized (messageIDMap) { if (debug.messageEnabled()) { debug.message("Utils.checkCorrelationHeader: adding " + "messageID: " + messageID); } messageIDMap.put(messageID, new Long(currentTime)); } } String refToMessageID = corrH.getRefToMessageID(); if (refToMessageID != null && requestMessageID != null && !refToMessageID.equals(requestMessageID)) { if (isServer) { SOAPFaultDetail sfd = new SOAPFaultDetail(SOAPFaultDetail.INVALID_REF_TO_MSG_ID, messageID, null); sfd.setCorrelationHeader(corrH); SOAPFault sf = new SOAPFault(FAULT_CODE_SERVER, faultStringServerError, null, sfd); throw new SOAPFaultException(new Message(sf)); } else { throw new SOAPBindingException(bundle.getString("invalidRef")); } } }