/** * Copyright 2003-2006 the original author or authors. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jdon.aop.interceptor; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import com.jdon.container.pico.Startable; import com.jdon.controller.model.ModelUtil; import com.jdon.domain.model.cache.ModelKey; import com.jdon.domain.model.cache.ModelManager; import com.jdon.util.Debug; /** * * Cache Interceptor all Interceptors are added in picoContainer * * method match can be done by this class, CacheInterceptor only interceptor the * method getXXXXX. * * @see AopInterceptorRegistry.java * * <p> * </p> * @author banq */ public class CacheInterceptor implements MethodInterceptor, Startable { private final static String module = CacheInterceptor.class.getName(); private ModelManager modelManager; public String match_MethodName = "get"; private Set isModelCache = new HashSet(); public CacheInterceptor(ModelManager modelManager) { this.modelManager = modelManager; } public Object invoke(MethodInvocation invocation) throws Throwable { Method method = invocation.getMethod(); if (!methodMatchsModelGET(method)) { // Debug.logVerbose("[JdonFramework] cacheInteceptor don't action, enter next invocation.proceed()", // module); return invocation.proceed(); // 下一个interceptor } Debug.logVerbose("[JdonFramework] enter cacheInteceptor method:" + method.getName(), module); Class modelClass = method.getReturnType(); String dataKey = getArguments(invocation); if (dataKey == null || modelClass == null) return invocation.proceed(); try { ModelKey modelKey = new ModelKey(dataKey, modelClass); Object model = modelManager.getCache(modelKey); if (model == null) { model = invocation.proceed(); // 下一个interceptor if (model != null && modelClass.isAssignableFrom(model.getClass())) { Debug.logVerbose("[JdonFramework] save to cache", module); model = modelManager.addCache(modelKey, model); } } return model; } catch (Exception e) { Debug.logError("[JdonFramework]CacheInterceptor Exception error:" + e + " method:" + method.getName() + " return class:" + modelClass + " dataKey:" + dataKey, module); } return invocation.proceed(); } /** * 1.check return type if is Model 2.check method name if include "get" 3. * if found them, cache this method * * * @param method * Method * @return boolean */ private boolean methodMatchsModelGET(Method method) { boolean condition = false; try { if (isModelCache.contains(method)) { condition = true; return condition; } String mehtodName = method.getName(); if (method.getReturnType() == null) return condition; // 无返回值,不做缓存 Class returnClass = method.getReturnType(); if (returnClass.getSuperclass() == null) return condition; // 无返回值,不做缓存 Debug.logVerbose("[JdonFramework]methodMatchsModelGET: returnClassName = " + returnClass.getName(), module); if (ModelUtil.isModel(returnClass)) { if (mehtodName.indexOf(match_MethodName) != -1) { condition = true; // method name include "getXXXX" and return Type is subClass // of Model isModelCache.add(method); } } } catch (Exception ex) { Debug.logError("[JdonFramework]Exception error:" + ex, module); } catch (Throwable the) { Debug.logError("[JdonFramework]Throwable error:" + the, module); } return condition; } /** * 组合参数数值为一个字符串 这些参数必须实现toString(); * * @param invocation * MethodInvocation * @return String */ public String getArguments(MethodInvocation invocation) { try { Object[] args = invocation.getArguments(); if (args == null) return null; if (args.length != 1) return null;// 参数是一个主键 if (args[0] == null) return null; return args[0].toString(); } catch (Exception ex) { Debug.logError("[JdonFramework] method:" + invocation.getMethod().getName() + " " + ex, module); return null; } } public String getMatch_MethodName() { return match_MethodName; } @Override public void start() { // TODO Auto-generated method stub } @Override public void stop() { this.isModelCache.clear(); this.isModelCache = null; this.modelManager = null; } }