auto-pipeline
is a source code generator that auto generate the component's pipeline. Help you to keep your project smaller, simpler, and more extensible. π‘
auto-pipeline
is an annotation-processor
for Pipeline
generation, which is inspired by
Google's Auto
. β€οΈ
for more information, please check out the auto-pipeline documents.
below is a brief introduction. please check the examples project, and it's test cases for details.
auto-pipeline
require java 8 or above.
for maven
project:
<dependencies>
<!--
the auto-pipeline annotation processor will generate
the pipeline classes for the interface.
annotation processor dependency should be "provided" scope,
because it's only needed at compile time.
-->
<dependency>
<groupId>com.foldright.auto-pipeline</groupId>
<artifactId>auto-pipeline-processor</artifactId>
<version>0.3.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
for gradle
project:
/*
* Gradle Kotlin DSL
*/
// the auto-pipeline annotation will be used in your interface type
compileOnly("com.foldright.auto-pipeline:auto-pipeline-annotations:0.3.0")
// the auto-pipeline annotation processor will generate the pipeline classes for the interface.
// use "annotationProcessor" scope because it's only needed at annotation processing time.
annotationProcessor("com.foldright.auto-pipeline:auto-pipeline-processor:0.3.0")
/*
* Gradle Groovy DSL
*/
compileOnly 'com.foldright.auto-pipeline:auto-pipeline-annotations:0.3.0'
annotationProcessor 'com.foldright.auto-pipeline:auto-pipeline-processor:0.3.0'
auto-pipeline
has published to maven central, click here
to find the latest version.
annotate @AutoPipeline
to your interface, and auto-pipeline
will generate some java files for the interface at compile time.
let's check the ConfigSource
as an example:
given an interface named ConfigSource
, the ConfigSource
has the get()
method, input a string as key and output a string as the value.
like this:
public interface ConfigSource {
String get(String key);
}
say, we want ConfigSource#get()
has some extensibility, so we decide to apply the chain of responsibility
pattern to it for extensibility.
Now it's auto-pipeline
's turn to play a role, we simply add @AutoPipelin
to ConfigSource
οΌ
@AutoPipeline
public interface ConfigSource {
String get(String key);
}
auto-pipeline-processor
will auto generate pipeline java files for ConfigSource
into subpackage pipeline
when compiled:
ConfigSourceHandler
the responsibility interface we want to implement for extensibilityConfigSourcePipeline
the chainConfigSourceHandlerContext
AbstractConfigSourceHandlerContext
DefaultConfigSourceHandlerContext
we can implement MapConfigSourceHandler
and SystemConfigSourceHandler
(they are all in the ConfigSource handler example):
public class MapConfigSourceHandler implements ConfigSourceHandler {
private final Map<String, String> map;
public MapConfigSourceHandler(Map<String, String> map) {
this.map = map;
}
@Override
public String get(String key, ConfigSourceHandlerContext context) {
String value = map.get(key);
if (StringUtils.isNotBlank(value)) {
return value;
}
return context.get(key);
}
}
public class SystemConfigSourceHandler implements ConfigSourceHandler {
public static final SystemConfigSourceHandler INSTANCE = new SystemConfigSourceHandler();
@Override
public String get(String key, ConfigSourceHandlerContext context) {
String value = System.getProperty(key);
if (StringUtils.isNotBlank(value)) {
return value;
}
return context.get(key);
}
}
create a ConfigSourcePipeline
by composing ConfigSourceHandler
s which can ben an entrance of the ConfigSource
:
Map<String, String> mapConfig = new HashMap<String, String>();
mapConfig.put("hello", "world");
ConfigSourceHandler mapConfigSourceHandler = new MapConfigSourceHandler(mapConfig);
ConfigSource pipeline = new ConfigSourcePipeline()
.addLast(mapConfigSourceHandler)
.addLast(SystemConfigSourceHandler.INSTANCE);
now, we can use the pipeline.get(...)
to invoke the chain! π
pipeline.get("hello");
// get value "world"
// from mapConfig / mapConfigSourceHandler
pipeline.get("java.specification.version")
// get value "1.8"
// from system properties / SystemConfigSourceHandler
check the runnable test case for details.
Apache License 2.0