View Javadoc

1   /*******************************************************************************
2    * Copyright 2013 André Rouél and Dominik Seichter
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    *   http://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 net.sf.qualitytest.blueprint;
17  
18  import java.lang.reflect.Field;
19  import java.lang.reflect.Method;
20  
21  import javax.annotation.Nonnull;
22  import javax.annotation.Nullable;
23  
24  import net.sf.qualitytest.exception.BlueprintCycleException;
25  
26  /**
27   * Defines a blueprint configuration
28   * 
29   * @author André Rouél
30   */
31  public interface BlueprintConfiguration {
32  
33  	/**
34  	 * Construct a Java-Object using a class as a blueprint.
35  	 * 
36  	 * @see Blueprint
37  	 * 
38  	 * @param <T>
39  	 * @param clazz
40  	 *            a class
41  	 * @return a blue printed instance of {@code T}
42  	 */
43  	@Nullable
44  	<T> T construct(@Nonnull final Class<T> clazz);
45  
46  	/**
47  	 * Find a creation strategy that matches on the given field.
48  	 * 
49  	 * @param field
50  	 *            A field
51  	 * 
52  	 * @return a {@code ValueCreationStrategy} or {@code null}
53  	 */
54  	@Nullable
55  	CreationStrategy<?> findCreationStrategyForField(@Nonnull final Field field);
56  
57  	/**
58  	 * Find a creation strategy that matches on the given method.
59  	 * 
60  	 * @param method
61  	 *            A setter method
62  	 * 
63  	 * @return a {@code ValueCreationStrategy} or {@code null}
64  	 */
65  	@Nullable
66  	CreationStrategy<?> findCreationStrategyForMethod(@Nonnull final Method method);
67  
68  	/**
69  	 * Find a creation strategy that matches on a given type.
70  	 * 
71  	 * @param class A class
72  	 * 
73  	 * @return a {@code ValueCreationStrategy} or {@code null}
74  	 */
75  	@Nullable
76  	CreationStrategy<?> findCreationStrategyForType(@Nonnull final Class<?> clazz);
77  
78  	/**
79  	 * Handle the situation that a BlueprintCycle was detected for a particular class.
80  	 * 
81  	 * @see Blueprint
82  	 * 
83  	 * @param <T>
84  	 * @param session
85  	 *            The current {@link BlueprintSession}
86  	 * @param clazz
87  	 *            The class which caused cycle in the blueprinting graph
88  	 * @return a blue printed instance of {@code T}
89  	 */
90  	@Nullable
91  	<T> T handleCycle(@Nonnull final BlueprintSession session, @Nonnull final Class<T> clazz);
92  
93  	/**
94  	 * Retrieve if public attributes are filled during blueprinting.
95  	 * 
96  	 * @return {@code true} if public attributes are filled during blueprinting
97  	 */
98  	boolean isWithPublicAttributes();
99  
100 	/**
101 	 * Replace every attribute with the type {@code type} with a given value.
102 	 * 
103 	 * @param type
104 	 *            a Java type.
105 	 * @param creator
106 	 *            Creation strategy which actually creates a new value.
107 	 * 
108 	 * @return the changed blueprint configuration.
109 	 */
110 	@Nonnull
111 	<T> BlueprintConfiguration with(@Nonnull final Class<T> type, @Nullable final CreationStrategy<?> creator);
112 
113 	/**
114 	 * Replace every attribute with the type {@code type} with a given value.
115 	 * 
116 	 * @param type
117 	 *            a Java type.
118 	 * @param value
119 	 *            value which should be assigned to the attribute
120 	 * 
121 	 * @return the changed blueprint configuration.
122 	 */
123 	@Nonnull
124 	<T> BlueprintConfiguration with(@Nonnull final Class<T> type, @Nullable final T value);
125 
126 	/**
127 	 * Handle detected cycles in the blueprinting graph using an additional strategy. The default is to throw a
128 	 * {@link BlueprintCycleException}.
129 	 * 
130 	 * @param cycleHandlingStrategy
131 	 *            Strategy to define how cycles for a certain type are handled
132 	 * 
133 	 * @return the changed blueprint configuration
134 	 */
135 	@Nonnull
136 	<T> BlueprintConfiguration with(@Nonnull final CycleHandlingStrategy<T> cycleHandlingStrategy);
137 
138 	/**
139 	 * Blueprint everything matching a given {@code MatchingStrategy} using this configuration.
140 	 * 
141 	 * @param matchingStrategy
142 	 *            Matching strategy to define if a given type or method should be constructed using blueprint.
143 	 * @return the changed blueprint configuration
144 	 */
145 	@Nonnull
146 	<T> BlueprintConfiguration with(@Nonnull final MatchingStrategy matchingStrategy);
147 
148 	/**
149 	 * Replace every attribute which matches a given strategy with a given value.
150 	 * 
151 	 * @param matcher
152 	 *            Matching strategy to define if the replaced should be applied.
153 	 * @param creator
154 	 *            Creation strategy which actually creates a new value.
155 	 * 
156 	 * @return the changed blueprint configuration.
157 	 */
158 	@Nonnull
159 	BlueprintConfiguration with(final MatchingStrategy matcher, final CreationStrategy<?> creator);
160 
161 	/**
162 	 * Replace every attribute with the name {@code name} with a given value.
163 	 * 
164 	 * @param name
165 	 *            case insensitive name of an attribute.
166 	 * @param value
167 	 *            value which should be assigned to the attribute
168 	 * 
169 	 * @return the changed blueprint configuration.
170 	 */
171 	@Nonnull
172 	<T> BlueprintConfiguration with(@Nonnull final String name, @Nullable final T value);
173 
174 	/**
175 	 * Configure whether public attributes should be filled with values during blueprinting.
176 	 * 
177 	 * @param withPublicAttributes
178 	 *            if {@code true} public attributes will be filled during blueprinting, otherwise they will be ignored.
179 	 * 
180 	 * @return the changed blueprint configuration.
181 	 */
182 	@Nonnull
183 	BlueprintConfiguration withPublicAttributes(final boolean withPublicAttributes);
184 
185 }