Search in sources :

Example 1 with ServiceInterfaceGenerator

use of com.sun.ejb.codegen.ServiceInterfaceGenerator in project Payara by payara.

the class SafeProperties method initializeHome.

/**
 * Called from the ContainerFactory during initialization.
 */
protected void initializeHome() throws Exception {
    if (isWebServiceEndpoint) {
        EjbBundleDescriptorImpl bundle = ejbDescriptor.getEjbBundleDescriptor();
        WebServicesDescriptor webServices = bundle.getWebServices();
        Collection myEndpoints = webServices.getEndpointsImplementedBy(ejbDescriptor);
        // An ejb can only be exposed through 1 web service endpoint
        Iterator iter = myEndpoints.iterator();
        webServiceEndpoint = (com.sun.enterprise.deployment.WebServiceEndpoint) iter.next();
        Class serviceEndpointIntfClass = loader.loadClass(webServiceEndpoint.getServiceEndpointInterface());
        if (!serviceEndpointIntfClass.isInterface()) {
            ServiceInterfaceGenerator generator = new ServiceInterfaceGenerator(loader, ejbClass);
            serviceEndpointIntfClass = EJBUtils.generateSEI(generator, generator.getGeneratedClass(), loader, this.ejbClass);
            if (serviceEndpointIntfClass == null) {
                throw new RuntimeException(localStrings.getLocalString("ejb.error_generating_sei", "Error in generating service endpoint interface class for EJB class {0}", this.ejbClass));
            }
        }
        Class tieClass = null;
        WebServiceInvocationHandler invocationHandler = new WebServiceInvocationHandler(ejbClass, webServiceEndpoint, serviceEndpointIntfClass, ejbContainerUtilImpl, webServiceInvocationInfoMap);
        invocationHandler.setContainer(this);
        Object servant = (Object) Proxy.newProxyInstance(loader, new Class[] { serviceEndpointIntfClass }, invocationHandler);
        // starting in 2.0, there is no more generated Ties
        if (webServiceEndpoint.getTieClassName() != null) {
            tieClass = loader.loadClass(webServiceEndpoint.getTieClassName());
        }
        // Create a facade for container services to be used by web services runtime.
        EjbEndpointFacade endpointFacade = new EjbEndpointFacadeImpl(this, ejbContainerUtilImpl);
        wsejbEndpointRegistry = Globals.getDefaultHabitat().getService(WSEjbEndpointRegistry.class);
        if (wsejbEndpointRegistry != null) {
            wsejbEndpointRegistry.registerEndpoint(webServiceEndpoint, endpointFacade, servant, tieClass);
        } else {
            throw new DeploymentException(localStrings.getLocalString("ejb.no_webservices_module", "EJB-based Webservice endpoint is detected but there is no webservices module installed to handle it"));
        }
    }
    Map<String, Object> intfsForPortableJndi = new HashMap<String, Object>();
    // Root of portable global JNDI name for this bean
    String javaGlobalName = getJavaGlobalJndiNamePrefix();
    if (isRemote) {
        boolean disableNonPortableJndiName = false;
        Boolean disableInDD = ejbDescriptor.getEjbBundleDescriptor().getDisableNonportableJndiNames();
        if (disableInDD != null) {
            // explicitly set in glassfish-ejb-jar.xml
            disableNonPortableJndiName = disableInDD;
        } else {
            String disableInServer = ejbContainerUtilImpl.getEjbContainer().getPropertyValue(RuntimeTagNames.DISABLE_NONPORTABLE_JNDI_NAMES);
            disableNonPortableJndiName = Boolean.valueOf(disableInServer);
        }
        String glassfishSpecificJndiName = null;
        if (!disableNonPortableJndiName) {
            // This is either the default glassfish-specific (non-portable)
            // global JNDI name or the one specified via mappedName(), sun-ejb-jar.xml,
            // etc.
            glassfishSpecificJndiName = ejbDescriptor.getJndiName();
            // clashes.
            if ((glassfishSpecificJndiName != null) && (glassfishSpecificJndiName.equals("") || glassfishSpecificJndiName.equals(javaGlobalName))) {
                glassfishSpecificJndiName = null;
            }
        }
        if (hasRemoteHomeView) {
            this.ejbHomeImpl = instantiateEJBHomeImpl();
            this.ejbHome = ejbHomeImpl.getEJBHome();
            // Since some containers might create multiple EJBObjects for
            // the same ejb, make sure we use the same Proxy class to
            // instantiate all the proxy instances.
            ejbObjectProxyClass = Proxy.getProxyClass(loader, new Class[] { remoteIntf });
            ejbObjectProxyCtor = ejbObjectProxyClass.getConstructor(new Class[] { InvocationHandler.class });
            // 
            // Make sure all Home/Remote interfaces conform to RMI-IIOP
            // rules.  Checking for conformance here keeps the exposed
            // deployment/startup error behavior consistent since when
            // rmic is used during codegen it makes equivalent checks and
            // treats any validation problems as fatal errors.
            // 
            // These same checks will be made when setTarget is called
            // in POARemoteReferenceFactory.preinvoke, but that happens
            // only when the actual invocation is made, so it's better to
            // know at container initialization time if there is a problem.
            // 
            getProtocolManager().validateTargetObjectInterfaces(this.ejbHome);
            // Unlike the Home, each of the concrete containers are
            // responsible for creating the EJBObjects, so just create
            // a dummy EJBObjectImpl for validation purposes.
            EJBObjectImpl dummyEJBObjectImpl = instantiateEJBObjectImpl();
            EJBObject dummyEJBObject = (EJBObject) dummyEJBObjectImpl.getEJBObject();
            getProtocolManager().validateTargetObjectInterfaces(dummyEJBObject);
            // Remotereference factory needs instances of
            // Home and Remote to get repository Ids since it doesn't have
            // stubs and ties.  This must be done before any Home or Remote
            // references are created.
            remoteHomeRefFactory.setRepositoryIds(homeIntf, remoteIntf);
            // get a remote ref for the EJBHome
            ejbHomeStub = (EJBHome) remoteHomeRefFactory.createHomeReference(homeInstanceKey);
            // Add 2.x Home for later portable JNDI name processing.
            intfsForPortableJndi.put(ejbDescriptor.getHomeClassName(), ejbHomeStub);
            // this was the original use of the jndi name.
            if (glassfishSpecificJndiName != null) {
                JndiInfo jndiInfo = JndiInfo.newNonPortableRemote(glassfishSpecificJndiName, ejbHomeStub);
                jndiInfoMap.put(jndiInfo.name, jndiInfo);
            }
        }
        if (hasRemoteBusinessView) {
            this.ejbRemoteBusinessHomeImpl = instantiateEJBRemoteBusinessHomeImpl();
            this.ejbRemoteBusinessHome = ejbRemoteBusinessHomeImpl.getEJBHome();
            // RMI-IIOP validation
            getProtocolManager().validateTargetObjectInterfaces(this.ejbRemoteBusinessHome);
            for (RemoteBusinessIntfInfo next : remoteBusinessIntfInfo.values()) {
                next.proxyClass = Proxy.getProxyClass(loader, new Class[] { next.generatedRemoteIntf });
                next.proxyCtor = next.proxyClass.getConstructor(new Class[] { InvocationHandler.class });
                // Remotereference factory needs instances of
                // Home and Remote to get repository Ids since it
                // doesn't have stubs and ties.  This must be done before
                // any Home or Remote references are created.
                next.referenceFactory.setRepositoryIds(remoteBusinessHomeIntf, next.generatedRemoteIntf);
                // selected, so just do it the first time through the loop.
                if (ejbRemoteBusinessHomeStub == null) {
                    ejbRemoteBusinessHomeStub = (EJBHome) next.referenceFactory.createHomeReference(homeInstanceKey);
                }
            }
            EJBObjectImpl dummyEJBObjectImpl = instantiateRemoteBusinessObjectImpl();
            // Internal jndi name under which remote business home is registered for
            // glassfish-specific remote business JNDI names
            String remoteBusinessHomeJndiName = null;
            if (glassfishSpecificJndiName != null) {
                remoteBusinessHomeJndiName = EJBUtils.getRemote30HomeJndiName(glassfishSpecificJndiName);
            }
            // Convenience location for common case of 3.0 session bean with only
            // 1 remote business interface and no adapted remote home.  Allows a
            // stand-alone client to access 3.0 business interface by using simple
            // jndi name.  Each remote business interface is also always available
            // at <jndi-name>#<business_interface_name>.  This is needed for the
            // case where the bean has an adapted remote home and/or multiple business
            // interfaces.
            String simpleRemoteBusinessJndiName = null;
            if ((glassfishSpecificJndiName != null) && !hasRemoteHomeView && remoteBusinessIntfInfo.size() == 1) {
                simpleRemoteBusinessJndiName = glassfishSpecificJndiName;
            }
            // We need a separate name for the internal generated home object to
            // support the portable global JNDI names for business interfaces.
            // There won't necessarily be a glassfish-specific name specified so
            // it's cleaner to just always use a separate ones.
            String internalHomeJndiNameForPortableRemoteNames = EJBUtils.getRemote30HomeJndiName(javaGlobalName);
            for (RemoteBusinessIntfInfo next : remoteBusinessIntfInfo.values()) {
                java.rmi.Remote dummyEJBObject = dummyEJBObjectImpl.getEJBObject(next.generatedRemoteIntf.getName());
                getProtocolManager().validateTargetObjectInterfaces(dummyEJBObject);
                if (glassfishSpecificJndiName != null) {
                    next.jndiName = EJBUtils.getRemoteEjbJndiName(true, next.remoteBusinessIntf.getName(), glassfishSpecificJndiName);
                    Reference remoteBusRef = new Reference(next.remoteBusinessIntf.getName(), new StringRefAddr("url", remoteBusinessHomeJndiName), "com.sun.ejb.containers.RemoteBusinessObjectFactory", null);
                    // Glassfish-specific JNDI name for fully-qualified 3.0 Remote business interface.
                    JndiInfo jndiInfo = JndiInfo.newNonPortableRemote(next.jndiName, remoteBusRef);
                    jndiInfoMap.put(jndiInfo.name, jndiInfo);
                }
                if (simpleRemoteBusinessJndiName != null) {
                    Reference remoteBusRef = new Reference(next.remoteBusinessIntf.getName(), new StringRefAddr("url", remoteBusinessHomeJndiName), "com.sun.ejb.containers.RemoteBusinessObjectFactory", null);
                    // Glassfish-specific JNDI name for simple 3.0 Remote business interface lookup.
                    // Applicable when the bean exposes only a single Remote 3.x client view.
                    JndiInfo jndiInfo = JndiInfo.newNonPortableRemote(simpleRemoteBusinessJndiName, remoteBusRef);
                    jndiInfoMap.put(jndiInfo.name, jndiInfo);
                }
                Reference remoteBusRef = new Reference(next.remoteBusinessIntf.getName(), new StringRefAddr("url", internalHomeJndiNameForPortableRemoteNames), "com.sun.ejb.containers.RemoteBusinessObjectFactory", null);
                // Always register portable JNDI name for each remote business view
                intfsForPortableJndi.put(next.remoteBusinessIntf.getName(), remoteBusRef);
            }
            if (remoteBusinessHomeJndiName != null) {
                // Glassfish-specific JNDI name for internal generated
                // home object used by container
                JndiInfo jndiInfo = JndiInfo.newNonPortableRemote(remoteBusinessHomeJndiName, ejbRemoteBusinessHomeStub);
                jndiInfo.setInternal(true);
                jndiInfoMap.put(jndiInfo.name, jndiInfo);
            }
            // Always registeer internal name for home in support of portable global
            // remote business JNDI names.
            JndiInfo jndiInfo = JndiInfo.newPortableRemote(internalHomeJndiNameForPortableRemoteNames, ejbRemoteBusinessHomeStub);
            jndiInfo.setInternal(true);
            jndiInfoMap.put(jndiInfo.name, jndiInfo);
            // lookup logic that depends on ejbDescriptor.getJndiName() will work.
            if (glassfishSpecificJndiName == null) {
                ejbDescriptor.setJndiName(javaGlobalName);
            }
        }
    }
    if (isLocal) {
        if (hasLocalHomeView) {
            this.ejbLocalHomeImpl = instantiateEJBLocalHomeImpl();
            this.ejbLocalHome = ejbLocalHomeImpl.getEJBLocalHome();
            // Since some containers might create multiple EJBLocalObjects
            // for the same ejb, make sure we use the same Proxy class to
            // instantiate all the proxy instances.
            Class ejbLocalObjectProxyClass = Proxy.getProxyClass(loader, new Class[] { IndirectlySerializable.class, localIntf });
            ejbLocalObjectProxyCtor = ejbLocalObjectProxyClass.getConstructor(new Class[] { InvocationHandler.class });
            // Portable JNDI name for EJB 2.x LocalHome.  We don't provide a
            // glassfish-specific way of accessing Local EJBs.
            JavaGlobalJndiNamingObjectProxy namingProxy = new JavaGlobalJndiNamingObjectProxy(this, localHomeIntf.getName());
            intfsForPortableJndi.put(localHomeIntf.getName(), namingProxy);
        }
        if (hasLocalBusinessView) {
            ejbLocalBusinessHomeImpl = instantiateEJBLocalBusinessHomeImpl();
            ejbLocalBusinessHome = (GenericEJBLocalHome) ejbLocalBusinessHomeImpl.getEJBLocalHome();
            Class[] proxyInterfaces = new Class[localBusinessIntfs.size() + 1];
            proxyInterfaces[0] = IndirectlySerializable.class;
            int index = 1;
            for (Class next : localBusinessIntfs) {
                proxyInterfaces[index] = next;
                index++;
            }
            Class proxyClass = Proxy.getProxyClass(loader, proxyInterfaces);
            ejbLocalBusinessObjectProxyCtor = proxyClass.getConstructor(new Class[] { InvocationHandler.class });
            for (Class next : localBusinessIntfs) {
                // Portable JNDI name for EJB 3.x Local business interface.
                // We don't provide a glassfish-specific way of accessing Local EJBs.
                JavaGlobalJndiNamingObjectProxy namingProxy = new JavaGlobalJndiNamingObjectProxy(this, next.getName());
                intfsForPortableJndi.put(next.getName(), namingProxy);
            }
        }
        if (hasOptionalLocalBusinessView) {
            EJBLocalHomeImpl obj = instantiateEJBOptionalLocalBusinessHomeImpl();
            ejbOptionalLocalBusinessHomeImpl = (EJBLocalHomeImpl) obj;
            ejbOptionalLocalBusinessHome = (GenericEJBLocalHome) ejbOptionalLocalBusinessHomeImpl.getEJBLocalHome();
            Class[] proxyInterfaces = new Class[2];
            proxyInterfaces[0] = IndirectlySerializable.class;
            String optionalIntfName = EJBUtils.getGeneratedOptionalInterfaceName(ejbClass.getName());
            proxyInterfaces[1] = ejbGeneratedOptionalLocalBusinessIntfClass = optIntfClassLoader.loadClass(optionalIntfName);
            Class proxyClass = Proxy.getProxyClass(loader, proxyInterfaces);
            ejbOptionalLocalBusinessObjectProxyCtor = proxyClass.getConstructor(new Class[] { InvocationHandler.class });
            // Portable JNDI name for no-interface view.
            // We don't provide a glassfish-specific way of accessing the
            // no-interface view of a session bean.
            JavaGlobalJndiNamingObjectProxy namingProxy = new JavaGlobalJndiNamingObjectProxy(this, ejbClass.getName());
            intfsForPortableJndi.put(ejbClass.getName(), namingProxy);
        }
    }
    for (Map.Entry<String, Object> entry : intfsForPortableJndi.entrySet()) {
        String intf = entry.getKey();
        String fullyQualifiedJavaGlobalName = javaGlobalName + "!" + intf;
        Object namingProxy = entry.getValue();
        boolean local = (namingProxy instanceof JavaGlobalJndiNamingObjectProxy);
        if (intfsForPortableJndi.size() == 1) {
            JndiInfo jndiInfo = local ? JndiInfo.newPortableLocal(javaGlobalName, namingProxy) : JndiInfo.newPortableRemote(javaGlobalName, namingProxy);
            jndiInfoMap.put(jndiInfo.name, jndiInfo);
        }
        JndiInfo jndiInfo = local ? JndiInfo.newPortableLocal(fullyQualifiedJavaGlobalName, namingProxy) : JndiInfo.newPortableRemote(fullyQualifiedJavaGlobalName, namingProxy);
        jndiInfoMap.put(jndiInfo.name, jndiInfo);
    }
    for (Map.Entry<String, JndiInfo> entry : jndiInfoMap.entrySet()) {
        JndiInfo jndiInfo = entry.getValue();
        try {
            jndiInfo.publish(this.namingManager);
            if (jndiInfo.internal) {
                publishedInternalGlobalJndiNames.add(jndiInfo.name);
            } else {
                if (jndiInfo.portable) {
                    publishedPortableGlobalJndiNames.add(jndiInfo.name);
                } else {
                    publishedNonPortableGlobalJndiNames.add(jndiInfo.name);
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(localStrings.getLocalString("ejb.error_binding_jndi_name", "Error while binding JNDI name {0} for EJB {1}", jndiInfo.name, this.ejbDescriptor.getName()), e);
        }
    }
    if (!publishedPortableGlobalJndiNames.isEmpty()) {
        _logger.log(Level.INFO, PORTABLE_JNDI_NAMES, new Object[] { this.ejbDescriptor.getName(), publishedPortableGlobalJndiNames });
    }
    if (!publishedNonPortableGlobalJndiNames.isEmpty()) {
        _logger.log(Level.INFO, GLASSFISH_SPECIFIC_JNDI_NAMES, new Object[] { this.ejbDescriptor.getName(), publishedNonPortableGlobalJndiNames });
    }
    if (!publishedInternalGlobalJndiNames.isEmpty()) {
        _logger.log(Level.FINE, "Internal container JNDI names for EJB {0}: {1}", new Object[] { this.ejbDescriptor.getName(), publishedInternalGlobalJndiNames });
    }
    // set EJBMetaData
    setEJBMetaData();
}
Also used : ServiceInterfaceGenerator(com.sun.ejb.codegen.ServiceInterfaceGenerator) HashMap(java.util.HashMap) EjbEndpointFacade(org.glassfish.ejb.api.EjbEndpointFacade) WSEjbEndpointRegistry(org.glassfish.ejb.spi.WSEjbEndpointRegistry) EJBObject(javax.ejb.EJBObject) Iterator(java.util.Iterator) com.sun.enterprise.deployment(com.sun.enterprise.deployment) Reference(javax.naming.Reference) InvocationHandler(java.lang.reflect.InvocationHandler) TransactionRequiredLocalException(javax.ejb.TransactionRequiredLocalException) EJBAccessException(javax.ejb.EJBAccessException) InvocationTargetException(java.lang.reflect.InvocationTargetException) EJBException(javax.ejb.EJBException) DeploymentException(org.glassfish.deployment.common.DeploymentException) AccessException(java.rmi.AccessException) AccessLocalException(javax.ejb.AccessLocalException) TransactionRolledbackLocalException(javax.ejb.TransactionRolledbackLocalException) SystemException(javax.transaction.SystemException) NoSuchEJBException(javax.ejb.NoSuchEJBException) NamingException(javax.naming.NamingException) RemoveException(javax.ejb.RemoveException) EJBTransactionRequiredException(javax.ejb.EJBTransactionRequiredException) EJBTransactionRolledbackException(javax.ejb.EJBTransactionRolledbackException) RemoteException(java.rmi.RemoteException) RollbackException(javax.transaction.RollbackException) FinderException(javax.ejb.FinderException) CreateException(javax.ejb.CreateException) NoSuchObjectLocalException(javax.ejb.NoSuchObjectLocalException) StringRefAddr(javax.naming.StringRefAddr) Collection(java.util.Collection) EJBLocalObject(javax.ejb.EJBLocalObject) EJBObject(javax.ejb.EJBObject) DeploymentException(org.glassfish.deployment.common.DeploymentException) Map(java.util.Map) MethodMap(com.sun.ejb.containers.util.MethodMap) HashMap(java.util.HashMap)

Aggregations

ServiceInterfaceGenerator (com.sun.ejb.codegen.ServiceInterfaceGenerator)1 MethodMap (com.sun.ejb.containers.util.MethodMap)1 com.sun.enterprise.deployment (com.sun.enterprise.deployment)1 InvocationHandler (java.lang.reflect.InvocationHandler)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 AccessException (java.rmi.AccessException)1 RemoteException (java.rmi.RemoteException)1 Collection (java.util.Collection)1 HashMap (java.util.HashMap)1 Iterator (java.util.Iterator)1 Map (java.util.Map)1 AccessLocalException (javax.ejb.AccessLocalException)1 CreateException (javax.ejb.CreateException)1 EJBAccessException (javax.ejb.EJBAccessException)1 EJBException (javax.ejb.EJBException)1 EJBLocalObject (javax.ejb.EJBLocalObject)1 EJBObject (javax.ejb.EJBObject)1 EJBTransactionRequiredException (javax.ejb.EJBTransactionRequiredException)1 EJBTransactionRolledbackException (javax.ejb.EJBTransactionRolledbackException)1 FinderException (javax.ejb.FinderException)1