docs: public String getState() throws SIMPException
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.entry(tc, "getState");
  
      String state = State.UNLOCKED;
      
      assertValidControllable();
      SIMPMessage msg = null;
      try
      {
        msg = getSIMPMessage();
      }
      catch (SIResourceException e)
      {
        // No FFDC code needed    
        SIMPRuntimeOperationFailedException finalE =
          new SIMPRuntimeOperationFailedException(
            nls.getFormattedMessage(
              "INTERNAL_MESSAGING_ERROR_CWSIP0003",
              new Object[] {"QueuedMessage.getState",
                            "1:288:1.66",
                            e,
                            Long.toString(_messageID)},
              null), e,
              "INTERNAL_MESSAGING_ERROR_CWSIP0003", new Object[] {Long.toString(_messageID)});
    
        SibTr.exception(tc, finalE);
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) 
          SibTr.exit(tc, "getState", finalE);
        throw finalE;
      }
      
      if(msg!=null)  
      {
        //defect 262036: locked messages are displayed as locked, but so 
        //are messages that are no longer available 
        //e.g. messages being removed
        AbstractItem msgItem = (AbstractItem)msg;
        if(!msgItem.isAvailable())
        {
          // This message is locked because a consumer (MDB probably) has
          // hidden it due to repeated failures to process it.
          if(msg.isHidden())
            state = State.PENDING_RETRY;         
          // It's being added under a tran (probably already in prepare)
          else if(msgItem.isAdding())
            state = State.COMMITTING;
          // It's being deleted under a tran
          else if(msgItem.isRemoving())
            state = State.REMOVING;
          // It's currently locked for a remote getter
          else if(msgItem.isPersistentlyLocked())
            state = State.REMOTE_LOCKED;
          else
            state = State.LOCKED;
        }
        else
        {
          // Even if the mesage looks available, the whole stream may be blocked
          // by a ConsumerDispatcher due to a failing message not being exceptioned
          // so this mesasge is actually unavailable for the time being
          if(isStreamBlocked())
            state = State.BLOCKED;
        }
      }
      
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.exit(tc, "getState", state);
      return state;
    }