All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sun.faces.application.annotation.ManagedBeanConfigHandler Maven / Gradle / Ivy

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 * or packager/legal/LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at packager/legal/LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */

package com.sun.faces.application.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.LinkedHashMap;
import java.util.Set;

import javax.faces.bean.*;
import javax.faces.context.FacesContext;

import com.sun.faces.application.ApplicationAssociate;
import com.sun.faces.mgbean.BeanManager;
import com.sun.faces.mgbean.ManagedBeanInfo;

/**
 * 

* ConfigAnnotationHandler for {@link ManagedBean} annotated * classes. *

*/ public class ManagedBeanConfigHandler implements ConfigAnnotationHandler { private static final Class[] SCOPES = { RequestScoped.class, ViewScoped.class, SessionScoped.class, ApplicationScoped.class, NoneScoped.class, CustomScoped.class }; private static final Collection> HANDLES; static { Collection> handles = new ArrayList>(2); handles.add(ManagedBean.class); HANDLES = Collections.unmodifiableCollection(handles); } private Map,Annotation> managedBeans; // ------------------------------------ Methods from ConfigAnnotationHandler /** * @see com.sun.faces.application.annotation.ConfigAnnotationHandler#getHandledAnnotations() */ public Collection> getHandledAnnotations() { return HANDLES; } /** * @see com.sun.faces.application.annotation.ConfigAnnotationHandler#collect(Class, java.lang.annotation.Annotation) */ public void collect(Class target, Annotation annotation) { if (managedBeans == null) { managedBeans = new HashMap,Annotation>(); } managedBeans.put(target, annotation); } /** * @see com.sun.faces.application.annotation.ConfigAnnotationHandler#push(javax.faces.context.FacesContext) */ public void push(FacesContext ctx) { if (managedBeans != null) { ApplicationAssociate associate = ApplicationAssociate.getInstance(ctx.getExternalContext()); if (associate != null) { BeanManager manager = associate.getBeanManager(); for (Map.Entry,Annotation> entry : managedBeans.entrySet()) { process(manager, entry.getKey(), entry.getValue()); } } } } // --------------------------------------------------------- Private Methods private void process(BeanManager manager, Class annotatedClass, Annotation annotation) { manager.register(getBeanInfo(annotatedClass, (ManagedBean) annotation)); } private ManagedBeanInfo getBeanInfo(Class annotatedClass, ManagedBean metadata) { String name = getName(metadata, annotatedClass); String scope = getScope(annotatedClass); boolean eager = metadata.eager(); Map annotatedFields = new LinkedHashMap(); //Map annotatedMethods = new LinkedHashMap(); collectAnnotatedFields(annotatedClass, annotatedFields); //collectAnnotatedMethods(annotatedClass, // annotatedMethods, // annotatedFields.keySet()); List properties = null; if (!annotatedFields.isEmpty()) { properties = new ArrayList(annotatedFields.size()); for (Map.Entry entry : annotatedFields.entrySet()) { Field f = entry.getValue(); ManagedProperty property = f.getAnnotation(ManagedProperty.class); ManagedBeanInfo.ManagedProperty propertyInfo = new ManagedBeanInfo.ManagedProperty(entry.getKey(), f.getType().getName(), property.value(), null, null); properties.add(propertyInfo); } } /* if (!annotatedMethods.isEmpty()) { if (properties == null) { properties = new ArrayList(annotatedMethods.size()); for (Map.Entry entry : annotatedMethods.entrySet()) { Method m = entry.getValue(); ManagedProperty property = m.getAnnotation(ManagedProperty.class); String alias = property.name(); if (alias != null && alias.length() == 0) { alias = null; } ManagedBeanInfo.ManagedProperty propertyInfo = new ManagedBeanInfo.ManagedProperty(alias, entry.getKey(), m.getParameterTypes()[0].getName(), property.value(), null, null); properties.add(propertyInfo); } } } */ return new ManagedBeanInfo(name, annotatedClass.getName(), scope, eager, null, null, properties, null); } private void collectAnnotatedMethods(Class baseClass, Map annotatedMethods, Set annotatedFields) { Method[] methods = baseClass.getDeclaredMethods(); for (Method method : methods) { ManagedProperty property = method.getAnnotation(ManagedProperty.class); if (property != null) { if (!method.getName().startsWith("set") || method.getParameterTypes().length != 1) { continue; } StringBuilder sb = new StringBuilder(method.getName().substring(3)); char c = sb.charAt(0); sb.deleteCharAt(0); sb.insert(0, Character.toLowerCase(c)); String propName = sb.toString(); if (!annotatedFields.contains(propName) && !annotatedMethods.containsKey(propName)) { annotatedMethods.put(propName, method); } } } Class superClass = baseClass.getSuperclass(); if (!Object.class.equals(superClass)) { collectAnnotatedMethods(superClass, annotatedMethods, annotatedFields); } } private void collectAnnotatedFields(Class baseClass, Map annotatedFields) { Field[] fields = baseClass.getDeclaredFields(); for (Field field : fields) { ManagedProperty property = field.getAnnotation(ManagedProperty.class); if (property != null) { String propName = property.name(); if (propName == null || propName.length() == 0) { propName = field.getName(); } // if the field has already been collected, don't replace the existing // value as that value represents an override. if (!annotatedFields.containsKey(propName)) { annotatedFields.put(propName, field); } } } Class superClass = baseClass.getSuperclass(); if (!Object.class.equals(superClass)) { collectAnnotatedFields(superClass, annotatedFields); } } private String getScope(Class annotatedClass) { for (Class scope : SCOPES) { //noinspection unchecked Annotation a = annotatedClass.getAnnotation((Class) scope); if (a != null) { if (a instanceof RequestScoped) { return "request"; } else if (a instanceof ViewScoped) { return "view"; } if (a instanceof SessionScoped) { return "session"; } else if (a instanceof ApplicationScoped) { return "application"; } else if (a instanceof NoneScoped) { return "none"; } else if (a instanceof CustomScoped) { return ((CustomScoped) a).value(); } } } return "request"; } private String getName(ManagedBean managedBean, Class annotatedClass) { String name = managedBean.name(); if (name.length() == 0) { String t = annotatedClass.getName(); name = t.substring(t.lastIndexOf('.') + 1); char[] nameChars = name.toCharArray(); nameChars[0] = Character.toLowerCase(nameChars[0]); name = new String(nameChars); } return name; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy