Major overhaul of entire project infrastructure.
Formatted source with Spring formatter. Fixed license headers and author tags.
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,2 +1,4 @@
|
||||
.classpath
|
||||
.project
|
||||
.settings/
|
||||
target/
|
||||
@@ -15,11 +15,6 @@
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.springframework.ide.eclipse.core.springbuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.wst.validation.validationbuilder</name>
|
||||
<arguments>
|
||||
@@ -32,7 +27,6 @@
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.springframework.ide.eclipse.core.springnature</nature>
|
||||
<nature>org.maven.ide.eclipse.maven2Nature</nature>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
#Wed Aug 05 19:23:44 CEST 2009
|
||||
#Wed Feb 15 21:22:56 CET 2012
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
|
||||
org.eclipse.jdt.core.compiler.compliance=1.5
|
||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
||||
org.eclipse.jdt.core.compiler.compliance=1.6
|
||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||
org.eclipse.jdt.core.compiler.source=1.5
|
||||
org.eclipse.jdt.core.compiler.source=1.6
|
||||
|
||||
@@ -3,5 +3,7 @@
|
||||
<wb-module deploy-name="hera-core">
|
||||
<wb-resource deploy-path="/" source-path="/src/main/java"/>
|
||||
<wb-resource deploy-path="/" source-path="/src/main/resources"/>
|
||||
<wb-resource deploy-path="/" source-path="/src/test/java"/>
|
||||
<wb-resource deploy-path="/" source-path="/src/test/resources"/>
|
||||
</wb-module>
|
||||
</project-modules>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<faceted-project>
|
||||
<installed facet="jst.java" version="5.0"/>
|
||||
<installed facet="jst.utility" version="1.0"/>
|
||||
<installed facet="jst.java" version="1.6"/>
|
||||
</faceted-project>
|
||||
|
||||
17
core/pom.xml
17
core/pom.xml
@@ -23,6 +23,11 @@
|
||||
<artifactId>spring-context</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-aop</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
@@ -33,16 +38,4 @@
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>1.5</source>
|
||||
<target>1.5</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
|
||||
@@ -1,53 +1,38 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* Extension of {@link PluginRegistry} with additional methods to modify the
|
||||
* registry.
|
||||
* Extension of {@link PluginRegistry} with additional methods to modify the registry.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public interface MutablePluginRegistry<T extends Plugin<S>, S> extends
|
||||
PluginRegistry<T, S> {
|
||||
public interface MutablePluginRegistry<T extends Plugin<S>, S> extends PluginRegistry<T, S> {
|
||||
|
||||
/**
|
||||
* Register plugins.
|
||||
*
|
||||
* @param plugins the plugins to set
|
||||
*/
|
||||
void setPlugins(List<? extends T> plugins);
|
||||
/**
|
||||
* Adds a given plugin to the registry.
|
||||
*
|
||||
* @param plugin must not be {@literal null}.
|
||||
*/
|
||||
MutablePluginRegistry<T, S> addPlugin(T plugin);
|
||||
|
||||
|
||||
/**
|
||||
* Adds a given plugin to the registry.
|
||||
*
|
||||
* @param plugin
|
||||
*/
|
||||
MutablePluginRegistry<T, S> addPlugin(T plugin);
|
||||
|
||||
|
||||
/**
|
||||
* Removes a given plugin from the registry.
|
||||
*
|
||||
* @param plugin
|
||||
*/
|
||||
boolean removePlugin(T plugin);
|
||||
/**
|
||||
* Removes a given plugin from the registry.
|
||||
*
|
||||
* @param plugin must not be {@literal null}.
|
||||
*/
|
||||
boolean removePlugin(T plugin);
|
||||
}
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
@@ -23,192 +23,144 @@ import java.util.List;
|
||||
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
|
||||
import org.springframework.util.comparator.InvertibleComparator;
|
||||
|
||||
|
||||
/**
|
||||
* {@link PluginRegistry} implementation that be made aware of a certain
|
||||
* ordering of {@link Plugin}s. By default it orders {@link Plugin}s by
|
||||
* regarding {@link org.springframework.core.Ordered} interface or
|
||||
* {@link org.springframework.core.annotation.Order} annotation. To alter
|
||||
* ordering behaviour use one of the factory methods accepting a
|
||||
* {@link Comparator} as parameter.
|
||||
* {@link PluginRegistry} implementation that be made aware of a certain ordering of {@link Plugin}s. By default it
|
||||
* orders {@link Plugin}s by regarding {@link org.springframework.core.Ordered} interface or
|
||||
* {@link org.springframework.core.annotation.Order} annotation. To alter ordering behaviour use one of the factory
|
||||
* methods accepting a {@link Comparator} as parameter.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class OrderAwarePluginRegistry<T extends Plugin<S>, S> extends
|
||||
SimplePluginRegistry<T, S> {
|
||||
public class OrderAwarePluginRegistry<T extends Plugin<S>, S> extends SimplePluginRegistry<T, S> {
|
||||
|
||||
/**
|
||||
* Comparator regarding {@link org.springframework.core.Ordered} interface
|
||||
* or {@link org.springframework.core.annotation.Order} annotation.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private static final Comparator<Object> DEFAULT_COMPARATOR =
|
||||
new AnnotationAwareOrderComparator();
|
||||
/**
|
||||
* Comparator regarding {@link org.springframework.core.Ordered} interface or
|
||||
* {@link org.springframework.core.annotation.Order} annotation.
|
||||
*/
|
||||
private static final Comparator<Object> DEFAULT_COMPARATOR = new AnnotationAwareOrderComparator();
|
||||
|
||||
/**
|
||||
* Comparator reverting the {@value #DEFAULT_COMPARATOR}.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private static final Comparator<Object> DEFAULT_REVERSE_COMPARATOR =
|
||||
new InvertibleComparator(DEFAULT_COMPARATOR, false);
|
||||
/**
|
||||
* Comparator reverting the {@value #DEFAULT_COMPARATOR}.
|
||||
*/
|
||||
private static final Comparator<Object> DEFAULT_REVERSE_COMPARATOR = new InvertibleComparator<Object>(
|
||||
DEFAULT_COMPARATOR, false);
|
||||
|
||||
private Comparator<? super T> comparator;
|
||||
private Comparator<? super T> comparator;
|
||||
|
||||
/**
|
||||
* Creates a new {@link OrderAwarePluginRegistry} with the given {@link Plugin}s and {@link Comparator}.
|
||||
*
|
||||
* @param plugins the {@link Plugin}s to be contained in the registry or {@literal null} if the registry shall be
|
||||
* empty initally.
|
||||
* @param comparator the {@link Comparator} to be used for ordering the {@link Plugin}s or {@literal null} if the
|
||||
* {@code #DEFAULT_COMPARATOR} shall be used.
|
||||
*/
|
||||
protected OrderAwarePluginRegistry(List<? extends T> plugins, Comparator<? super T> comparator) {
|
||||
|
||||
/**
|
||||
* Creates a new {@link OrderAwarePluginRegistry} with the given
|
||||
* {@link Plugin}s and {@link Comparator}.
|
||||
*
|
||||
* @param plugins the {@link Plugin}s to be contained in the registry or
|
||||
* {@literal null} if the registry shall be empty initally.
|
||||
* @param comparator the {@link Comparator} to be used for ordering the
|
||||
* {@link Plugin}s or {@literal null} if the
|
||||
* {@code #DEFAULT_COMPARATOR} shall be used.
|
||||
*/
|
||||
protected OrderAwarePluginRegistry(List<? extends T> plugins,
|
||||
Comparator<? super T> comparator) {
|
||||
super(plugins);
|
||||
setComparator(comparator);
|
||||
}
|
||||
|
||||
super(plugins);
|
||||
setComparator(comparator);
|
||||
}
|
||||
/**
|
||||
* Creates a new {@link OrderAwarePluginRegistry} using the {@code #DEFAULT_COMPARATOR}.
|
||||
*
|
||||
* @param <T>
|
||||
* @param <S>
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> OrderAwarePluginRegistry<T, S> create() {
|
||||
|
||||
return create(null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link OrderAwarePluginRegistry} using the
|
||||
* {@code #DEFAULT_COMPARATOR}.
|
||||
*
|
||||
* @param <T>
|
||||
* @param <S>
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> OrderAwarePluginRegistry<T, S> create() {
|
||||
/**
|
||||
* Creates a new {@link OrderAwarePluginRegistry} using the given {@link Comparator} for ordering contained
|
||||
* {@link Plugin}s.
|
||||
*
|
||||
* @param <T>
|
||||
* @param <S>
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> OrderAwarePluginRegistry<T, S> create(Comparator<? super T> comparator) {
|
||||
return create(null, comparator);
|
||||
}
|
||||
|
||||
return create(null, null);
|
||||
}
|
||||
/**
|
||||
* Creates a new {@link OrderAwarePluginRegistry} with the given plugins.
|
||||
*
|
||||
* @param <S>
|
||||
* @param <T>
|
||||
* @param plugins
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> OrderAwarePluginRegistry<T, S> create(List<? extends T> plugins) {
|
||||
return create(plugins, DEFAULT_COMPARATOR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link OrderAwarePluginRegistry} with the given plugins and the order of the plugins reverted.
|
||||
*
|
||||
* @param <S>
|
||||
* @param <T>
|
||||
* @param plugins
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> OrderAwarePluginRegistry<T, S> createReverse(List<? extends T> plugins) {
|
||||
return create(plugins, DEFAULT_REVERSE_COMPARATOR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link OrderAwarePluginRegistry} using the given
|
||||
* {@link Comparator} for ordering contained {@link Plugin}s.
|
||||
*
|
||||
* @param <T>
|
||||
* @param <S>
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> OrderAwarePluginRegistry<T, S> create(
|
||||
Comparator<? super T> comparator) {
|
||||
/**
|
||||
* Creates a new {@link OrderAwarePluginRegistry} with the given plugins.
|
||||
*
|
||||
* @param <S>
|
||||
* @param <T>
|
||||
* @param plugins
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> OrderAwarePluginRegistry<T, S> create(List<? extends T> plugins,
|
||||
Comparator<? super T> comparator) {
|
||||
return new OrderAwarePluginRegistry<T, S>(plugins, comparator);
|
||||
}
|
||||
|
||||
return create(null, comparator);
|
||||
}
|
||||
/**
|
||||
* Sets the comparator to use. Resorts the contained {@link Plugin}s if any available.
|
||||
*
|
||||
* @param comparator the comparator to set
|
||||
*/
|
||||
private void setComparator(Comparator<? super T> comparator) {
|
||||
|
||||
this.comparator = DEFAULT_COMPARATOR;
|
||||
|
||||
/**
|
||||
* Creates a new {@link OrderAwarePluginRegistry} with the given plugins.
|
||||
*
|
||||
* @param <S>
|
||||
* @param <T>
|
||||
* @param plugins
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> OrderAwarePluginRegistry<T, S> create(
|
||||
List<? extends T> plugins) {
|
||||
if (comparator != null) {
|
||||
this.comparator = comparator;
|
||||
}
|
||||
|
||||
return create(plugins, DEFAULT_COMPARATOR);
|
||||
}
|
||||
if (plugins != null) {
|
||||
Collections.sort(plugins, comparator);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.SimplePluginRegistry#addPlugin(org.synyx.hera.core.Plugin)
|
||||
*/
|
||||
@Override
|
||||
public OrderAwarePluginRegistry<T, S> addPlugin(T plugin) {
|
||||
|
||||
/**
|
||||
* Creates a new {@link OrderAwarePluginRegistry} with the given plugins and
|
||||
* the order of the plugins reverted.
|
||||
*
|
||||
* @param <S>
|
||||
* @param <T>
|
||||
* @param plugins
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> OrderAwarePluginRegistry<T, S> createReverse(
|
||||
List<? extends T> plugins) {
|
||||
super.addPlugin(plugin);
|
||||
Collections.sort(plugins, comparator);
|
||||
return this;
|
||||
}
|
||||
|
||||
return create(plugins, DEFAULT_REVERSE_COMPARATOR);
|
||||
}
|
||||
/**
|
||||
* Returns a new {@link OrderAwarePluginRegistry} with the order of the plugins reverted.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public OrderAwarePluginRegistry<T, S> reverse() {
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new {@link OrderAwarePluginRegistry} with the given plugins.
|
||||
*
|
||||
* @param <S>
|
||||
* @param <T>
|
||||
* @param plugins
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> OrderAwarePluginRegistry<T, S> create(
|
||||
List<? extends T> plugins, Comparator<? super T> comparator) {
|
||||
|
||||
return new OrderAwarePluginRegistry<T, S>(plugins, comparator);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets the comparator to use. Resorts the contained {@link Plugin}s if any
|
||||
* available.
|
||||
*
|
||||
* @param comparator the comparator to set
|
||||
*/
|
||||
private void setComparator(Comparator<? super T> comparator) {
|
||||
|
||||
this.comparator = DEFAULT_COMPARATOR;
|
||||
|
||||
if (comparator != null) {
|
||||
this.comparator = comparator;
|
||||
}
|
||||
|
||||
if (plugins != null) {
|
||||
Collections.sort(plugins, comparator);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.PluginRegistry#setPlugins(java.util.List)
|
||||
*/
|
||||
@Override
|
||||
public void setPlugins(List<? extends T> plugins) {
|
||||
|
||||
super.setPlugins(plugins);
|
||||
|
||||
if (!this.plugins.isEmpty()) {
|
||||
Collections.sort(this.plugins, comparator);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.synyx.hera.core.PluginRegistry#addPlugin(org.synyx.hera.core.Plugin)
|
||||
*/
|
||||
@Override
|
||||
public OrderAwarePluginRegistry<T, S> addPlugin(T plugin) {
|
||||
|
||||
super.addPlugin(plugin);
|
||||
Collections.sort(plugins, comparator);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a new {@link OrderAwarePluginRegistry} with the order of the
|
||||
* plugins reverted.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public OrderAwarePluginRegistry<T, S> reverse() {
|
||||
|
||||
return create(plugins, new InvertibleComparator(comparator, false));
|
||||
}
|
||||
ArrayList<T> copy = new ArrayList<T>(plugins);
|
||||
return create(copy, new InvertibleComparator(comparator, false));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,37 +1,35 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core;
|
||||
|
||||
/**
|
||||
* Central interface for plugins for the system. This interface is meant to be
|
||||
* extended by concrete plugin interfaces. Its core responsibility is to define
|
||||
* a delimiter type and a selection callback with the delimiter as parameter.
|
||||
* The delimiter is some kind of decision object concrete plugin implementations
|
||||
* can use to decide if they are capable to be executed.
|
||||
* Central interface for plugins for the system. This interface is meant to be extended by concrete plugin interfaces.
|
||||
* Its core responsibility is to define a delimiter type and a selection callback with the delimiter as parameter. The
|
||||
* delimiter is some kind of decision object concrete plugin implementations can use to decide if they are capable to be
|
||||
* executed.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public interface Plugin<S> {
|
||||
|
||||
/**
|
||||
* Returns if a plugin should be invoked according to the given delimiter.
|
||||
*
|
||||
* @param delimiter
|
||||
* @return if the plugin should be invoked
|
||||
*/
|
||||
boolean supports(S delimiter);
|
||||
/**
|
||||
* Returns if a plugin should be invoked according to the given delimiter.
|
||||
*
|
||||
* @param delimiter
|
||||
* @return if the plugin should be invoked
|
||||
*/
|
||||
boolean supports(S delimiter);
|
||||
}
|
||||
|
||||
@@ -1,138 +1,116 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* Registry for plugins. Allows sophisticated typesafe access to implementations
|
||||
* of interfaces extending {link Plugin}.
|
||||
* Registry for plugins. Allows sophisticated typesafe access to implementations of interfaces extending {link Plugin}.
|
||||
*
|
||||
* @param <T> the concrete plugin interface
|
||||
* @param <S> the delimiter type
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public interface PluginRegistry<T extends Plugin<S>, S> extends Iterable<T> {
|
||||
|
||||
/**
|
||||
* Returns the first plugin found for the given originating system. Thus,
|
||||
* further configured plugins are ignored.
|
||||
*
|
||||
* @param originatingSystem
|
||||
* @return a plugin for the given originating system or {@code null} if none
|
||||
* found
|
||||
*/
|
||||
T getPluginFor(S delimiter);
|
||||
/**
|
||||
* Returns the first plugin found for the given originating system. Thus, further configured plugins are ignored.
|
||||
*
|
||||
* @param originatingSystem
|
||||
* @return a plugin for the given originating system or {@code null} if none found
|
||||
*/
|
||||
T getPluginFor(S delimiter);
|
||||
|
||||
/**
|
||||
* Returns all plugins for the given delimiter.
|
||||
*
|
||||
* @param delimiter
|
||||
* @return a list of plugins or an empty list if none found
|
||||
*/
|
||||
List<T> getPluginsFor(S delimiter);
|
||||
|
||||
/**
|
||||
* Returns all plugins for the given delimiter.
|
||||
*
|
||||
* @param delimiter
|
||||
* @return a list of plugins or an empty list if none found
|
||||
*/
|
||||
List<T> getPluginsFor(S delimiter);
|
||||
/**
|
||||
* Retrieves a required plugin from the registry or throw the given exception if none can be found. If more than one
|
||||
* plugins are found the first one will be returned.
|
||||
*
|
||||
* @param <E> the exception type to be thrown in case no plugin can be found
|
||||
* @param delimiter
|
||||
* @param ex the exception to be thrown in case no plugin can be found
|
||||
* @return a single plugin for the given delimiter
|
||||
* @throws E if no plugin can be found for the given delimiter
|
||||
*/
|
||||
<E extends Exception> T getPluginFor(S delimiter, E ex) throws E;
|
||||
|
||||
/**
|
||||
* Retrieves all plugins for the given delimiter or throws an exception if no plugin can be found.
|
||||
*
|
||||
* @param <E> the exception type to be thrown
|
||||
* @param delimiter
|
||||
* @param ex
|
||||
* @return all plugins for the given delimiter
|
||||
* @throws E if no plugin can be found
|
||||
*/
|
||||
<E extends Exception> List<T> getPluginsFor(S delimiter, E ex) throws E;
|
||||
|
||||
/**
|
||||
* Retrieves a required plugin from the registry or throw the given
|
||||
* exception if none can be found. If more than one plugins are found the
|
||||
* first one will be returned.
|
||||
*
|
||||
* @param <E> the exception type to be thrown in case no plugin can be found
|
||||
* @param delimiter
|
||||
* @param ex the exception to be thrown in case no plugin can be found
|
||||
* @return a single plugin for the given delimiter
|
||||
* @throws E if no plugin can be found for the given delimiter
|
||||
*/
|
||||
<E extends Exception> T getPluginFor(S delimiter, E ex) throws E;
|
||||
/**
|
||||
* Returns the first {@link Plugin} supporting the given delimiter or the given plugin if none can be found.
|
||||
*
|
||||
* @param delimiter
|
||||
* @param plugin
|
||||
* @return a single {@link Plugin} supporting the given delimiter or the given {@link Plugin} if none found
|
||||
*/
|
||||
T getPluginFor(S delimiter, T plugin);
|
||||
|
||||
/**
|
||||
* Returns all {@link Plugin}s supporting the given delimiter or the given plugins if none found.
|
||||
*
|
||||
* @param delimiter
|
||||
* @param plugins
|
||||
* @return all {@link Plugin}s supporting the given delimiter or the given {@link Plugin}s if none found
|
||||
*/
|
||||
List<T> getPluginsFor(S delimiter, List<? extends T> plugins);
|
||||
|
||||
/**
|
||||
* Retrieves all plugins for the given delimiter or throws an exception if
|
||||
* no plugin can be found.
|
||||
*
|
||||
* @param <E> the exception type to be thrown
|
||||
* @param delimiter
|
||||
* @param ex
|
||||
* @return all plugins for the given delimiter
|
||||
* @throws E if no plugin can be found
|
||||
*/
|
||||
<E extends Exception> List<T> getPluginsFor(S delimiter, E ex) throws E;
|
||||
/**
|
||||
* Returns the number of registered plugins.
|
||||
*
|
||||
* @return the number of plugins in the registry
|
||||
*/
|
||||
int countPlugins();
|
||||
|
||||
/**
|
||||
* Returns whether the registry contains a given plugin.
|
||||
*
|
||||
* @param plugin
|
||||
* @return
|
||||
*/
|
||||
boolean contains(T plugin);
|
||||
|
||||
/**
|
||||
* Returns the first {@link Plugin} supporting the given delimiter or the
|
||||
* given plugin if none can be found.
|
||||
*
|
||||
* @param delimiter
|
||||
* @param plugin
|
||||
* @return a single {@link Plugin} supporting the given delimiter or the
|
||||
* given {@link Plugin} if none found
|
||||
*/
|
||||
T getPluginFor(S delimiter, T plugin);
|
||||
/**
|
||||
* Returns whether the registry contains a {@link Plugin} matching the given delimiter.
|
||||
*
|
||||
* @param delimiter
|
||||
* @return
|
||||
*/
|
||||
boolean hasPluginFor(S delimiter);
|
||||
|
||||
|
||||
/**
|
||||
* Returns all {@link Plugin}s supporting the given delimiter or the given
|
||||
* plugins if none found.
|
||||
*
|
||||
* @param delimiter
|
||||
* @param plugins
|
||||
* @return all {@link Plugin}s supporting the given delimiter or the given
|
||||
* {@link Plugin}s if none found
|
||||
*/
|
||||
List<T> getPluginsFor(S delimiter, List<? extends T> plugins);
|
||||
|
||||
|
||||
/**
|
||||
* Returns the number of registered plugins.
|
||||
*
|
||||
* @return the number of plugins in the registry
|
||||
*/
|
||||
int countPlugins();
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether the registry contains a given plugin.
|
||||
*
|
||||
* @param plugin
|
||||
* @return
|
||||
*/
|
||||
boolean contains(T plugin);
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether the registry contains a {@link Plugin} matching the given
|
||||
* delimiter.
|
||||
*
|
||||
* @param delimiter
|
||||
* @return
|
||||
*/
|
||||
boolean hasPluginFor(S delimiter);
|
||||
|
||||
|
||||
/**
|
||||
* Returns all {@link Plugin}s contained in this registry. Will return an
|
||||
* immutable {@link List} to prevent outside modifications of the
|
||||
* {@link PluginRegistry} content.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
List<T> getPlugins();
|
||||
/**
|
||||
* Returns all {@link Plugin}s contained in this registry. Will return an immutable {@link List} to prevent outside
|
||||
* modifications of the {@link PluginRegistry} content.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
List<T> getPlugins();
|
||||
}
|
||||
@@ -1,19 +1,18 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -21,277 +20,197 @@ import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* Basic implementation of {@link PluginRegistry}. Simply holds all given
|
||||
* plugins in a list dropping {@literal null} values silently on adding.
|
||||
* Basic implementation of {@link PluginRegistry}. Simply holds all given plugins in a list dropping {@literal null}
|
||||
* values silently on adding.
|
||||
*
|
||||
* @param <T> the concrete plugin interface
|
||||
* @param <S> the delimiter type
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class SimplePluginRegistry<T extends Plugin<S>, S> implements
|
||||
MutablePluginRegistry<T, S> {
|
||||
|
||||
protected List<T> plugins;
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new {@code SimplePluginRegistry}. Will create an empty registry
|
||||
* if {@literal null} is provided.
|
||||
*/
|
||||
protected SimplePluginRegistry(List<? extends T> plugins) {
|
||||
|
||||
this.plugins = filterNulls(plugins);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new {@link SimplePluginRegistry}.
|
||||
*
|
||||
* @param <T>
|
||||
* @param <S>
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> SimplePluginRegistry<T, S> create() {
|
||||
|
||||
return new SimplePluginRegistry<T, S>(null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new {@link SimplePluginRegistry} with the given {@link Plugin}
|
||||
* s.
|
||||
*
|
||||
* @param <T>
|
||||
* @param <S>
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> SimplePluginRegistry<T, S> create(
|
||||
List<? extends T> plugins) {
|
||||
|
||||
return new SimplePluginRegistry<T, S>(plugins);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.MutablePluginRegistry#setPlugins(java.util.List)
|
||||
*/
|
||||
public void setPlugins(List<? extends T> plugins) {
|
||||
|
||||
this.plugins = filterNulls(plugins);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Filters {@literal null} values from the given list.
|
||||
*
|
||||
* @param plugins
|
||||
* @return an empty {@link List} if the given list is {@literal null} or
|
||||
* empty, or the original list without its {@literal null} elements.
|
||||
*/
|
||||
private List<T> filterNulls(List<? extends T> plugins) {
|
||||
|
||||
if (plugins == null || plugins.isEmpty()) {
|
||||
return new ArrayList<T>();
|
||||
}
|
||||
|
||||
List<T> result = new ArrayList<T>();
|
||||
|
||||
for (T plugin : plugins) {
|
||||
if (plugin != null) {
|
||||
result.add(plugin);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.synyx.hera.core.MutablePluginRegistry#addPlugin(org.synyx.hera.core
|
||||
* .Plugin)
|
||||
*/
|
||||
public SimplePluginRegistry<T, S> addPlugin(T plugin) {
|
||||
|
||||
if (plugin != null) {
|
||||
this.plugins.add(plugin);
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.synyx.hera.core.MutablePluginRegistry#removePlugin(org.synyx.hera
|
||||
* .core.Plugin)
|
||||
*/
|
||||
public boolean removePlugin(T plugin) {
|
||||
|
||||
return this.plugins.remove(plugin);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.PluginRegistry#getPluginFor(S)
|
||||
*/
|
||||
public T getPluginFor(S delimiter) {
|
||||
|
||||
List<T> result = getPluginsFor(delimiter);
|
||||
|
||||
if (0 < result.size()) {
|
||||
return result.get(0);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.PluginRegistry#getPluginsFor(S)
|
||||
*/
|
||||
public List<T> getPluginsFor(S delimiter) {
|
||||
|
||||
List<T> result = new ArrayList<T>();
|
||||
|
||||
for (T plugin : plugins) {
|
||||
if (plugin.supports(delimiter)) {
|
||||
result.add(plugin);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.PluginRegistry#getPluginFor(S, E)
|
||||
*/
|
||||
public <E extends Exception> T getPluginFor(S delimiter, E ex) throws E {
|
||||
|
||||
T plugin = getPluginFor(delimiter);
|
||||
|
||||
if (null == plugin) {
|
||||
throw ex;
|
||||
}
|
||||
|
||||
return plugin;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.PluginRegistry#getPluginsFor(S, E)
|
||||
*/
|
||||
public <E extends Exception> List<T> getPluginsFor(S delimiter, E ex)
|
||||
throws E {
|
||||
|
||||
List<T> result = getPluginsFor(delimiter);
|
||||
|
||||
if (0 == result.size()) {
|
||||
throw ex;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.PluginRegistry#getPluginFor(S, T)
|
||||
*/
|
||||
public T getPluginFor(S delimiter, T plugin) {
|
||||
|
||||
T candidate = getPluginFor(delimiter);
|
||||
|
||||
return null == candidate ? plugin : candidate;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.PluginRegistry#getPluginsFor(S, java.util.List)
|
||||
*/
|
||||
public List<T> getPluginsFor(S delimiter, List<? extends T> plugins) {
|
||||
|
||||
List<T> candidates = getPluginsFor(delimiter);
|
||||
|
||||
return candidates.size() == 0 ? new ArrayList<T>(plugins) : candidates;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.PluginRegistry#countPlugins()
|
||||
*/
|
||||
public int countPlugins() {
|
||||
|
||||
return plugins.size();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns all registered plugins. Only use this method if you really need
|
||||
* to access all plugins. For distinguished access to certain plugins favour
|
||||
* accessor methods like {link #getPluginFor} over this one. This method
|
||||
* should only be used for testing purposes to check registry configuration.
|
||||
*
|
||||
* @return all plugins of the registry
|
||||
*/
|
||||
public List<T> getPlugins() {
|
||||
|
||||
return Collections.unmodifiableList(plugins);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.synyx.hera.core.PluginRegistry#contains(org.synyx.hera.core.Plugin)
|
||||
*/
|
||||
public boolean contains(T plugin) {
|
||||
|
||||
return this.plugins.contains(plugin);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.PluginRegistry#hasPluginFor(java.lang.Object)
|
||||
*/
|
||||
public boolean hasPluginFor(S delimter) {
|
||||
|
||||
return null != getPluginFor(delimter);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see java.lang.Iterable#iterator()
|
||||
*/
|
||||
public Iterator<T> iterator() {
|
||||
|
||||
return plugins.iterator();
|
||||
}
|
||||
public class SimplePluginRegistry<T extends Plugin<S>, S> implements MutablePluginRegistry<T, S> {
|
||||
|
||||
protected final List<T> plugins;
|
||||
|
||||
/**
|
||||
* Creates a new {@code SimplePluginRegistry}. Will create an empty registry if {@literal null} is provided.
|
||||
*
|
||||
* @param plugins must not be {@literal null}.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
protected SimplePluginRegistry(List<? extends T> plugins) {
|
||||
this.plugins = plugins == null ? new ArrayList<T>() : (List<T>) plugins;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link SimplePluginRegistry}.
|
||||
*
|
||||
* @param <T> the plugin type
|
||||
* @param <S> the delimiter type
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> SimplePluginRegistry<T, S> create() {
|
||||
return new SimplePluginRegistry<T, S>(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link SimplePluginRegistry} with the given {@link Plugin} s.
|
||||
*
|
||||
* @param <T> the plugin type
|
||||
* @param <S> the delimiter type
|
||||
* @return
|
||||
*/
|
||||
public static <S, T extends Plugin<S>> SimplePluginRegistry<T, S> create(List<? extends T> plugins) {
|
||||
return new SimplePluginRegistry<T, S>(plugins);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.MutablePluginRegistry#addPlugin(org.synyx.hera.core.Plugin)
|
||||
*/
|
||||
public SimplePluginRegistry<T, S> addPlugin(T plugin) {
|
||||
|
||||
if (plugin != null) {
|
||||
this.plugins.add(plugin);
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.MutablePluginRegistry#removePlugin(org.synyx.hera.core.Plugin)
|
||||
*/
|
||||
public boolean removePlugin(T plugin) {
|
||||
|
||||
return this.plugins.remove(plugin);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.PluginRegistry#getPluginFor(java.lang.Object)
|
||||
*/
|
||||
public T getPluginFor(S delimiter) {
|
||||
|
||||
List<T> result = getPluginsFor(delimiter);
|
||||
|
||||
if (0 < result.size()) {
|
||||
return result.get(0);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.PluginRegistry#getPluginsFor(java.lang.Object)
|
||||
*/
|
||||
public List<T> getPluginsFor(S delimiter) {
|
||||
|
||||
List<T> result = new ArrayList<T>();
|
||||
|
||||
for (T plugin : plugins) {
|
||||
if (plugin != null && plugin.supports(delimiter)) {
|
||||
result.add(plugin);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.PluginRegistry#getPluginFor(java.lang.Object, java.lang.Exception)
|
||||
*/
|
||||
public <E extends Exception> T getPluginFor(S delimiter, E ex) throws E {
|
||||
|
||||
T plugin = getPluginFor(delimiter);
|
||||
|
||||
if (null == plugin) {
|
||||
throw ex;
|
||||
}
|
||||
|
||||
return plugin;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.PluginRegistry#getPluginsFor(java.lang.Object, java.lang.Exception)
|
||||
*/
|
||||
public <E extends Exception> List<T> getPluginsFor(S delimiter, E ex) throws E {
|
||||
|
||||
List<T> result = getPluginsFor(delimiter);
|
||||
|
||||
if (result.isEmpty()) {
|
||||
throw ex;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.PluginRegistry#getPluginFor(java.lang.Object, org.synyx.hera.core.Plugin)
|
||||
*/
|
||||
public T getPluginFor(S delimiter, T plugin) {
|
||||
|
||||
T candidate = getPluginFor(delimiter);
|
||||
|
||||
return null == candidate ? plugin : candidate;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.PluginRegistry#getPluginsFor(java.lang.Object, java.util.List)
|
||||
*/
|
||||
public List<T> getPluginsFor(S delimiter, List<? extends T> plugins) {
|
||||
|
||||
List<T> candidates = getPluginsFor(delimiter);
|
||||
|
||||
return candidates.isEmpty() ? new ArrayList<T>(plugins) : candidates;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.PluginRegistry#countPlugins()
|
||||
*/
|
||||
public int countPlugins() {
|
||||
|
||||
return plugins.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all registered plugins. Only use this method if you really need to access all plugins. For distinguished
|
||||
* access to certain plugins favour accessor methods like {link #getPluginFor} over this one. This method should only
|
||||
* be used for testing purposes to check registry configuration.
|
||||
*
|
||||
* @return all plugins of the registry
|
||||
*/
|
||||
public List<T> getPlugins() {
|
||||
return Collections.unmodifiableList(plugins);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.PluginRegistry#contains(org.synyx.hera.core.Plugin)
|
||||
*/
|
||||
public boolean contains(T plugin) {
|
||||
return this.plugins.contains(plugin);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.PluginRegistry#hasPluginFor(java.lang.Object)
|
||||
*/
|
||||
public boolean hasPluginFor(S delimter) {
|
||||
return null != getPluginFor(delimter);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.lang.Iterable#iterator()
|
||||
*/
|
||||
public Iterator<T> iterator() {
|
||||
return plugins.iterator();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core.config;
|
||||
|
||||
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
||||
@@ -22,79 +21,60 @@ import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
|
||||
import org.springframework.beans.factory.xml.ParserContext;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
|
||||
/**
|
||||
* Bean definition parser to register {@code <list />} elements from the plugin
|
||||
* namespace.
|
||||
* Bean definition parser to register {@code <list />} elements from the plugin namespace.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class PluginListDefinitionParser extends AbstractBeanDefinitionParser {
|
||||
|
||||
protected static final String PACKAGE = "org.synyx.hera.core.support.";
|
||||
protected static final String PACKAGE = "org.synyx.hera.core.support.";
|
||||
|
||||
/**
|
||||
* Returns the name of the {@link org.springframework.beans.factory.config.BeanFactoryPostProcessor} to be registered.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected String getPostProcessorName() {
|
||||
return PACKAGE + "BeanListFactoryBean";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the
|
||||
* {@link org.springframework.beans.factory.config.BeanFactoryPostProcessor}
|
||||
* to be registered.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected String getPostProcessorName() {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#parseInternal(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext)
|
||||
*/
|
||||
@Override
|
||||
protected AbstractBeanDefinition parseInternal(Element element, ParserContext context) {
|
||||
|
||||
return PACKAGE + "BeanListFactoryBean";
|
||||
}
|
||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(getPostProcessorName());
|
||||
builder.addPropertyValue("type", element.getAttribute("class"));
|
||||
|
||||
return getSourcedBeanDefinition(builder, element, context);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.springframework.beans.factory.xml.AbstractBeanDefinitionParser#
|
||||
* parseInternal(org.w3c.dom.Element,
|
||||
* org.springframework.beans.factory.xml.ParserContext)
|
||||
*/
|
||||
@Override
|
||||
protected AbstractBeanDefinition parseInternal(Element element,
|
||||
ParserContext context) {
|
||||
/**
|
||||
* Returns the bean definition prepared by the builder and has connected it to the {@code source} object.
|
||||
*
|
||||
* @param builder
|
||||
* @param source
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
private AbstractBeanDefinition getSourcedBeanDefinition(BeanDefinitionBuilder builder, Object source,
|
||||
ParserContext context) {
|
||||
|
||||
BeanDefinitionBuilder builder =
|
||||
BeanDefinitionBuilder
|
||||
.genericBeanDefinition(getPostProcessorName());
|
||||
builder.addPropertyValue("type", element.getAttribute("class"));
|
||||
AbstractBeanDefinition definition = builder.getRawBeanDefinition();
|
||||
definition.setSource(context.extractSource(source));
|
||||
|
||||
return getSourcedBeanDefinition(builder, element, context);
|
||||
}
|
||||
return definition;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the bean definition prepared by the builder and has connected it
|
||||
* to the {@code source} object.
|
||||
*
|
||||
* @param builder
|
||||
* @param source
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
private AbstractBeanDefinition getSourcedBeanDefinition(
|
||||
BeanDefinitionBuilder builder, Object source, ParserContext context) {
|
||||
|
||||
AbstractBeanDefinition definition = builder.getRawBeanDefinition();
|
||||
definition.setSource(context.extractSource(source));
|
||||
|
||||
return definition;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.springframework.beans.factory.xml.AbstractBeanDefinitionParser#
|
||||
* shouldGenerateIdAsFallback()
|
||||
*/
|
||||
@Override
|
||||
protected boolean shouldGenerateIdAsFallback() {
|
||||
|
||||
return true;
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#shouldGenerateIdAsFallback()
|
||||
*/
|
||||
@Override
|
||||
protected boolean shouldGenerateIdAsFallback() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,40 +1,35 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core.config;
|
||||
|
||||
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
|
||||
|
||||
|
||||
/**
|
||||
* Simple namespace handler for {@literal plugin-config} namespace.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class PluginNamespaceHandler extends NamespaceHandlerSupport {
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.springframework.beans.factory.xml.NamespaceHandler#init()
|
||||
*/
|
||||
public void init() {
|
||||
|
||||
registerBeanDefinitionParser("list", new PluginListDefinitionParser());
|
||||
registerBeanDefinitionParser("registry",
|
||||
new PluginRegistryDefinitionParser());
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.beans.factory.xml.NamespaceHandler#init()
|
||||
*/
|
||||
public void init() {
|
||||
registerBeanDefinitionParser("list", new PluginListDefinitionParser());
|
||||
registerBeanDefinitionParser("registry", new PluginRegistryDefinitionParser());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,39 +1,35 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core.config;
|
||||
|
||||
|
||||
/**
|
||||
* Simple extension of {@link PluginListDefinitionParser}. Simply registers a
|
||||
* {@code PluginRegistryBeanFactoryPostProcessor} instead of the original class.
|
||||
* {@link PluginRegistryBeanFactoryPostProcessor} instead of the original class.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class PluginRegistryDefinitionParser extends PluginListDefinitionParser {
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser
|
||||
* #getBeanClassName(org.w3c.dom.Element)
|
||||
*/
|
||||
@Override
|
||||
protected String getPostProcessorName() {
|
||||
|
||||
return PACKAGE + "PluginRegistryFactoryBean";
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.config.PluginListDefinitionParser#getPostProcessorName()
|
||||
*/
|
||||
@Override
|
||||
protected String getPostProcessorName() {
|
||||
return PACKAGE + "PluginRegistryFactoryBean";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
/**
|
||||
* This package contains configuration support classes to ease registry configuration with Spring namespaces.
|
||||
*/
|
||||
package org.synyx.hera.core.config;
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<body>
|
||||
This package contains configuration support classes to ease registry configuration with
|
||||
Spring namespaces.
|
||||
</body>
|
||||
</html>
|
||||
5
core/src/main/java/org/synyx/hera/core/package-info.java
Normal file
5
core/src/main/java/org/synyx/hera/core/package-info.java
Normal file
@@ -0,0 +1,5 @@
|
||||
/**
|
||||
* This package contains the core plugin API. It allows other modules implementing components that extend functionality defined by a plugin interface. Plugin clients can be equipped with plugin implementations.
|
||||
*/
|
||||
package org.synyx.hera.core;
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<body>
|
||||
This package contains the core plugin API. It allows other modules implementing
|
||||
components that extend functionality defined by a plugin interface. Plugin clients
|
||||
can be equipped with plugin implementations.
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,74 +1,181 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core.support;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.aop.TargetSource;
|
||||
import org.springframework.aop.framework.ProxyFactory;
|
||||
import org.springframework.beans.factory.FactoryBean;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.ListableBeanFactory;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.ApplicationContextAware;
|
||||
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.context.event.ContextRefreshedEvent;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* Abstract base class to implement types that need access to all beans of a
|
||||
* given type from the {@link ApplicationContext}.
|
||||
* Abstract base class to implement types that need access to all beans of a given type from the
|
||||
* {@link ApplicationContext}.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public abstract class AbstractTypeAwareSupport<T> implements
|
||||
ApplicationContextAware {
|
||||
public abstract class AbstractTypeAwareSupport<T> implements ApplicationContextAware,
|
||||
ApplicationListener<ContextRefreshedEvent>, InitializingBean {
|
||||
|
||||
private ApplicationContext context;
|
||||
private Class<T> type;
|
||||
private ApplicationContext context;
|
||||
private Class<T> type;
|
||||
private BeansOfTypeTargetSource targetSource;
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.springframework.context.ApplicationContextAware#setApplicationContext
|
||||
* (org.springframework.context.ApplicationContext)
|
||||
*/
|
||||
public void setApplicationContext(ApplicationContext context) {
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.springframework.context.ApplicationContextAware#setApplicationContext
|
||||
* (org.springframework.context.ApplicationContext)
|
||||
*/
|
||||
public void setApplicationContext(ApplicationContext context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
this.context = context;
|
||||
}
|
||||
/**
|
||||
* @param type the type to set
|
||||
*/
|
||||
public void setType(Class<T> type) {
|
||||
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param type the type to set
|
||||
*/
|
||||
public void setType(Class<T> type) {
|
||||
/**
|
||||
* Returns all beans from the {@link ApplicationContext} that match the given type.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
protected List<T> getBeans() {
|
||||
|
||||
this.type = type;
|
||||
}
|
||||
ProxyFactory factory = new ProxyFactory(List.class, targetSource);
|
||||
return (List<T>) factory.getProxy();
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
|
||||
*/
|
||||
public void afterPropertiesSet() {
|
||||
this.targetSource = new BeansOfTypeTargetSource(context, type, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all beans from the {@link ApplicationContext} that match the
|
||||
* given type.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
protected List<T> getBeans() {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)
|
||||
*/
|
||||
public void onApplicationEvent(ContextRefreshedEvent event) {
|
||||
|
||||
Map<String, T> pluginMap = context.getBeansOfType(type);
|
||||
if (context.equals(event.getApplicationContext())) {
|
||||
targetSource.freeze();
|
||||
}
|
||||
}
|
||||
|
||||
return new ArrayList<T>(pluginMap.values());
|
||||
}
|
||||
/**
|
||||
* {@link TargetSource} implementation that returns all beans of the configured type from the
|
||||
* {@link ListableBeanFactory} the instance was set up with. Allows freezing the lookup as calls to
|
||||
* {@link ListableBeanFactory#getBeansOfType(Class, boolean, boolean)} are potentially expensive as the entire factory
|
||||
* has to be scanned for type information.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
private static class BeansOfTypeTargetSource implements TargetSource {
|
||||
|
||||
private final ListableBeanFactory context;
|
||||
private final Class<?> type;
|
||||
private final boolean eagerInit;
|
||||
|
||||
private boolean frozen = false;
|
||||
private Collection<?> components;
|
||||
|
||||
/**
|
||||
* Creates a new {@link BeansOfTypeTargetSource} using the given {@link ListableBeanFactory} to lookup beans of the
|
||||
* given type.
|
||||
*
|
||||
* @param context must not be {@literal null}.
|
||||
* @param type must not be {@literal null}.
|
||||
* @param eagerInit whether to eagerly init {@link FactoryBean}s, defaults to {@literal false}.
|
||||
*/
|
||||
public BeansOfTypeTargetSource(ListableBeanFactory context, Class<?> type, boolean eagerInit) {
|
||||
|
||||
Assert.notNull(context);
|
||||
Assert.notNull(type);
|
||||
|
||||
this.context = context;
|
||||
this.type = type;
|
||||
this.eagerInit = eagerInit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Freezes the {@link TargetSource} so that the next access to {@link #getTarget()} will get the results cached and
|
||||
* reused.
|
||||
*/
|
||||
public void freeze() {
|
||||
this.frozen = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.aop.TargetSource#getTargetClass()
|
||||
*/
|
||||
public Class<?> getTargetClass() {
|
||||
return List.class;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.aop.TargetSource#isStatic()
|
||||
*/
|
||||
public boolean isStatic() {
|
||||
return frozen;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.aop.TargetSource#getTarget()
|
||||
*/
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
public synchronized Object getTarget() throws Exception {
|
||||
|
||||
Collection<?> components = this.components == null ? context.getBeansOfType(type, false, eagerInit).values()
|
||||
: this.components;
|
||||
|
||||
if (frozen && this.components == null) {
|
||||
this.components = components;
|
||||
}
|
||||
|
||||
return new ArrayList(components);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.aop.TargetSource#releaseTarget(java.lang.Object)
|
||||
*/
|
||||
public void releaseTarget(Object target) throws Exception {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,54 +22,41 @@ import java.util.List;
|
||||
import org.springframework.beans.factory.FactoryBean;
|
||||
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
|
||||
|
||||
|
||||
/**
|
||||
* Factory to create bean lists for a given type. Exposes all beans of the
|
||||
* configured type that can be found in the
|
||||
* Factory to create bean lists for a given type. Exposes all beans of the configured type that can be found in the
|
||||
* {@link org.springframework.context.ApplicationContext}.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class BeanListFactoryBean<T> extends AbstractTypeAwareSupport<T>
|
||||
implements FactoryBean {
|
||||
public class BeanListFactoryBean<T> extends AbstractTypeAwareSupport<T> implements FactoryBean<List<T>> {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static final Comparator<Object> COMPARATOR =
|
||||
new AnnotationAwareOrderComparator();
|
||||
private static final Comparator<Object> COMPARATOR = new AnnotationAwareOrderComparator();
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.beans.factory.FactoryBean#getObject()
|
||||
*/
|
||||
public List<T> getObject() {
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.springframework.beans.factory.FactoryBean#getObject()
|
||||
*/
|
||||
public Object getObject() {
|
||||
List<T> beans = getBeans();
|
||||
Collections.sort(beans, COMPARATOR);
|
||||
|
||||
List<T> beans = getBeans();
|
||||
Collections.sort(beans, COMPARATOR);
|
||||
return beans;
|
||||
}
|
||||
|
||||
return beans;
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.beans.factory.FactoryBean#getObjectType()
|
||||
*/
|
||||
public Class<?> getObjectType() {
|
||||
return List.class;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.springframework.beans.factory.FactoryBean#getObjectType()
|
||||
*/
|
||||
public Class<?> getObjectType() {
|
||||
|
||||
return List.class;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.springframework.beans.factory.FactoryBean#isSingleton()
|
||||
*/
|
||||
public boolean isSingleton() {
|
||||
|
||||
return true;
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.beans.factory.FactoryBean#isSingleton()
|
||||
*/
|
||||
public boolean isSingleton() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core.support;
|
||||
|
||||
@@ -20,45 +20,35 @@ import org.synyx.hera.core.OrderAwarePluginRegistry;
|
||||
import org.synyx.hera.core.Plugin;
|
||||
import org.synyx.hera.core.PluginRegistry;
|
||||
|
||||
|
||||
/**
|
||||
* {@link FactoryBean} to create {@link PluginRegistry} instances. Wraps a
|
||||
* {@link BeanListFactoryBean}.
|
||||
* {@link FactoryBean} to create {@link PluginRegistry} instances. Wraps a {@link BeanListFactoryBean}.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class PluginRegistryFactoryBean<T extends Plugin<S>, S> extends
|
||||
AbstractTypeAwareSupport<T> implements FactoryBean {
|
||||
public class PluginRegistryFactoryBean<T extends Plugin<S>, S> extends AbstractTypeAwareSupport<T> implements
|
||||
FactoryBean<PluginRegistry<T, S>> {
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.springframework.beans.factory.FactoryBean#getObject()
|
||||
*/
|
||||
public Object getObject() {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.beans.factory.FactoryBean#getObject()
|
||||
*/
|
||||
public OrderAwarePluginRegistry<T, S> getObject() {
|
||||
return OrderAwarePluginRegistry.create(getBeans());
|
||||
}
|
||||
|
||||
return OrderAwarePluginRegistry.create(getBeans());
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.beans.factory.FactoryBean#getObjectType()
|
||||
*/
|
||||
public Class<?> getObjectType() {
|
||||
return PluginRegistry.class;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.springframework.beans.factory.FactoryBean#getObjectType()
|
||||
*/
|
||||
public Class<?> getObjectType() {
|
||||
|
||||
return PluginRegistry.class;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.springframework.beans.factory.FactoryBean#isSingleton()
|
||||
*/
|
||||
public boolean isSingleton() {
|
||||
|
||||
return true;
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.beans.factory.FactoryBean#isSingleton()
|
||||
*/
|
||||
public boolean isSingleton() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
/**
|
||||
* This package contains support classes to create bean lists or plugin registry instances out of beans implementing a certain interface.
|
||||
*/
|
||||
package org.synyx.hera.core.support;
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<body>
|
||||
This package contains support classes to create bean lists or plugin
|
||||
registry instances out of beans implementing a certain interface.
|
||||
</body>
|
||||
</html>
|
||||
@@ -7,7 +7,6 @@
|
||||
|
||||
<xsd:import namespace="http://www.springframework.org/schema/tool" />
|
||||
|
||||
|
||||
<xsd:element name="list" type="pluginType">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
@@ -37,8 +36,7 @@
|
||||
</xsd:documentation>
|
||||
<xsd:appinfo>
|
||||
<tool:annotation>
|
||||
<tool:exports identifier="@id"
|
||||
type="org.synyx.plugin.core.PluginRegistry" />
|
||||
<tool:exports identifier="@id" type="org.synyx.plugin.core.PluginRegistry" />
|
||||
</tool:annotation>
|
||||
</xsd:appinfo>
|
||||
</xsd:annotation>
|
||||
@@ -47,8 +45,7 @@
|
||||
<xsd:complexType name="pluginType">
|
||||
<xsd:attribute name="id" type="xsd:string" />
|
||||
<xsd:attribute name="class" type="classType" />
|
||||
<xsd:attribute name="init-factories" type="xsd:boolean"
|
||||
default="false" />
|
||||
<xsd:attribute name="init-factories" type="xsd:boolean" default="false" />
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:simpleType name="classType">
|
||||
|
||||
@@ -1,68 +1,48 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
|
||||
/**
|
||||
* Unit test for implementations of {@link MutablePluginRegistry}.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public abstract class AbstractMutablePluginRegistryUnitTest {
|
||||
|
||||
private SamplePlugin plugin = new SamplePluginImplementation();
|
||||
private SamplePlugin plugin = new SamplePluginImplementation();
|
||||
|
||||
@Test
|
||||
public void allowsAddingPluginsAfterCreation() throws Exception {
|
||||
|
||||
@Test
|
||||
public void allowsAddingPluginsAfterCreation() throws Exception {
|
||||
MutablePluginRegistry<SamplePlugin, String> registry = getRegistry();
|
||||
registry.addPlugin(plugin);
|
||||
|
||||
MutablePluginRegistry<SamplePlugin, String> registry = getRegistry();
|
||||
registry.addPlugin(plugin);
|
||||
assertTrue(registry.contains(plugin));
|
||||
assertThat(registry.getPlugins().size(), is(1));
|
||||
}
|
||||
|
||||
assertTrue(registry.contains(plugin));
|
||||
assertThat(registry.getPlugins().size(), is(1));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void settingPluginsRemovesOldOnes() throws Exception {
|
||||
|
||||
MutablePluginRegistry<SamplePlugin, String> registry = getRegistry();
|
||||
registry.addPlugin(plugin);
|
||||
|
||||
SamplePlugin anotherPlugin = new SamplePluginImplementation();
|
||||
|
||||
registry.setPlugins(Arrays.asList(anotherPlugin));
|
||||
assertTrue(registry.contains(anotherPlugin));
|
||||
assertFalse(registry.contains(plugin));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the {@link MutablePluginRegistry} to test.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected abstract MutablePluginRegistry<SamplePlugin, String> getRegistry();
|
||||
/**
|
||||
* Return the {@link MutablePluginRegistry} to test.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected abstract MutablePluginRegistry<SamplePlugin, String> getRegistry();
|
||||
}
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
@@ -23,151 +22,107 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.springframework.core.annotation.Order;
|
||||
|
||||
|
||||
/**
|
||||
* Unit test for {@link OrderAwarePluginRegistry} that especially concentrates
|
||||
* on testing ordering functionality.
|
||||
* Unit test for {@link OrderAwarePluginRegistry} that especially concentrates on testing ordering functionality.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class OrderAwarePluginRegistryUnitTest extends
|
||||
SimplePluginRegistryUnitTest {
|
||||
public class OrderAwarePluginRegistryUnitTest extends SimplePluginRegistryUnitTest {
|
||||
|
||||
private OrderAwarePluginRegistry<TestPlugin, String> registry;
|
||||
TestPlugin firstPlugin;
|
||||
TestPlugin secondPlugin;
|
||||
|
||||
private TestPlugin firstPlugin;
|
||||
private TestPlugin secondPlugin;
|
||||
@Override
|
||||
@Before
|
||||
public void setUp() {
|
||||
|
||||
super.setUp();
|
||||
|
||||
@Override
|
||||
@Before
|
||||
public void setUp() {
|
||||
firstPlugin = new FirstImplementation();
|
||||
secondPlugin = new SecondImplementation();
|
||||
}
|
||||
|
||||
super.setUp();
|
||||
@Override
|
||||
protected OrderAwarePluginRegistry<SamplePlugin, String> getRegistry() {
|
||||
|
||||
registry = OrderAwarePluginRegistry.create();
|
||||
return OrderAwarePluginRegistry.create();
|
||||
}
|
||||
|
||||
firstPlugin = new FirstImplementation();
|
||||
secondPlugin = new SecondImplementation();
|
||||
}
|
||||
@Test
|
||||
public void honorsOrderOnAddPlugins() throws Exception {
|
||||
|
||||
PluginRegistry<TestPlugin, String> registry = OrderAwarePluginRegistry.create(Arrays.asList(firstPlugin,
|
||||
secondPlugin));
|
||||
assertOrder(registry, secondPlugin, firstPlugin);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.SimplePluginRegistryUnitTest#getRegistry()
|
||||
*/
|
||||
@Override
|
||||
protected OrderAwarePluginRegistry<SamplePlugin, String> getRegistry() {
|
||||
@Test
|
||||
@Ignore
|
||||
public void assertsOrderOnAddingPlugins() throws Exception {
|
||||
|
||||
return OrderAwarePluginRegistry.create();
|
||||
}
|
||||
MutablePluginRegistry<TestPlugin, String> registry = OrderAwarePluginRegistry.create(Arrays.asList(firstPlugin));
|
||||
registry.addPlugin(secondPlugin);
|
||||
|
||||
assertOrder(registry, secondPlugin, firstPlugin);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the plugin implementations in order of their names, expecting the
|
||||
* registry to order them correctly.
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test
|
||||
public void honorsOrderOnAddPlugins() throws Exception {
|
||||
private void assertOrder(PluginRegistry<TestPlugin, String> registry, TestPlugin... plugins) {
|
||||
|
||||
registry.setPlugins(Arrays.asList(firstPlugin, secondPlugin));
|
||||
List<TestPlugin> result = registry.getPluginsFor(null);
|
||||
|
||||
assertOrder(registry, secondPlugin, firstPlugin);
|
||||
}
|
||||
assertThat(plugins.length, is(result.size()));
|
||||
|
||||
for (int i = 0; i < plugins.length; i++) {
|
||||
assertThat(result.get(i), is(result.get(i)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void assertsOrderOnAddingPlugins() throws Exception {
|
||||
assertThat(registry.getPluginFor(null), is(plugins[0]));
|
||||
}
|
||||
|
||||
registry.setPlugins(Arrays.asList(firstPlugin));
|
||||
registry.addPlugin(secondPlugin);
|
||||
@Test
|
||||
public void createsRevertedRegistryCorrectly() throws Exception {
|
||||
|
||||
assertOrder(registry, secondPlugin, firstPlugin);
|
||||
}
|
||||
OrderAwarePluginRegistry<TestPlugin, String> registry = OrderAwarePluginRegistry.create(Arrays.asList(firstPlugin,
|
||||
secondPlugin));
|
||||
PluginRegistry<TestPlugin, String> reverse = registry.reverse();
|
||||
|
||||
assertOrder(registry, secondPlugin, firstPlugin);
|
||||
assertOrder(reverse, firstPlugin, secondPlugin);
|
||||
}
|
||||
|
||||
private void assertOrder(PluginRegistry<TestPlugin, String> registry,
|
||||
TestPlugin... plugins) {
|
||||
private static interface TestPlugin extends Plugin<String> {
|
||||
|
||||
List<TestPlugin> result = registry.getPluginsFor(null);
|
||||
}
|
||||
|
||||
assertThat(plugins.length, is(result.size()));
|
||||
@Order(5)
|
||||
private static class FirstImplementation implements TestPlugin {
|
||||
|
||||
for (int i = 0; i < plugins.length; i++) {
|
||||
assertThat(result.get(i), is(result.get(i)));
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.Plugin#supports(java.lang.Object)
|
||||
*/
|
||||
public boolean supports(String delimiter) {
|
||||
|
||||
assertThat(registry.getPluginFor(null), is(plugins[0]));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Order(1)
|
||||
private static class SecondImplementation implements TestPlugin {
|
||||
|
||||
@Test
|
||||
public void createsRevertedRegistryCorrectly() throws Exception {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.Plugin#supports(java.lang.Object)
|
||||
*/
|
||||
public boolean supports(String delimiter) {
|
||||
|
||||
basicPrepare();
|
||||
PluginRegistry<TestPlugin, String> reverse = registry.reverse();
|
||||
|
||||
assertOrder(registry, secondPlugin, firstPlugin);
|
||||
assertOrder(reverse, firstPlugin, secondPlugin);
|
||||
}
|
||||
|
||||
|
||||
private void basicPrepare() {
|
||||
|
||||
registry.setPlugins(Arrays.asList(firstPlugin, secondPlugin));
|
||||
assertOrder(registry, secondPlugin, firstPlugin);
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple test interface.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
*/
|
||||
private static interface TestPlugin extends Plugin<String> {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Plugin implementation, that is orderd right AFTER the second one.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
*/
|
||||
@Order(5)
|
||||
private static class FirstImplementation implements TestPlugin {
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.Plugin#supports(java.lang.Object)
|
||||
*/
|
||||
public boolean supports(String delimiter) {
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Plugin implementation that is ordered BEFORE the first one.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
*/
|
||||
@Order(1)
|
||||
private static class SecondImplementation implements TestPlugin {
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.hera.core.Plugin#supports(java.lang.Object)
|
||||
*/
|
||||
public boolean supports(String delimiter) {
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,25 +1,24 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core;
|
||||
|
||||
/**
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public interface SamplePlugin extends Plugin<String> {
|
||||
|
||||
void pluginMethod();
|
||||
void pluginMethod();
|
||||
}
|
||||
|
||||
@@ -1,44 +1,40 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core;
|
||||
|
||||
/**
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class SamplePluginHost {
|
||||
|
||||
private PluginRegistry<SamplePlugin, String> registry =
|
||||
SimplePluginRegistry.create();
|
||||
private PluginRegistry<SamplePlugin, String> registry = SimplePluginRegistry.create();
|
||||
|
||||
/**
|
||||
* @param registry the registry to set
|
||||
*/
|
||||
public void setRegistry(PluginRegistry<SamplePlugin, String> registry) {
|
||||
|
||||
/**
|
||||
* @param registry the registry to set
|
||||
*/
|
||||
public void setRegistry(PluginRegistry<SamplePlugin, String> registry) {
|
||||
this.registry = registry;
|
||||
}
|
||||
|
||||
this.registry = registry;
|
||||
}
|
||||
/**
|
||||
* @return the registry
|
||||
*/
|
||||
public PluginRegistry<SamplePlugin, String> getRegistry() {
|
||||
|
||||
|
||||
/**
|
||||
* @return the registry
|
||||
*/
|
||||
public PluginRegistry<SamplePlugin, String> getRegistry() {
|
||||
|
||||
return registry;
|
||||
}
|
||||
return registry;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,43 +1,38 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core;
|
||||
|
||||
/**
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class SamplePluginImplementation implements SamplePlugin {
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.plugin.core.Plugin#supports(java.lang.Object)
|
||||
*/
|
||||
public boolean supports(String delimiter) {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.Plugin#supports(java.lang.Object)
|
||||
*/
|
||||
public boolean supports(String delimiter) {
|
||||
return "FOO".equals(delimiter);
|
||||
}
|
||||
|
||||
return "FOO".equals(delimiter);
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.SamplePlugin#pluginMethod()
|
||||
*/
|
||||
public void pluginMethod() {
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.synyx.plugin.core.ISamplePlugin#pluginMethod()
|
||||
*/
|
||||
public void pluginMethod() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.core;
|
||||
@@ -25,155 +25,115 @@ import java.util.List;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
|
||||
/**
|
||||
* Unit test for {@link SimplePluginRegistry}.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class SimplePluginRegistryUnitTest extends
|
||||
AbstractMutablePluginRegistryUnitTest {
|
||||
public class SimplePluginRegistryUnitTest extends AbstractMutablePluginRegistryUnitTest {
|
||||
|
||||
private SamplePlugin plugin;
|
||||
SamplePlugin plugin;
|
||||
|
||||
private SimplePluginRegistry<SamplePlugin, String> registry;
|
||||
SimplePluginRegistry<SamplePlugin, String> registry;
|
||||
|
||||
/**
|
||||
* Initializes a {@code PluginRegistry} and equips it with an {@code EmailNotificationProvider}.
|
||||
*/
|
||||
@Before
|
||||
public void setUp() {
|
||||
|
||||
/**
|
||||
* Initializes a {@code PluginRegistry} and equips it with an {@code
|
||||
* EmailNotificationProvider}.
|
||||
*/
|
||||
@Before
|
||||
public void setUp() {
|
||||
plugin = new SamplePluginImplementation();
|
||||
registry = SimplePluginRegistry.create();
|
||||
}
|
||||
|
||||
plugin = new SamplePluginImplementation();
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.AbstractMutablePluginRegistryUnitTest#getRegistry()
|
||||
*/
|
||||
@Override
|
||||
protected MutablePluginRegistry<SamplePlugin, String> getRegistry() {
|
||||
|
||||
registry = SimplePluginRegistry.create();
|
||||
}
|
||||
return SimplePluginRegistry.create();
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that the registry contains the plugin it was initialized with.
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test
|
||||
public void assertRegistryInitialized() throws Exception {
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.synyx.hera.core.AbstractMutablePluginRegistryUnitTest#getRegistry()
|
||||
*/
|
||||
@Override
|
||||
protected MutablePluginRegistry<SamplePlugin, String> getRegistry() {
|
||||
registry.addPlugin(plugin);
|
||||
|
||||
return SimplePluginRegistry.create();
|
||||
}
|
||||
assertThat(registry.countPlugins(), is(1));
|
||||
assertTrue(registry.contains(plugin));
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts asking for a plugin with the {@code PluginMetadata} provided by the {@link EmailNotificationProvider}.
|
||||
*/
|
||||
@Test
|
||||
public void assertFindsEmailNotificationProvider() {
|
||||
|
||||
/**
|
||||
* Asserts that the registry contains the plugin it was initialized with.
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test
|
||||
public void assertRegistryInitialized() throws Exception {
|
||||
registry.addPlugin(plugin);
|
||||
|
||||
registry.addPlugin(plugin);
|
||||
String delimiter = "FOO";
|
||||
|
||||
assertThat(registry.countPlugins(), is(1));
|
||||
assertTrue(registry.contains(plugin));
|
||||
}
|
||||
List<SamplePlugin> plugins = registry.getPluginsFor(delimiter);
|
||||
assertThat(plugins, is(notNullValue()));
|
||||
assertThat(plugins.size(), is(1));
|
||||
|
||||
SamplePlugin provider = plugins.get(0);
|
||||
assertThat(provider, is(instanceOf(SamplePluginImplementation.class)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts asking for a plugin with the {@code PluginMetadata} provided by
|
||||
* the {@link EmailNotificationProvider}.
|
||||
*/
|
||||
@Test
|
||||
public void assertFindsEmailNotificationProvider() {
|
||||
/**
|
||||
* Expects the given exception to be thrown if no {@link Plugin} found.
|
||||
*/
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void throwsExceptionIfNoPluginFound() {
|
||||
|
||||
registry.addPlugin(plugin);
|
||||
registry.getPluginFor("BAR", new IllegalArgumentException());
|
||||
}
|
||||
|
||||
String delimiter = "FOO";
|
||||
/**
|
||||
* Expects the given exception to be thrown if no {@link Plugin}s found.
|
||||
*/
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void throwsExceptionIfNoPluginsFound() {
|
||||
|
||||
List<SamplePlugin> plugins = registry.getPluginsFor(delimiter);
|
||||
assertThat(plugins, is(notNullValue()));
|
||||
assertThat(plugins.size(), is(1));
|
||||
registry.getPluginsFor("BAR", new IllegalArgumentException());
|
||||
}
|
||||
|
||||
SamplePlugin provider = plugins.get(0);
|
||||
assertThat(provider, is(instanceOf(SamplePluginImplementation.class)));
|
||||
}
|
||||
/**
|
||||
* Expect the defualt plugin to be returned if none found.
|
||||
*/
|
||||
@Test
|
||||
public void returnsDefaultIfNoneFound() {
|
||||
|
||||
SamplePlugin defaultPlugin = new SamplePluginImplementation();
|
||||
|
||||
/**
|
||||
* Expects the given exception to be thrown if no {@link Plugin} found.
|
||||
*/
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void throwsExceptionIfNoPluginFound() {
|
||||
assertThat(registry.getPluginFor("BAR", defaultPlugin), is(defaultPlugin));
|
||||
}
|
||||
|
||||
registry.getPluginFor("BAR", new IllegalArgumentException());
|
||||
}
|
||||
/**
|
||||
* Expect the given default plugins to be returned if none found.
|
||||
*/
|
||||
@Test
|
||||
public void returnsDefaultsIfNoneFound() {
|
||||
|
||||
List<? extends SamplePlugin> defaultPlugins = Arrays.asList(new SamplePluginImplementation());
|
||||
|
||||
/**
|
||||
* Expects the given exception to be thrown if no {@link Plugin}s found.
|
||||
*/
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void throwsExceptionIfNoPluginsFound() {
|
||||
List<SamplePlugin> result = registry.getPluginsFor("BAR", defaultPlugins);
|
||||
assertTrue(result.containsAll(defaultPlugins));
|
||||
}
|
||||
|
||||
registry.getPluginsFor("BAR", new IllegalArgumentException());
|
||||
}
|
||||
@Test
|
||||
public void handlesAddingNullPluginsCorrecty() throws Exception {
|
||||
|
||||
registry.addPlugin(null);
|
||||
|
||||
/**
|
||||
* Expect the defualt plugin to be returned if none found.
|
||||
*/
|
||||
@Test
|
||||
public void returnsDefaultIfNoneFound() {
|
||||
|
||||
SamplePlugin defaultPlugin = new SamplePluginImplementation();
|
||||
|
||||
assertThat(registry.getPluginFor("BAR", defaultPlugin),
|
||||
is(defaultPlugin));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Expect the given default plugins to be returned if none found.
|
||||
*/
|
||||
@Test
|
||||
public void returnsDefaultsIfNoneFound() {
|
||||
|
||||
List<? extends SamplePlugin> defaultPlugins =
|
||||
Arrays.asList(new SamplePluginImplementation());
|
||||
|
||||
List<SamplePlugin> result =
|
||||
registry.getPluginsFor("BAR", defaultPlugins);
|
||||
assertTrue(result.containsAll(defaultPlugins));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void handlesAddingNullPluginsCorrecty() throws Exception {
|
||||
|
||||
registry.addPlugin(null);
|
||||
|
||||
assertThat(registry.countPlugins(), is(0));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void doesNotAddNullsOnSettingPlugins() throws Exception {
|
||||
|
||||
registry.setPlugins(Arrays.asList(null, plugin, null));
|
||||
|
||||
assertThat(registry.countPlugins(), is(1));
|
||||
assertThat(registry.getPlugins().size(), is(1));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void dropsNullValuesOnCreation() throws Exception {
|
||||
|
||||
registry =
|
||||
SimplePluginRegistry.create(Arrays.asList(null, plugin, null));
|
||||
|
||||
assertThat(registry.countPlugins(), is(1));
|
||||
assertThat(registry.getPlugins().size(), is(1));
|
||||
}
|
||||
assertThat(registry.countPlugins(), is(0));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,18 @@
|
||||
/*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.synyx.hera.core.config;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
@@ -14,44 +29,42 @@ import org.synyx.hera.core.PluginRegistry;
|
||||
import org.synyx.hera.core.SamplePlugin;
|
||||
import org.synyx.hera.core.SamplePluginHost;
|
||||
|
||||
|
||||
/**
|
||||
* Integration test to simply check if the configuration gets parsed correctly.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@ContextConfiguration(locations = "classpath:application-context.xml")
|
||||
public class PluginConfigurationIntegrationTest {
|
||||
|
||||
@Autowired
|
||||
List<SamplePlugin> samplePlugins;
|
||||
@Autowired
|
||||
List<SamplePlugin> samplePlugins;
|
||||
|
||||
@Autowired
|
||||
@Qualifier("bar")
|
||||
PluginRegistry<SamplePlugin, String> pluginRegistry;
|
||||
@Autowired
|
||||
@Qualifier("bar")
|
||||
PluginRegistry<SamplePlugin, String> pluginRegistry;
|
||||
|
||||
@Autowired
|
||||
@Qualifier("host")
|
||||
SamplePluginHost host;
|
||||
@Autowired
|
||||
@Qualifier("host")
|
||||
SamplePluginHost host;
|
||||
|
||||
@Autowired
|
||||
@Qualifier("otherHost")
|
||||
SamplePluginHost otherHost;
|
||||
@Autowired
|
||||
@Qualifier("otherHost")
|
||||
SamplePluginHost otherHost;
|
||||
|
||||
@Autowired
|
||||
SamplePlugin plugin;
|
||||
@Autowired
|
||||
SamplePlugin plugin;
|
||||
|
||||
@Test
|
||||
public void test() throws Exception {
|
||||
|
||||
@Test
|
||||
public void test() throws Exception {
|
||||
assertNotNull(samplePlugins);
|
||||
|
||||
assertNotNull(samplePlugins);
|
||||
assertSame(pluginRegistry, host.getRegistry());
|
||||
assertNotSame(pluginRegistry, otherHost.getRegistry());
|
||||
|
||||
assertSame(pluginRegistry, host.getRegistry());
|
||||
assertNotSame(pluginRegistry, otherHost.getRegistry());
|
||||
|
||||
assertTrue(samplePlugins.contains(plugin));
|
||||
assertTrue(pluginRegistry.contains(plugin));
|
||||
}
|
||||
assertTrue(samplePlugins.contains(plugin));
|
||||
assertTrue(pluginRegistry.contains(plugin));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,18 @@
|
||||
/*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.synyx.hera.core.support;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
@@ -15,88 +30,82 @@ import org.mockito.runners.MockitoJUnitRunner;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.core.Ordered;
|
||||
|
||||
|
||||
/**
|
||||
* Unit test for {@link BeanListFactoryBean}.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class BeanListFactoryBeanUnitTest {
|
||||
|
||||
private BeanListFactoryBean<Ordered> factory;
|
||||
BeanListFactoryBean<Ordered> factory;
|
||||
|
||||
@Mock
|
||||
private ApplicationContext context;
|
||||
@Mock
|
||||
ApplicationContext context;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
factory = new BeanListFactoryBean<Ordered>();
|
||||
factory.setApplicationContext(context);
|
||||
factory.setType(Ordered.class);
|
||||
factory.afterPropertiesSet();
|
||||
}
|
||||
|
||||
factory = new BeanListFactoryBean<Ordered>();
|
||||
factory.setApplicationContext(context);
|
||||
factory.setType(Ordered.class);
|
||||
}
|
||||
@Test
|
||||
public void regardsOrderOfBeans() throws Exception {
|
||||
|
||||
// They shall be switched in the result.
|
||||
Ordered first = getOrdered(5);
|
||||
Ordered second = getOrdered(0);
|
||||
|
||||
@Test
|
||||
public void regardsOrderOfBeans() throws Exception {
|
||||
Map<String, Ordered> beans = new HashMap<String, Ordered>();
|
||||
beans.put("first", first);
|
||||
beans.put("second", second);
|
||||
|
||||
// They shall be switched in the result.
|
||||
Ordered first = getOrdered(5);
|
||||
Ordered second = getOrdered(0);
|
||||
when(context.getBeansOfType(Ordered.class, false, false)).thenReturn(beans);
|
||||
|
||||
Map<String, Ordered> beans = new HashMap<String, Ordered>();
|
||||
beans.put("first", first);
|
||||
beans.put("second", second);
|
||||
Object result = factory.getObject();
|
||||
assertTrue(result instanceof List<?>);
|
||||
|
||||
when(context.getBeansOfType(Ordered.class)).thenReturn(beans);
|
||||
List<Ordered> members = type(result);
|
||||
|
||||
Object result = factory.getObject();
|
||||
assertTrue(result instanceof List<?>);
|
||||
assertEquals(0, members.indexOf(second));
|
||||
assertEquals(1, members.indexOf(first));
|
||||
}
|
||||
|
||||
List<Ordered> members = type(result);
|
||||
@Test
|
||||
public void returnsEmptyListIfNoBeansFound() throws Exception {
|
||||
|
||||
assertEquals(0, members.indexOf(second));
|
||||
assertEquals(1, members.indexOf(first));
|
||||
}
|
||||
when(context.getBeansOfType(Ordered.class)).thenReturn(new HashMap<String, Ordered>());
|
||||
|
||||
Object result = factory.getObject();
|
||||
assertTrue(result instanceof List<?>);
|
||||
|
||||
@Test
|
||||
public void returnsEmptyListIfNoBeansFound() throws Exception {
|
||||
List<Ordered> members = type(result);
|
||||
assertTrue(members.isEmpty());
|
||||
}
|
||||
|
||||
when(context.getBeansOfType(Ordered.class)).thenReturn(
|
||||
new HashMap<String, Ordered>());
|
||||
@SuppressWarnings("unchecked")
|
||||
private <T> List<T> type(Object list) {
|
||||
|
||||
Object result = factory.getObject();
|
||||
assertTrue(result instanceof List<?>);
|
||||
return (List<T>) list;
|
||||
}
|
||||
|
||||
List<Ordered> members = type(result);
|
||||
assertTrue(members.isEmpty());
|
||||
}
|
||||
/**
|
||||
* Returns an {@link Ordered} with the given order.
|
||||
*
|
||||
* @param order
|
||||
* @return
|
||||
*/
|
||||
public Ordered getOrdered(final int order) {
|
||||
|
||||
return new Ordered() {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private <T> List<T> type(Object list) {
|
||||
public int getOrder() {
|
||||
|
||||
return (List<T>) list;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns an {@link Ordered} with the given order.
|
||||
*
|
||||
* @param order
|
||||
* @return
|
||||
*/
|
||||
public Ordered getOrdered(final int order) {
|
||||
|
||||
return new Ordered() {
|
||||
|
||||
public int getOrder() {
|
||||
|
||||
return order;
|
||||
}
|
||||
};
|
||||
}
|
||||
return order;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.stdout.Target=System.out
|
||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
|
||||
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %40.40c:%4L - %m%n
|
||||
|
||||
# Root logger option
|
||||
log4j.rootLogger=WARN, stdout
|
||||
|
||||
@@ -18,11 +18,6 @@
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>commons-lang</groupId>-->
|
||||
<!-- <artifactId>commons-lang</artifactId>-->
|
||||
<!-- <version>2.4</version>-->
|
||||
<!-- </dependency>-->
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
||||
@@ -1,68 +1,57 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.metadata;
|
||||
|
||||
import org.synyx.hera.core.Plugin;
|
||||
|
||||
import org.synyx.hera.core.PluginRegistry;
|
||||
|
||||
/**
|
||||
* Abstract base class for plugins based on {@code PluginMetadata}. Plugins
|
||||
* based on this class can be selected from the {@code PluginRegistry} via an
|
||||
* instance of {@code PluginMetadata}. Therefore you can regard this as a role
|
||||
* model implementation of a base class for certain delimiter implmentations.
|
||||
* Abstract base class for plugins based on {@link PluginMetadata}. Plugins based on this class can be selected from the
|
||||
* {@link PluginRegistry} via an instance of {@link PluginMetadata}. Therefore you can regard this as a role model
|
||||
* implementation of a base class for certain delimiter implmentations.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public abstract class AbstractMetadataBasedPlugin implements
|
||||
Plugin<PluginMetadata>, MetadataProvider {
|
||||
public abstract class AbstractMetadataBasedPlugin implements Plugin<PluginMetadata>, MetadataProvider {
|
||||
|
||||
private PluginMetadata metadata;
|
||||
private final PluginMetadata metadata;
|
||||
|
||||
/**
|
||||
* Creates a new instance of {@code AbstractMetadataBasedPlugin}.
|
||||
*
|
||||
* @param name must not be {@literal null}.
|
||||
* @param version must not be {@literal null}.
|
||||
*/
|
||||
public AbstractMetadataBasedPlugin(String name, String version) {
|
||||
this.metadata = new SimplePluginMetadata(name, version);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new instance of {@code AbstractMetadataBasedPlugin}.
|
||||
*
|
||||
* @param name
|
||||
* @param version
|
||||
*/
|
||||
public AbstractMetadataBasedPlugin(String name, String version) {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.Plugin#supports(java.lang.Object)
|
||||
*/
|
||||
public boolean supports(PluginMetadata delimiter) {
|
||||
return getMetadata().equals(delimiter);
|
||||
}
|
||||
|
||||
this.metadata = new SimplePluginMetadata(name, version);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see com.synyx.minos.core.plugin.Plugin#supports(java.lang.Object)
|
||||
*/
|
||||
public boolean supports(PluginMetadata delimiter) {
|
||||
|
||||
return getMetadata().equals(delimiter);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see com.synyx.minos.core.plugin.MetadataProvider#getMetadata()
|
||||
*/
|
||||
public PluginMetadata getMetadata() {
|
||||
|
||||
return metadata;
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.metadata.MetadataProvider#getMetadata()
|
||||
*/
|
||||
public PluginMetadata getMetadata() {
|
||||
return metadata;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,31 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.metadata;
|
||||
|
||||
/**
|
||||
* Interface for plugins providing metadata information. Usually the plugins
|
||||
* will implement this interface themselves.
|
||||
* Interface for plugins providing metadata information. Usually the plugins will implement this interface themselves.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public interface MetadataProvider {
|
||||
|
||||
/**
|
||||
* Returns the plugins metadata.
|
||||
*
|
||||
* @return the plugins metadata
|
||||
*/
|
||||
PluginMetadata getMetadata();
|
||||
/**
|
||||
* Returns the plugins metadata.
|
||||
*
|
||||
* @return the plugins metadata
|
||||
*/
|
||||
PluginMetadata getMetadata();
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
* Copyright 2008-2010 the original author or authors.
|
||||
*
|
||||
* Licensed 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
|
||||
*
|
||||
* Copyright 2008-2012 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
* 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.synyx.hera.metadata;
|
||||
@@ -19,24 +19,21 @@ package org.synyx.hera.metadata;
|
||||
/**
|
||||
* Basic interface to define a set of metadata information for plugins.
|
||||
*
|
||||
* @author Oliver Gierke - gierke@synyx.de
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public interface PluginMetadata {
|
||||
|
||||
/**
|
||||
* Returns a unique plugin name. Plugins return a metadata implementation
|
||||
* have to ensure uniqueness of this name.
|
||||
*
|
||||
* @return the name of the plugin
|
||||
*/
|
||||
String getName();
|
||||
/**
|
||||
* Returns a unique plugin name. Plugins return a metadata implementation have to ensure uniqueness of this name.
|
||||
*
|
||||
* @return the name of the plugin
|
||||
*/
|
||||
String getName();
|
||||
|
||||
|
||||
/**
|
||||
* Returns the plugin version. This allows rudimentary versioning
|
||||
* possibilities.
|
||||
*
|
||||
* @return the version of the plugin
|
||||
*/
|
||||
String getVersion();
|
||||
/**
|
||||
* Returns the plugin version. This allows rudimentary versioning possibilities.
|
||||
*
|
||||
* @return the version of the plugin
|
||||
*/
|
||||
String getVersion();
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.synyx.hera.metadata;
|
||||
|
||||
import static org.springframework.util.ObjectUtils.*;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* Value object style implementation of {@code PluginMetadata}.
|
||||
@@ -26,90 +27,78 @@ import static org.springframework.util.ObjectUtils.*;
|
||||
*/
|
||||
public class SimplePluginMetadata implements PluginMetadata {
|
||||
|
||||
private String name;
|
||||
private String version;
|
||||
private final String name;
|
||||
private final String version;
|
||||
|
||||
/**
|
||||
* Creates a new instance of {@code SimplePluginMetadata}.
|
||||
*
|
||||
* @param name must not be {@literal null}.
|
||||
* @param version must not be {@literal null}.
|
||||
*/
|
||||
public SimplePluginMetadata(String name, String version) {
|
||||
|
||||
/**
|
||||
* Creates a new instance of {@code SimplePluginMetadata}.
|
||||
*
|
||||
* @param name
|
||||
* @param version
|
||||
*/
|
||||
public SimplePluginMetadata(String name, String version) {
|
||||
Assert.hasText(name, "Name must not be null or empty!");
|
||||
Assert.hasText(version, "Version must not be null or empty!");
|
||||
|
||||
this.name = name;
|
||||
this.version = version;
|
||||
}
|
||||
this.name = name;
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.metadata.PluginMetadata#getName()
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see com.synyx.minos.core.plugin.PluginMetadata#getName()
|
||||
*/
|
||||
public String getName() {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.metadata.PluginMetadata#getVersion()
|
||||
*/
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.lang.Object#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("%s:%s", getName(), getVersion());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.lang.Object#equals(java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see com.synyx.minos.core.plugin.PluginMetadata#getVersion()
|
||||
*/
|
||||
public String getVersion() {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return version;
|
||||
}
|
||||
if (!(obj instanceof PluginMetadata)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
PluginMetadata that = (PluginMetadata) obj;
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see java.lang.Object#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
boolean sameName = nullSafeEquals(this.getName(), that.getName());
|
||||
boolean sameVersion = nullSafeEquals(this.getName(), that.getName());
|
||||
|
||||
return String.format("%s:%s", getName(), getVersion());
|
||||
}
|
||||
return sameName && sameVersion;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see java.lang.Object#equals(java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!(obj instanceof PluginMetadata)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
PluginMetadata that = (PluginMetadata) obj;
|
||||
|
||||
boolean sameName = nullSafeEquals(this.getName(), that.getName());
|
||||
boolean sameVersion = nullSafeEquals(this.getName(), that.getName());
|
||||
|
||||
return sameName && sameVersion;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see java.lang.Object#hashCode()
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
|
||||
return nullSafeHashCode(name) + nullSafeHashCode(version);
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.lang.Object#hashCode()
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return nullSafeHashCode(name) + nullSafeHashCode(version);
|
||||
}
|
||||
}
|
||||
|
||||
9
pom.xml
9
pom.xml
@@ -44,7 +44,7 @@
|
||||
</modules>
|
||||
|
||||
<properties>
|
||||
<spring.version>2.5.6.SEC02</spring.version>
|
||||
<spring.version>3.0.6.RELEASE</spring.version>
|
||||
</properties>
|
||||
|
||||
<developers>
|
||||
@@ -87,16 +87,19 @@
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.3.2</version>
|
||||
<configuration>
|
||||
<source>1.5</source>
|
||||
<target>1.5</target>
|
||||
<source>1.6</source>
|
||||
<target>1.6</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<version>2.1.2</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-sources</id>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#Wed May 25 12:22:34 CEST 2011
|
||||
#Wed Feb 15 21:50:38 CET 2012
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
|
||||
org.eclipse.jdt.core.compiler.compliance=1.5
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
|
||||
<properties>
|
||||
<spring.integration.version>2.0.5.RELEASE</spring.integration.version>
|
||||
<spring.version>3.0.5.RELEASE</spring.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
@@ -40,12 +39,6 @@
|
||||
<version>${spring.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-context</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-test</artifactId>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011 the original author or authors.
|
||||
* Copyright 2011-2012 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -107,6 +107,7 @@ public class PluginRegistryAwareMessageHandler extends AbstractReplyProducingMes
|
||||
* @param delimiterExpression the delimiterExpression to set
|
||||
*/
|
||||
public void setDelimiterExpression(String expression) {
|
||||
|
||||
Assert.hasText(expression);
|
||||
this.delimiterExpression = parser.parseExpression(expression);
|
||||
}
|
||||
@@ -118,6 +119,7 @@ public class PluginRegistryAwareMessageHandler extends AbstractReplyProducingMes
|
||||
* @param invocationArgumentsExpression the invocationArgumentsExpression to set
|
||||
*/
|
||||
public void setInvocationArgumentsExpression(String expression) {
|
||||
|
||||
Assert.hasText(expression);
|
||||
this.invocationArgumentsExpression = parser.parseExpression(expression);
|
||||
}
|
||||
@@ -134,7 +136,10 @@ public class PluginRegistryAwareMessageHandler extends AbstractReplyProducingMes
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.integration.handler.AbstractReplyProducingMessageHandler#handleRequestMessage(org.springframework.integration.Message)
|
||||
*
|
||||
* @see
|
||||
* org.springframework.integration.handler.AbstractReplyProducingMessageHandler
|
||||
* #handleRequestMessage(org.springframework.integration.Message)
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
@@ -163,6 +168,7 @@ public class PluginRegistryAwareMessageHandler extends AbstractReplyProducingMes
|
||||
}
|
||||
|
||||
private List<Object> invokePlugins(Collection<? extends Plugin<?>> plugins, Message<?> message) {
|
||||
|
||||
List<Object> results = new ArrayList<Object>();
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug(String.format("Invoking plugin(s) %s with message %s",
|
||||
@@ -247,6 +253,7 @@ public class PluginRegistryAwareMessageHandler extends AbstractReplyProducingMes
|
||||
* @return
|
||||
*/
|
||||
private Class<?>[] getTypes(Object[] source) {
|
||||
|
||||
Class<?>[] result = new Class<?>[source.length];
|
||||
for (int i = 0; i < source.length; i++) {
|
||||
Object sourceElement = source[i];
|
||||
@@ -255,10 +262,9 @@ public class PluginRegistryAwareMessageHandler extends AbstractReplyProducingMes
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Lookup methods for plugins.
|
||||
*
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
private enum PluginLookupMethod {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011 the original author or authors.
|
||||
* Copyright 2011-2012 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -28,7 +28,7 @@ import org.w3c.dom.Element;
|
||||
|
||||
/**
|
||||
* {@link BeanDefinitionParser} to create {@link PluginRegistryAwareMessageHandler} beans.
|
||||
*
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class DynamicServiceActivatorParser extends AbstractConsumerEndpointParser {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011 the original author or authors.
|
||||
* Copyright 2011-2012 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011 the original author or authors.
|
||||
* Copyright 2011-2012 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -14,6 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.synyx.hera.si;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
@@ -53,8 +54,9 @@ public class PluginRegistryAwareMessageHandlerUnitTest {
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
|
||||
registry = OrderAwarePluginRegistry
|
||||
.create(Arrays.asList(new FirstSamplePluginImpl(), new SecondSamplePluginImpl()));
|
||||
.create(Arrays.asList(new FirstSamplePluginImpl(), new SecondSamplePluginImpl()));
|
||||
|
||||
handler = new PluginRegistryAwareMessageHandler(registry, SamplePlugin.class, "myBusinessMethod");
|
||||
handler.setOutputChannel(outputChannel);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011 the original author or authors.
|
||||
* Copyright 2011-2012 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011 the original author or authors.
|
||||
* Copyright 2011-2012 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,19 +16,20 @@
|
||||
package org.synyx.hera.si.sample;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public class FirstSamplePluginImpl implements SamplePlugin {
|
||||
|
||||
/* (non-Javadoc)
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.Plugin#supports(java.lang.Object)
|
||||
*/
|
||||
public boolean supports(String delimiter) {
|
||||
return "FOO".equals(delimiter);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.si.sample.SamplePlugin#myBusinessMethod()
|
||||
*/
|
||||
public String myBusinessMethod(String message) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011 the original author or authors.
|
||||
* Copyright 2011-2012 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -18,7 +18,6 @@ package org.synyx.hera.si.sample;
|
||||
import org.synyx.hera.core.Plugin;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
public interface SamplePlugin extends Plugin<String> {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011 the original author or authors.
|
||||
* Copyright 2011-2012 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -25,14 +25,16 @@ import org.springframework.core.annotation.Order;
|
||||
@Order(10)
|
||||
public class SecondSamplePluginImpl implements SamplePlugin {
|
||||
|
||||
/* (non-Javadoc)
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.Plugin#supports(java.lang.Object)
|
||||
*/
|
||||
public boolean supports(String delimiter) {
|
||||
return "BAR".equals(delimiter);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.si.sample.SamplePlugin#myBusinessMethod()
|
||||
*/
|
||||
public String myBusinessMethod(String message) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011 the original author or authors.
|
||||
* Copyright 2011-2012 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -25,14 +25,16 @@ import org.springframework.core.annotation.Order;
|
||||
@Order(20)
|
||||
class ThirdSamplePluginImpl implements SamplePlugin {
|
||||
|
||||
/* (non-Javadoc)
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.core.Plugin#supports(java.lang.Object)
|
||||
*/
|
||||
public boolean supports(String delimiter) {
|
||||
return "BAR".equals(delimiter);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.synyx.hera.si.sample.SamplePlugin#myBusinessMethod()
|
||||
*/
|
||||
public String myBusinessMethod(String message) {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.stdout.Target=System.out
|
||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
|
||||
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %40.40c:%4L - %m%n
|
||||
|
||||
# Root logger option
|
||||
log4j.rootLogger=WARN, stdout
|
||||
|
||||
Reference in New Issue
Block a user