code: public ExecutionContext with( Map<String, String> data ) {
          Map<String, String> newData = data;
          if (newData == null) {
              if (this.data.isEmpty()) return this;
          } else {
              // Copy the data in the map ...
              newData = Collections.unmodifiableMap(new HashMap<String, String>(data));
          }
          return new ExecutionContext(securityContext, namespaceRegistry, propertyFactory, threadPools, binaryStore, newData,
                                      processId, decoder, encoder, stringFactory, binaryFactory, booleanFactory, dateFactory,
                                      decimalFactory, doubleFactory, longFactory, nameFactory, pathFactory, referenceFactory,
                                      weakReferenceFactory, simpleReferenceFactory, uriFactory, objectFactory, locale);
      }
docs: Create a new execution context that mirrors this context but that contains the supplied data. Note that the supplied map is
  always copied to ensure that it is immutable.
  
  @param data the data that is to be affiliated with the resulting context or null if the resulting context should have no
  data
  @return the execution context that is identical with this execution context, but which uses the supplied data; never null
  @since 2.0