public boolean isEjbManagedObject(Object desc, Class c) { String className = c.getName(); EjbDescriptor ejbDesc = (EjbDescriptor) desc; Set<String> ejbManagedObjectClassNames = new HashSet<String>(); ejbManagedObjectClassNames.add(ejbDesc.getEjbClassName()); for (EjbInterceptor next : ejbDesc.getInterceptorClasses()) { if (!next.isCDIInterceptor()) { ejbManagedObjectClassNames.add(next.getInterceptorClassName()); } } Set<String> serializableClassNames = new HashSet<String>(); for (String next : ejbManagedObjectClassNames) { // Add the serializable sub-class version of each name as well serializableClassNames.add(EJBUtils.getGeneratedSerializableClassName(next)); } boolean isEjbManagedObject = ejbManagedObjectClassNames.contains(className) || serializableClassNames.contains(className); return isEjbManagedObject; }
/** * Session Bean's bean-managed transaction demarcation test. * * <p>The enterprise bean with bean-managed transaction demarcation must be a Session bean. * * @param descriptor the Enterprise Java Bean deployment descriptor * @return <code>Result</code> the results for this assertion */ public Result check(EjbDescriptor descriptor) { Result result = getInitializedResult(); ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor(); String transactionType = descriptor.getTransactionType(); if (EjbSessionDescriptor.BEAN_TRANSACTION_TYPE.equals(transactionType)) { if (descriptor instanceof EjbSessionDescriptor) { result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.passed( smh.getLocalString( getClass().getName() + ".passed", "[ {0} ] is valid transactionType within Session bean [ {1} ]", new Object[] {transactionType, descriptor.getName()})); } else if (descriptor instanceof EjbEntityDescriptor) { result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.failed( smh.getLocalString( getClass().getName() + ".failedException", "Error: [ {0} ] is not valid transactionType within entity bean [ {1} ]", new Object[] {transactionType, descriptor.getName()})); } return result; } else if (EjbSessionDescriptor.CONTAINER_TRANSACTION_TYPE.equals(transactionType)) { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable", "Expected [ {0} ] transaction demarcation, but [ {1} ] bean has [ {2} ] transaction demarcation.", new Object[] { EjbSessionDescriptor.BEAN_TRANSACTION_TYPE, descriptor.getName(), EjbSessionDescriptor.CONTAINER_TRANSACTION_TYPE })); return result; } else { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable", "Expected [ {0} ] transaction demarcation, but [ {1} ] bean has [ {2} ] transaction demarcation.", new Object[] { EjbSessionDescriptor.BEAN_TRANSACTION_TYPE, descriptor.getName(), transactionType })); return result; } }
public boolean isRemoved(Object ejbRef) { EJBLocalObjectImpl localObjectImpl = getEJBLocalObject(ejbRef); if (localObjectImpl == null) { throw new UnsupportedOperationException("Invalid ejb ref"); } Container container = localObjectImpl.getContainer(); EjbDescriptor ejbDesc = container.getEjbDescriptor(); boolean isStatefulBean = false; if (ejbDesc.getType().equals(EjbSessionDescriptor.TYPE)) { EjbSessionDescriptor sessionDesc = (EjbSessionDescriptor) ejbDesc; isStatefulBean = sessionDesc.isStateful(); } if (!isStatefulBean) { // TODO 299 impl is incorrectly calling isRemoved for stateless/singleton // beans. Until it's fixed just return false. Otherwise, any app acquiring // stateless/singleton references via 299 will fail until bug is fixed. return false; // TODO reenable this per SessionObjectReference.isRemoved SPI // throw new UnsupportedOperationException("ejbRef for ejb " + // ejbDesc.getName() + " is not a stateful bean "); } boolean removed = false; try { ((BaseContainer) container).checkExists(localObjectImpl); } catch (Exception e) { removed = true; } return removed; }
public void remove(Object ejbRef) { EJBLocalObjectImpl localObjectImpl = getEJBLocalObject(ejbRef); if (localObjectImpl == null) { throw new UnsupportedOperationException("Invalid ejb ref"); } Container container = localObjectImpl.getContainer(); EjbDescriptor ejbDesc = container.getEjbDescriptor(); boolean isStatefulBean = false; if (ejbDesc.getType().equals(EjbSessionDescriptor.TYPE)) { EjbSessionDescriptor sessionDesc = (EjbSessionDescriptor) ejbDesc; isStatefulBean = sessionDesc.isStateful(); } if (!isStatefulBean) { // TODO 299 impl may incorrectly call this for stateless/singleton // beans. Until it's fixed just treat it as a no-op. Otherwise, any app acquiring // stateless/singleton references via 299 could fail until bug is fixed. return; // TODO reenable this after bug is fixed // throw new UnsupportedOperationException("ejbRef for ejb " + // ejbDesc.getName() + " is not a stateful bean "); } try { localObjectImpl.remove(); } catch (EJBException e) { LogFacade.getLogger().log(Level.FINE, "EJBException during remove. ", e); } catch (javax.ejb.RemoveException re) { throw new NoSuchEJBException(re.getMessage(), re); } }
public <S> S getBusinessObject(Object ejbRef, java.lang.Class<S> businessInterface) { EJBLocalObjectImpl localObjectImpl = getEJBLocalObject(ejbRef); if (localObjectImpl == null) { throw new IllegalStateException("Invalid ejb ref"); } Container container = localObjectImpl.getContainer(); EjbDescriptor ejbDesc = container.getEjbDescriptor(); S businessObject = null; if (businessInterface != null) { String intfName = businessInterface.getName(); if (ejbDesc.getLocalBusinessClassNames().contains(intfName)) { // Get proxy corresponding to this business interface. businessObject = (S) localObjectImpl.getClientObject(intfName); } else if (ejbDesc.isLocalBean()) { // If this is a no-interface view session bean, the bean // can be accessed through interfaces in its superclass as well boolean isValidBusinessInterface = ejbDesc.getNoInterfaceLocalBeanClasses().contains(intfName); if ((intfName.equals(ejbDesc.getEjbClassName())) || isValidBusinessInterface) { businessObject = (S) localObjectImpl.getClientObject(ejbDesc.getEjbClassName()); } } } if (businessObject == null) { throw new IllegalStateException( "Unable to convert ejbRef for ejb " + ejbDesc.getName() + " to a business object of type " + businessInterface); } return businessObject; }
/** * Container-managed fields valid type test. * * <p>The Bean Provider must ensure that the Java types assigned to the container-managed fields * are one of the following: Java primitive types, Java serializable types, or references to * enterprise beans' remote or home interfaces. * * @param descriptor the Enterprise Java Bean deployment descriptor * @return <code>Result</code> the results for this assertion */ public Result check(EjbDescriptor descriptor) { Result result = getInitializedResult(); ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor(); if (descriptor instanceof EjbEntityDescriptor) { String persistentType = ((EjbEntityDescriptor) descriptor).getPersistenceType(); if (EjbEntityDescriptor.CONTAINER_PERSISTENCE.equals(persistentType)) { // this test apply only to 1.x cmp beans, in 2.x fields are virtual fields only if (EjbCMPEntityDescriptor.CMP_1_1 != ((EjbCMPEntityDescriptor) descriptor).getCMPVersion()) { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( "com.sun.enterprise.tools.verifier.tests.ejb.entity.cmp2.CMPTest.notApplicable3", "Test do not apply to this cmp-version of container managed persistence EJBs")); return result; } VerifierTestContext context = getVerifierContext(); ClassLoader jcl = context.getClassLoader(); // RULE: container-managed fields are one of the following: // Java primitive types, Java serializable types, or references // to enterprise beans' remote or home interfaces. Set persistentFields = ((EjbCMPEntityDescriptor) descriptor).getPersistenceDescriptor().getCMPFields(); Iterator iterator = persistentFields.iterator(); Descriptor persistentField; Field field; boolean oneFailed = false; while (iterator.hasNext()) { persistentField = (Descriptor) iterator.next(); boolean foundField = false; try { Class c = Class.forName( descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader()); // start do while loop here.... do { try { Field f = c.getDeclaredField(persistentField.getName()); foundField = true; Class persistentFieldClassType = f.getType(); if (descriptor.getHomeClassName() != null && !"".equals(descriptor.getHomeClassName()) && descriptor.getRemoteClassName() != null && !"".equals(descriptor.getRemoteClassName())) { if (RmiIIOPUtils.isPersistentFieldTypeValid( persistentFieldClassType, descriptor.getHomeClassName(), descriptor.getRemoteClassName())) { result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addGoodDetails( smh.getLocalString( getClass().getName() + ".passed", "Valid type assigned to container managed field [ {0} ] found in bean [ {1} ]", new Object[] {((Descriptor) persistentField).getName(), c.getName()})); } else { oneFailed = true; result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".failed", "Error: Invalid type assigned to container managed field [ {0} ] found in bean [ {1} ]", new Object[] {((Descriptor) persistentField).getName(), c.getName()})); } } if (descriptor.getLocalHomeClassName() != null && !"".equals(descriptor.getLocalHomeClassName()) && descriptor.getLocalClassName() != null && !"".equals(descriptor.getLocalClassName())) { if (RmiIIOPUtils.isPersistentFieldTypeValid( persistentFieldClassType, descriptor.getLocalHomeClassName(), descriptor.getLocalClassName())) { result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addGoodDetails( smh.getLocalString( getClass().getName() + ".passed", "Valid type assigned to container managed field [ {0} ] found in bean [ {1} ]", new Object[] {((Descriptor) persistentField).getName(), c.getName()})); } else { oneFailed = true; result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".failed", "Error: Invalid type assigned to container managed field [ {0} ] found in bean [ {1} ]", new Object[] {((Descriptor) persistentField).getName(), c.getName()})); } } } catch (NoSuchFieldException e) { foundField = false; } } while (((c = c.getSuperclass()) != null) && (!foundField)); if (!foundField) { if (!oneFailed) { oneFailed = true; } result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".failedException1", "Error: field [ {0} ] not found in class [ {1} ]", new Object[] { ((Descriptor) persistentField).getName(), descriptor.getEjbClassName() })); } } catch (ClassNotFoundException e) { Verifier.debug(e); result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.failed( smh.getLocalString( getClass().getName() + ".failedException", "Error: [ {0} ] class not found.", new Object[] {descriptor.getEjbClassName()})); } } if (oneFailed) { result.setStatus(Result.FAILED); } else { result.setStatus(Result.PASSED); } } else { // if (BEAN_PERSISTENCE.equals(persistentType)) result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable1", "Expected persistence type [ {0} ], but [ {1} ] bean has persistence type [ {2} ]", new Object[] { EjbEntityDescriptor.CONTAINER_PERSISTENCE, descriptor.getName(), persistentType })); } return result; } else { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable", "[ {0} ] expected {1} bean, but called with {2} bean.", new Object[] {getClass(), "Entity", "Session"})); return result; } }
protected String getInterfaceName(EjbDescriptor descriptor) { return descriptor.getRemoteClassName(); }