mirror of https://github.com/apache/nifi.git
NIFI-268: Fail any unit test that uses a Processor that uses deprecated annotations
This commit is contained in:
parent
1c0eb6c66e
commit
29b3ad89a4
|
@ -0,0 +1,86 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.nifi.util;
|
||||||
|
|
||||||
|
import org.apache.nifi.processor.AbstractProcessor;
|
||||||
|
import org.apache.nifi.processor.ProcessContext;
|
||||||
|
import org.apache.nifi.processor.ProcessSession;
|
||||||
|
import org.apache.nifi.processor.exception.ProcessException;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TestStandardProcessorTestRunner {
|
||||||
|
|
||||||
|
@Test(expected=AssertionError.class)
|
||||||
|
public void testFailOnDeprecatedTypeAnnotation() {
|
||||||
|
new StandardProcessorTestRunner(new DeprecatedAnnotation());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotFailOnNonDeprecatedTypeAnnotation() {
|
||||||
|
new StandardProcessorTestRunner(new NewAnnotation());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected=AssertionError.class)
|
||||||
|
public void testFailOnDeprecatedMethodAnnotation() {
|
||||||
|
new StandardProcessorTestRunner(new DeprecatedMethodAnnotation());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoesNotFailOnNonDeprecatedMethodAnnotation() {
|
||||||
|
new StandardProcessorTestRunner(new NewMethodAnnotation());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@org.apache.nifi.processor.annotation.Tags({"deprecated"})
|
||||||
|
private static class DeprecatedAnnotation extends AbstractProcessor {
|
||||||
|
@Override
|
||||||
|
public void onTrigger(ProcessContext context, ProcessSession session) throws ProcessException {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@org.apache.nifi.annotation.documentation.Tags({"deprecated"})
|
||||||
|
private static class NewAnnotation extends AbstractProcessor {
|
||||||
|
@Override
|
||||||
|
public void onTrigger(ProcessContext context, ProcessSession session) throws ProcessException {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class NewMethodAnnotation extends AbstractProcessor {
|
||||||
|
@org.apache.nifi.annotation.lifecycle.OnScheduled
|
||||||
|
public void dummy() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTrigger(ProcessContext context, ProcessSession session) throws ProcessException {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class DeprecatedMethodAnnotation extends AbstractProcessor {
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@org.apache.nifi.processor.annotation.OnScheduled
|
||||||
|
public void dummy() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTrigger(ProcessContext context, ProcessSession session) throws ProcessException {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -786,7 +786,6 @@ public class MockProcessSession implements ProcessSession {
|
||||||
* @param sources
|
* @param sources
|
||||||
*/
|
*/
|
||||||
private FlowFile inheritAttributes(final Collection<FlowFile> sources, final FlowFile destination) {
|
private FlowFile inheritAttributes(final Collection<FlowFile> sources, final FlowFile destination) {
|
||||||
final String uuid = destination.getAttribute(CoreAttributes.UUID.key());
|
|
||||||
final StringBuilder parentUuidBuilder = new StringBuilder();
|
final StringBuilder parentUuidBuilder = new StringBuilder();
|
||||||
int uuidsCaptured = 0;
|
int uuidsCaptured = 0;
|
||||||
for (final FlowFile source : sources) {
|
for (final FlowFile source : sources) {
|
||||||
|
|
|
@ -21,7 +21,9 @@ import static java.util.Objects.requireNonNull;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -39,6 +41,12 @@ import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
|
import org.apache.nifi.annotation.behavior.TriggerSerially;
|
||||||
|
import org.apache.nifi.annotation.lifecycle.OnAdded;
|
||||||
|
import org.apache.nifi.annotation.lifecycle.OnScheduled;
|
||||||
|
import org.apache.nifi.annotation.lifecycle.OnShutdown;
|
||||||
|
import org.apache.nifi.annotation.lifecycle.OnStopped;
|
||||||
|
import org.apache.nifi.annotation.lifecycle.OnUnscheduled;
|
||||||
import org.apache.nifi.components.AllowableValue;
|
import org.apache.nifi.components.AllowableValue;
|
||||||
import org.apache.nifi.components.PropertyDescriptor;
|
import org.apache.nifi.components.PropertyDescriptor;
|
||||||
import org.apache.nifi.components.ValidationResult;
|
import org.apache.nifi.components.ValidationResult;
|
||||||
|
@ -50,15 +58,8 @@ import org.apache.nifi.processor.ProcessSessionFactory;
|
||||||
import org.apache.nifi.processor.Processor;
|
import org.apache.nifi.processor.Processor;
|
||||||
import org.apache.nifi.processor.QueueSize;
|
import org.apache.nifi.processor.QueueSize;
|
||||||
import org.apache.nifi.processor.Relationship;
|
import org.apache.nifi.processor.Relationship;
|
||||||
import org.apache.nifi.processor.annotation.OnAdded;
|
|
||||||
import org.apache.nifi.processor.annotation.OnScheduled;
|
|
||||||
import org.apache.nifi.processor.annotation.OnShutdown;
|
|
||||||
import org.apache.nifi.processor.annotation.OnStopped;
|
|
||||||
import org.apache.nifi.processor.annotation.OnUnscheduled;
|
|
||||||
import org.apache.nifi.processor.annotation.TriggerSerially;
|
|
||||||
import org.apache.nifi.provenance.ProvenanceReporter;
|
import org.apache.nifi.provenance.ProvenanceReporter;
|
||||||
import org.apache.nifi.reporting.InitializationException;
|
import org.apache.nifi.reporting.InitializationException;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
|
||||||
public class StandardProcessorTestRunner implements TestRunner {
|
public class StandardProcessorTestRunner implements TestRunner {
|
||||||
|
@ -74,6 +75,16 @@ public class StandardProcessorTestRunner implements TestRunner {
|
||||||
private int numThreads = 1;
|
private int numThreads = 1;
|
||||||
private final AtomicInteger invocations = new AtomicInteger(0);
|
private final AtomicInteger invocations = new AtomicInteger(0);
|
||||||
|
|
||||||
|
private static final Set<Class<? extends Annotation>> deprecatedTypeAnnotations = new HashSet<>();
|
||||||
|
private static final Set<Class<? extends Annotation>> deprecatedMethodAnnotations = new HashSet<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
// do this in a separate method, just so that we can add a @SuppressWarnings annotation
|
||||||
|
// because we want to indicate explicitly that we know that we are using deprecated
|
||||||
|
// classes here.
|
||||||
|
populateDeprecatedMethods();
|
||||||
|
}
|
||||||
|
|
||||||
StandardProcessorTestRunner(final Processor processor) {
|
StandardProcessorTestRunner(final Processor processor) {
|
||||||
this.processor = processor;
|
this.processor = processor;
|
||||||
this.idGenerator = new AtomicLong(0L);
|
this.idGenerator = new AtomicLong(0L);
|
||||||
|
@ -82,6 +93,8 @@ public class StandardProcessorTestRunner implements TestRunner {
|
||||||
this.sessionFactory = new MockSessionFactory(sharedState);
|
this.sessionFactory = new MockSessionFactory(sharedState);
|
||||||
this.context = new MockProcessContext(processor);
|
this.context = new MockProcessContext(processor);
|
||||||
|
|
||||||
|
detectDeprecatedAnnotations(processor);
|
||||||
|
|
||||||
final MockProcessorInitializationContext mockInitContext = new MockProcessorInitializationContext(processor, context);
|
final MockProcessorInitializationContext mockInitContext = new MockProcessorInitializationContext(processor, context);
|
||||||
processor.initialize(mockInitContext);
|
processor.initialize(mockInitContext);
|
||||||
|
|
||||||
|
@ -94,6 +107,42 @@ public class StandardProcessorTestRunner implements TestRunner {
|
||||||
triggerSerially = null != processor.getClass().getAnnotation(TriggerSerially.class);
|
triggerSerially = null != processor.getClass().getAnnotation(TriggerSerially.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
private static void populateDeprecatedMethods() {
|
||||||
|
deprecatedTypeAnnotations.add(org.apache.nifi.processor.annotation.CapabilityDescription.class);
|
||||||
|
deprecatedTypeAnnotations.add(org.apache.nifi.processor.annotation.EventDriven.class);
|
||||||
|
deprecatedTypeAnnotations.add(org.apache.nifi.processor.annotation.SideEffectFree.class);
|
||||||
|
deprecatedTypeAnnotations.add(org.apache.nifi.processor.annotation.SupportsBatching.class);
|
||||||
|
deprecatedTypeAnnotations.add(org.apache.nifi.processor.annotation.Tags.class);
|
||||||
|
deprecatedTypeAnnotations.add(org.apache.nifi.processor.annotation.TriggerWhenEmpty.class);
|
||||||
|
deprecatedTypeAnnotations.add(org.apache.nifi.processor.annotation.TriggerWhenAnyDestinationAvailable.class);
|
||||||
|
deprecatedTypeAnnotations.add(org.apache.nifi.processor.annotation.TriggerSerially.class);
|
||||||
|
|
||||||
|
deprecatedMethodAnnotations.add(org.apache.nifi.processor.annotation.OnRemoved.class);
|
||||||
|
deprecatedMethodAnnotations.add(org.apache.nifi.processor.annotation.OnAdded.class);
|
||||||
|
deprecatedMethodAnnotations.add(org.apache.nifi.processor.annotation.OnScheduled.class);
|
||||||
|
deprecatedMethodAnnotations.add(org.apache.nifi.processor.annotation.OnShutdown.class);
|
||||||
|
deprecatedMethodAnnotations.add(org.apache.nifi.processor.annotation.OnStopped.class);
|
||||||
|
deprecatedMethodAnnotations.add(org.apache.nifi.processor.annotation.OnUnscheduled.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void detectDeprecatedAnnotations(final Processor processor) {
|
||||||
|
for ( final Class<? extends Annotation> annotationClass : deprecatedTypeAnnotations ) {
|
||||||
|
if ( processor.getClass().isAnnotationPresent(annotationClass) ) {
|
||||||
|
Assert.fail("Processor is using deprecated Annotation " + annotationClass.getCanonicalName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( final Class<? extends Annotation> annotationClass : deprecatedMethodAnnotations ) {
|
||||||
|
for ( final Method method : processor.getClass().getMethods() ) {
|
||||||
|
if ( method.isAnnotationPresent(annotationClass) ) {
|
||||||
|
Assert.fail("Processor is using deprecated Annotation " + annotationClass.getCanonicalName() + " for method " + method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setValidateExpressionUsage(final boolean validate) {
|
public void setValidateExpressionUsage(final boolean validate) {
|
||||||
context.setValidateExpressionUsage(validate);
|
context.setValidateExpressionUsage(validate);
|
||||||
|
|
Loading…
Reference in New Issue