001 package com.khubla.pragmatach.plugin.mongodb.proxy; 002 003 import java.beans.Introspector; 004 import java.lang.reflect.Field; 005 import java.lang.reflect.InvocationTargetException; 006 import java.lang.reflect.Method; 007 008 import javassist.util.proxy.MethodFilter; 009 import javassist.util.proxy.MethodHandler; 010 011 import com.khubla.pragmatach.plugin.mongodb.util.ClassTypeUtils; 012 013 /** 014 * @author tom 015 */ 016 public class MongoMethodHandler implements MethodHandler, MethodFilter { 017 /** 018 * get the field for a getter 019 */ 020 private Field getField(Method thisMethod) throws NoSuchFieldException { 021 final String fieldName = Introspector.decapitalize(thisMethod.getName().substring(3)); 022 return thisMethod.getDeclaringClass().getDeclaredField(fieldName); 023 } 024 025 @Override 026 public Object invoke(Object object, Method thisMethod, Method proceed, Object[] args) throws Throwable { 027 /* 028 * do the lazy load, if required 029 */ 030 lazyLoad(object, thisMethod, proceed, args); 031 /* 032 * proceed 033 */ 034 return proceed.invoke(object, args); 035 } 036 037 @Override 038 public boolean isHandled(Method method) { 039 try { 040 if (method.getName().startsWith("get")) { 041 final Field field = getField(method); 042 if (ClassTypeUtils.isLazyLoad(field)) { 043 return true; 044 } 045 } 046 return false; 047 } catch (final Exception e) { 048 System.out.println(e.getMessage()); 049 return false; 050 } 051 } 052 053 /** 054 * lazy load 055 */ 056 private void lazyLoad(Object object, Method thisMethod, Method proceed, Object[] args) throws NoSuchFieldException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { 057 boolean fetched = MongoProxyFactory.getFetched(object); 058 if (false == fetched) { 059 String lazyLoadid = MongoProxyFactory.getId(object); 060 System.out.println(lazyLoadid); 061 } 062 } 063 }