001 package biz.hammurapi.jms.adapter; 002 003 import java.util.HashMap; 004 import java.util.Map; 005 import java.util.logging.Level; 006 import java.util.logging.Logger; 007 008 import biz.hammurapi.metrics.MeasurementCollector; 009 import biz.hammurapi.metrics.MeasurementConsumer; 010 011 public class MapLocalDelegate implements LocalDelegate, MeasurementCollector, MeasurementConsumer { 012 013 private final static Logger logger = Logger.getLogger(MapLocalDelegate.class.getName()); 014 015 private Map state = new HashMap(); 016 017 private MeasurementConsumer measurementConsumer; 018 019 public Object getState() { 020 return state; 021 } 022 023 public Object invoke(Object proxy, final java.lang.reflect.Method method, final Object[] args, final Method jmsMethod) throws Throwable { 024 if (jmsMethod == null) { 025 if (method.getName().length()>3) { 026 if (method.getName().startsWith("set") && method.getParameterTypes().length==1 && void.class.equals(method.getReturnType())) { 027 state.put(method.getName().substring(3), args[0]); 028 return null; 029 } 030 031 if (method.getName().startsWith("get") && method.getParameterTypes().length==0 && !void.class.equals(method.getReturnType())) { 032 return state.get(method.getName().substring(3)); 033 } 034 } 035 return method.invoke(state, args); 036 } 037 038 if (jmsMethod!=null && jmsMethod.isAsync()) { 039 jmsMethod.getJmsService().getWorker().post(new Runnable() { 040 041 public void run() { 042 try { 043 jmsMethod.invoke(state, args, method.getDeclaringClass().getName()); 044 } catch (Throwable e) { 045 String methodSignature = ProxyService.signature(method); 046 addMeasurement(methodSignature.toString()+".error", 1, System.currentTimeMillis()); 047 logger.log(Level.SEVERE, "Invocation of "+methodSignature+" failed: "+e, e); 048 } 049 } 050 051 }); 052 return null; 053 } 054 055 return jmsMethod.invoke(state, args, method.getDeclaringClass().getName()); 056 } 057 058 public void setMeasurementConsumer(MeasurementConsumer measurementConsumer) { 059 this.measurementConsumer = measurementConsumer; 060 } 061 062 public void addMeasurement(String name, double value, long time) { 063 if (measurementConsumer!=null) { 064 measurementConsumer.addMeasurement(name, value, time); 065 } 066 } 067 068 public void setState(Object state) { 069 this.state = (Map) state; 070 } 071 072 }