http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestCompoundUpdateMonitor.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestCompoundUpdateMonitor.java b/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestCompoundUpdateMonitor.java deleted file mode 100644 index f576e94..0000000 --- a/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestCompoundUpdateMonitor.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * 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.file.monitor; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.file.Path; -import java.util.UUID; - - -import org.junit.Test; - -public class TestCompoundUpdateMonitor { - - @Test - public void test() throws IOException { - final UpdateMonitor lastModified = new LastModifiedMonitor(); - final MD5SumMonitor md5 = new MD5SumMonitor(); - final CompoundUpdateMonitor compound = new CompoundUpdateMonitor(lastModified, md5); - - final File file = new File("target/" + UUID.randomUUID().toString()); - if (file.exists()) { - assertTrue(file.delete()); - } - assertTrue(file.createNewFile()); - - final Path path = file.toPath(); - - final Object curState = compound.getCurrentState(path); - final Object state2 = compound.getCurrentState(path); - - assertEquals(curState, state2); - file.setLastModified(System.currentTimeMillis() + 1000L); - final Object state3 = compound.getCurrentState(path); - assertEquals(state2, state3); - - final Object state4 = compound.getCurrentState(path); - assertEquals(state3, state4); - - final long lastModifiedDate = file.lastModified(); - try (final OutputStream out = new FileOutputStream(file)) { - out.write("Hello".getBytes("UTF-8")); - } - - file.setLastModified(lastModifiedDate); - - final Object state5 = compound.getCurrentState(path); - assertNotSame(state4, state5); - } - -}
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestSynchronousFileWatcher.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestSynchronousFileWatcher.java b/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestSynchronousFileWatcher.java deleted file mode 100644 index 7125581..0000000 --- a/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/file/monitor/TestSynchronousFileWatcher.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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.file.monitor; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.io.ByteArrayInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; - -import org.junit.Test; - - -public class TestSynchronousFileWatcher { - - @Test - public void testIt() throws UnsupportedEncodingException, IOException, InterruptedException { - final Path path = Paths.get("target/1.txt"); - Files.copy(new ByteArrayInputStream("Hello, World!".getBytes("UTF-8")), path, StandardCopyOption.REPLACE_EXISTING); - final UpdateMonitor monitor = new MD5SumMonitor(); - - final SynchronousFileWatcher watcher = new SynchronousFileWatcher(path, monitor, 10L); - assertFalse(watcher.checkAndReset()); - Thread.sleep(30L); - assertFalse(watcher.checkAndReset()); - - final FileOutputStream fos = new FileOutputStream(path.toFile()); - try { - fos.write("Good-bye, World!".getBytes("UTF-8")); - fos.getFD().sync(); - } finally { - fos.close(); - } - - assertTrue(watcher.checkAndReset()); - assertFalse(watcher.checkAndReset()); - - Thread.sleep(30L); - assertFalse(watcher.checkAndReset()); - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestRingBuffer.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestRingBuffer.java b/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestRingBuffer.java deleted file mode 100644 index fafffdd..0000000 --- a/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestRingBuffer.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * 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.timebuffer; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -import org.apache.nifi.util.RingBuffer; -import org.apache.nifi.util.RingBuffer.ForEachEvaluator; -import org.apache.nifi.util.RingBuffer.IterationDirection; - -import org.junit.Test; - -/** - * - */ -public class TestRingBuffer { - - @Test - public void testAsList() { - final RingBuffer<Integer> ringBuffer = new RingBuffer<>(10); - - final List<Integer> emptyList = ringBuffer.asList(); - assertTrue(emptyList.isEmpty()); - - for (int i = 0; i < 3; i++) { - ringBuffer.add(i); - } - - List<Integer> list = ringBuffer.asList(); - assertEquals(3, list.size()); - for (int i = 0; i < 3; i++) { - assertEquals(Integer.valueOf(i), list.get(i)); - } - - for (int i = 3; i < 10; i++) { - ringBuffer.add(i); - } - - list = ringBuffer.asList(); - assertEquals(10, list.size()); - for (int i = 0; i < 10; i++) { - assertEquals(Integer.valueOf(i), list.get(i)); - } - } - - @Test - public void testIterateForwards() { - final RingBuffer<Integer> ringBuffer = new RingBuffer<>(10); - - final int[] values = new int[]{3, 5, 20, 7}; - for (final int v : values) { - ringBuffer.add(v); - } - - final AtomicInteger countHolder = new AtomicInteger(0); - ringBuffer.forEach(new ForEachEvaluator<Integer>() { - int counter = 0; - - @Override - public boolean evaluate(final Integer value) { - final int expected = values[counter++]; - countHolder.incrementAndGet(); - assertEquals(expected, value.intValue()); - return true; - } - - }, IterationDirection.FORWARD); - - assertEquals(4, countHolder.get()); - } - - @Test - public void testIterateForwardsAfterFull() { - final RingBuffer<Integer> ringBuffer = new RingBuffer<>(10); - - for (int i = 0; i < 12; i++) { - ringBuffer.add(i); - } - - final int[] values = new int[]{3, 5, 20, 7}; - for (final int v : values) { - ringBuffer.add(v); - } - - ringBuffer.forEach(new ForEachEvaluator<Integer>() { - int counter = 0; - - @Override - public boolean evaluate(final Integer value) { - if (counter < 6) { - assertEquals(counter + 6, value.intValue()); - } else { - final int expected = values[counter - 6]; - assertEquals(expected, value.intValue()); - } - - counter++; - return true; - } - - }, IterationDirection.FORWARD); - } - - @Test - public void testIterateBackwards() { - final RingBuffer<Integer> ringBuffer = new RingBuffer<>(10); - - final int[] values = new int[]{3, 5, 20, 7}; - for (final int v : values) { - ringBuffer.add(v); - } - - final AtomicInteger countHolder = new AtomicInteger(0); - ringBuffer.forEach(new ForEachEvaluator<Integer>() { - int counter = 0; - - @Override - public boolean evaluate(final Integer value) { - final int index = values.length - 1 - counter; - final int expected = values[index]; - countHolder.incrementAndGet(); - - assertEquals(expected, value.intValue()); - counter++; - return true; - } - - }, IterationDirection.BACKWARD); - - assertEquals(4, countHolder.get()); - } - - @Test - public void testIterateBackwardsAfterFull() { - final RingBuffer<Integer> ringBuffer = new RingBuffer<>(10); - - for (int i = 0; i < 12; i++) { - ringBuffer.add(i); - } - - final int[] values = new int[]{3, 5, 20, 7}; - for (final int v : values) { - ringBuffer.add(v); - } - - ringBuffer.forEach(new ForEachEvaluator<Integer>() { - int counter = 0; - - @Override - public boolean evaluate(final Integer value) { - if (counter < values.length) { - final int index = values.length - 1 - counter; - final int expected = values[index]; - - assertEquals(expected, value.intValue()); - counter++; - } - - return true; - } - - }, IterationDirection.BACKWARD); - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestTimedBuffer.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestTimedBuffer.java b/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestTimedBuffer.java deleted file mode 100644 index 39ca330..0000000 --- a/nifi/commons/nifi-utils/src/test/java/org/apache/nifi/util/timebuffer/TestTimedBuffer.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * 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.timebuffer; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - -import java.util.concurrent.TimeUnit; - -import org.junit.Test; - -public class TestTimedBuffer { - - @Test - public void testAgesOff() throws InterruptedException { - final LongEntityAccess access = new LongEntityAccess(); - final TimedBuffer<TimestampedLong> buffer = new TimedBuffer<>(TimeUnit.SECONDS, 2, access); - - buffer.add(new TimestampedLong(1000000L)); - TimestampedLong aggregate = buffer.getAggregateValue(System.currentTimeMillis() - 30000L); - assertEquals(1000000L, aggregate.getValue().longValue()); - Thread.sleep(1000L); - aggregate = buffer.getAggregateValue(System.currentTimeMillis() - 30000L); - assertEquals(1000000L, aggregate.getValue().longValue()); - Thread.sleep(1500L); - aggregate = buffer.getAggregateValue(System.currentTimeMillis() - 30000L); - assertNull(aggregate); - } - - @Test - public void testAggregation() throws InterruptedException { - final LongEntityAccess access = new LongEntityAccess(); - final TimedBuffer<TimestampedLong> buffer = new TimedBuffer<>(TimeUnit.SECONDS, 2, access); - - buffer.add(new TimestampedLong(1000000L)); - buffer.add(new TimestampedLong(1000000L)); - buffer.add(new TimestampedLong(25000L)); - - TimestampedLong aggregate = buffer.getAggregateValue(System.currentTimeMillis() - 30000L); - assertEquals(2025000L, aggregate.getValue().longValue()); - Thread.sleep(1000L); - aggregate = buffer.getAggregateValue(System.currentTimeMillis() - 30000L); - assertEquals(2025000L, aggregate.getValue().longValue()); - Thread.sleep(1500L); - aggregate = buffer.getAggregateValue(System.currentTimeMillis() - 30000L); - assertNull(aggregate); - } - - private static class TimestampedLong { - - private final Long value; - private final long timestamp = System.currentTimeMillis(); - - public TimestampedLong(final Long value) { - this.value = value; - } - - public Long getValue() { - return value; - } - - public long getTimestamp() { - return timestamp; - } - } - - private static class LongEntityAccess implements EntityAccess<TimestampedLong> { - - @Override - public TimestampedLong aggregate(TimestampedLong oldValue, TimestampedLong toAdd) { - if (oldValue == null && toAdd == null) { - return new TimestampedLong(0L); - } else if (oldValue == null) { - return toAdd; - } else if (toAdd == null) { - return oldValue; - } - - return new TimestampedLong(oldValue.getValue().longValue() + toAdd.getValue().longValue()); - } - - @Override - public TimestampedLong createNew() { - return new TimestampedLong(0L); - } - - @Override - public long getTimestamp(TimestampedLong entity) { - return entity == null ? 0L : entity.getTimestamp(); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-utils/src/test/resources/logback-test.xml ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-utils/src/test/resources/logback-test.xml b/nifi/commons/nifi-utils/src/test/resources/logback-test.xml deleted file mode 100644 index 8651d47..0000000 --- a/nifi/commons/nifi-utils/src/test/resources/logback-test.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - 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. ---> - -<configuration scan="true" scanPeriod="30 seconds"> - <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> - <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> - <pattern>%-4r [%t] %-5p %c - %m%n</pattern> - </encoder> - </appender> - - <!-- valid logging levels: TRACE, DEBUG, INFO, WARN, ERROR --> - <logger name="org.apache.nifi" level="DEBUG"/> - - <root level="INFO"> - <appender-ref ref="CONSOLE"/> - </root> - -</configuration> - http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-web-utils/pom.xml ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-web-utils/pom.xml b/nifi/commons/nifi-web-utils/pom.xml deleted file mode 100644 index 647459c..0000000 --- a/nifi/commons/nifi-web-utils/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - 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. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <parent> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-commons-parent</artifactId> - <version>0.0.1-incubating-SNAPSHOT</version> - </parent> - - <artifactId>nifi-web-utils</artifactId> - <version>0.0.1-incubating-SNAPSHOT</version> - <name>NiFi Web Utils</name> - - <dependencies> - <dependency> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-security-utils</artifactId> - </dependency> - <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - </dependency> - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-lang3</artifactId> - </dependency> - <dependency> - <groupId>com.sun.jersey</groupId> - <artifactId>jersey-client</artifactId> - </dependency> - <dependency> - <groupId>com.sun.jersey</groupId> - <artifactId>jersey-json</artifactId> - </dependency> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>javax.servlet-api</artifactId> - <scope>provided</scope> - </dependency> - </dependencies> -</project> http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/ClientUtils.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/ClientUtils.java b/nifi/commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/ClientUtils.java deleted file mode 100644 index 8c0b1f4..0000000 --- a/nifi/commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/ClientUtils.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * 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.web.util; - -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientHandlerException; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.UniformInterfaceException; -import com.sun.jersey.api.client.WebResource; -import com.sun.jersey.core.util.MultivaluedMapImpl; -import java.net.URI; -import java.util.Map; -import javax.ws.rs.core.MediaType; - -/** - * - */ -public class ClientUtils { - - private final Client client; - - public ClientUtils(Client client) { - this.client = client; - } - - /** - * Gets the content at the specified URI. - * - * @param uri - * @return - * @throws ClientHandlerException - * @throws UniformInterfaceException - */ - public ClientResponse get(final URI uri) throws ClientHandlerException, UniformInterfaceException { - return get(uri, null); - } - - /** - * Gets the content at the specified URI using the given query parameters. - * - * @param uri - * @param queryParams - * @return - * @throws ClientHandlerException - * @throws UniformInterfaceException - */ - public ClientResponse get(final URI uri, final Map<String, String> queryParams) throws ClientHandlerException, UniformInterfaceException { - // perform the request - WebResource webResource = client.resource(uri); - if (queryParams != null) { - for (final Map.Entry<String, String> queryEntry : queryParams.entrySet()) { - webResource = webResource.queryParam(queryEntry.getKey(), queryEntry.getValue()); - } - } - - return webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); - } - - /** - * Performs a POST using the specified url and entity body. - * - * @param uri - * @param entity - * @return - */ - public ClientResponse post(URI uri, Object entity) throws ClientHandlerException, UniformInterfaceException { - // get the resource - WebResource.Builder resourceBuilder = client.resource(uri).accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON); - - // include the request entity - if (entity != null) { - resourceBuilder = resourceBuilder.entity(entity); - } - - // perform the request - return resourceBuilder.post(ClientResponse.class); - } - - /** - * Performs a POST using the specified url and form data. - * - * @param uri - * @param formData - * @return - */ - public ClientResponse post(URI uri, Map<String, String> formData) throws ClientHandlerException, UniformInterfaceException { - // convert the form data - MultivaluedMapImpl entity = new MultivaluedMapImpl(); - for (String key : formData.keySet()) { - entity.add(key, formData.get(key)); - } - - // get the resource - WebResource.Builder resourceBuilder = client.resource(uri).accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_FORM_URLENCODED); - - // add the form data if necessary - if (!entity.isEmpty()) { - resourceBuilder = resourceBuilder.entity(entity); - } - - // perform the request - return resourceBuilder.post(ClientResponse.class); - } - - /** - * Performs a HEAD request to the specified URI. - * - * @param uri - * @return - * @throws ClientHandlerException - * @throws UniformInterfaceException - */ - public ClientResponse head(final URI uri) throws ClientHandlerException, UniformInterfaceException { - // perform the request - WebResource webResource = client.resource(uri); - return webResource.head(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/ObjectMapperResolver.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/ObjectMapperResolver.java b/nifi/commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/ObjectMapperResolver.java deleted file mode 100644 index 4e7f5b6..0000000 --- a/nifi/commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/ObjectMapperResolver.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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.web.util; - -import javax.ws.rs.ext.ContextResolver; -import javax.ws.rs.ext.Provider; -import org.codehaus.jackson.map.AnnotationIntrospector; -import org.codehaus.jackson.map.DeserializationConfig; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.map.SerializationConfig; -import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; -import org.codehaus.jackson.xc.JaxbAnnotationIntrospector; - -@Provider -public class ObjectMapperResolver implements ContextResolver<ObjectMapper> { - - private final ObjectMapper mapper; - - public ObjectMapperResolver() throws Exception { - mapper = new ObjectMapper(); - - final AnnotationIntrospector jaxbIntrospector = new JaxbAnnotationIntrospector(); - final SerializationConfig serializationConfig = mapper.getSerializationConfig(); - final DeserializationConfig deserializationConfig = mapper.getDeserializationConfig(); - - mapper.setSerializationConfig(serializationConfig.withSerializationInclusion(Inclusion.NON_NULL).withAnnotationIntrospector(jaxbIntrospector)); - mapper.setDeserializationConfig(deserializationConfig.withAnnotationIntrospector(jaxbIntrospector)); - } - - @Override - public ObjectMapper getContext(Class<?> objectType) { - return mapper; - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/WebUtils.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/WebUtils.java b/nifi/commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/WebUtils.java deleted file mode 100644 index 587b3d8..0000000 --- a/nifi/commons/nifi-web-utils/src/main/java/org/apache/nifi/web/util/WebUtils.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * 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.web.util; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.security.cert.Certificate; -import java.security.cert.CertificateParsingException; -import java.security.cert.X509Certificate; -import java.util.List; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLPeerUnverifiedException; -import javax.net.ssl.SSLSession; - -import org.apache.nifi.security.util.CertificateUtils; - -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.binary.Hex; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.config.ClientConfig; -import com.sun.jersey.api.client.config.DefaultClientConfig; -import com.sun.jersey.api.json.JSONConfiguration; -import com.sun.jersey.client.urlconnection.HTTPSProperties; - -/** - * Common utilities related to web development. - * - * @author unattributed - */ -public final class WebUtils { - - private static Logger logger = LoggerFactory.getLogger(WebUtils.class); - - final static ReadWriteLock lock = new ReentrantReadWriteLock(); - - private WebUtils() { - } - - /** - * Creates a client for non-secure requests. The client will be created - * using the given configuration. Additionally, the client will be - * automatically configured for JSON serialization/deserialization. - * - * @param config client configuration - * - * @return a Client instance - */ - public static Client createClient(final ClientConfig config) { - return createClientHelper(config, null); - } - - /** - * Creates a client for secure requests. The client will be created using - * the given configuration and security context. Additionally, the client - * will be automatically configured for JSON serialization/deserialization. - * - * @param config client configuration - * @param ctx security context - * - * @return a Client instance - */ - public static Client createClient(final ClientConfig config, final SSLContext ctx) { - return createClientHelper(config, ctx); - } - - /** - * A helper method for creating clients. The client will be created using - * the given configuration and security context. Additionally, the client - * will be automatically configured for JSON serialization/deserialization. - * - * @param config client configuration - * @param ctx security context, which may be null for non-secure client - * creation - * - * @return a Client instance - */ - private static Client createClientHelper(final ClientConfig config, final SSLContext ctx) { - - final ClientConfig finalConfig = (config == null) ? new DefaultClientConfig() : config; - - if (ctx != null && StringUtils.isBlank((String) finalConfig.getProperty(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES))) { - - // custom hostname verifier that checks subject alternative names against the hostname of the URI - final HostnameVerifier hostnameVerifier = new HostnameVerifier() { - @Override - public boolean verify(final String hostname, final SSLSession ssls) { - - try { - for (final Certificate peerCertificate : ssls.getPeerCertificates()) { - if (peerCertificate instanceof X509Certificate) { - final X509Certificate x509Cert = (X509Certificate) peerCertificate; - final List<String> subjectAltNames = CertificateUtils.getSubjectAlternativeNames(x509Cert); - if (subjectAltNames.contains(hostname.toLowerCase())) { - return true; - } - } - } - } catch (final SSLPeerUnverifiedException | CertificateParsingException ex) { - logger.warn("Hostname Verification encountered exception verifying hostname due to: " + ex, ex); - } - - return false; - } - }; - - finalConfig.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(hostnameVerifier, ctx)); - } - - finalConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); - finalConfig.getClasses().add(ObjectMapperResolver.class); - - // web client for restful request - return Client.create(finalConfig); - - } - - /** - * Serializes the given object to hexadecimal. Serialization uses Java's - * native serialization mechanism, the ObjectOutputStream. - * - * @param obj an object - * @return the serialized object as hex - */ - public static String serializeObjectToHex(final Serializable obj) { - - final ByteArrayOutputStream serializedObj = new ByteArrayOutputStream(); - - // IOException can never be thrown because we are serializing to an in memory byte array - try { - final ObjectOutputStream oos = new ObjectOutputStream(serializedObj); - oos.writeObject(obj); - oos.close(); - } catch (final IOException ioe) { - throw new RuntimeException(ioe); - } - - logger.debug(String.format("Serialized object '%s' size: %d", obj, serializedObj.size())); - - // hex encode the binary - return new String(Hex.encodeHex(serializedObj.toByteArray(), /* tolowercase */ true)); - } - - /** - * Deserializes a Java serialized, hex-encoded string into a Java object. - * This method is the inverse of the serializeObjectToHex method in this - * class. - * - * @param hexEncodedObject a string - * @return the object - * @throws ClassNotFoundException if the class could not be found - */ - public static Serializable deserializeHexToObject(final String hexEncodedObject) throws ClassNotFoundException { - - // decode the hex encoded object - byte[] serializedObj; - try { - serializedObj = Hex.decodeHex(hexEncodedObject.toCharArray()); - } catch (final DecoderException de) { - throw new IllegalArgumentException(de); - } - - // IOException can never be thrown because we are deserializing from an in memory byte array - try { - // deserialize bytes into object - ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(serializedObj)); - return (Serializable) ois.readObject(); - } catch (final IOException ioe) { - throw new RuntimeException(ioe); - } - - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/pom.xml ---------------------------------------------------------------------- diff --git a/nifi/commons/pom.xml b/nifi/commons/pom.xml deleted file mode 100644 index f85e337..0000000 --- a/nifi/commons/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - 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. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <parent> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-parent</artifactId> - <version>0.0.1-incubating-SNAPSHOT</version> - </parent> - - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-commons-parent</artifactId> - <packaging>pom</packaging> - <name>NiFi :: Commons Parent</name> - - <modules> - <module>data-provenance-utils</module> - <module>flowfile-packager</module> - <module>nifi-expression-language</module> - <module>nifi-logging-utils</module> - <module>nifi-properties</module> - <module>nifi-security-utils</module> - <module>nifi-socket-utils</module> - <module>nifi-utils</module> - <module>nifi-web-utils</module> - <module>processor-utilities</module> - <module>wali</module> - </modules> -</project> http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/processor-utilities/pom.xml ---------------------------------------------------------------------- diff --git a/nifi/commons/processor-utilities/pom.xml b/nifi/commons/processor-utilities/pom.xml deleted file mode 100644 index 523b98e..0000000 --- a/nifi/commons/processor-utilities/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0"?> -<!-- - 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. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <parent> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-commons-parent</artifactId> - <version>0.0.1-incubating-SNAPSHOT</version> - </parent> - - <artifactId>nifi-processor-utils</artifactId> - <version>0.0.1-incubating-SNAPSHOT</version> - <packaging>jar</packaging> - <name>NiFi Processor Utils</name> - - <dependencies> - <dependency> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-api</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-utils</artifactId> - </dependency> - <dependency> - <groupId>org.apache.nifi</groupId> - <artifactId>nifi-security-utils</artifactId> - </dependency> - </dependencies> -</project> http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/processor-utilities/src/main/java/org/apache/nifi/processor/util/FlowFileFilters.java ---------------------------------------------------------------------- diff --git a/nifi/commons/processor-utilities/src/main/java/org/apache/nifi/processor/util/FlowFileFilters.java b/nifi/commons/processor-utilities/src/main/java/org/apache/nifi/processor/util/FlowFileFilters.java deleted file mode 100644 index 1f77093..0000000 --- a/nifi/commons/processor-utilities/src/main/java/org/apache/nifi/processor/util/FlowFileFilters.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * 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.processor.util; - -import org.apache.nifi.flowfile.FlowFile; -import org.apache.nifi.processor.DataUnit; -import org.apache.nifi.processor.FlowFileFilter; - -public class FlowFileFilters { - - /** - * Returns a new {@link FlowFileFilter} that will pull FlowFiles until the - * maximum file size has been reached, or the maximum FlowFile Count was - * been reached (this is important because FlowFiles may be 0 bytes!). If - * the first FlowFile exceeds the max size, the FlowFile will be selected - * and no other FlowFile will be. - * - * @param maxSize the maximum size of the group of FlowFiles - * @param unit the unit of the <code>maxSize</code> argument - * @param maxCount the maximum number of FlowFiles to pull - * @return - */ - public static FlowFileFilter newSizeBasedFilter(final double maxSize, final DataUnit unit, final int maxCount) { - final double maxBytes = DataUnit.B.convert(maxSize, unit); - - return new FlowFileFilter() { - int count = 0; - long size = 0L; - - @Override - public FlowFileFilterResult filter(final FlowFile flowFile) { - if (count == 0) { - count++; - size += flowFile.getSize(); - - return FlowFileFilterResult.ACCEPT_AND_CONTINUE; - } - - if ((size + flowFile.getSize() > maxBytes) || (count + 1 > maxCount)) { - return FlowFileFilterResult.REJECT_AND_TERMINATE; - } - - count++; - size += flowFile.getSize(); - return FlowFileFilterResult.ACCEPT_AND_CONTINUE; - } - - }; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/processor-utilities/src/main/java/org/apache/nifi/processor/util/SSLProperties.java ---------------------------------------------------------------------- diff --git a/nifi/commons/processor-utilities/src/main/java/org/apache/nifi/processor/util/SSLProperties.java b/nifi/commons/processor-utilities/src/main/java/org/apache/nifi/processor/util/SSLProperties.java deleted file mode 100644 index 0d66df5..0000000 --- a/nifi/commons/processor-utilities/src/main/java/org/apache/nifi/processor/util/SSLProperties.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * 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.processor.util; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.UnrecoverableKeyException; -import java.security.cert.CertificateException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.net.ssl.SSLContext; - -import org.apache.nifi.components.PropertyDescriptor; -import org.apache.nifi.components.ValidationResult; -import org.apache.nifi.processor.ProcessContext; -import org.apache.nifi.security.util.CertificateUtils; -import org.apache.nifi.security.util.KeystoreType; -import org.apache.nifi.security.util.SslContextFactory; -import org.apache.nifi.security.util.SslContextFactory.ClientAuth; - -public class SSLProperties { - - public static final PropertyDescriptor TRUSTSTORE = new PropertyDescriptor.Builder() - .name("Truststore Filename") - .description("The fully-qualified filename of the Truststore") - .defaultValue(null) - .addValidator(StandardValidators.FILE_EXISTS_VALIDATOR) - .sensitive(false) - .build(); - - public static final PropertyDescriptor TRUSTSTORE_TYPE = new PropertyDescriptor.Builder() - .name("Truststore Type") - .description("The Type of the Truststore. Either JKS or PKCS12") - .allowableValues("JKS", "PKCS12") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .defaultValue(null) - .sensitive(false) - .build(); - - public static final PropertyDescriptor TRUSTSTORE_PASSWORD = new PropertyDescriptor.Builder() - .name("Truststore Password") - .description("The password for the Truststore") - .defaultValue(null) - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .sensitive(true) - .build(); - - public static final PropertyDescriptor KEYSTORE = new PropertyDescriptor.Builder() - .name("Keystore Filename") - .description("The fully-qualified filename of the Keystore") - .defaultValue(null) - .addValidator(StandardValidators.FILE_EXISTS_VALIDATOR) - .sensitive(false) - .build(); - - public static final PropertyDescriptor KEYSTORE_TYPE = new PropertyDescriptor.Builder() - .name("Keystore Type") - .description("The Type of the Keystore") - .allowableValues("JKS", "PKCS12") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .sensitive(false) - .build(); - - public static final PropertyDescriptor KEYSTORE_PASSWORD = new PropertyDescriptor.Builder() - .name("Keystore Password") - .defaultValue(null) - .description("The password for the Keystore") - .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) - .sensitive(true) - .build(); - - public static Collection<ValidationResult> validateStore(final Map<PropertyDescriptor, String> properties) { - final Collection<ValidationResult> results = new ArrayList<>(); - results.addAll(validateStore(properties, KeystoreValidationGroup.KEYSTORE)); - results.addAll(validateStore(properties, KeystoreValidationGroup.TRUSTSTORE)); - return results; - } - - public static Collection<ValidationResult> validateStore(final Map<PropertyDescriptor, String> properties, final KeystoreValidationGroup keyStoreOrTrustStore) { - final Collection<ValidationResult> results = new ArrayList<>(); - - final String filename; - final String password; - final String type; - - if (keyStoreOrTrustStore == KeystoreValidationGroup.KEYSTORE) { - filename = properties.get(KEYSTORE); - password = properties.get(KEYSTORE_PASSWORD); - type = properties.get(KEYSTORE_TYPE); - } else { - filename = properties.get(TRUSTSTORE); - password = properties.get(TRUSTSTORE_PASSWORD); - type = properties.get(TRUSTSTORE_TYPE); - } - - final String keystoreDesc = (keyStoreOrTrustStore == KeystoreValidationGroup.KEYSTORE) ? "Keystore" : "Truststore"; - - final int nulls = countNulls(filename, password, type); - if (nulls != 3 && nulls != 0) { - results.add(new ValidationResult.Builder().valid(false).explanation("Must set either 0 or 3 properties for " + keystoreDesc).subject(keystoreDesc + " Properties").build()); - } else if (nulls == 0) { - // all properties were filled in. - final File file = new File(filename); - if (!file.exists() || !file.canRead()) { - results.add(new ValidationResult.Builder().valid(false).subject(keystoreDesc + " Properties").explanation("Cannot access file " + file.getAbsolutePath()).build()); - } else { - try { - final boolean storeValid = CertificateUtils.isStoreValid(file.toURI().toURL(), KeystoreType.valueOf(type), password.toCharArray()); - if (!storeValid) { - results.add(new ValidationResult.Builder().subject(keystoreDesc + " Properties").valid(false).explanation("Invalid KeyStore Password or Type specified for file " + filename).build()); - } - } catch (MalformedURLException e) { - results.add(new ValidationResult.Builder().subject(keystoreDesc + " Properties").valid(false).explanation("Malformed URL from file: " + e).build()); - } - } - } - - return results; - } - - private static int countNulls(Object... objects) { - int count = 0; - for (final Object x : objects) { - if (x == null) { - count++; - } - } - - return count; - } - - public static enum KeystoreValidationGroup { - - KEYSTORE, TRUSTSTORE - } - - public static List<PropertyDescriptor> getKeystoreDescriptors(final boolean required) { - final List<PropertyDescriptor> descriptors = new ArrayList<>(); - for (final PropertyDescriptor descriptor : KEYSTORE_DESCRIPTORS) { - final PropertyDescriptor.Builder builder = new PropertyDescriptor.Builder().fromPropertyDescriptor(descriptor).required(required); - if (required && descriptor.getName().equals(KEYSTORE_TYPE.getName())) { - builder.defaultValue("JKS"); - } - descriptors.add(builder.build()); - } - - return descriptors; - } - - public static List<PropertyDescriptor> getTruststoreDescriptors(final boolean required) { - final List<PropertyDescriptor> descriptors = new ArrayList<>(); - for (final PropertyDescriptor descriptor : TRUSTSTORE_DESCRIPTORS) { - final PropertyDescriptor.Builder builder = new PropertyDescriptor.Builder().fromPropertyDescriptor(descriptor).required(required); - if (required && descriptor.getName().equals(TRUSTSTORE_TYPE.getName())) { - builder.defaultValue("JKS"); - } - descriptors.add(builder.build()); - } - - return descriptors; - } - - public static SSLContext createSSLContext(final ProcessContext context, final ClientAuth clientAuth) - throws UnrecoverableKeyException, KeyManagementException, KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException { - final String keystoreFile = context.getProperty(KEYSTORE).getValue(); - if (keystoreFile == null) { - return SslContextFactory.createTrustSslContext( - context.getProperty(TRUSTSTORE).getValue(), - context.getProperty(TRUSTSTORE_PASSWORD).getValue().toCharArray(), - context.getProperty(TRUSTSTORE_TYPE).getValue()); - } else { - final String truststoreFile = context.getProperty(TRUSTSTORE).getValue(); - if (truststoreFile == null) { - return SslContextFactory.createSslContext( - context.getProperty(KEYSTORE).getValue(), - context.getProperty(KEYSTORE_PASSWORD).getValue().toCharArray(), - context.getProperty(KEYSTORE_TYPE).getValue()); - } else { - return SslContextFactory.createSslContext( - context.getProperty(KEYSTORE).getValue(), - context.getProperty(KEYSTORE_PASSWORD).getValue().toCharArray(), - context.getProperty(KEYSTORE_TYPE).getValue(), - context.getProperty(TRUSTSTORE).getValue(), - context.getProperty(TRUSTSTORE_PASSWORD).getValue().toCharArray(), - context.getProperty(TRUSTSTORE_TYPE).getValue(), - clientAuth); - } - } - } - - private static final Set<PropertyDescriptor> KEYSTORE_DESCRIPTORS = new HashSet<>(); - private static final Set<PropertyDescriptor> TRUSTSTORE_DESCRIPTORS = new HashSet<>(); - - static { - KEYSTORE_DESCRIPTORS.add(KEYSTORE); - KEYSTORE_DESCRIPTORS.add(KEYSTORE_TYPE); - KEYSTORE_DESCRIPTORS.add(KEYSTORE_PASSWORD); - - TRUSTSTORE_DESCRIPTORS.add(TRUSTSTORE); - TRUSTSTORE_DESCRIPTORS.add(TRUSTSTORE_TYPE); - TRUSTSTORE_DESCRIPTORS.add(TRUSTSTORE_PASSWORD); - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/processor-utilities/src/main/java/org/apache/nifi/processor/util/StandardValidators.java ---------------------------------------------------------------------- diff --git a/nifi/commons/processor-utilities/src/main/java/org/apache/nifi/processor/util/StandardValidators.java b/nifi/commons/processor-utilities/src/main/java/org/apache/nifi/processor/util/StandardValidators.java deleted file mode 100644 index 10748fe..0000000 --- a/nifi/commons/processor-utilities/src/main/java/org/apache/nifi/processor/util/StandardValidators.java +++ /dev/null @@ -1,544 +0,0 @@ -/* - * 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.processor.util; - -import java.io.File; -import java.net.URI; -import java.net.URL; -import java.nio.charset.Charset; -import java.nio.charset.UnsupportedCharsetException; -import java.util.Collection; -import java.util.concurrent.TimeUnit; -import java.util.regex.Pattern; - -import org.apache.nifi.components.ValidationContext; -import org.apache.nifi.components.ValidationResult; -import org.apache.nifi.components.Validator; -import org.apache.nifi.controller.ControllerService; -import org.apache.nifi.expression.AttributeExpression.ResultType; -import org.apache.nifi.flowfile.FlowFile; -import org.apache.nifi.processor.DataUnit; -import org.apache.nifi.util.FormatUtils; - -public class StandardValidators { - - // - // - // STATICALLY DEFINED VALIDATORS - // - // - public static final Validator ATTRIBUTE_KEY_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String input, final ValidationContext context) { - final ValidationResult.Builder builder = new ValidationResult.Builder(); - builder.subject(subject).input(input); - - try { - FlowFile.KeyValidator.validateKey(input); - builder.valid(true); - } catch (final IllegalArgumentException e) { - builder.valid(false).explanation(e.getMessage()); - } - - return builder.build(); - } - }; - - public static final Validator ATTRIBUTE_KEY_PROPERTY_NAME_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String input, final ValidationContext context) { - final ValidationResult.Builder builder = new ValidationResult.Builder(); - builder.subject("Property Name").input(subject); - - try { - FlowFile.KeyValidator.validateKey(subject); - builder.valid(true); - } catch (final IllegalArgumentException e) { - builder.valid(false).explanation(e.getMessage()); - } - - return builder.build(); - } - }; - - public static final Validator POSITIVE_INTEGER_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String value, final ValidationContext context) { - String reason = null; - try { - final int intVal = Integer.parseInt(value); - - if (intVal <= 0) { - reason = "not a positive value"; - } - } catch (final NumberFormatException e) { - reason = "not a valid integer"; - } - - return new ValidationResult.Builder().subject(subject).input(value).explanation(reason).valid(reason == null).build(); - } - }; - - public static final Validator POSITIVE_LONG_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String value, final ValidationContext context) { - String reason = null; - try { - final long longVal = Long.parseLong(value); - - if (longVal <= 0) { - reason = "not a positive value"; - } - } catch (final NumberFormatException e) { - reason = "not a valid 64-bit integer"; - } - - return new ValidationResult.Builder().subject(subject).input(value).explanation(reason).valid(reason == null).build(); - } - }; - - public static final Validator PORT_VALIDATOR = createLongValidator(1, 65535, true); - - public static final Validator NON_EMPTY_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String value, final ValidationContext context) { - return new ValidationResult.Builder().subject(subject).input(value).valid(value != null && !value.isEmpty()).explanation(subject + " cannot be empty").build(); - } - }; - - public static final Validator BOOLEAN_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String value, final ValidationContext context) { - final boolean valid = "true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value); - final String explanation = valid ? null : "Value must be 'true' or 'false'"; - return new ValidationResult.Builder().subject(subject).input(value).valid(valid).explanation(explanation).build(); - } - }; - - public static final Validator INTEGER_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String value, final ValidationContext context) { - String reason = null; - try { - Integer.parseInt(value); - } catch (final NumberFormatException e) { - reason = "not a valid integer"; - } - - return new ValidationResult.Builder().subject(subject).input(value).explanation(reason).valid(reason == null).build(); - } - }; - - public static final Validator LONG_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String value, final ValidationContext context) { - String reason = null; - try { - Long.parseLong(value); - } catch (final NumberFormatException e) { - reason = "not a valid Long"; - } - - return new ValidationResult.Builder().subject(subject).input(value).explanation(reason).valid(reason == null).build(); - } - }; - - public static final Validator NON_NEGATIVE_INTEGER_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String value, final ValidationContext context) { - String reason = null; - try { - final int intVal = Integer.parseInt(value); - - if (intVal < 0) { - reason = "value is negative"; - } - } catch (final NumberFormatException e) { - reason = "value is not a valid integer"; - } - - return new ValidationResult.Builder().subject(subject).input(value).explanation(reason).valid(reason == null).build(); - } - }; - - public static final Validator CHARACTER_SET_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String value, final ValidationContext context) { - String reason = null; - try { - if (!Charset.isSupported(value)) { - reason = "Character Set is not supported by this JVM."; - } - } catch (final UnsupportedCharsetException uce) { - reason = "Character Set is not supported by this JVM."; - } catch (final IllegalArgumentException iae) { - reason = "Character Set value cannot be null."; - } - - return new ValidationResult.Builder().subject(subject).input(value).explanation(reason).valid(reason == null).build(); - } - }; - - /** - * URL Validator that does not allow the Expression Language to be used - */ - public static final Validator URL_VALIDATOR = createURLValidator(); - - public static final Validator URI_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String input, final ValidationContext context) { - try { - new URI(input); - return new ValidationResult.Builder().subject(subject).input(input).explanation("Valid URI").valid(true).build(); - } catch (final Exception e) { - return new ValidationResult.Builder().subject(subject).input(input).explanation("Not a valid URI").valid(false).build(); - } - } - }; - - public static final Validator REGULAR_EXPRESSION_VALIDATOR = createRegexValidator(0, Integer.MAX_VALUE, false); - - public static final Validator ATTRIBUTE_EXPRESSION_LANGUAGE_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String input, final ValidationContext context) { - try { - context.newExpressionLanguageCompiler().compile(input); - return new ValidationResult.Builder().subject(subject).input(input).valid(true).build(); - } catch (final Exception e) { - return new ValidationResult.Builder().subject(subject).input(input).valid(false).explanation(e.getMessage()).build(); - } - } - - }; - - public static final Validator TIME_PERIOD_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String input, final ValidationContext context) { - if (input == null) { - return new ValidationResult.Builder().subject(subject).input(input).valid(false).explanation("Time Period cannot be null").build(); - } - if (Pattern.compile(FormatUtils.TIME_DURATION_REGEX).matcher(input.toLowerCase()).matches()) { - return new ValidationResult.Builder().subject(subject).input(input).valid(true).build(); - } else { - return new ValidationResult.Builder().subject(subject).input(input).valid(false).explanation("Must be of format <duration> <TimeUnit> where <duration> is a non-negative integer and TimeUnit is a supported Time Unit, such as: nanos, millis, secs, mins, hrs, days").build(); - } - } - }; - - public static final Validator DATA_SIZE_VALIDATOR = new Validator() { - @Override - public ValidationResult validate(final String subject, final String input, final ValidationContext context) { - if (input == null) { - return new ValidationResult.Builder().subject(subject).input(input).valid(false).explanation("Data Size cannot be null").build(); - } - if (Pattern.compile(DataUnit.DATA_SIZE_REGEX).matcher(input.toUpperCase()).matches()) { - return new ValidationResult.Builder().subject(subject).input(input).valid(true).build(); - } else { - return new ValidationResult.Builder().subject(subject).input(input).valid(false).explanation("Must be of format <Data Size> <Data Unit> where <Data Size> is a non-negative integer and <Data Unit> is a supported Data Unit, such as: B, KB, MB, GB, TB").build(); - } - } - }; - - public static final Validator FILE_EXISTS_VALIDATOR = new FileExistsValidator(true); - - // - // - // FACTORY METHODS FOR VALIDATORS - // - // - public static Validator createDirectoryExistsValidator(final boolean allowExpressionLanguage, final boolean createDirectoryIfMissing) { - return new DirectoryExistsValidator(allowExpressionLanguage, createDirectoryIfMissing); - } - - private static Validator createURLValidator() { - return new Validator() { - @Override - public ValidationResult validate(final String subject, final String input, final ValidationContext context) { - try { - final String evaluatedInput = context.newPropertyValue(input).evaluateAttributeExpressions().getValue(); - new URL(evaluatedInput); - return new ValidationResult.Builder().subject(subject).input(input).explanation("Valid URL").valid(true).build(); - } catch (final Exception e) { - return new ValidationResult.Builder().subject(subject).input(input).explanation("Not a valid URL").valid(false).build(); - } - } - }; - } - - public static Validator createTimePeriodValidator(final long minTime, final TimeUnit minTimeUnit, final long maxTime, final TimeUnit maxTimeUnit) { - return new TimePeriodValidator(minTime, minTimeUnit, maxTime, maxTimeUnit); - } - - public static Validator createAttributeExpressionLanguageValidator(final ResultType expectedResultType) { - return createAttributeExpressionLanguageValidator(expectedResultType, true); - } - - public static Validator createRegexMatchingValidator(final Pattern pattern) { - return new Validator() { - @Override - public ValidationResult validate(final String subject, final String input, final ValidationContext context) { - final boolean matches = pattern.matcher(input).matches(); - return new ValidationResult.Builder() - .input(input) - .subject(subject) - .valid(matches) - .explanation(matches ? null : "Value does not match regular expression: " + pattern.pattern()) - .build(); - } - }; - } - - /** - * Creates a @{link Validator} that ensure that a value is a valid Java - * Regular Expression with at least <code>minCapturingGroups</code> - * capturing groups and at most <code>maxCapturingGroups</code> capturing - * groups. If <code>supportAttributeExpressionLanguage</code> is set to - * <code>true</code>, the value may also include the Expression Language, - * but the result of evaluating the Expression Language will be applied - * before the Regular Expression is performed. In this case, the Expression - * Language will not support FlowFile Attributes but only System/JVM - * Properties - * - * @param minCapturingGroups - * @param maxCapturingGroups - * @param supportAttributeExpressionLanguage - * @return - */ - public static Validator createRegexValidator(final int minCapturingGroups, final int maxCapturingGroups, final boolean supportAttributeExpressionLanguage) { - return new Validator() { - @Override - public ValidationResult validate(final String subject, final String value, final ValidationContext context) { - try { - final String substituted; - if (supportAttributeExpressionLanguage) { - try { - substituted = context.newPropertyValue(value).evaluateAttributeExpressions().getValue(); - } catch (final Exception e) { - return new ValidationResult.Builder().subject(subject).input(value).valid(false).explanation("Failed to evaluate the Attribute Expression Language due to " + e.toString()).build(); - } - } else { - substituted = value; - } - - final Pattern pattern = Pattern.compile(substituted); - final int numGroups = pattern.matcher("").groupCount(); - if (numGroups < minCapturingGroups || numGroups > maxCapturingGroups) { - return new ValidationResult.Builder().subject(subject).input(value).valid(false).explanation("RegEx is required to have between " + minCapturingGroups + " and " + maxCapturingGroups + " Capturing Groups but has " + numGroups).build(); - } - - return new ValidationResult.Builder().subject(subject).input(value).valid(true).build(); - } catch (final Exception e) { - return new ValidationResult.Builder().subject(subject).input(value).valid(false).explanation("Not a valid Java Regular Expression").build(); - } - - } - }; - } - - public static Validator createAttributeExpressionLanguageValidator(final ResultType expectedResultType, final boolean allowExtraCharacters) { - return new Validator() { - @Override - public ValidationResult validate(final String subject, final String input, final ValidationContext context) { - final String syntaxError = context.newExpressionLanguageCompiler().validateExpression(input, allowExtraCharacters); - if (syntaxError != null) { - return new ValidationResult.Builder().subject(subject).input(input).valid(false).explanation(syntaxError).build(); - } - - final ResultType resultType = allowExtraCharacters ? ResultType.STRING : context.newExpressionLanguageCompiler().getResultType(input); - if (!resultType.equals(expectedResultType)) { - return new ValidationResult.Builder().subject(subject).input(input).valid(false).explanation("Expected Attribute Query to return type " + expectedResultType + " but query returns type " + resultType).build(); - } - - return new ValidationResult.Builder().subject(subject).input(input).valid(true).build(); - } - }; - } - - public static Validator createLongValidator(final long minimum, final long maximum, final boolean inclusive) { - return new Validator() { - @Override - public ValidationResult validate(final String subject, final String input, final ValidationContext context) { - String reason = null; - try { - final long longVal = Long.parseLong(input); - if (longVal < minimum || (!inclusive && longVal == minimum) | longVal > maximum || (!inclusive && longVal == maximum)) { - reason = "Value must be between " + minimum + " and " + maximum + " (" + (inclusive ? "inclusive" : "exclusive") + ")"; - } - } catch (final NumberFormatException e) { - reason = "not a valid integer"; - } - - return new ValidationResult.Builder().subject(subject).input(input).explanation(reason).valid(reason == null).build(); - } - - }; - } - - // - // - // SPECIFIC VALIDATOR IMPLEMENTATIONS THAT CANNOT BE ANONYMOUS CLASSES - // - // - static class TimePeriodValidator implements Validator { - - private final Pattern pattern; - - private final long minNanos; - private final long maxNanos; - - private final String minValueEnglish; - private final String maxValueEnglish; - - public TimePeriodValidator(final long minValue, final TimeUnit minTimeUnit, final long maxValue, final TimeUnit maxTimeUnit) { - pattern = Pattern.compile(FormatUtils.TIME_DURATION_REGEX); - - this.minNanos = TimeUnit.NANOSECONDS.convert(minValue, minTimeUnit); - this.maxNanos = TimeUnit.NANOSECONDS.convert(maxValue, maxTimeUnit); - this.minValueEnglish = minValue + " " + minTimeUnit.toString(); - this.maxValueEnglish = maxValue + " " + maxTimeUnit.toString(); - } - - @Override - public ValidationResult validate(final String subject, final String input, final ValidationContext context) { - if (input == null) { - return new ValidationResult.Builder().subject(subject).input(input).valid(false).explanation("Time Period cannot be null").build(); - } - final String lowerCase = input.toLowerCase(); - final boolean validSyntax = pattern.matcher(lowerCase).matches(); - final ValidationResult.Builder builder = new ValidationResult.Builder(); - if (validSyntax) { - final long nanos = FormatUtils.getTimeDuration(lowerCase, TimeUnit.NANOSECONDS); - - if (nanos < minNanos || nanos > maxNanos) { - builder.subject(subject).input(input).valid(false) - .explanation("Must be in the range of " + minValueEnglish + " to " + maxValueEnglish); - } else { - builder.subject(subject).input(input).valid(true); - } - } else { - builder.subject(subject).input(input).valid(false) - .explanation("Must be of format <duration> <TimeUnit> where <duration> is a non-negative integer and TimeUnit is a supported Time Unit, such as: nanos, millis, secs, mins, hrs, days"); - } - return builder.build(); - } - } - - public static class FileExistsValidator implements Validator { - - private final boolean allowEL; - - public FileExistsValidator(final boolean allowExpressionLanguage) { - this.allowEL = allowExpressionLanguage; - } - - @Override - public ValidationResult validate(final String subject, final String value, final ValidationContext context) { - final String substituted; - if (allowEL) { - try { - substituted = context.newPropertyValue(value).evaluateAttributeExpressions().getValue(); - } catch (final Exception e) { - return new ValidationResult.Builder().subject(subject).input(value).valid(false) - .explanation("Not a valid Expression Language value: " + e.getMessage()).build(); - } - } else { - substituted = value; - } - - final File file = new File(substituted); - final boolean valid = file.exists(); - final String explanation = valid ? null : "File " + file + " does not exist"; - return new ValidationResult.Builder().subject(subject).input(value).valid(valid).explanation(explanation).build(); - } - } - - public static class DirectoryExistsValidator implements Validator { - - private final boolean allowEL; - private final boolean create; - - public DirectoryExistsValidator(final boolean allowExpressionLanguage, final boolean create) { - this.allowEL = allowExpressionLanguage; - this.create = create; - } - - @Override - public ValidationResult validate(final String subject, final String value, final ValidationContext context) { - final String substituted; - if (allowEL) { - try { - substituted = context.newPropertyValue(value).evaluateAttributeExpressions().getValue(); - } catch (final Exception e) { - return new ValidationResult.Builder().subject(subject).input(value).valid(false) - .explanation("Not a valid Expression Language value: " + e.getMessage()).build(); - } - - if (substituted.trim().isEmpty() && !value.trim().isEmpty()) { - // User specified an Expression and nothing more... assume valid. - return new ValidationResult.Builder().subject(subject).input(value).valid(true).build(); - } - } else { - substituted = value; - } - - String reason = null; - try { - final File file = new File(substituted); - if (!file.exists()) { - if (!create) { - reason = "Directory does not exist"; - } else if (!file.mkdirs()) { - reason = "Directory does not exist and could not be created"; - } - } else if (!file.isDirectory()) { - reason = "Path does not point to a directory"; - } - } catch (final Exception e) { - reason = "Value is not a valid directory name"; - } - - return new ValidationResult.Builder().subject(subject).input(value).explanation(reason).valid(reason == null).build(); - } - } - - public static Validator createControllerServiceExistsValidator(final Class<? extends ControllerService> serviceClass) { - return new Validator() { - @Override - public ValidationResult validate(final String subject, final String input, final ValidationContext context) { - final ControllerService svc = context.getControllerServiceLookup().getControllerService(input); - - if (svc == null) { - return new ValidationResult.Builder().valid(false).input(input).subject(subject).explanation("No Controller Service exists with this ID").build(); - } - - if (!serviceClass.isAssignableFrom(svc.getClass())) { - return new ValidationResult.Builder().valid(false).input(input).subject(subject).explanation("Controller Service with this ID is of type " + svc.getClass().getName() + " but is expected to be of type " + serviceClass.getName()).build(); - } - - final ValidationContext serviceValidationContext = context.getControllerServiceValidationContext(svc); - final Collection<ValidationResult> serviceValidationResults = svc.validate(serviceValidationContext); - for (final ValidationResult result : serviceValidationResults) { - if (!result.isValid()) { - return new ValidationResult.Builder().valid(false).input(input).subject(subject).explanation("Controller Service " + input + " is not valid: " + result.getExplanation()).build(); - } - } - - return new ValidationResult.Builder().input(input).subject(subject).valid(true).build(); - } - }; - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/processor-utilities/src/test/java/org/apache/nifi/processor/TestFormatUtils.java ---------------------------------------------------------------------- diff --git a/nifi/commons/processor-utilities/src/test/java/org/apache/nifi/processor/TestFormatUtils.java b/nifi/commons/processor-utilities/src/test/java/org/apache/nifi/processor/TestFormatUtils.java deleted file mode 100644 index 359def2..0000000 --- a/nifi/commons/processor-utilities/src/test/java/org/apache/nifi/processor/TestFormatUtils.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.processor; - -import static org.junit.Assert.assertEquals; - -import java.util.concurrent.TimeUnit; - -import org.apache.nifi.util.FormatUtils; - -import org.junit.Test; - -public class TestFormatUtils { - - @Test - public void testParse() { - assertEquals(3, FormatUtils.getTimeDuration("3000 ms", TimeUnit.SECONDS)); - assertEquals(3000, FormatUtils.getTimeDuration("3000 s", TimeUnit.SECONDS)); - assertEquals(0, FormatUtils.getTimeDuration("999 millis", TimeUnit.SECONDS)); - assertEquals(4L * 24L * 60L * 60L * 1000000000L, FormatUtils.getTimeDuration("4 days", TimeUnit.NANOSECONDS)); - assertEquals(24, FormatUtils.getTimeDuration("1 DAY", TimeUnit.HOURS)); - assertEquals(60, FormatUtils.getTimeDuration("1 hr", TimeUnit.MINUTES)); - assertEquals(60, FormatUtils.getTimeDuration("1 Hrs", TimeUnit.MINUTES)); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/processor-utilities/src/test/java/org/apache/nifi/processor/util/TestStandardValidators.java ---------------------------------------------------------------------- diff --git a/nifi/commons/processor-utilities/src/test/java/org/apache/nifi/processor/util/TestStandardValidators.java b/nifi/commons/processor-utilities/src/test/java/org/apache/nifi/processor/util/TestStandardValidators.java deleted file mode 100644 index 2ae50c9..0000000 --- a/nifi/commons/processor-utilities/src/test/java/org/apache/nifi/processor/util/TestStandardValidators.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.processor.util; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.util.concurrent.TimeUnit; - -import org.apache.nifi.components.ValidationResult; -import org.apache.nifi.components.Validator; - -import org.junit.Test; - -public class TestStandardValidators { - - @Test - public void testTimePeriodValidator() { - Validator val = StandardValidators.createTimePeriodValidator(1L, TimeUnit.SECONDS, Long.MAX_VALUE, TimeUnit.NANOSECONDS); - ValidationResult vr; - - vr = val.validate("TimePeriodTest", "0 sense made", null); - assertFalse(vr.isValid()); - - vr = val.validate("TimePeriodTest", null, null); - assertFalse(vr.isValid()); - - vr = val.validate("TimePeriodTest", "0 secs", null); - assertFalse(vr.isValid()); - - vr = val.validate("TimePeriodTest", "999 millis", null); - assertFalse(vr.isValid()); - - vr = val.validate("TimePeriodTest", "999999999 nanos", null); - assertFalse(vr.isValid()); - - vr = val.validate("TimePeriodTest", "1 sec", null); - assertTrue(vr.isValid()); - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/wali/.gitignore ---------------------------------------------------------------------- diff --git a/nifi/commons/wali/.gitignore b/nifi/commons/wali/.gitignore deleted file mode 100755 index 19f2e00..0000000 --- a/nifi/commons/wali/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target -/target