FileDocCategorySizeDatePackage
EntityManagerFactoryReferenceHandler.javaAPI DocGlassfish v2 API9186Fri May 04 22:31:34 BST 2007com.sun.enterprise.deployment.annotation.handlers

EntityManagerFactoryReferenceHandler

public class EntityManagerFactoryReferenceHandler extends AbstractResourceHandler
This handler is responsible for handling the javax.persistence.PersistenceUnit annotation.

Fields Summary
Constructors Summary
public EntityManagerFactoryReferenceHandler()

    
Methods Summary
public java.lang.ClassgetAnnotationType()

return
the annoation type this annotation handler is handling

        return PersistenceUnit.class;
    
private com.sun.enterprise.deployment.EntityManagerFactoryReferenceDescriptor[]getEmfReferenceDescriptors(java.lang.String logicalName, com.sun.enterprise.deployment.annotation.context.ResourceContainerContext[] rcContexts)
Return EntityManagerFactoryReferenceDescriptors with given name if exists or a new one without name being set.

            
        EntityManagerFactoryReferenceDescriptor emfRefs[] =
                new EntityManagerFactoryReferenceDescriptor[rcContexts.length];
        for (int i = 0; i < rcContexts.length; i++) {
            EntityManagerFactoryReferenceDescriptor emfRef =
                (EntityManagerFactoryReferenceDescriptor)rcContexts[i].
                    getEntityManagerFactoryReference(logicalName);
            if (emfRef == null) {
                emfRef = new EntityManagerFactoryReferenceDescriptor();
                rcContexts[i].addEntityManagerFactoryReferenceDescriptor
                    (emfRef);
            }
            emfRefs[i] = emfRef;
        }

        return emfRefs;
    
protected com.sun.enterprise.deployment.annotation.HandlerProcessingResultprocessAnnotation(com.sun.enterprise.deployment.annotation.AnnotationInfo ainfo, com.sun.enterprise.deployment.annotation.context.ResourceContainerContext[] rcContexts)
Process a particular annotation which type is the same as the one returned by @see getAnnotationType(). All information pertinent to the annotation and its context is encapsulated in the passed AnnotationInfo instance.

param
ainfo the annotation information
param
rcContexts an array of ResourceContainerContext
param
HandlerProcessingResult


        PersistenceUnit emfRefAn = (PersistenceUnit)ainfo.getAnnotation();
        return processEmfRef(ainfo, rcContexts, emfRefAn);
    
protected com.sun.enterprise.deployment.annotation.HandlerProcessingResultprocessEmfRef(com.sun.enterprise.deployment.annotation.AnnotationInfo ainfo, com.sun.enterprise.deployment.annotation.context.ResourceContainerContext[] rcContexts, javax.persistence.PersistenceUnit emfRefAn)
Process a particular annotation which type is the same as the one returned by @see getAnnotationType(). All information pertinent to the annotation and its context is encapsulated in the passed AnnotationInfo instance.

        EntityManagerFactoryReferenceDescriptor emfRefs[] = null;

        if (ElementType.FIELD.equals(ainfo.getElementType())) {
            Field f = (Field)ainfo.getAnnotatedElement();
            String targetClassName = f.getDeclaringClass().getName();

            String logicalName = emfRefAn.name();
                
            // applying with default 
            if (logicalName.equals("")) {
                logicalName = targetClassName + "/" + f.getName();
            }

            emfRefs = getEmfReferenceDescriptors(logicalName, rcContexts);
            
            InjectionTarget target = new InjectionTarget();
            target.setFieldName(f.getName());
            target.setClassName(targetClassName);
            for (EntityManagerFactoryReferenceDescriptor emfRef : emfRefs) {
                emfRef.addInjectionTarget(target);

                if (emfRef.getName().length() == 0) { // a new one
                    processNewEmfRefAnnotation(emfRef, logicalName, emfRefAn);
                }
            }
        } else if (ElementType.METHOD.equals(ainfo.getElementType())) {

            Method m = (Method)ainfo.getAnnotatedElement();
            String targetClassName = m.getDeclaringClass().getName();

            String logicalName = emfRefAn.name();
            if( logicalName.equals("") ) {
                // Derive javabean property name.
                String propertyName = 
                    getInjectionMethodPropertyName(m, ainfo);

                // prefixing with fully qualified type name
                logicalName = targetClassName + "/" + propertyName;
            }

            validateInjectionMethod(m, ainfo);

            emfRefs = getEmfReferenceDescriptors(logicalName, rcContexts);

            InjectionTarget target = new InjectionTarget();
            target.setMethodName(m.getName());
            target.setClassName(targetClassName);            
            for (EntityManagerFactoryReferenceDescriptor emfRef : emfRefs) {

                emfRef.addInjectionTarget(target);

                if (emfRef.getName().length() == 0) { // a new one

                    processNewEmfRefAnnotation(emfRef, logicalName, emfRefAn);

                }
            }
        } else if( ElementType.TYPE.equals(ainfo.getElementType()) ) {
            // name() is required for TYPE-level usage
            String logicalName = emfRefAn.name();

            if( "".equals(logicalName) ) {
                Class c = (Class) ainfo.getAnnotatedElement();
                log(Level.SEVERE, ainfo,
                    localStrings.getLocalString(
                    "enterprise.deployment.annotation.handlers.nonametypelevel",
                    "TYPE-Level annotation symbol on class must specify name."));
                return getDefaultFailedResult();
            }
                               
            emfRefs = getEmfReferenceDescriptors(logicalName, rcContexts);
            for (EntityManagerFactoryReferenceDescriptor emfRef : emfRefs) {
                if (emfRef.getName().length() == 0) { // a new one

                    processNewEmfRefAnnotation(emfRef, logicalName, emfRefAn);
                                            
                }
            }
        } 

        return getDefaultProcessedResult();
    
private voidprocessNewEmfRefAnnotation(com.sun.enterprise.deployment.EntityManagerFactoryReferenceDescriptor emfRef, java.lang.String logicalName, javax.persistence.PersistenceUnit annotation)

        
        emfRef.setName(logicalName);
        
        if( !(annotation.unitName().equals("")) ) {
            emfRef.setUnitName(annotation.unitName());
        }