EnvEntry does not work properly
-------------------------------

         Key: EJB-23
         URL: http://jira.andromda.org/browse/EJB-23
     Project: EJB Cartridge
        Type: Bug
 Environment: All platforms
    Reporter: Raj Subramani
 Assigned to: Chad Brandon 


I have logged the bugs that need fixing (3 in total) and hope you or anyone 
else maintaing this module will be able to incorporate my fixes.

The following entry in SessionBean.vsl in andromda-ejb-cartridge-3.*.jar (line 
94 to line 147)
Code:

line 94        // -- accessors for environment entries --
line 95    #foreach($envEntry in $service.getEnvironmentEntries(true))
line 96        /**
line 97         * Get <em>${envEntry.name}</em> environment entry.
line 98    $envEntry.getDocumentation("     * ")
line 99         *
line100    ## Only expose the method to the component interface if it is public.
line101    #if($visibility == "public")
line102         * @ejb.interface-method
line103    #end
line104         */
line105        $visibility $envEntry.type.fullyQualifiedName 
${attribute.getterName}()
line106        {
line107            javax.naming.InitialContext initialContext = null;
line108            try
line109            {
line110                initialContext = new javax.naming.InitialContext();
line111                return (${envEntry.type.fullyQualifiedName}) line112    
initialContext.lookup("java:comp/env/$envEntry.name");
line113            }
line114            catch (javax.naming.NamingException cause)
line115            {
line116                RuntimeException ex = new IllegalStateException(
line117                    "Cannot access environment entry 
\"$envEntry.name\".");
line118                // In order to set the exception cause on JDK 1.4
line119                // and stay JDK 1.3 compatible nonetheless, we need
line120                // a bit of reflection magic here...
line121                try
line122                {
line123                    java.lang.reflect.Method initCause =
line124                      ex.getClass().getMethod("initCause",
                                        new Class[] {Throwable.class});
line125                    initCause.invoke(ex, new Object[] { cause });
line126                }
line127                catch (Throwable t)
line128                {
line129                   // Ignore any errors here - we simply make do without 
the cause
line130                }
line131                throw ex;
line132            }
line133            finally
line134            {
line135                try
line136                {
line137                    if (initialContext != null)
line138                    {
line139                        initialContext.close();
line140                    }
line141                }
line142                catch (javax.naming.NamingException ignore)
line143                {
line144                    // Silently ignore naming exceptions at cleanup time
line145                }
line146            }
line147    #end




has the following bugs:

1.
Error
-----
$visibility in line 101 is not set

Fix
---
Add the line
Code:

     #set ($visibility = $envEntry.visibility)


2.
Error
-----
$visibility $envEntry.type.fullyQualifiedName ${attribute.getterName}(), line 
105, is incorrect

Fix
---
Replace with the line
Code:

     $visibility $envEntry.type.fullyQualifiedName ${envEntry.getterName}()


3.
Error
-----
Closing brace before #end in line 147 is missing

Fix
---
Replace line 146 and line 147 with the following 3 lines
Code:

        }
    }
#end


I have only one observation to make and wish some feedback. The ServiceBean and 
the Local and Remote interfaces have getter methods for each of the env entries 
but these methods do not exist in ServiceBeanImpl.java. Now either, the 
ServiceBean.java must declare these methods as abstract and the implementation 
moved to ServiceBeanImpl.java, or, the Remote and Local interfaces should not 
generate the getter methods (I prefer the latter, which would mean that the 
SessionRemote.vsl and SessionLocal.vsl also have to be modified, someone please 
comment?).

The new SessionBean.vsl now looks as follows:

Code:

// license-header java merge-point
/* Autogenerated by AndroMDA (SessionBean.vsl) - do not edit */
#if ($stringUtils.isNotBlank($service.packageName))
package $service.packageName;
#end

/**
 * Autogenerated EJB implementation class for the $service.name session bean.
$service.getDocumentation(" * ")
 *
#if ($service.abstract)
 * @ejb.bean generate="false"
#else
 * @ejb.bean generate="true"
#end
 *     name="$service.name"
 *     type="$service.type"
 *     view-type="$service.viewType"
 *     jndi-name = "${service.jndiName}/Remote"
 *     local-jndi-name = "${service.jndiName}/Local"
 *
 * @ejb.interface
 *     local-class="${service.fullyQualifiedName}Local"
 *     remote-class="${service.fullyQualifiedName}"
 * @ejb.home
 *     local-class="${service.fullyQualifiedName}LocalHome"
 *     remote-class="${service.fullyQualifiedName}Home"
 * @ejb.transaction type="$service.transactionType"
 *
 * @ejb.util generate="physical"
 *
#foreach($envEntry in $service.getEnvironmentEntries(true))
#set ($value = $envEntry.defaultValue)
## Add string delimiters if they are not already present
#if (!$value.startsWith('"') || !$value.endsWith('"'))
#set ($value = "$value")
#end
 * @ejb.env-entry
 *     name="$envEntry.name"
 *     type="$envEntry.type.fullyQualifiedName"
 *     value="$value"
 *
#end
#foreach ( $dependency in $service.sourceDependencies )
#if ($dependency.hasStereotype("EntityRef") || 
$dependency.hasStereotype("ServiceRef"))
#set ($reference = $dependency.targetElement)
 * @ejb.ejb-ref
 *     ejb-name="${reference.name}"
 *     view-type="$reference.viewType"
 *     ref-name="ejb/${reference.name}BeanRef"
 *
#end
#if ($dependency.hasStereotype("ResourceRef"))
#set ($reference = $dependency.targetElement)
#set ($jndiRef = 
$dependency.findTaggedValue("@andromda.ejb.resource-ref.jndi-name"))
#set ($resAuth = 
$dependency.findTaggedValue("@andromda.ejb.resource-ref.res-auth"))
#if (!$resAuth)
#set ($resAuth = "Container")
#end
#set ($resName = $dependency.name)
#if (!$resName)
#set ($resName = $reference.name)
#end
 * @ejb.resource-ref
 *     res-ref-name="resource/$resName"
 *     res-type="${reference.fullyQualifiedName}"
 *     res-auth="$resAuth"
 *
#if ($jndiRef)
 * @jboss.resource-ref
 *     res-ref-name = "resource/$resName"
 *     jndi-name = "$jndiRef"
 *
 * @weblogic.resource-description
 *   res-ref-name= "resource/$resName"
 *   jndi-name= "$jndiRef"
 *
 * @websphere.bean
#end
#end
#end
 */
public abstract class ${service.name}Bean
#if($service.generalization)
    extends ${service.generalization.fullyQualifiedName}BeanImpl
#end
    implements javax.ejb.SessionBean
{
    // ----------- constant definitions -----------
#foreach($constant in $service.getConstants(true))
    private static final $constant.type.fullyQualifiedName $constant.name = 
$constant.defaultValue;
#end


    // -- accessors for environment entries --
#foreach($envEntry in $service.getEnvironmentEntries(true))
    /**
     * Get <em>${envEntry.name}</em> environment entry.
$envEntry.getDocumentation("     * ")
     *
## Only expose the method to the component interface if it is public.
#set ($visibility = $envEntry.visibility)
#if($visibility == "public")
     * @ejb.interface-method
#end
     */
    $visibility $envEntry.type.fullyQualifiedName ${envEntry.getterName}()
    {
        javax.naming.InitialContext initialContext = null;
        try
        {
            initialContext = new javax.naming.InitialContext();
            return (${envEntry.type.fullyQualifiedName}) 
initialContext.lookup("java:comp/env/$envEntry.name");
        }
        catch (javax.naming.NamingException cause)
        {
            RuntimeException ex = new IllegalStateException(
                "Cannot access environment entry \"$envEntry.name\".");
            // In order to set the exception cause on JDK 1.4
            // and stay JDK 1.3 compatible nonetheless, we need
            // a bit of reflection magic here...
            try
            {
                java.lang.reflect.Method initCause =
                  ex.getClass().getMethod("initCause",
                                        new Class[] {Throwable.class});
                initCause.invoke(ex, new Object[] { cause });
            }
            catch (Throwable t)
            {
               // Ignore any errors here - we simply make do without the cause
            }
            throw ex;
        }
        finally
        {
            try
            {
                if (initialContext != null)
                {
                    initialContext.close();
                }
            }
            catch (javax.naming.NamingException ignore)
            {
                // Silently ignore naming exceptions at cleanup time
            }
        }
    }
#end

    // -- accessors for constants --
#foreach($constant in $service.getConstants(true))
    /**
     * Get the <code>$constant.name</code> constant
$constant.getDocumentation("     * ")
#if ($constant.visibility == "public")
     *
     * @ejb.interface-method
#end
    $constant.visibility $constant.type.fullyQualifiedName 
${constant.getterName}()
    {
        return $constant.name;
    }

## If the constant is public, expose it to the home interface as well
#if($constant.visibility == "public")

    /**
     * Home interface method for accessing [EMAIL PROTECTED] 
#${attribute.getterName}}.
     * @ejb.home-method
     * @see #${constant.getterName}
     */
     public $constant.type.fullyQualifiedName ejbHomeGet${constant.name}()
     {
         return ${constant.getterName};
     }
#end
#end

#set ($instanceAttributes = $service.instanceAttributes)
#if(!$instanceAttributes.empty)
    // --------------- attributes ---------------------
#foreach ( $attribute in $instanceAttributes)
#set ($visibility = $attribute.visibility)
    /** The $attribute.name property */
    private $attribute.type.fullyQualifiedName $attribute.name;

    /**
     * Get the ${attribute.name} property
$attribute.getDocumentation("     * ")
     *
#if ($attribute.transactionType)
     * @ejb.transaction type="$attribute.transactionType"
#end
#if($visibility == "public")
     * @ejb.interface-method
#end
     */
    $visibility $attribute.type.fullyQualifiedName ${attribute.getterName}()
    {
       return $attribute.name;
    }

## Only generate a setter if the attribute is not read-only
## Note: It's no use to generate final fields for read-only attributes because
## the fields are likely to be initialized in ejbActivate() or a similiar
## method and not in the constructor.
#if (!$attribute.readOnly)
    /**
     * Set the $attribute.name property
     * @param value the new value
#if($visibility == "public")
     * @ejb.interface-method
#end
#if ($attribute.transactionType)
     * @ejb.transaction type="$attribute.transactionType"
#end
     */
    $visibility void ${attribute.setterName}($attribute.type.fullyQualifiedName 
value)
    {
       this.$attribute.name = value;
    }

#end
#end
#end
    // ---------------- business methods  ----------------------

#foreach ( $operation in $service.businessOperations)
#set ($visibility = $operation.visibility)
   /**
$operation.getDocumentation("    * ")
## Only public methods have transactions and are exported to the interfaces
#if ($visibility == "public")
    * @ejb.interface-method
#if ($operation.transactionType)
    * @ejb.transaction type="$operation.transactionType"
#end
#end
    */
#set ($returnType = $operation.returnType.fullyQualifiedName)
#if ($operation.exceptionsPresent)
    $visibility abstract $returnType $operation.signature throws 
$operation.exceptionList;
#else
    $visibility abstract $returnType $operation.signature;
#end

#end

    // ---------------- create methods --------------------
## Handle explicitly defined create methods. Since we can't know
## what the user intended to do with the arbitrary parameters to these methods,
## we generate an abstract ejbCreate() and delegate the implementation to the 
user.
#foreach ( $operation in $service.getCreateMethods(false))

    /**
$operation.getDocumentation("    * ")
     *
     * @ejb.create-method
     */
    public abstract void ejbCreate($operation.typedArgumentList);

    public void ejbPostCreate($operation.typedArgumentList)
    {
    }
#end
## Default create method with no arguments.

   /**
## Only expose the method to the interface for concrete EJBs
#if (!$service.abstract)
    * @ejb.create-method
#end
    */
    public void ejbCreate() throws javax.ejb.CreateException
    {
    }

    public void ejbPostCreate() throws javax.ejb.CreateException
    {
    }

## Autogenerated create method with all attributes. Only present for stateful 
beans.
#set ($allAttributes = $service.allInstanceAttributes)
#if (!$allAttributes.empty)
    /**
     * Create method with all attribute values.
#set ($inheritedAttributes = $service.inheritedInstanceAttributes)
#foreach($attribute in $allAttributes)
     * @param $attribute.name Value for the ${attribute.name} property
#end
     * @ejb.create-method
     */
    public void ejbCreate($transform.getAttributesAsList($allAttributes, true, 
true))
           throws javax.ejb.CreateException
    {
#if(!$inheritedAttributes.empty)
        // Call ejbCreate method for the super type
        super.ejbCreate($transform.getAttributesAsList($inheritedAttributes, 
false, true));
#end
#foreach ( $attribute in $service.instanceAttributes)
## Don't use a setter here - we may have none if the attribute is marked 
readonly
        this.$attribute.name = $attribute.name;
#end
    }

    public void ejbPostCreate($transform.getAttributesAsList($allAttributes, 
true, true))
        throws javax.ejb.CreateException
    {
#if(!$inheritedAttributes.empty)
        // Call postCreate method for the super type
        
super.ejbPostCreate($transform.getAttributesAsList($inheritedAttributes, false, 
true));
#end
    }
#end

    // ---------------- accessor methods for bean references ---------------

#foreach ( $dependency in $service.sourceDependencies )
#if ($dependency.hasStereotype("EntityRef") || 
$dependency.hasStereotype("ServiceRef"))
#set ($reference = $dependency.targetElement)
#if ($reference.viewType == "local")
#set ($homeInterfaceName = "${reference.name}LocalHome")
#set ($fqHomeInterfaceName = "${reference.fullyQualifiedName}LocalHome")
    /**
     * Get the local home interface of the ${reference.name} bean.
     * The home interface is obtained from the initial context
     * by looking up the bean reference name.
     * @return local home interface for ${reference.name}.
     */
    protected static ${fqHomeInterfaceName} get${homeInterfaceName}()
        throws javax.naming.NamingException
    {
        javax.naming.InitialContext initialContext = new 
javax.naming.InitialContext();
        try
        {
            // Local homes shouldn't be narrowed, as there is no RMI involved.
            ${fqHomeInterfaceName} home =
                (${fqHomeInterfaceName}) 
initialContext.lookup("java:/comp/env/ejb/${reference.name}BeanRef");
            return home;
        }
        finally
        {
            initialContext.close();
        }
    }
#end
#if ($reference.viewType == "remote")
#set ($homeInterfaceName = "${reference.name}Home")
#set ($fqHomeInterfaceName = "${reference.fullyQualifiedName}Home")
    /**
     * Get the remote home interface of the ${reference.name} bean.
     * The home interface is obtained from the initial context
     * by looking up the bean reference name.
     * @return remote home interface for ${reference.name}. Lookup using bean 
ref name.
     */
    protected static ${fqHomeInterfaceName} get${homeInterfaceName}()
        throws javax.naming.NamingException {
        javax.naming.InitialContext initialContext = new 
javax.naming.InitialContext();
        try
        {
            Object home =
                 
initialContext.lookup("java:/comp/env/ejb/${reference.name}BeanRef");
            return ($fqHomeInterfaceName)
                   javax.rmi.PortableRemoteObject.narrow(home,
                   ${fqHomeInterfaceName}.class);
        }
        finally
        {
            initialContext.close();
        }
    }
#end
#end
#if ($dependency.hasStereotype("ResourceRef"))
#set ($reference = $dependency.targetElement)
#set ($resClassName = "$referencedClass.fullyQualifiedName}")
#set ($resName = $dependency.name)
#if (!$resName)
#set ($resName = $reference.name)
#end
    /**
     * Get the ${resName} resource.
     * The resource is obtained by looking up
     * <code>java:/comp/env/resource/$resName</code> in JNDI
     * @return the ${resName} resource
     */
    protected static ${resClassName} get${stringUtils.capitalize($resName)}()
        throws javax.naming.NamingException
    {
        javax.naming.InitialContext initialContext =
            new javax.naming.InitialContext();
        try
        {
            Object resource =
                 initialContext.lookup("java:/comp/env/resource/$resName");
            return ($resClassName) resource;
        }
        finally
        {
            initialContext.close();
        }
    }
#end
#end

    private javax.ejb.SessionContext context;

    public void setSessionContext(javax.ejb.SessionContext ctx)
    {
        context = ctx;
    }

    public void ejbRemove()
    {
    }

    public void ejbPassivate()
    {
    }

    public void ejbActivate()
    {
    }
}


Cheers
-raj




-------------------------------------------------------
This SF.Net email is sponsored by:
Power Architecture Resource Center: Free content, downloads, discussions,
and more. http://solutions.newsforge.com/ibmarch.tmpl

Reply via email to