public NamedWindowProcessor addProcessor(
      String name,
      String contextName,
      boolean singleInstanceContext,
      EventType eventType,
      StatementResultService statementResultService,
      ValueAddEventProcessor revisionProcessor,
      String eplExpression,
      String statementName,
      boolean isPrioritized,
      boolean isEnableSubqueryIndexShare,
      boolean isBatchingDataWindow,
      boolean isVirtualDataWindow,
      StatementMetricHandle statementMetricHandle,
      Set<String> optionalUniqueKeyProps)
      throws ViewProcessingException {
    if (processors.containsKey(name)) {
      throw new ViewProcessingException(
          "A named window by name '" + name + "' has already been created");
    }

    NamedWindowProcessor processor =
        new NamedWindowProcessor(
            name,
            this,
            contextName,
            singleInstanceContext,
            eventType,
            statementResultService,
            revisionProcessor,
            eplExpression,
            statementName,
            isPrioritized,
            isEnableSubqueryIndexShare,
            enableQueryPlanLog,
            metricReportingService,
            isBatchingDataWindow,
            isVirtualDataWindow,
            statementMetricHandle,
            optionalUniqueKeyProps);
    processors.put(name, processor);

    if (!observers.isEmpty()) {
      NamedWindowLifecycleEvent theEvent =
          new NamedWindowLifecycleEvent(
              name, processor, NamedWindowLifecycleEvent.LifecycleEventType.CREATE);
      for (NamedWindowLifecycleObserver observer : observers) {
        observer.observe(theEvent);
      }
    }

    return processor;
  }
  public void removeProcessor(String name) {
    NamedWindowProcessor processor = processors.get(name);
    if (processor != null) {
      processor.destroy();
      processors.remove(name);

      if (!observers.isEmpty()) {
        NamedWindowLifecycleEvent theEvent =
            new NamedWindowLifecycleEvent(
                name, processor, NamedWindowLifecycleEvent.LifecycleEventType.DESTROY);
        for (NamedWindowLifecycleObserver observer : observers) {
          observer.observe(theEvent);
        }
      }
    }
  }