@Override public void processSimEvent(SimEvent event) { Object[] requestedParameters = event.getParameters(); Method requestedMethod = this.lookupMethodForSimEvent(event); // this is consistent with the behavior pattern set by SimEntityBase if (null == requestedMethod) { return; } try { Level l = Level.FINEST; if (LOG.isLoggable(l)) { LOG.log( l, LogString.format( eventList, "Will invoke " + requestedMethod.toGenericString() + " on " + this.toString() + " which was found under the annotation sim event name \'" + event.getEventName() + "\'")); } requestedMethod.invoke(this, requestedParameters); } catch (IllegalAccessException ex) { throw new RuntimeException(ex); } catch (IllegalArgumentException ex) { throw new RuntimeException(ex); } catch (InvocationTargetException ex) { throw new RuntimeException(ex); } }
protected Method lookupMethodForSimEvent(SimEvent event) { String requestedEvent = event.getEventName(); Class<?>[] requestedSignature = new Class<?>[event.getSignature().length]; // <ugh> Object[] args = event.getParameters(); for (int i = 0; i < args.length; i++) { if (null == args[i]) { break; } Class<?> c = args[i].getClass(); requestedSignature[i] = c; } // </ugh> Map<Class<?>[], Method> signatureKeyedMethods = eventMethodMap.get(getClass()).get(requestedEvent); Method requestedMethod = null; for (Class<?>[] sig : signatureKeyedMethods.keySet()) { if (callableArgTypes(sig, requestedSignature)) { requestedMethod = signatureKeyedMethods.get(sig); } } // special case, ignore other entities' run events if (requestedEvent.equalsIgnoreCase("Run") && event.getSource() != this) { requestedMethod = null; } if (null == requestedMethod) { Level l = Level.WARNING; if (LOG.isLoggable(l)) { StringBuilder buff = new StringBuilder("("); int z = requestedSignature.length; if (z == 0) { buff.append(")"); } else { for (Class c : requestedSignature) { buff.append(c.getName()); if (z > 0) { buff.append(", "); } else { buff.append(")"); } z--; } } LOG.log( l, "No method having signature compatible with " + buff + " was found for event '" + requestedEvent + "' in " + this.getClass().getSimpleName()); } } return requestedMethod; }