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.strategy.matching;
17  
18  import java.lang.reflect.Field;
19  import java.lang.reflect.Method;
20  
21  import net.sf.qualitycheck.Check;
22  import net.sf.qualitytest.blueprint.MatchingStrategy;
23  
24  /**
25   * This value matching strategy matches string names case insensitively on the method name. This works for setter-based
26   * blueprinting.
27   * 
28   * This {@code MatchingStrategy} does never match by type.
29   * 
30   * @author Dominik Seichter
31   */
32  public class CaseInsensitiveMethodNameMatchingStrategy implements MatchingStrategy {
33  
34  	private static final String SETTER_PREFIX = "set";
35  
36  	private final String name;
37  	private final String prefix;
38  
39  	/**
40  	 * Create a new {@code CaseInsensitiveMethodNameMatchingStrategy} which matches method names by default such as
41  	 * 'name' or 'setName' case insensitively.
42  	 * 
43  	 * @param name
44  	 *            The name to be matched (must not be empty or {@code null}.
45  	 */
46  	public CaseInsensitiveMethodNameMatchingStrategy(final String name) {
47  		this.name = Check.notEmpty(name, "name");
48  		prefix = SETTER_PREFIX;
49  	}
50  
51  	/**
52  	 * Create a new {@code CaseInsensitiveMethodNameMatchingStrategy} which matches method names by default such as
53  	 * 'name' or prefix + 'Name' case insensitively.
54  	 * 
55  	 * @param name
56  	 *            The name to be matched (must not be empty or {@code null}.
57  	 * @param prefix
58  	 *            An optional prefix that is matched before the name (default is 'set'). Maybe empty but not
59  	 *            {@code null}.
60  	 */
61  	public CaseInsensitiveMethodNameMatchingStrategy(final String name, final String prefix) {
62  		this.name = Check.notEmpty(name);
63  		this.prefix = Check.notNull(prefix);
64  	}
65  
66  	@Override
67  	public boolean matchesByField(final Field field) {
68  		Check.notNull(field, "field");
69  		final String fieldName = field.getName();
70  		return name.equalsIgnoreCase(fieldName);
71  	}
72  
73  	@Override
74  	public boolean matchesByMethod(final Method method) {
75  		Check.notNull(method, "method");
76  		final String methodName = method.getName();
77  		final String setterName = prefix + name;
78  		return name.equalsIgnoreCase(methodName) || setterName.equalsIgnoreCase(methodName);
79  	}
80  
81  	/**
82  	 * This strategy does never match a type!
83  	 * 
84  	 * @return false
85  	 */
86  	@Override
87  	public boolean matchesByType(final Class<?> clazz) {
88  		return false;
89  	}
90  
91  }