private Map findCallbackDefinitions()

in jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/DefaultPageBeanDescriptor.java [121:207]


    private Map<PhaseId, RequestLifecycleCallbackEntry> findCallbackDefinitions(Class beanClass)
    {
        Class currentClass = beanClass;

        PhasesLifecycleCallbackEntryHelper beforeCallbackEntryHelper = new PhasesLifecycleCallbackEntryHelper();
        PhasesLifecycleCallbackEntryHelper afterCallbackEntryHelper = new PhasesLifecycleCallbackEntryHelper();

        List<String> processedMethodNames = new ArrayList<String>();
        
        boolean callbackAdded;
        while(!(currentClass.getName().equals(Object.class.getName())))
        {
            for(Method currentMethod : currentClass.getDeclaredMethods())
            {
                //don't process overridden methods
                if (processedMethodNames.contains(currentMethod.getName()))
                {
                    continue;
                }
                
                callbackAdded = false;

                if(currentMethod.isAnnotationPresent(BeforePhase.class))
                {
                    callbackAdded = true;
                    beforeCallbackEntryHelper.add(
                            currentMethod.getAnnotation(BeforePhase.class).value(), currentMethod);
                }
                else if(currentMethod.isAnnotationPresent(AfterPhase.class))
                {
                    callbackAdded = true;
                    afterCallbackEntryHelper.add(
                            currentMethod.getAnnotation(AfterPhase.class).value(), currentMethod);
                }
                else if(currentMethod.isAnnotationPresent(InitView.class))
                {
                    callbackAdded = true;
                    this.initViewMethods.add(currentMethod);
                }
                else if(currentMethod.isAnnotationPresent(PrePageAction.class))
                {
                    callbackAdded = true;
                    this.prePageActionMethods.add(currentMethod);
                }
                else if(currentMethod.isAnnotationPresent(PreRenderView.class))
                {
                    callbackAdded = true;
                    this.preRenderViewMethods.add(currentMethod);
                }
                else if(currentMethod.isAnnotationPresent(PostRenderView.class))
                {
                    callbackAdded = true;
                    this.postRenderViewMethods.add(currentMethod);
                }

                if (callbackAdded)
                {
                    processedMethodNames.add(currentMethod.getName());
                    
                    String errorMessage = "";
                    
                    if (currentMethod.getParameterTypes().length != 0)
                    {
                        errorMessage += "Parameters aren't supported. ";
                    }
                    
                    if (Modifier.isPrivate(currentMethod.getModifiers()))
                    {
                        errorMessage +=
                            "Private methods aren't supported to avoid side-effects with normal-scoped CDI beans. " +
                            "Please use e.g. protected or public instead. ";
                    }
                            
                    if (!"".equals(errorMessage))
                    {
                        throw new IllegalStateException("Callback-Implementation not supported: " +
                            currentMethod.getDeclaringClass().getName() + "#" + currentMethod.getName() + ". " +
                            errorMessage);
                    }
                }
            }

            currentClass = currentClass.getSuperclass();
        }

        return createPhasesLifecycleCallbackMap(beforeCallbackEntryHelper, afterCallbackEntryHelper);
    }