NIFI-4: Added better support for reporting task and controller service lifecycle via annotations
Project: http://git-wip-us.apache.org/repos/asf/incubator-nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-nifi/commit/b5956709 Tree: http://git-wip-us.apache.org/repos/asf/incubator-nifi/tree/b5956709 Diff: http://git-wip-us.apache.org/repos/asf/incubator-nifi/diff/b5956709 Branch: refs/heads/NIFI-250 Commit: b5956709b724a2a3520c6b6f5c877653b599ac5e Parents: 53328a4 Author: Mark Payne <[email protected]> Authored: Tue Jan 20 12:59:59 2015 -0500 Committer: Mark Payne <[email protected]> Committed: Tue Jan 20 12:59:59 2015 -0500 ---------------------------------------------------------------------- .../cluster/manager/impl/WebClusterManager.java | 23 ++++----- .../nifi/controller/ReportingTaskNode.java | 1 + .../service/ControllerServiceNode.java | 1 + .../reporting/AbstractReportingTaskNode.java | 53 ++++++++++++++++++-- .../service/ControllerServiceLoader.java | 10 ++-- .../service/StandardControllerServiceNode.java | 25 ++++++++- .../StandardControllerServiceProvider.java | 1 + .../nifi/web/controller/ControllerFacade.java | 8 ++- 8 files changed, 97 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/b5956709/nifi/nar-bundles/framework-bundle/framework/cluster/src/main/java/org/apache/nifi/cluster/manager/impl/WebClusterManager.java ---------------------------------------------------------------------- diff --git a/nifi/nar-bundles/framework-bundle/framework/cluster/src/main/java/org/apache/nifi/cluster/manager/impl/WebClusterManager.java b/nifi/nar-bundles/framework-bundle/framework/cluster/src/main/java/org/apache/nifi/cluster/manager/impl/WebClusterManager.java index 511bb7d..cec9b74 100644 --- a/nifi/nar-bundles/framework-bundle/framework/cluster/src/main/java/org/apache/nifi/cluster/manager/impl/WebClusterManager.java +++ b/nifi/nar-bundles/framework-bundle/framework/cluster/src/main/java/org/apache/nifi/cluster/manager/impl/WebClusterManager.java @@ -191,7 +191,6 @@ import org.apache.nifi.web.api.entity.ProvenanceEventEntity; import org.apache.nifi.web.api.entity.RemoteProcessGroupEntity; import org.apache.nifi.web.api.entity.RemoteProcessGroupsEntity; import org.apache.nifi.web.util.WebUtils; - import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -1290,18 +1289,6 @@ public class WebClusterManager implements HttpClusterManager, ProtocolHandler, C } } - /** - * Adds an instance of a specified controller service. - * - * @param type - * @param id - * @param properties - * @return - */ - @Override - public ControllerServiceNode createControllerService(String type, String id, Map<String, String> properties) { - return controllerServiceProvider.createControllerService(type, id, properties); - } @Override public ControllerService getControllerService(String serviceIdentifier) { @@ -1323,6 +1310,16 @@ public class WebClusterManager implements HttpClusterManager, ProtocolHandler, C return controllerServiceProvider.isControllerServiceEnabled(serviceIdentifier); } + @Override + public ControllerServiceNode createControllerService(final String type, final String id, final boolean firstTimeAdded) { + return controllerServiceProvider.createControllerService(type, id, firstTimeAdded); + } + + @Override + public void removeControllerService(final ControllerServiceNode serviceNode) { + controllerServiceProvider.removeControllerService(serviceNode); + } + /** * Handle a bulletins message. * http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/b5956709/nifi/nar-bundles/framework-bundle/framework/core-api/src/main/java/org/apache/nifi/controller/ReportingTaskNode.java ---------------------------------------------------------------------- diff --git a/nifi/nar-bundles/framework-bundle/framework/core-api/src/main/java/org/apache/nifi/controller/ReportingTaskNode.java b/nifi/nar-bundles/framework-bundle/framework/core-api/src/main/java/org/apache/nifi/controller/ReportingTaskNode.java index 0db49bd..fa48cb3 100644 --- a/nifi/nar-bundles/framework-bundle/framework/core-api/src/main/java/org/apache/nifi/controller/ReportingTaskNode.java +++ b/nifi/nar-bundles/framework-bundle/framework/core-api/src/main/java/org/apache/nifi/controller/ReportingTaskNode.java @@ -73,4 +73,5 @@ public interface ReportingTaskNode extends ConfiguredComponent { void verifyCanDisable(); void verifyCanEnable(); void verifyCanDelete(); + void verifyCanUpdate(); } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/b5956709/nifi/nar-bundles/framework-bundle/framework/core-api/src/main/java/org/apache/nifi/controller/service/ControllerServiceNode.java ---------------------------------------------------------------------- diff --git a/nifi/nar-bundles/framework-bundle/framework/core-api/src/main/java/org/apache/nifi/controller/service/ControllerServiceNode.java b/nifi/nar-bundles/framework-bundle/framework/core-api/src/main/java/org/apache/nifi/controller/service/ControllerServiceNode.java index 357d4de..66bad39 100644 --- a/nifi/nar-bundles/framework-bundle/framework/core-api/src/main/java/org/apache/nifi/controller/service/ControllerServiceNode.java +++ b/nifi/nar-bundles/framework-bundle/framework/core-api/src/main/java/org/apache/nifi/controller/service/ControllerServiceNode.java @@ -43,4 +43,5 @@ public interface ControllerServiceNode extends ConfiguredComponent { void verifyCanEnable(); void verifyCanDisable(); void verifyCanDelete(); + void verifyCanUpdate(); } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/b5956709/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/reporting/AbstractReportingTaskNode.java ---------------------------------------------------------------------- diff --git a/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/reporting/AbstractReportingTaskNode.java b/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/reporting/AbstractReportingTaskNode.java index f299781..7c3734a 100644 --- a/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/reporting/AbstractReportingTaskNode.java +++ b/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/reporting/AbstractReportingTaskNode.java @@ -19,7 +19,6 @@ package org.apache.nifi.controller.reporting; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; -import org.apache.nifi.annotation.lifecycle.OnAdded; import org.apache.nifi.controller.AbstractConfiguredComponent; import org.apache.nifi.controller.Availability; import org.apache.nifi.controller.ConfigurationContext; @@ -27,7 +26,6 @@ import org.apache.nifi.controller.ControllerServiceLookup; import org.apache.nifi.controller.ProcessScheduler; import org.apache.nifi.controller.ReportingTaskNode; import org.apache.nifi.controller.ScheduledState; -import org.apache.nifi.controller.StandardProcessorNode; import org.apache.nifi.controller.ValidationContextFactory; import org.apache.nifi.controller.annotation.OnConfigured; import org.apache.nifi.controller.exception.ProcessorLifeCycleException; @@ -145,6 +143,8 @@ public abstract class AbstractReportingTaskNode extends AbstractConfiguredCompon } private void onConfigured() { + // We need to invoke any method annotation with the OnConfigured annotation in order to + // maintain backward compatibility. This will be removed when we remove the old, deprecated annotations. try (final NarCloseable x = NarCloseable.withNarLoader()) { final ConfigurationContext configContext = new StandardConfigurationContext(this, serviceLookup); ReflectionUtils.invokeMethodsWithAnnotation(OnConfigured.class, reportingTask, configContext); @@ -153,11 +153,58 @@ public abstract class AbstractReportingTaskNode extends AbstractConfiguredCompon } } + public boolean isDisabled() { + return scheduledState == ScheduledState.DISABLED; + } + @Override public void verifyCanDelete() { if (isRunning()) { - throw new IllegalStateException(this + " is running"); + throw new IllegalStateException("Cannot delete " + reportingTask + " because it is currently running"); + } + } + + @Override + public void verifyCanDisable() { + if ( isRunning() ) { + throw new IllegalStateException("Cannot disable " + reportingTask + " because it is currently running"); + } + + if ( isDisabled() ) { + throw new IllegalStateException("Cannot disable " + reportingTask + " because it is already disabled"); + } + } + + + @Override + public void verifyCanEnable() { + if ( !isDisabled() ) { + throw new IllegalStateException("Cannot enable " + reportingTask + " because it is not disabled"); } } + @Override + public void verifyCanStart() { + if ( isDisabled() ) { + throw new IllegalStateException("Cannot start " + reportingTask + " because it is currently disabled"); + } + + if ( isRunning() ) { + throw new IllegalStateException("Cannot start " + reportingTask + " because it is already running"); + } + } + + @Override + public void verifyCanStop() { + if ( !isRunning() ) { + throw new IllegalStateException("Cannot stop " + reportingTask + " because it is not running"); + } + } + + @Override + public void verifyCanUpdate() { + if ( isRunning() ) { + throw new IllegalStateException("Cannot update " + reportingTask + " because it is currently running"); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/b5956709/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/ControllerServiceLoader.java ---------------------------------------------------------------------- diff --git a/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/ControllerServiceLoader.java b/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/ControllerServiceLoader.java index 42bd55f..9fec307 100644 --- a/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/ControllerServiceLoader.java +++ b/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/ControllerServiceLoader.java @@ -123,23 +123,21 @@ public class ControllerServiceLoader { final List<Element> serviceNodes = DomUtils.getChildElementsByTagName(servicesElement, "service"); for (final Element serviceElement : serviceNodes) { - //add global properties common to all tasks - Map<String, String> properties = new HashMap<>(); - //get properties for the specific controller task - id, name, class, //and schedulingPeriod must be set final String serviceId = DomUtils.getChild(serviceElement, "identifier").getTextContent().trim(); final String serviceClass = DomUtils.getChild(serviceElement, "class").getTextContent().trim(); + //set the class to be used for the configured controller task + final ControllerServiceNode serviceNode = provider.createControllerService(serviceClass, serviceId, false); + //optional task-specific properties for (final Element optionalProperty : DomUtils.getChildElementsByTagName(serviceElement, "property")) { final String name = optionalProperty.getAttribute("name").trim(); final String value = optionalProperty.getTextContent().trim(); - properties.put(name, value); + serviceNode.setProperty(name, value); } - //set the class to be used for the configured controller task - final ControllerServiceNode serviceNode = provider.createControllerService(serviceClass, serviceId, properties); services.add(serviceNode); serviceNode.setDisabled(false); } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/b5956709/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java ---------------------------------------------------------------------- diff --git a/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java b/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java index 61a3aa8..4681293 100644 --- a/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java +++ b/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java @@ -166,7 +166,30 @@ public class StandardControllerServiceNode extends AbstractConfiguredComponent i @Override public void verifyCanDelete() { if ( !isDisabled() ) { - throw new IllegalStateException(this + " cannot be deleted because it has not been disabled"); + throw new IllegalStateException(implementation + " cannot be deleted because it is not disabled"); + } + } + + @Override + public void verifyCanDisable() { + final ControllerServiceReference references = getReferences(); + final int numRunning = references.getRunningReferences().size(); + if ( numRunning > 0 ) { + throw new IllegalStateException(implementation + " cannot be disabled because it is referenced by " + numRunning + " components that are currently running"); + } + } + + @Override + public void verifyCanEnable() { + if ( !isDisabled() ) { + throw new IllegalStateException(implementation + " cannot be enabled because it is not disabled"); + } + } + + @Override + public void verifyCanUpdate() { + if ( !isDisabled() ) { + throw new IllegalStateException(implementation + " cannot be updated because it is not disabled"); } } } http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/b5956709/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java ---------------------------------------------------------------------- diff --git a/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java b/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java index 1deed59..cc7a18a 100644 --- a/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java +++ b/nifi/nar-bundles/framework-bundle/framework/core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java @@ -117,6 +117,7 @@ public class StandardControllerServiceProvider implements ControllerServiceProvi public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { final ControllerServiceNode node = serviceNodeHolder.get(); if (node.isDisabled() && !validDisabledMethods.contains(method)) { + // Use nar class loader here because we are implicitly calling toString() on the original implementation. try (final NarCloseable narCloseable = NarCloseable.withNarLoader()) { throw new IllegalStateException("Cannot invoke method " + method + " on Controller Service " + originalService + " because the Controller Service is disabled"); } catch (final Throwable e) { http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/b5956709/nifi/nar-bundles/framework-bundle/framework/web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java ---------------------------------------------------------------------- diff --git a/nifi/nar-bundles/framework-bundle/framework/web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java b/nifi/nar-bundles/framework-bundle/framework/web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java index dbc4b3c..c97d38c 100644 --- a/nifi/nar-bundles/framework-bundle/framework/web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java +++ b/nifi/nar-bundles/framework-bundle/framework/web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java @@ -384,8 +384,12 @@ public class ControllerFacade implements ControllerServiceProvider { } @Override - public ControllerServiceNode createControllerService(String type, String id, Map<String, String> properties) { - return flowController.createControllerService(type, id, properties); + public ControllerServiceNode createControllerService(String type, String id, boolean firstTimeAdded) { + return flowController.createControllerService(type, id, firstTimeAdded); + } + + public void removeControllerService(ControllerServiceNode serviceNode) { + flowController.removeControllerService(serviceNode); } @Override
