/** * @param element the element * @param method the method to add to the element */ private void addMethod(FilterElementDescriptor element, Method method) { String methodName = method.getName(); Type[] methodTypes = method.getGenericParameterTypes(); if (methodName.startsWith(PREFIX_BEGIN)) { if (element.getBeginMethod() == null || element.getBeginMethod().getGenericParameterTypes().length < methodTypes.length) { element.setBeginMethod(method); } } else if (methodName.startsWith(PREFIX_END)) { if (element.getEndMethod() == null || element.getEndMethod().getGenericParameterTypes().length < methodTypes.length) { element.setEndMethod(method); } } else { if (element.getOnMethod() == null || element.getOnMethod().getGenericParameterTypes().length < methodTypes.length) { element.setOnMethod(method); } } }
/** * @param elementName the name of the element * @param descriptor the descriptor in which to add the element * @param method the method associated to the element * @throws IncompatibleFilterException when passed method is not compatible with matching filter(s) */ private void addElement(String elementName, FilterDescriptor descriptor, Method method) throws IncompatibleFilterException { String lowerElementName = elementName.toLowerCase(); FilterElementDescriptor element = descriptor.getElements().get(lowerElementName); Type[] methodTypes = method.getGenericParameterTypes(); if (element == null || methodTypes.length > element.getParameters().length) { FilterElementParameterDescriptor<?>[] parameters = new FilterElementParameterDescriptor<?>[methodTypes.length]; for (int i = 0; i < methodTypes.length; ++i) { parameters[i] = createFilterElementParameter(method, i, methodTypes[i]); } // Make sure those parameters are compatible with any other matching element if (element != null) { checkCompatible(element, parameters); } element = new FilterElementDescriptor(elementName, parameters); descriptor.getElements().put(lowerElementName, element); } addMethod(element, method); }
private static void invokeUnkown(Object filter, FilterDescriptor descriptor, Method method, Object[] args) throws FilterException { String id = DefaultFilterDescriptorManager.getElementName(method); if (id != null) { FilterElementDescriptor element = descriptor.getElement(id); if (element != null) { FilterEventParameters metadata = new FilterEventParameters(); for (FilterElementParameterDescriptor<?> parameter : element.getParameters()) { metadata.put( parameter.getName() != null ? parameter.getName() : String.valueOf(parameter.getIndex()), args[parameter.getIndex()]); } UnknownFilter unknownFilter = (UnknownFilter) filter; if (method.getName().startsWith(DefaultFilterDescriptorManager.PREFIX_BEGIN)) { unknownFilter.beginUnknwon(id, metadata); } else if (method.getName().startsWith(DefaultFilterDescriptorManager.PREFIX_END)) { unknownFilter.endUnknwon(id, metadata); } else if (method.getName().startsWith(DefaultFilterDescriptorManager.PREFIX_ON)) { unknownFilter.onUnknwon(id, metadata); } } } } }
/** * Call passed begin event if possible. * * @param filter the filter * @param descriptor the descriptor of the filter * @param id the id of the event * @param parameters the parameters of the event * @return true if the event has been sent, false otherwise * @throws FilterException when the passed filter exposes the event but failed anyway */ public static boolean sendBeginEvent(Object filter, FilterDescriptor descriptor, String id, FilterEventParameters parameters) throws FilterException { FilterElementDescriptor elementDescriptor = descriptor.getElement(id); if (elementDescriptor != null && elementDescriptor.getBeginMethod() != null) { sendEvent(elementDescriptor.getBeginMethod(), elementDescriptor, filter, parameters); } else if (filter instanceof UnknownFilter) { ((UnknownFilter) filter).beginUnknwon(id, parameters); } else { return false; } return true; }
/** * Call passed end event if possible. * * @param filter the filter * @param descriptor the descriptor of the filter * @param id the id of the event * @param parameters the parameters of the event * @return true if the event has been sent, false otherwise * @throws FilterException when the passed filter exposes the event but failed anyway */ public static boolean sendEndEvent(Object filter, FilterDescriptor descriptor, String id, FilterEventParameters parameters) throws FilterException { FilterElementDescriptor elementDescriptor = descriptor.getElement(id); if (elementDescriptor != null && elementDescriptor.getEndMethod() != null) { sendEvent(elementDescriptor.getEndMethod(), elementDescriptor, filter, parameters); } else if (filter instanceof UnknownFilter) { ((UnknownFilter) filter).endUnknwon(id, parameters); } else { return false; } return true; }
/** * Call passed on event if possible. * * @param filter the filter * @param descriptor the descriptor of the filter * @param id the id of the event * @param parameters the parameters of the event * @return true if the event has been sent, false otherwise * @throws FilterException when the passed filter exposes the event but failed anyway */ public static boolean sendOnEvent(Object filter, FilterDescriptor descriptor, String id, FilterEventParameters parameters) throws FilterException { FilterElementDescriptor elementDescriptor = descriptor.getElement(id); if (elementDescriptor != null && elementDescriptor.getOnMethod() != null) { sendEvent(elementDescriptor.getOnMethod(), elementDescriptor, filter, parameters); } else if (filter instanceof UnknownFilter) { ((UnknownFilter) filter).onUnknwon(id, parameters); } else { return false; } return true; } }
private void checkCompatible(FilterElementDescriptor element, FilterElementParameterDescriptor<?>[] parameters) throws IncompatibleFilterException { for (FilterElementParameterDescriptor<?> parameter : parameters) { FilterElementParameterDescriptor<?> elementParameter = element.getParameter(parameter.getName()); if (elementParameter != null && !elementParameter.getType().equals(parameter.getType())) { throw new IncompatibleFilterException("Parameter [" + parameter + "] is not compatible with parameter [" + elementParameter + "] (different types)"); } } }
FilterEventParameters parameters) throws FilterException FilterElementParameterDescriptor<?>[] parameterDescriptors = elementDescriptor.getParameters();