예제 #1
0
 /**
  * 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);
     }
   }
 }
예제 #2
0
  /**
   * 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"));
      }
    }
  }