diff --git a/azkarra-streams/src/main/java/io/streamthoughts/azkarra/streams/autoconfigure/AutoConfigure.java b/azkarra-streams/src/main/java/io/streamthoughts/azkarra/streams/autoconfigure/AutoConfigure.java index 72e4416b..0a969a86 100644 --- a/azkarra-streams/src/main/java/io/streamthoughts/azkarra/streams/autoconfigure/AutoConfigure.java +++ b/azkarra-streams/src/main/java/io/streamthoughts/azkarra/streams/autoconfigure/AutoConfigure.java @@ -63,11 +63,16 @@ public void load(final AzkarraApplication application) { } final Class mainApplicationClass = application.getMainApplicationClass(); - - Optional configBasename = loadAutoSettingsIfEnable(mainApplicationClass); - final AzkarraConf conf = configBasename.map(AzkarraConf::create).orElse(AzkarraConf.empty()); - application.addConfiguration(conf); - + final Optional autoConfig = loadAutoConfigIfEnable(mainApplicationClass); + autoConfig.ifPresent(configBasename -> { + if (configBasename.isEmpty()) + // Load default configuration + application.addConfiguration(AzkarraConf.create()); + else { + // Load user defined custom configuration + application.addConfiguration(AzkarraConf.create(configBasename)); + } + }); isHttpServerEnable(mainApplicationClass) .ifPresent(application::enableHttpServer); @@ -78,7 +83,7 @@ public void load(final AzkarraApplication application) { .ifPresent(application::setEnableComponentScan); } - private Optional isComponentScanEnable(final Class source) { + private static Optional isComponentScanEnable(final Class source) { Set annotations = allAnnotationsOfType(source, ComponentScan.class); Optional optional = annotations.stream() .map(a -> ((ComponentScan) a).value()) @@ -88,7 +93,7 @@ private Optional isComponentScanEnable(final Class source) { isHttpServerEnable(AzkarraStreamsApplication.class) : Optional.empty()); } - private Optional isHttpServerEnable(final Class source) { + private static Optional isHttpServerEnable(final Class source) { Set annotations = allAnnotationsOfType(source, EnableEmbeddedHttpServer.class); Optional optional = annotations.stream() .map(a -> ((EnableEmbeddedHttpServer) a).value()) @@ -98,7 +103,7 @@ private Optional isHttpServerEnable(final Class source) { isHttpServerEnable(AzkarraStreamsApplication.class) : Optional.empty()); } - private Optional loadAutoStartEnvironmentNameIfEnable(final Class source) { + private static Optional loadAutoStartEnvironmentNameIfEnable(final Class source) { Set annotations = allAnnotationsOfType(source, EnableAutoStart.class); Optional optional = annotations.stream() .map(a -> ((EnableAutoStart)a).environment()) @@ -109,18 +114,17 @@ private Optional loadAutoStartEnvironmentNameIfEnable(final Class sou } - private Optional loadAutoSettingsIfEnable(final Class source) { + private static Optional loadAutoConfigIfEnable(final Class source) { Set annotations = allAnnotationsOfType(source, EnableAutoConfig.class); Optional optional = annotations.stream() .map(a -> ((EnableAutoConfig)a).name()) .findFirst(); return optional.or(() -> isAnnotatedWith(source, AzkarraStreamsApplication.class) ? - loadAutoSettingsIfEnable(AzkarraStreamsApplication.class) : Optional.empty()); + loadAutoConfigIfEnable(AzkarraStreamsApplication.class) : Optional.empty()); } - @SuppressWarnings("unchecked") private static boolean isAnnotatedWith( final T type, final Class annotation) { diff --git a/azkarra-streams/src/main/java/io/streamthoughts/azkarra/streams/autoconfigure/annotations/EnableAutoConfig.java b/azkarra-streams/src/main/java/io/streamthoughts/azkarra/streams/autoconfigure/annotations/EnableAutoConfig.java index 2e09a6d8..393ec0fe 100644 --- a/azkarra-streams/src/main/java/io/streamthoughts/azkarra/streams/autoconfigure/annotations/EnableAutoConfig.java +++ b/azkarra-streams/src/main/java/io/streamthoughts/azkarra/streams/autoconfigure/annotations/EnableAutoConfig.java @@ -28,5 +28,9 @@ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface EnableAutoConfig { - String name() default "application"; + /** + * The name (optionally without extension) of a resource on classpath. + * By default, a default configuration is loaded no resource basename is specified. + */ + String name() default ""; } diff --git a/azkarra-streams/src/main/java/io/streamthoughts/azkarra/streams/config/AzkarraConf.java b/azkarra-streams/src/main/java/io/streamthoughts/azkarra/streams/config/AzkarraConf.java index 0a5b1915..7ba1ae12 100644 --- a/azkarra-streams/src/main/java/io/streamthoughts/azkarra/streams/config/AzkarraConf.java +++ b/azkarra-streams/src/main/java/io/streamthoughts/azkarra/streams/config/AzkarraConf.java @@ -78,7 +78,7 @@ public static AzkarraConf create(final String resourceBasename) { /** * Static helper that can be used to creates a new {@link AzkarraConf} instance - * using the specified resource base name. + * that loads a default configuration. * *

* This method loads the following (first-listed are higher priority): diff --git a/azkarra-streams/src/test/java/io/streamthoughts/azkarra/streams/autoconfigure/AutoConfigureTest.java b/azkarra-streams/src/test/java/io/streamthoughts/azkarra/streams/autoconfigure/AutoConfigureTest.java new file mode 100644 index 00000000..d35a8eee --- /dev/null +++ b/azkarra-streams/src/test/java/io/streamthoughts/azkarra/streams/autoconfigure/AutoConfigureTest.java @@ -0,0 +1,81 @@ +/* + * Copyright 2019 StreamThoughts. + * + * 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 io.streamthoughts.azkarra.streams.autoconfigure; + +import io.streamthoughts.azkarra.api.config.Conf; +import io.streamthoughts.azkarra.streams.AzkarraApplication; +import io.streamthoughts.azkarra.streams.autoconfigure.annotations.EnableAutoConfig; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AutoConfigureTest { + + private static final String TEST_SYSTEM_PROPERTY_NAME = "azkarra.system-prop"; + private static final String TEST_CUSTOM_PROPERTY_NAME = "azkarra.custom-prop"; + + private static final String TEST_PROPERTY_VALUE = "test-value"; + + @Test + public void shouldLoadDefaultConfigsFromSystem(final @TempDir Path tempDir) throws IOException { + createTempConfigProperties(tempDir); + final AzkarraApplication application = new AzkarraApplication() { + public Class getMainApplicationClass() { + return ClassWithDefaultAutoConfig.class; + } + }; + new AutoConfigure().load(application); + Conf configuration = application.getConfiguration(); + assertEquals(TEST_PROPERTY_VALUE, configuration.getString(TEST_SYSTEM_PROPERTY_NAME)); + } + + @Test + public void shouldLoadCustomConfigs() { + final AzkarraApplication application = new AzkarraApplication() { + public Class getMainApplicationClass() { + return ClassWithCustomAutoConfig.class; + } + }; + new AutoConfigure().load(application); + Conf configuration = application.getConfiguration(); + assertEquals(TEST_PROPERTY_VALUE, configuration.getString(TEST_CUSTOM_PROPERTY_NAME)); + } + + private void createTempConfigProperties(@TempDir Path tempDir) throws IOException { + Path props = Files.createFile(tempDir.resolve("test.properties")); + Files.writeString(props, TEST_SYSTEM_PROPERTY_NAME + "=" + TEST_PROPERTY_VALUE); + System.setProperty("config.file", props.toString()); + } + + @EnableAutoConfig + public static class ClassWithDefaultAutoConfig { + + } + + @EnableAutoConfig(name = "custom") + public static class ClassWithCustomAutoConfig { + + } + +} \ No newline at end of file diff --git a/azkarra-streams/src/test/resources/custom.conf b/azkarra-streams/src/test/resources/custom.conf new file mode 100644 index 00000000..9f4ca133 --- /dev/null +++ b/azkarra-streams/src/test/resources/custom.conf @@ -0,0 +1,3 @@ +azkarra { + custom-prop = test-value +} \ No newline at end of file