Author: simonetripodi Date: Thu Jul 19 08:56:32 2012 New Revision: 1363265 URL: http://svn.apache.org/viewvc?rev=1363265&view=rev Log: [CHAIN-70] Add a small EDSL to simplify Chain setup and execution
Added: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ChainExecutor.java (with props) commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/Chains.java (with props) commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/CommandSetter.java (with props) commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ToExecutorCommandSetter.java (with props) commons/proper/chain/trunk/core/src/test/java/org/apache/commons/chain2/impl/FluentInterfacesTestCase.java (with props) Modified: commons/proper/chain/trunk/RELEASE-NOTES.txt commons/proper/chain/trunk/src/changes/changes.xml Modified: commons/proper/chain/trunk/RELEASE-NOTES.txt URL: http://svn.apache.org/viewvc/commons/proper/chain/trunk/RELEASE-NOTES.txt?rev=1363265&r1=1363264&r2=1363265&view=diff ============================================================================== --- commons/proper/chain/trunk/RELEASE-NOTES.txt (original) +++ commons/proper/chain/trunk/RELEASE-NOTES.txt Thu Jul 19 08:56:32 2012 @@ -58,6 +58,7 @@ The Recommended Dependency Set for Chain NEW FEATURES ============= + * [CHAIN-70] Add a small EDSL to simplify Chain setup and execution * [CHAIN-58] Update Chain Context interface to use K,V generics * [CHAIN-56] clever Context with generic type "auto-cast" feature. * [CHAIN-55] split the huge project in submodules. Added: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ChainExecutor.java URL: http://svn.apache.org/viewvc/commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ChainExecutor.java?rev=1363265&view=auto ============================================================================== --- commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ChainExecutor.java (added) +++ commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ChainExecutor.java Thu Jul 19 08:56:32 2012 @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.chain2; + +import java.util.Map; + +/** + * Builder that allows continue adding a command in the target chain and execute it. + * + * @param <K> Context key type + * @param <V> Context value type + * @param <C> Type of the context associated with this chain executor + * @since 2.0 + */ +public interface ChainExecutor<K, V, C extends Map<K, V>> extends CommandSetter<K, V, C, ChainExecutor<K, V, C>> { + + /** + * Execute the processing represented by the target chain. + * + * @param context the context processed by the target chain + * @return true, if the processing of the target chain has been completed, + * false otherwise + * @see Chain#execute(Map) + */ + boolean execute(C context); + +} Propchange: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ChainExecutor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ChainExecutor.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ChainExecutor.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/Chains.java URL: http://svn.apache.org/viewvc/commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/Chains.java?rev=1363265&view=auto ============================================================================== --- commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/Chains.java (added) +++ commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/Chains.java Thu Jul 19 08:56:32 2012 @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.chain2; + +import java.util.Map; + +/** + * Simple fluent chain EDSL to simplify {@link Chain} instances invocation. + * + * @since 2.0 + */ +public final class Chains { + + /** + * Defines the target chain has to be invoked. + * + * @param <K> Context key type + * @param <V> Context value type + * @param <C> Type of the context associated with this command + * @param <CH> Type of the {@link Chain} to execute + * @param chain the chain instance reference to execute + * @return next chain builder + */ + public static <K, V, C extends Map<K, V>, CH extends Chain<K, V, C>> ToExecutorCommandSetter<K, V, C> on(CH chain) { + return new DefaultCommandSetter<K, V, C>(checkNotNullArgument(chain, "Null Chain can not be executed")); + } + + /** + * Private constructor, this class cannot be instantiated directly. + */ + private Chains() { + // do nothing + } + + private static class DefaultCommandSetter<K, V, C extends Map<K, V>> implements ToExecutorCommandSetter<K, V, C> { + + private final Chain<K, V, C> chain; + + public DefaultCommandSetter(Chain<K, V, C> chain) { + this.chain = chain; + } + + public <CMD extends Command<K, V, C>> ChainExecutor<K, V, C> addCommand(CMD command) { + chain.addCommand(checkNotNullArgument(command, "Chain does not accept null Command instances")); + return new DefaultChainExecutor<K, V, C>(chain); + } + + } + + private static final class DefaultChainExecutor<K, V, C extends Map<K, V>> implements ChainExecutor<K, V, C> { + + private final Chain<K, V, C> chain; + + public DefaultChainExecutor(Chain<K, V, C> chain) { + this.chain = chain; + } + + public <CMD extends Command<K, V, C>> ChainExecutor<K, V, C> addCommand(CMD command) { + chain.addCommand(checkNotNullArgument(command, "Chain does not accept null Command instances")); + return this; + } + + public boolean execute(C context) { + return chain.execute(checkNotNullArgument(context, "Chain cannot be applied to a null context.")); + } + + } + + private static <T> T checkNotNullArgument(T reference, String message) { + if (reference == null) { + throw new IllegalArgumentException(message); + } + return reference; + } + +} Propchange: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/Chains.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/Chains.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/Chains.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/CommandSetter.java URL: http://svn.apache.org/viewvc/commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/CommandSetter.java?rev=1363265&view=auto ============================================================================== --- commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/CommandSetter.java (added) +++ commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/CommandSetter.java Thu Jul 19 08:56:32 2012 @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.chain2; + +import java.util.Map; + +/** + * Generic builder that allows adding commands to the target {@link Chain} has to be executed. + * + * @param <K> Context key type + * @param <V> Context value type + * @param <C> Type of the context associated with this command setter + * @param <CS> Type of the next chain builder + * @since 2.0 + */ +public interface CommandSetter<K, V, C extends Map<K, V>, CS extends CommandSetter<K, V, C, CS>> { + + /** + * Add the given command to the target {@link Chain} has to be executed. + * + * @param <CMD> Type of the command has to be added + * @param command the command has to be added in the target chain + * @return next chain builder + * @see Chain#addCommand(Command) + */ + <CMD extends Command<K, V, C>> CS addCommand(CMD command); + +} Propchange: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/CommandSetter.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/CommandSetter.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/CommandSetter.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ToExecutorCommandSetter.java URL: http://svn.apache.org/viewvc/commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ToExecutorCommandSetter.java?rev=1363265&view=auto ============================================================================== --- commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ToExecutorCommandSetter.java (added) +++ commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ToExecutorCommandSetter.java Thu Jul 19 08:56:32 2012 @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.chain2; + +import java.util.Map; + +/** + * First builder that allows adding a command in the target chain. + * + * @param <K> Context key type + * @param <V> Context value type + * @param <C> Type of the context associated with this chain executor + * @since 2.0 + */ +public interface ToExecutorCommandSetter<K, V, C extends Map<K, V>> + extends CommandSetter<K, V, C, ChainExecutor<K,V,C>> { + +} Propchange: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ToExecutorCommandSetter.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ToExecutorCommandSetter.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: commons/proper/chain/trunk/core/src/main/java/org/apache/commons/chain2/ToExecutorCommandSetter.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/proper/chain/trunk/core/src/test/java/org/apache/commons/chain2/impl/FluentInterfacesTestCase.java URL: http://svn.apache.org/viewvc/commons/proper/chain/trunk/core/src/test/java/org/apache/commons/chain2/impl/FluentInterfacesTestCase.java?rev=1363265&view=auto ============================================================================== --- commons/proper/chain/trunk/core/src/test/java/org/apache/commons/chain2/impl/FluentInterfacesTestCase.java (added) +++ commons/proper/chain/trunk/core/src/test/java/org/apache/commons/chain2/impl/FluentInterfacesTestCase.java Thu Jul 19 08:56:32 2012 @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.chain2.impl; + +import static org.junit.Assert.assertTrue; +import static org.apache.commons.chain2.Chains.on; + +import org.apache.commons.chain2.Context; +import org.junit.Test; + +import org.apache.commons.chain2.Chain; + +public final class FluentInterfacesTestCase { + + @Test(expected = IllegalArgumentException.class) + public void doesNotAcceptNullChain() { + on((Chain<String, Object, Context<String, Object>>) null); + } + + @Test(expected = IllegalArgumentException.class) + public void doesNotAcceptNullCommand() { + on(new ChainBase<String, Object, Context<String, Object>>()) + .addCommand(null); + } + + @Test(expected = IllegalArgumentException.class) + public void doesNotAcceptNullContext() { + on(new ChainBase<String, Object, Context<String, Object>>()) + .addCommand(new NonDelegatingFilter("3", "c")) + .execute(null); + } + + @Test + public void justMakeSureChainIsExecuted() { + ContextBase context = new ContextBase(); + + on(new ChainBase<String, Object, Context<String, Object>>()) + .addCommand(new DelegatingFilter("1", "a")) + .addCommand(new ExceptionFilter("2", "b")) + .addCommand(new NonDelegatingFilter("3", "c")) + .execute(context); + + assertTrue(context.containsKey("log")); + } + +} Propchange: commons/proper/chain/trunk/core/src/test/java/org/apache/commons/chain2/impl/FluentInterfacesTestCase.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/chain/trunk/core/src/test/java/org/apache/commons/chain2/impl/FluentInterfacesTestCase.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: commons/proper/chain/trunk/core/src/test/java/org/apache/commons/chain2/impl/FluentInterfacesTestCase.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: commons/proper/chain/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/chain/trunk/src/changes/changes.xml?rev=1363265&r1=1363264&r2=1363265&view=diff ============================================================================== --- commons/proper/chain/trunk/src/changes/changes.xml (original) +++ commons/proper/chain/trunk/src/changes/changes.xml Thu Jul 19 08:56:32 2012 @@ -41,6 +41,9 @@ The <action> type attribute can be add,u <body> <release version="2.0" description="Major release"> + <action dev="simonetripodi" type="add" issue="CHAIN-70"> + Add a small EDSL to simplify Chain setup and execution. + </action> <action dev="simonetripodi" type="add" issue="CHAIN-69" due-to="Elijah Zupancic"> Fixed Checkstyle / PMD Warnings </action>