docs: @Override
      public void setAttribute(String name, Object value) {
          final boolean bTrace = TraceComponent.isAnyTracingEnabled();
          if (bTrace && tc.isDebugEnabled()) {
              Tr.debug(tc, "setAttribute: " + name + "=" + value);
          }
          if (null == value) {
              removeAttribute(name);
              return;
          }
          if (isInvalid()) {
              throw new IllegalStateException("Session is invalid");
          }
          HttpSessionBindingEvent replaceEvent = null;
          HttpSessionBindingEvent addEvent = null;
          Object current = this.attributes.remove(name);
          if (null != current) {
              replaceEvent = new HttpSessionBindingEvent(this, name, current);
              if (current instanceof HttpSessionBindingListener) {
                  // inform the old value of it's removal
                  if (bTrace && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Notifying old value: " + current);
                  }
                  ((HttpSessionBindingListener) current).valueUnbound(replaceEvent);
              }
          }
          this.attributes.put(name, value);
          if (value instanceof HttpSessionBindingListener) {
              // inform the new value of it's use
              if (bTrace && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Notifying new value: " + value);
              }
              addEvent = new HttpSessionBindingEvent(this, name, value);
              ((HttpSessionBindingListener) value).valueBound(addEvent);
          }
          // List<HttpSessionAttributeListener> list = this.myConfig.getSessionAttributeListeners();
          // if (null != list) {
          // // if we replaced a value, let the listeners now that. Otherwise,
          // // tell them of the new value being set
          // if (null != current) {
          // for (HttpSessionAttributeListener listener : list) {
          // if (bTrace && tc.isDebugEnabled()) {
          // Tr.debug(tc, "Notifying listener of replace: " + listener);
          // }
          // listener.attributeReplaced(replaceEvent);
          // }
          // } else {
          // if (null == addEvent) {
          // addEvent = new HttpSessionBindingEvent(this, name, value);
          // }
          // for (HttpSessionAttributeListener listener : list) {
          // if (bTrace && tc.isDebugEnabled()) {
          // Tr.debug(tc, "Notifying listener of set: " + listener);
          // }
          // listener.attributeAdded(addEvent);
          // }
          // }
          // }
      }