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

EntityManagerReferenceHandler

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

Fields Summary
Constructors Summary
public EntityManagerReferenceHandler()

    
Methods Summary
public java.lang.ClassgetAnnotationType()

return
the annoation type this annotation handler is handling

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

            
        EntityManagerReferenceDescriptor emRefs[] =
                new EntityManagerReferenceDescriptor[rcContexts.length];
        for (int i = 0; i < rcContexts.length; i++) {
            EntityManagerReferenceDescriptor emRef =
                (EntityManagerReferenceDescriptor)rcContexts[i].
                    getEntityManagerReference(logicalName);
            if (emRef == null) {
                emRef = new EntityManagerReferenceDescriptor();
                rcContexts[i].addEntityManagerReferenceDescriptor
                    (emRef);
            }
            emRefs[i] = emRef;
        }

        return emRefs;
    
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
return
HandlerProcessingResult


        AnnotatedElementHandler aeHandler = 
            ainfo.getProcessingContext().getHandler();
        if (aeHandler instanceof AppClientContext) {
            // application client does not support @PersistenceContext
            String msg = localStrings.getLocalString(
                "enterprise.deployment.annotation.handlers.invalidaehandler",
                "Invalid annotation symbol found for this type of class.");
            log(Level.SEVERE, ainfo, msg);
            return getDefaultProcessedResult();
        }
        PersistenceContext emRefAn = (PersistenceContext)ainfo.getAnnotation();
        return processEmRef(ainfo, rcContexts, emRefAn);
    
protected com.sun.enterprise.deployment.annotation.HandlerProcessingResultprocessEmRef(com.sun.enterprise.deployment.annotation.AnnotationInfo ainfo, com.sun.enterprise.deployment.annotation.context.ResourceContainerContext[] rcContexts, javax.persistence.PersistenceContext emRefAn)
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.

        EntityManagerReferenceDescriptor emRefs[] = null;

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

            String logicalName = emRefAn.name();

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

            emRefs = getEmReferenceDescriptors(logicalName, rcContexts);
            
            InjectionTarget target = new InjectionTarget();
            target.setFieldName(f.getName());
            target.setClassName(targetClassName);            
            for (EntityManagerReferenceDescriptor emRef : emRefs) {
                
                emRef.addInjectionTarget(target);
            
                if (emRef.getName().length() == 0) { // a new one
                    processNewEmRefAnnotation(emRef, logicalName, emRefAn);
                }
            }
        } else if (ElementType.METHOD.equals(ainfo.getElementType())) {

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

            String logicalName = emRefAn.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);

            emRefs = getEmReferenceDescriptors(logicalName, rcContexts);
            
            InjectionTarget target = new InjectionTarget();
            target.setMethodName(m.getName());
            target.setClassName(targetClassName);                   
            for (EntityManagerReferenceDescriptor emRef : emRefs) {
                
                emRef.addInjectionTarget(target);

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

                    processNewEmRefAnnotation(emRef, logicalName, emRefAn);

                }
            }
        } else if( ElementType.TYPE.equals(ainfo.getElementType()) ) {
            // name() is required for TYPE-level usage
            String logicalName = emRefAn.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();
            }
                               
            emRefs = getEmReferenceDescriptors(logicalName, rcContexts);
            for (EntityManagerReferenceDescriptor emRef : emRefs) {
                if (emRef.getName().length() == 0) { // a new one

                    processNewEmRefAnnotation(emRef, logicalName, emRefAn);
                                            
                }
            }
        } 

        return getDefaultProcessedResult();
    
private voidprocessNewEmRefAnnotation(com.sun.enterprise.deployment.EntityManagerReferenceDescriptor emRef, java.lang.String logicalName, javax.persistence.PersistenceContext annotation)

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

        emRef.setPersistenceContextType(annotation.type());

        // Add each property from annotation to descriptor, unless
        // it has been overridden within the .xml.
        Map existingProperties = emRef.getProperties();

        for(PersistenceProperty next : annotation.properties()) {
            if( !existingProperties.containsKey(next.name()) ) {
                emRef.addProperty(next.name(), next.value());
            }
        }