code: private void includeInAppDataChanges(String name, Object value, int invoker) {
          if (appDataTablesPerThread) {
              Thread t = Thread.currentThread();
              Hashtable sht = (Hashtable) appDataChanges.get(t);
              if (sht == null) {
                  sht = new Hashtable();
                  appDataChanges.put(t, sht);
              }
              if (com.ibm.websphere.ras.TraceComponent.isAnyTracingEnabled() && LoggingUtil.SESSION_LOGGER_WAS.isLoggable(Level.FINE)) {
                  if (!SessionManagerConfig.isHideSessionValues()) {
                      LoggingUtil.SESSION_LOGGER_WAS.logp(Level.FINE, methodClassName, methodNames[invoker], "storing for " + getId() + " prop " + name + " with value "
                                                                                                                    + value + " via thread " + t);
                  } else {
                      LoggingUtil.SESSION_LOGGER_WAS.logp(Level.FINE, methodClassName, methodNames[invoker], "storing for " + getId() + " prop " + name + " via thread "
                                                                                                                    + t);
                  }
              }
              sht.put(name, value);
          } else { // appDataTablesPerSession
              appDataChanges.put(name, value);
          }
      }
docs: Adds a session attribute to the tracked list of changed data.
  
  Precondition: invoker must be synchronized on BackedSession instance
  
  @param name name of session attribute
  @param value value of session attribute
  @param invoker constant indicating the invoking method: GET_VALUE_GUTS or PUT_VALUE_GUTS