1 /*
2 * Copyright (c) 2002-2025, City of Paris
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright notice
10 * and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright notice
13 * and the following disclaimer in the documentation and/or other materials
14 * provided with the distribution.
15 *
16 * 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 *
32 * License 1.0
33 */
34 package fr.paris.lutece.util.method;
35
36 import org.apache.commons.lang3.StringUtils;
37
38 import java.lang.reflect.InvocationTargetException;
39 import java.lang.reflect.Method;
40
41 /**
42 *
43 * MethodUtils
44 *
45 */
46 public final class MethodUtil
47 {
48 private static final String PREFIX_GET = "get";
49 private static final String PREFIX_SET = "set";
50
51 /**
52 * Instantiates a new method utils.
53 */
54 private MethodUtil( )
55 {
56 }
57
58 /**
59 * Sets the attribute. <br>
60 * <strong>Warning :</strong> This method does not handle setter that :
61 * <ul>
62 * <li>has no parameter or has more than one parameter</li>
63 * <li>has array parameter (ie : String[] or int[] ...)</li>
64 * </ul>
65 *
66 * @param <A>
67 * the generic type of the instance
68 * @param <B>
69 * the generic type of the value to set
70 * @param instance
71 * the instance to set
72 * @param strAttributeName
73 * the attribute name
74 * @param value
75 * the value of the attribute to set
76 * @throws SecurityException
77 * the security exception
78 * @throws NoSuchMethodException
79 * the no such method exception
80 * @throws IllegalArgumentException
81 * the illegal argument exception
82 * @throws IllegalAccessException
83 * the illegal access exception
84 * @throws InvocationTargetException
85 * the invocation target exception
86 */
87 public static <A, B> void set( A instance, String strAttributeName, B value )
88 throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
89 {
90 if ( StringUtils.isNotBlank( strAttributeName ) && ( instance != null ) && ( value != null ) )
91 {
92 Method methodSetter = getSetter( instance, strAttributeName, value.getClass( ) );
93
94 if ( methodSetter != null )
95 {
96 methodSetter.invoke( instance, value );
97 }
98 else
99 {
100 throw new NoSuchMethodException( );
101 }
102 }
103 else
104 {
105 throw new IllegalArgumentException( "One on the parameters is null/blank." );
106 }
107 }
108
109 /**
110 * Gets the method.
111 *
112 * @param <A>
113 * the generic type of the instance
114 * @param strMethodPrefix
115 * the str method prefix
116 * @param instance
117 * the instance
118 * @param strAttributeName
119 * the str attribute name
120 * @param clazz
121 * the clazz
122 * @return the method
123 * @throws SecurityException
124 * the security exception
125 * @throws NoSuchMethodException
126 * the no such method exception
127 */
128 public static <A> Method getMethod( String strMethodPrefix, A instance, String strAttributeName, Class<?> clazz ) throws NoSuchMethodException
129 {
130 String strFirstLetter = strAttributeName.substring( 0, 1 ).toUpperCase( );
131
132 String strMethodName = strMethodPrefix + strFirstLetter + strAttributeName.substring( 1, strAttributeName.length( ) );
133
134 try
135 {
136 return instance.getClass( ).getMethod( strMethodName, clazz );
137 }
138 catch( NoSuchMethodException e )
139 {
140 return getPrimitiveMethod( strMethodName, instance, clazz );
141 }
142 }
143
144 /**
145 * Gets the primitive method.
146 *
147 * @param <A>
148 * the generic type of the instance
149 * @param strMethodName
150 * the str method name
151 * @param instance
152 * the instance
153 * @param clazz
154 * the clazz
155 * @return the primitive method
156 * @throws SecurityException
157 * the security exception
158 * @throws NoSuchMethodException
159 * the no such method exception
160 */
161 public static <A> Method getPrimitiveMethod( String strMethodName, A instance, Class<?> clazz ) throws NoSuchMethodException
162 {
163 if ( clazz.equals( Integer.class ) )
164 {
165 return instance.getClass( ).getMethod( strMethodName, int.class );
166 }
167 else
168 if ( clazz.equals( Long.class ) )
169 {
170 return instance.getClass( ).getMethod( strMethodName, long.class );
171 }
172 else
173 if ( clazz.equals( Double.class ) )
174 {
175 return instance.getClass( ).getMethod( strMethodName, double.class );
176 }
177 else
178 if ( clazz.equals( Short.class ) )
179 {
180 return instance.getClass( ).getMethod( strMethodName, short.class );
181 }
182 else
183 if ( clazz.equals( Byte.class ) )
184 {
185 return instance.getClass( ).getMethod( strMethodName, byte.class );
186 }
187 else
188 if ( clazz.equals( Float.class ) )
189 {
190 return instance.getClass( ).getMethod( strMethodName, float.class );
191 }
192 else
193 if ( clazz.equals( Character.class ) )
194 {
195 return instance.getClass( ).getMethod( strMethodName, char.class );
196 }
197 else
198 if ( clazz.equals( Boolean.class ) )
199 {
200 return instance.getClass( ).getMethod( strMethodName, boolean.class );
201 }
202
203 throw new NoSuchMethodException( );
204 }
205
206 /**
207 * Gets the setter.
208 *
209 * @param <A>
210 * the generic type
211 * @param instance
212 * the instance
213 * @param strAttributeName
214 * the str attribute name
215 * @param clazz
216 * the clazz
217 * @return the setter
218 * @throws SecurityException
219 * the security exception
220 * @throws NoSuchMethodException
221 * the no such method exception
222 */
223 public static <A> Method getSetter( A instance, String strAttributeName, Class<?> clazz ) throws NoSuchMethodException
224 {
225 return getMethod( PREFIX_SET, instance, strAttributeName, clazz );
226 }
227
228 /**
229 * Gets the setter.
230 *
231 * @param <A>
232 * the generic type of the instance
233 * @param instance
234 * the instance
235 * @param strAttributeName
236 * the str attribute name
237 * @param clazz
238 * the clazz
239 * @return the setter
240 * @throws SecurityException
241 * the security exception
242 * @throws NoSuchMethodException
243 * the no such method exception
244 */
245 public static <A> Method getGetter( A instance, String strAttributeName, Class<?> clazz ) throws NoSuchMethodException
246 {
247 return getMethod( PREFIX_GET, instance, strAttributeName, clazz );
248 }
249 }