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    }