mirror of https://github.com/apache/nifi.git
NIFI-3362 update FlowConfiguration.xsd to allow all current time period units
This closes #1501. Signed-off-by: Aldrin Piri <aldrin@apache.org>
This commit is contained in:
parent
bd3e0438a3
commit
690130b063
|
@ -35,8 +35,8 @@ public class FormatUtils {
|
|||
private static final double BYTES_IN_TERABYTE = BYTES_IN_GIGABYTE * 1024;
|
||||
|
||||
// for Time Durations
|
||||
private static final String NANOS = join(UNION, "ns", "nano", "nanos", "nanoseconds");
|
||||
private static final String MILLIS = join(UNION, "ms", "milli", "millis", "milliseconds");
|
||||
private static final String NANOS = join(UNION, "ns", "nano", "nanos", "nanosecond", "nanoseconds");
|
||||
private static final String MILLIS = join(UNION, "ms", "milli", "millis", "millisecond", "milliseconds");
|
||||
private static final String SECS = join(UNION, "s", "sec", "secs", "second", "seconds");
|
||||
private static final String MINS = join(UNION, "m", "min", "mins", "minute", "minutes");
|
||||
private static final String HOURS = join(UNION, "h", "hr", "hrs", "hour", "hours");
|
||||
|
|
|
@ -87,7 +87,7 @@ public class FingerprintFactory {
|
|||
// no fingerprint value
|
||||
public static final String NO_VALUE = "NO_VALUE";
|
||||
|
||||
private static final String FLOW_CONFIG_XSD = "/FlowConfiguration.xsd";
|
||||
static final String FLOW_CONFIG_XSD = "/FlowConfiguration.xsd";
|
||||
private static final String ENCRYPTED_VALUE_PREFIX = "enc{";
|
||||
private static final String ENCRYPTED_VALUE_SUFFIX = "}";
|
||||
private final StringEncryptor encryptor;
|
||||
|
@ -115,6 +115,11 @@ public class FingerprintFactory {
|
|||
}
|
||||
}
|
||||
|
||||
public FingerprintFactory(final StringEncryptor encryptor, final DocumentBuilder docBuilder) {
|
||||
this.encryptor = encryptor;
|
||||
this.flowConfigDocBuilder = docBuilder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a fingerprint of a flow. The order of elements or attributes in the flow does not influence the fingerprint generation.
|
||||
* This method does not accept a FlowController, which means that Processors cannot be created in order to verify default property
|
||||
|
|
|
@ -315,7 +315,7 @@
|
|||
|
||||
<xs:simpleType name="TimePeriod">
|
||||
<xs:restriction base="xs:string">
|
||||
<xs:pattern value="\d+\s*(ns|nano|nanos|nanoseconds|ms|milli|millis|milliseconds|s|sec|secs|seconds|m|min|mins|minutes|h|hr|hrs|hours|d|day|days)"></xs:pattern>
|
||||
<xs:pattern value="\d+\s*(ns|nano|nanos|nanosecond|nanoseconds|ms|milli|millis|millisecond|milliseconds|s|sec|secs|second|seconds|m|min|mins|minute|minutes|h|hr|hrs|hour|hours|d|day|days|w|wk|wks|week|weeks)"></xs:pattern>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
|
|
|
@ -16,8 +16,9 @@
|
|||
*/
|
||||
package org.apache.nifi.fingerprint;
|
||||
|
||||
import static org.apache.nifi.fingerprint.FingerprintFactory.FLOW_CONFIG_XSD;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -26,6 +27,15 @@ import org.apache.commons.io.IOUtils;
|
|||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.xml.sax.ErrorHandler;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.SAXParseException;
|
||||
|
||||
import javax.xml.XMLConstants;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.validation.Schema;
|
||||
import javax.xml.validation.SchemaFactory;
|
||||
|
||||
/**
|
||||
*/
|
||||
|
@ -42,8 +52,6 @@ public class FingerprintFactoryTest {
|
|||
public void testSameFingerprint() throws IOException {
|
||||
final String fp1 = fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow1a.xml"), null);
|
||||
final String fp2 = fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow1b.xml"), null);
|
||||
System.out.println(fp1);
|
||||
System.out.println(fp2);
|
||||
assertEquals(fp1, fp2);
|
||||
}
|
||||
|
||||
|
@ -51,7 +59,7 @@ public class FingerprintFactoryTest {
|
|||
public void testDifferentFingerprint() throws IOException {
|
||||
final String fp1 = fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow1a.xml"), null);
|
||||
final String fp2 = fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow2.xml"), null);
|
||||
assertFalse(fp1.equals(fp2));
|
||||
assertNotEquals(fp1, fp2);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -61,8 +69,48 @@ public class FingerprintFactoryTest {
|
|||
assertTrue(fingerprint.contains("In Connection"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSchemaValidation() throws IOException {
|
||||
FingerprintFactory fp = new FingerprintFactory(null, getValidatingDocumentBuilder());
|
||||
final String fingerprint = fp.createFingerprint(getResourceBytes("/nifi/fingerprint/validating-flow.xml"), null);
|
||||
}
|
||||
|
||||
private byte[] getResourceBytes(final String resource) throws IOException {
|
||||
return IOUtils.toByteArray(FingerprintFactoryTest.class.getResourceAsStream(resource));
|
||||
}
|
||||
|
||||
private DocumentBuilder getValidatingDocumentBuilder() {
|
||||
final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||
documentBuilderFactory.setNamespaceAware(true);
|
||||
final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
|
||||
final Schema schema;
|
||||
try {
|
||||
schema = schemaFactory.newSchema(FingerprintFactory.class.getResource(FLOW_CONFIG_XSD));
|
||||
} catch (final Exception e) {
|
||||
throw new RuntimeException("Failed to parse schema for file flow configuration.", e);
|
||||
}
|
||||
try {
|
||||
documentBuilderFactory.setSchema(schema);
|
||||
DocumentBuilder docBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||
docBuilder.setErrorHandler(new ErrorHandler() {
|
||||
@Override
|
||||
public void warning(SAXParseException e) throws SAXException {
|
||||
throw e;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(SAXParseException e) throws SAXException {
|
||||
throw e;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fatalError(SAXParseException e) throws SAXException {
|
||||
throw e;
|
||||
}
|
||||
});
|
||||
return docBuilder;
|
||||
} catch (final Exception e) {
|
||||
throw new RuntimeException("Failed to create document builder for flow configuration.", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<flowController encoding-version="1.0">
|
||||
<maxTimerDrivenThreadCount>10</maxTimerDrivenThreadCount>
|
||||
<maxEventDrivenThreadCount>5</maxEventDrivenThreadCount>
|
||||
<rootGroup>
|
||||
<id>289ff050-015a-1000-b21b-a39f56e56729</id>
|
||||
<name>NiFi Flow</name>
|
||||
<position x="0.0" y="0.0"/>
|
||||
<comment/>
|
||||
<processor>
|
||||
<id>28a67671-015a-1000-77dd-8130e16012ec</id>
|
||||
<name>PutFile</name>
|
||||
<position x="420.0" y="288.0"/>
|
||||
<styles>
|
||||
<style name="background-color">#3046f0</style>
|
||||
</styles>
|
||||
<comment>write a file</comment>
|
||||
<class>org.apache.nifi.processors.standard.PutFile</class>
|
||||
<maxConcurrentTasks>1</maxConcurrentTasks>
|
||||
<schedulingPeriod>0 sec</schedulingPeriod>
|
||||
<penalizationPeriod>3000 millisecond</penalizationPeriod>
|
||||
<yieldPeriod>1 sec</yieldPeriod>
|
||||
<bulletinLevel>WARN</bulletinLevel>
|
||||
<lossTolerant>false</lossTolerant>
|
||||
<scheduledState>STOPPED</scheduledState>
|
||||
<schedulingStrategy>TIMER_DRIVEN</schedulingStrategy>
|
||||
<executionNode>ALL</executionNode>
|
||||
<runDurationNanos>0</runDurationNanos>
|
||||
<property>
|
||||
<name>Directory</name>
|
||||
</property>
|
||||
<property>
|
||||
<name>Conflict Resolution Strategy</name>
|
||||
<value>fail</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>Create Missing Directories</name>
|
||||
<value>true</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>Maximum File Count</name>
|
||||
</property>
|
||||
<property>
|
||||
<name>Last Modified Time</name>
|
||||
</property>
|
||||
<property>
|
||||
<name>Permissions</name>
|
||||
</property>
|
||||
<property>
|
||||
<name>Owner</name>
|
||||
</property>
|
||||
<property>
|
||||
<name>Group</name>
|
||||
</property>
|
||||
</processor>
|
||||
<processor>
|
||||
<id>28a6579e-015a-1000-2856-975c9a5af27e</id>
|
||||
<name>GetFile</name>
|
||||
<position x="422.0" y="50.0"/>
|
||||
<styles>
|
||||
<style name="background-color">#eb7575</style>
|
||||
</styles>
|
||||
<comment/>
|
||||
<class>org.apache.nifi.processors.standard.GetFile</class>
|
||||
<maxConcurrentTasks>1</maxConcurrentTasks>
|
||||
<schedulingPeriod>0 sec</schedulingPeriod>
|
||||
<penalizationPeriod>30 sec</penalizationPeriod>
|
||||
<yieldPeriod>1000000000 nanosecond</yieldPeriod>
|
||||
<bulletinLevel>WARN</bulletinLevel>
|
||||
<lossTolerant>false</lossTolerant>
|
||||
<scheduledState>STOPPED</scheduledState>
|
||||
<schedulingStrategy>TIMER_DRIVEN</schedulingStrategy>
|
||||
<executionNode>ALL</executionNode>
|
||||
<runDurationNanos>0</runDurationNanos>
|
||||
<property>
|
||||
<name>Input Directory</name>
|
||||
</property>
|
||||
<property>
|
||||
<name>File Filter</name>
|
||||
<value>[^\.].*</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>Path Filter</name>
|
||||
</property>
|
||||
<property>
|
||||
<name>Batch Size</name>
|
||||
<value>10</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>Keep Source File</name>
|
||||
<value>false</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>Recurse Subdirectories</name>
|
||||
<value>true</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>Polling Interval</name>
|
||||
<value>0 sec</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>Ignore Hidden Files</name>
|
||||
<value>true</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>Minimum File Age</name>
|
||||
<value>0 sec</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>Maximum File Age</name>
|
||||
</property>
|
||||
<property>
|
||||
<name>Minimum File Size</name>
|
||||
<value>0 B</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>Maximum File Size</name>
|
||||
</property>
|
||||
</processor>
|
||||
<connection>
|
||||
<id>28a77d72-015a-1000-32e4-c6fe548f5c9d</id>
|
||||
<name/>
|
||||
<bendPoints>
|
||||
<bendPoint x="815.0" y="231.0"/>
|
||||
</bendPoints>
|
||||
<labelIndex>0</labelIndex>
|
||||
<zIndex>0</zIndex>
|
||||
<sourceId>28a6579e-015a-1000-2856-975c9a5af27e</sourceId>
|
||||
<sourceGroupId>289ff050-015a-1000-b21b-a39f56e56729</sourceGroupId>
|
||||
<sourceType>PROCESSOR</sourceType>
|
||||
<destinationId>28a67671-015a-1000-77dd-8130e16012ec</destinationId>
|
||||
<destinationGroupId>289ff050-015a-1000-b21b-a39f56e56729</destinationGroupId>
|
||||
<destinationType>PROCESSOR</destinationType>
|
||||
<relationship>success</relationship>
|
||||
<maxWorkQueueSize>10000</maxWorkQueueSize>
|
||||
<maxWorkQueueDataSize>1 GB</maxWorkQueueDataSize>
|
||||
<flowFileExpiration>1 hour</flowFileExpiration>
|
||||
<queuePrioritizerClass>org.apache.nifi.prioritizer.FirstInFirstOutPrioritizer</queuePrioritizerClass>
|
||||
</connection>
|
||||
</rootGroup>
|
||||
<controllerServices/>
|
||||
<reportingTasks/>
|
||||
</flowController>
|
Loading…
Reference in New Issue