1515 *******************************************************************************/
1616package com .intuit .ipp .query ;
1717
18+ import java .lang .reflect .Method ;
1819import java .util .Calendar ;
1920import java .util .Date ;
2021
22+ import net .sf .cglib .proxy .Callback ;
23+ import net .sf .cglib .proxy .CallbackFilter ;
2124import net .sf .cglib .proxy .Enhancer ;
2225
2326import com .intuit .ipp .core .IEntity ;
2730import com .intuit .ipp .query .expr .NumberPath ;
2831import com .intuit .ipp .query .expr .StringPath ;
2932import com .intuit .ipp .util .Logger ;
33+ import net .sf .cglib .proxy .NoOp ;
3034
3135/**
3236 * Class used to generate the query string
@@ -76,7 +80,8 @@ public static <T> T createQueryEntity(Class<T> cl) {
7680 } else {
7781 enhancer .setSuperclass (cl );
7882 }
79- enhancer .setCallback (new MyMethodInterceptor ());
83+ enhancer .setCallbackFilter (CALLBACK_FILTER );
84+ enhancer .setCallbacks (new Callback [] {NoOp .INSTANCE , new MyMethodInterceptor ()});
8085 return (T ) enhancer .create ();
8186 }
8287
@@ -96,7 +101,8 @@ public static <T> T createQueryEntity(T entity) {
96101 //enhancer.setCallback(new MyMethodInterceptor());
97102 } else {
98103 enhancer .setSuperclass (cl );
99- enhancer .setCallback (new MyMethodInterceptor ());
104+ enhancer .setCallbackFilter (CALLBACK_FILTER );
105+ enhancer .setCallbacks (new Callback [] {NoOp .INSTANCE , new MyMethodInterceptor ()});
100106 }
101107 return (T ) enhancer .create ();
102108 }
@@ -257,4 +263,65 @@ public static void resetQueryMessage() {
257263 setMessage (new QueryMessage ());
258264 }
259265
266+ /**
267+ * Callback filter which will filter out callback triggers for several {@link Object} methods.
268+ */
269+ private static final CallbackFilter CALLBACK_FILTER = new CallbackFilter () {
270+
271+ @ Override
272+ public int accept (Method method ) {
273+ if (isFinalizeMethod (method ) || isCloneMethod (method ) || isEqualsMethod (method )
274+ || isHashCodeMethod (method ) || isToStringMethod (method )) {
275+ return 0 ;
276+ }
277+ return 1 ;
278+ }
279+
280+ /**
281+ * Determine whether the given method is a "finalize" method.
282+ * @see java.lang.Object#finalize()
283+ */
284+ private boolean isFinalizeMethod (Method method ) {
285+ return (method != null && method .getName ().equals ("finalize" ) &&
286+ method .getParameterTypes ().length == 0 );
287+ }
288+
289+ /**
290+ * Determine whether the given method is a "finalize" method.
291+ * @see java.lang.Object#finalize()
292+ */
293+ private boolean isCloneMethod (Method method ) {
294+ return (method != null && method .getName ().equals ("clone" ) &&
295+ method .getParameterTypes ().length == 0 );
296+ }
297+
298+ /**
299+ * Determine whether the given method is an "equals" method.
300+ * @see java.lang.Object#equals(Object)
301+ */
302+ private boolean isEqualsMethod (Method method ) {
303+ if (method == null || !method .getName ().equals ("equals" )) {
304+ return false ;
305+ }
306+ Class <?>[] paramTypes = method .getParameterTypes ();
307+ return (paramTypes .length == 1 && paramTypes [0 ] == Object .class );
308+ }
309+
310+ /**
311+ * Determine whether the given method is a "hashCode" method.
312+ * @see java.lang.Object#hashCode()
313+ */
314+ private boolean isHashCodeMethod (Method method ) {
315+ return (method != null && method .getName ().equals ("hashCode" ) && method .getParameterTypes ().length == 0 );
316+ }
317+
318+ /**
319+ * Determine whether the given method is a "toString" method.
320+ * @see java.lang.Object#toString()
321+ */
322+ private boolean isToStringMethod (Method method ) {
323+ return (method != null && method .getName ().equals ("toString" ) && method .getParameterTypes ().length == 0 );
324+ }
325+ };
326+
260327}
0 commit comments