code: /**
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements. See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership. The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License. You may obtain a copy of the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing,
   * software distributed under the License is distributed on an
   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   * KIND, either express or implied. See the License for the
   * specific language governing permissions and limitations
   * under the License.
   */
  
  package org.apache.cxf.ws.security.sts.provider;
  
  import javax.xml.namespace.QName;
  
  /**
   * A RuntimeException that can be thrown by an STS implementation. If the FaultCode is set, then this 
   * code/String will be returned to the user, otherwise the Exception message is returned.
   */
  public class STSException extends RuntimeException {
  
      /**
       * WS-Trust 1.3 namespace
       */
      public static final String WST_NS_05_12 = "http://docs.oasis-open.org/ws-sx/ws-trust/200512";
      
      /**
       * Specification Fault Codes
       */
      public static final QName INVALID_REQUEST = new QName(WST_NS_05_12, "InvalidRequest");
      public static final QName FAILED_AUTH = new QName(WST_NS_05_12, "FailedAuthentication");
      public static final QName REQUEST_FAILED = new QName(WST_NS_05_12, "RequestFailed");
      public static final QName INVALID_TOKEN = new QName(WST_NS_05_12, "InvalidSecurityToken");
      public static final QName AUTH_BAD_ELEMENTS = new QName(WST_NS_05_12, "AuthenticationBadElements");
      public static final QName BAD_REQUEST = new QName(WST_NS_05_12, "BadRequest");
      public static final QName EXPIRED_DATA = new QName(WST_NS_05_12, "ExpiredData");
      public static final QName INVALID_TIME = new QName(WST_NS_05_12, "InvalidTimeRange");
      public static final QName INVALID_SCOPE = new QName(WST_NS_05_12, "InvalidScope");
      public static final QName RENEW_NEEDED = new QName(WST_NS_05_12, "RenewNeeded");
      public static final QName UNABLE_TO_RENEW = new QName(WST_NS_05_12, "UnableToRenew");
      
      /**
       * A map of Fault Code to Fault Strings
       */
      private static final java.util.Map<QName, String> FAULT_CODE_MAP = 
              new java.util.HashMap<QName, String>();
  
      static {
          FAULT_CODE_MAP.put(INVALID_REQUEST, "The request was invalid or malformed");
          FAULT_CODE_MAP.put(FAILED_AUTH, "Authentication failed");
          FAULT_CODE_MAP.put(REQUEST_FAILED, "The specified request failed");
          FAULT_CODE_MAP.put(INVALID_TOKEN, "Security token has been revoked");
          FAULT_CODE_MAP.put(AUTH_BAD_ELEMENTS, "Insufficient Digest Elements");
          FAULT_CODE_MAP.put(BAD_REQUEST, "The specified RequestSecurityToken is not understood");
          FAULT_CODE_MAP.put(EXPIRED_DATA, "The request data is out-of-date");
          FAULT_CODE_MAP.put(INVALID_TIME, "The requested time range is invalid or unsupported");
          FAULT_CODE_MAP.put(INVALID_SCOPE, "The request scope is invalid or unsupported");
          FAULT_CODE_MAP.put(RENEW_NEEDED, "A renewable security token has expired");
          FAULT_CODE_MAP.put(UNABLE_TO_RENEW, "The requested renewal failed");
      }
      
      /**
       * 
       */
      private static final long serialVersionUID = 2186924985128534490L;
      
      
      private QName faultCode;
      
      public STSException(String message) {
          super(message);
      }
      
      public STSException(String message, QName faultCode) {
          super(message);
          this.faultCode = faultCode;
      }
      
      public STSException(String message, Throwable e) {
          super(message, e);
      }
  
      public STSException(String message, Throwable e, QName faultCode) {
          super(message, e);
          this.faultCode = faultCode;
      }
      
      public void setFaultCode(QName faultCode) {
          this.faultCode = faultCode;
      }
      
      public QName getFaultCode() {
          return faultCode;
      }
      
      @Override
      public String getMessage() {
          if (faultCode != null && FAULT_CODE_MAP.get(faultCode) != null) {
              return FAULT_CODE_MAP.get(faultCode);
          }
          return super.getMessage();
      }
  
  }
  