1 package org.sapia.ubik.rmi.interceptor; 2 3 import java.lang.reflect.Method ; 4 5 import java.util.*; 6 7 8 19 public class SingleDispatcher { 20 Map _interceptors = new HashMap(); 21 22 30 public void registerInterceptor(Class event, Interceptor it) 31 throws InvalidInterceptorException { 32 Class itClass = it.getClass(); 33 int idx = event.getName().lastIndexOf('.'); 34 String shortName; 35 36 if (idx < 0) { 37 shortName = event.getName(); 38 } else { 39 shortName = event.getName().substring(idx + 1); 40 } 41 42 char[] content = shortName.toCharArray(); 43 content[0] = Character.toUpperCase(content[0]); 44 shortName = "on" + new String (content); 45 46 Method m; 47 48 try { 49 m = itClass.getMethod(shortName, new Class [] { event }); 50 } catch (Exception e) { 51 throw new InvalidInterceptorException(e); 52 } 53 54 if (_interceptors.get(event) != null) { 55 throw new InvalidInterceptorException( 56 "interceptor already registered for " + event.getName()); 57 } 58 59 _interceptors.put(event, new InterceptorInfo(it, m)); 60 } 61 62 66 public void dispatch(Event event) { 67 InterceptorInfo info = (InterceptorInfo) _interceptors.get(event.getClass()); 68 69 if (info == null) { 70 return; 71 } 72 73 try { 74 info.method.invoke(info.interceptor, new Object [] { event }); 75 } catch (Throwable t) { 76 handleError(t); 77 } 78 } 79 80 85 protected void handleError(Throwable t) { 86 t.printStackTrace(); 87 } 88 } 89 | Popular Tags |