class StandardProcessorNode extends ProcessorNode implements Connectable {

    @Override
    public void start(final ScheduledExecutorService taskScheduler, final long administrativeYieldMillis, final ProcessContext processContext,
            final SchedulingAgentCallback schedulingAgentCallback, final boolean failIfStopping) {

        switch (getValidationStatus()) {
            case INVALID:
                throw new IllegalStateException("Processor " + this.getName() + " is not in a valid state due to " + this.getValidationErrors());
            case VALIDATING:
                throw new IllegalStateException("Processor " + this.getName() + " cannot be started because its validation is still being performed");
        }

        final Processor processor = processorRef.get().getProcessor();
        final ComponentLog procLog = new SimpleProcessLogger(StandardProcessorNode.this.getIdentifier(), processor);

        ScheduledState currentState;
        boolean starting;
        synchronized (this) {
            currentState = this.scheduledState.get();

            if (currentState == ScheduledState.STOPPED) {
                starting = this.scheduledState.compareAndSet(ScheduledState.STOPPED, ScheduledState.STARTING);
                if (starting) {
                    desiredState = ScheduledState.RUNNING;
                }
            } else if (currentState == ScheduledState.STOPPING && !failIfStopping) {
                desiredState = ScheduledState.RUNNING;
                return;
            } else {
                starting = false;
            }
        }

        if (starting) { // will ensure that the Processor represented by this node can only be started once
            hasActiveThreads = true;
            initiateStart(taskScheduler, administrativeYieldMillis, processContext, schedulingAgentCallback);
        } else {
            final String procName = processorRef.get().toString();
            LOG.warn("Cannot start {} because it is not currently stopped. Current state is {}", procName, currentState);
            procLog.warn("Cannot start {} because it is not currently stopped. Current state is {}", new Object[] {procName, currentState});
        }
    }

    public  StandardProcessorNode(final LoggableComponent<Processor> processor, final String uuid,
                                 final ValidationContextFactory validationContextFactory, final ProcessScheduler scheduler,
                                 final ControllerServiceProvider controllerServiceProvider, final NiFiProperties nifiProperties,
                                 final ComponentVariableRegistry variableRegistry, final ReloadComponent reloadComponent, final ValidationTrigger validationTrigger);
    public  StandardProcessorNode(final LoggableComponent<Processor> processor, final String uuid,
                                 final ValidationContextFactory validationContextFactory, final ProcessScheduler scheduler,
                                 final ControllerServiceProvider controllerServiceProvider,
                                 final String componentType, final String componentCanonicalClass, final NiFiProperties nifiProperties,
                                 final ComponentVariableRegistry variableRegistry, final ReloadComponent reloadComponent, final ValidationTrigger validationTrigger,
                                 final boolean isExtensionMissing);

}