code: private JsMessage getJSMessage(boolean throwExceptionIfNotAvailable)
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(this, tc, "getJSMessage", Boolean.valueOf(throwExceptionIfNotAvailable));
  
          JsMessage localMsg = msg;
          if (localMsg == null)
          {
              if (softReferenceMsg != null)
              {
                  localMsg = softReferenceMsg.get(); //Get the referred object
              }
  
              if (localMsg == null)
              {
                  synchronized (this)
                  {
                      restoreJsMessageFromMsgstore(throwExceptionIfNotAvailable);
                      localMsg = msg;
                      // It is possible that restoreJsMessageFromMsgstore restored no message and didn't
                      // throw an exception. In this case don't create the SoftReference.
                      if (localMsg != null)
                      {
                          //Assign the msg to the soft reference, this is to ensure that we
                          // don't keep a hard reference to the msg in memory after we have restored 
                          softReferenceMsg = new SoftReference<JsMessage>(msg);
                          //Remove the hard reference.
                          msg = null;
                      }
                  }
              }
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(this, tc, "getJSMessage", localMsg);
          return localMsg;
      }
docs: Get the underlying message object
  
  @param throwExceptionIfNotAvailable Boolean to indicate whether exception
  has to be thrown if message not available
  @return The underlying message object