View Javadoc
1   /*
2    * Copyright (C) 2012-2024 RRiBbit.org
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * https://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.rribbit;
17  
18  import java.util.Collection;
19  
20  /**
21   * The bus to which requests can be sent and responses received. The following rules apply to all methods of this interface:
22   *
23   * <ul>
24   * 	<li>When you send a request, ALL {@link Listener}s that match the request are executed, even if you only send for a single result</li>
25   * 	<li>The order in which the {@link Listener}s are executed is not specified</li>
26   * 	<li>The order in which the results are returned is not specified and does not necessarily match the execution order of the {@link Listener}s</li>
27   * 	<li>If exactly one of the {@link Listener}s throws a {@link Throwable}, then that {@link Throwable} is thrown</li>
28   * 	<li>If multiple {@link Listener}s throw a {@link Throwable}, then a {@link MultipleThrowablesOccurredException} is thrown, containing all the {@link Throwable}s that were thrown</li>
29   * 	<li>If any method parameter is 'null', then an {@link IllegalArgumentException} is thrown (null values may occur in the 'parameters' varargs array, however)</li>
30   * </ul>
31   *
32   * @author G.J. Schouten
33   *
34   */
35  public interface RequestResponseBus {
36  
37  	/**
38  	 * Send a request to all {@link Listener}s that satisfy the following requirements.
39  	 * <ul>
40  	 * 	<li>They return an {@link Object} that the parameter 'returnType' is assignable from and</li>
41  	 * 	<li>they belong to a method with parameters that match the given 'parameters' objects</li>
42  	 * </ul>
43  	 *
44  	 * @param returnType	the return type that has to be assignable from the return type of the {@link Listener}s
45  	 * @param parameters	the parameters to give to the {@link Listener}s
46  	 * @return				a single return value from one of the listeners that executed (which one is unspecified) or 'null' if no matching {@link Listener}s were found
47  	 */
48  	<T> T sendForSingleOfClass(Class<T> returnType, Object... parameters);
49  
50  	/**
51  	 * Send a request to all {@link Listener}s that satisfy the following requirements.
52  	 * <ul>
53  	 * 	<li>They return an {@link Object} that the parameter 'returnType' is assignable from and</li>
54  	 * 	<li>they belong to a method with parameters that match the given 'parameters' objects</li>
55  	 * </ul>
56  	 *
57  	 * The number of {@link Listener}s that are executed may be larger than the number of return values that is returned, because some {@link Listener}s may return nothing (void).
58  	 *
59  	 * @param returnType	the return type that has to be assignable from the return type of the {@link Listener}s
60  	 * @param parameters	the parameters to give to the {@link Listener}s
61  	 * @return				all return values from the listeners that executed or an empty {@link Collection} if no matching {@link Listener}s were found. This method never returns null.
62  	 */
63  	<T> Collection<T> sendForMultipleOfClass(Class<T> returnType, Object... parameters);
64  
65  	/**
66  	 * Send a request to all {@link Listener}s that satisfy the following requirements. Ignore all return values and return nothing.
67  	 * <ul>
68  	 * 	<li>They belong to a method with parameters that match the given 'parameters' objects</li>
69  	 * </ul>
70  	 *
71  	 * @param parameters	the parameters to give to the {@link Listener}s
72  	 */
73  	void sendForNothing(Object... parameters);
74  
75  	/**
76  	 * Send a request to all {@link Listener}s that satisfy the following requirements.
77  	 * <ul>
78  	 * 	<li>They have a hint that is equals to the 'hint' parameter and</li>
79  	 * 	<li>they belong to a method with parameters that match the given 'parameters' objects</li>
80  	 * </ul>
81  	 *
82  	 * @param hint			the hint that has to be equal to the hint of the {@link Listener}s
83  	 * @param parameters	the parameters to give to the {@link Listener}s
84  	 * @return				a single return value from one of the listeners that executed (which one is unspecified) or 'null' if no matching {@link Listener}s were found
85  	 * 						or none of them returned anything
86  	 */
87  	<T> T sendForSingleWithHint(String hint, Object... parameters);
88  
89  	/**
90  	 * Send a request to all {@link Listener}s that satisfy the following requirements.
91  	 * <ul>
92  	 * 	<li>They have a hint that is equals to the 'hint' parameter and</li>
93  	 * 	<li>they belong to a method with parameters that match the given 'parameters' objects</li>
94  	 * </ul>
95  	 *
96  	 * The number of {@link Listener}s that are executed may be larger than the number of return values that is returned, because some {@link Listener}s may return nothing (void).
97  	 *
98  	 * @param hint			the hint that has to be equal to the hint of the {@link Listener}s
99  	 * @param parameters	the parameters to give to the {@link Listener}s
100 	 * @return				all return values from the listeners that executed or an empty {@link Collection} if no matching {@link Listener}s were found or none of them returned anything.
101 	 * 						This method never returns null.
102 	 */
103 	<T> Collection<T> sendForMultipleWithHint(String hint, Object... parameters);
104 
105 	/**
106 	 * Send a request to all {@link Listener}s that satisfy the following requirements. Ignore all return values and return nothing.
107 	 * <ul>
108 	 * 	<li>They have a hint that is equals to the 'hint' parameter and</li>
109 	 * 	<li>they belong to a method with parameters that match the given 'parameters' objects</li>
110 	 * </ul>
111 	 *
112 	 * @param hint			the hint that has to be equal to the hint of the {@link Listener}s
113 	 * @param parameters	the parameters to give to the {@link Listener}s
114 	 */
115 	void sendForNothingWithHint(String hint, Object... parameters);
116 
117 	/**
118 	 * Send a request to all {@link Listener}s that satisfy the following requirements.
119 	 * <ul>
120 	 * 	<li>They return an {@link Object} that the parameter 'returnType' is assignable from and</li>
121 	 * 	<li>they have a hint that is equals to the 'hint' parameter and</li>
122 	 * 	<li>they belong to a method with parameters that match the given 'parameters' objects</li>
123 	 * </ul>
124 	 *
125 	 * @param returnType	the return type that has to be assignable from the return type of the {@link Listener}s
126 	 * @param hint			the hint that has to be equal to the hint of the {@link Listener}s
127 	 * @param parameters	the parameters to give to the {@link Listener}s
128 	 * @return				a single return value from one of the listeners that executed (which one is unspecified) or 'null' if no matching {@link Listener}s were found
129 	 */
130 	<T> T sendForSingleOfClassWithHint(Class<T> returnType, String hint, Object... parameters);
131 
132 	/**
133 	 * Send a request to all {@link Listener}s that satisfy the following requirements.
134 	 * <ul>
135 	 * 	<li>They return an {@link Object} that the parameter 'returnType' is assignable from and</li>
136 	 * 	<li>they have a hint that is equals to the 'hint' parameter and</li>
137 	 * 	<li>they belong to a method with parameters that match the given 'parameters' objects</li>
138 	 * </ul>
139 	 *
140 	 * The number of {@link Listener}s that are executed may be larger than the number of return values that is returned, because some {@link Listener}s may return nothing (void).
141 	 *
142 	 * @param returnType	the return type that has to be assignable from the return type of the {@link Listener}s
143 	 * @param hint			the hint that has to be equal to the hint of the {@link Listener}s
144 	 * @param parameters	the parameters to give to the {@link Listener}s
145 	 * @return				all return values from the listeners that executed or an empty {@link Collection} if no matching {@link Listener}s were found. This method never returns null.
146 	 */
147 	<T> Collection<T> sendForMultipleOfClassWithHint(Class<T> returnType, String hint, Object... parameters);
148 
149 	/**
150 	 * Equivalent to {@link #sendForSingleWithHint(String, Object...)}, since that is probably the most widely used method, because generally, when you know the hint, you know
151 	 * the returntype and you don't have to pass it specifically.
152 	 * <p />
153 	 * This method is just a convenience shorthand method with a shorter name.
154 	 *
155 	 * @param hint
156 	 * @param parameters
157 	 * @return same as sendForSingleWithHint
158 	 */
159 	<T> T send(String hint, Object... parameters);
160 }