public Result check(Descriptor descriptor) { this.descriptor = descriptor; result = getInitializedResult(); compName = getVerifierContext().getComponentNameConstructor(); ClassLoader cl = getVerifierContext().getClassLoader(); List<InjectionCapable> injectables = getInjectables(getClassName()); for (InjectionCapable injectionCapable : injectables) { Set<InjectionTarget> iTargets = injectionCapable.getInjectionTargets(); for (InjectionTarget target : iTargets) { try { if (target.isFieldInjectable()) { Class classObj = Class.forName(getClassName(), false, cl); Field field = classObj.getDeclaredField(target.getFieldName()); testMethodModifiers(field.getModifiers(), "field", field); } if (target.isMethodInjectable()) { Class classObj = Class.forName(getClassName(), false, cl); Method method = getInjectedMethod(classObj, target.getMethodName()); if (method == null) continue; testMethodModifiers(method.getModifiers(), "method", method); } } catch (Exception e) { } // ignore as it will be caught in other tests } } if (result.getStatus() != Result.FAILED) { addGoodDetails(result, compName); result.passed( smh.getLocalString(getClass().getName() + ".passed", "Valid injection method(s).")); } return result; }
public Result check(WebBundleDescriptor descriptor) { Result result = getInitializedResult(); addWarningDetails(result, getVerifierContext().getComponentNameConstructor()); result.setStatus(Result.PASSED); // default status is PASSED for (EntityManagerReferenceDescriptor emRefDesc : descriptor.getEntityManagerReferenceDescriptors()) { Set<InjectionTarget> injectionTargets = emRefDesc.getInjectionTargets(); if (injectionTargets != null) { for (InjectionTarget it : injectionTargets) { String itClassName = it.getClassName(); String errMsg = smh.getLocalString( className + ".warning", "Found a persistence unit by name [ {0} ] injected into [ {1} ].", new Object[] {emRefDesc.getUnitName(), itClassName}); try { Class c = Class.forName(itClassName, false, getVerifierContext().getClassLoader()); if (!(Servlet.class.isAssignableFrom(c))) { result.warning(errMsg); } else if (!(SingleThreadModel.class.isAssignableFrom(c))) { result.warning(errMsg); } } catch (Exception ex) { result.warning(errMsg); } } } } return result; }
/** * Checks if the EJB class implements the TimedObject interface * * @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(); boolean isEjb30 = descriptor.getEjbBundleDescriptor().getSpecVersion().equalsIgnoreCase("3.0"); if (descriptor.isTimedObject()) { // Timers can be created for stateless session beans, message-driven beans, // and 2.1 entity beans.Timers cannot be created for stateful session beans or EJB 3.0 // entities. if (((descriptor instanceof EjbEntityDescriptor) && isEjb30) || ((descriptor instanceof EjbSessionDescriptor) && ((((EjbSessionDescriptor) descriptor).getSessionType()) .equals(EjbSessionDescriptor.STATEFUL)))) { addErrorDetails(result, compName); result.failed( smh.getLocalString( getClass().getName() + ".failed1", "[ {0} ] must not implement the TimedObject interface." + "Only 2.1 entity beans or stateless session beans may " + "implement the TimedObject interface", new Object[] {descriptor.getEjbClassName()})); } } if (result.getStatus() != Result.FAILED) { addGoodDetails(result, compName); result.passed( smh.getLocalString( getClass().getName() + ".passed", "[ {0} ] properly implements the TimedObject interface", new Object[] {descriptor.getEjbClassName()})); } return result; }
/** * 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; } }
/** * All methods should have a * * @param descriptor the Enterprise Java Bean deployment descriptor * @return <code>Result</code> the results for this assertion */ public Result check(EjbDescriptor descriptor) { result = getInitializedResult(); // boolean oneFailed = false; try { if (descriptor instanceof EjbSessionDescriptor || descriptor instanceof EjbEntityDescriptor) { Set methods = descriptor.getMethodDescriptors(); // Set methodPermissions = new HashSet(); boolean noPermissions = false; for (Iterator i = methods.iterator(); i.hasNext(); ) { MethodDescriptor md = (MethodDescriptor) i.next(); Set permissions = descriptor.getMethodPermissionsFor(md); if (permissions.isEmpty() || (permissions == null)) { result.addWarningDetails( smh.getLocalString( getClass().getName() + ".failed", "Warning: Method [ {0} ] of EJB [ {1} ] does not have assigned security-permissions", new Object[] {md.getName(), descriptor.getName()})); result.setStatus(result.WARNING); noPermissions = true; } } if (!noPermissions) { result.passed( smh.getLocalString( getClass().getName() + ".passed", "Valid: All [ {0} ]EJB interfaces methods have security-permissions assigned.", new Object[] {descriptor.getName()})); } } else { result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable", "The bean [ {0} ] is neither a Session nor Entity Bean", new Object[] {descriptor.getName()})); return result; } } catch (Exception e) { result.failed( smh.getLocalString( getClass().getName() + ".exception", "The test generated the following exception [ {0} ]", new Object[] {e.getLocalizedMessage()})); } return result; }
public Result check(EjbDescriptor descriptor) { Result result = getInitializedResult(); ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor(); boolean oneFailed = false; try { Set resRef = descriptor.getResourceReferenceDescriptors(); if (!(resRef.isEmpty())) { Iterator it = resRef.iterator(); while (it.hasNext()) { ResourceReferenceDescriptor resDesc = ((ResourceReferenceDescriptor) it.next()); String refName = resDesc.getName(); if (refName == null || refName.length() == 0) { addErrorDetails(result, compName); result.failed( smh.getLocalString( getClass().getName() + ".failed", "FAILED [AS-EJB resource-ref] : resource-ref has empty res-ref-name")); } else { addGoodDetails(result, compName); result.passed( smh.getLocalString( getClass().getName() + ".passed", "PASSED [AS-EJB resource-ref] : res-ref-name is {0}", new Object[] {refName})); } } } else { addNaDetails(result, compName); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable", "{0} Does not define any resource-ref Elements", new Object[] {descriptor.getName()})); } } catch (Exception ex) { addErrorDetails(result, compName); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".notRun", "NOT RUN [AS-EJB] : Could not create the descriptor object")); } return result; }
private void commonToBothInterfaces(String intf, EjbDescriptor descriptor) { try { Class intfClass = Class.forName(intf, false, getVerifierContext().getClassLoader()); for (Method remoteMethod : intfClass.getMethods()) { // we don't test the EJB methods if (remoteMethod.getDeclaringClass().getName().equals("javax.ejb.EJBObject")) continue; Class beanClass = Class.forName( descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader()); for (Method method : beanClass.getMethods()) { if (method.getName().equals(remoteMethod.getName()) && !RmiIIOPUtils.isValidRmiIIOPReturnType(method.getReturnType())) { // The methods arguments types must be legal types for // RMI-IIOP. This means that their return values must // be of valid types for RMI-IIOP, addErrorDetails(result, compName); result.failed( smh.getLocalString( getClass().getName() + ".failed", "Error: business method [ {0} ] was found, but " + "business method has invalid return type [ {1} ]. Business " + "method return type must be a valid type for RMI-IIOP.", new Object[] {method.getName(), method.getReturnType()})); } } } } catch (ClassNotFoundException e) { Verifier.debug(e); addErrorDetails(result, compName); result.failed( smh.getLocalString( getClass().getName() + ".failedException", "Error: Remote interface [ {0} ] or bean class [ {1} ] does " + "not exist or is not loadable within bean [ {2} ].", new Object[] { descriptor.getRemoteClassName(), descriptor.getEjbClassName(), descriptor.getName() })); } }
private void testMethodModifiers(int modifier, String targetType, Object fieldOrMethod) { if (Modifier.isStatic(modifier) || Modifier.isFinal(modifier)) { addErrorDetails(result, compName); result.failed( smh.getLocalString( "com.sun.enterprise.tools.verifier.tests.InjectionTargetTest.failed", "Invalid annotation in {0} [ {1} ].", new Object[] {targetType, fieldOrMethod})); } }
/** * Enterprise Bean's business(...) methods argument RMI IIOP test. Each enterprise Bean class must * define zero or more business(...) methods. The method signatures must follow these rules: * * <p>The methods return value must be legal types for RMI-IIOP. * * @param descriptor the Enterprise Java Bean deployment descriptor * @return <code>Result</code> the results for this assertion */ public Result check(EjbDescriptor descriptor) { result = getInitializedResult(); compName = getVerifierContext().getComponentNameConstructor(); if ((descriptor instanceof EjbSessionDescriptor) || (descriptor instanceof EjbEntityDescriptor)) { if (descriptor.getRemoteClassName() != null && !"".equals(descriptor.getRemoteClassName())) commonToBothInterfaces(descriptor.getRemoteClassName(), descriptor); Set<String> remoteInterfaces = descriptor.getRemoteBusinessClassNames(); for (String remoteIntf : remoteInterfaces) commonToBothInterfaces(remoteIntf, descriptor); } if (result.getStatus() != Result.FAILED) { addGoodDetails(result, compName); result.passed( smh.getLocalString( getClass().getName() + ".passed", "Proper declaration of business method(s) found.")); } return result; }
/** * Test if a javax.resource.cci.ConnectionMetaData implementation has been provided in the rar * file * * @paramm descriptor deployment descriptor for the rar file * @return result object containing the result of the individual test performed */ public Result check(ConnectorDescriptor descriptor) { Result result = getInitializedResult(); ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor(); if (isCCIImplemented(descriptor, result)) { // File jarFile = Verifier.getJarFile(descriptor.getModuleDescriptor().getArchiveUri()); // File // f=Verifier.getArchiveFile(descriptor.getModuleDescriptor().getArchiveUri()); findImplementorOf(descriptor, "javax.resource.cci.ConnectionMetaData", result); } else { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( "com.sun.enterprise.tools.verifier.tests.connector.cci.InteractionExistence.notapp", "NotApplicable : The CCI interfaces do not seem to be implemented by this resource adapter")); } return result; }
public Result check(EjbDescriptor descriptor) { Result result = getInitializedResult(); ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor(); Set<String> remoteAndLocalIntfs = descriptor.getRemoteBusinessClassNames(); remoteAndLocalIntfs.addAll(descriptor.getLocalBusinessClassNames()); for (String remoteOrLocalIntf : remoteAndLocalIntfs) { try { Class c = Class.forName(remoteOrLocalIntf, false, getVerifierContext().getClassLoader()); if (javax.ejb.EJBObject.class.isAssignableFrom(c) || javax.ejb.EJBLocalObject.class.isAssignableFrom(c)) { addErrorDetails(result, compName); result.failed( smh.getLocalString( getClass().getName() + ".failed", "[ {0} ] extends either javax.ejb.EJBObject " + "or javax.ejb.EJBLocalObject.", new Object[] {remoteOrLocalIntf})); } } catch (ClassNotFoundException e) { Verifier.debug(e); addErrorDetails(result, compName); result.failed( smh.getLocalString( getClass().getName() + ".failed1", "Business Interface class [ {0} ] not found.", new Object[] {remoteOrLocalIntf})); } } if (result.getStatus() != Result.FAILED) { addGoodDetails(result, compName); result.passed( smh.getLocalString(getClass().getName() + ".passed", "Business Interface(s) are valid.")); } return result; }
/** * Check that the Client API Connection interface implements the close() method * * @paramm descriptor deployment descriptor for the rar file * @return result object containing the result of the individual test performed */ public Result check(ConnectorDescriptor descriptor) { // get the connection Result result = getInitializedResult(); ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor(); if (isCCIImplemented(descriptor, result)) { Class c = testConnectionImpl(descriptor, result); if (c == null) { return result; } // now check the close() method Method m = getMethod(c, "close", null); if (m != null) { // passed result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.passed( smh.getLocalString( getClass().getName() + ".passed", "The connection interface [ {0} ] implements the close() method", new Object[] {c.getName()})); } else { result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.failed( smh.getLocalString( getClass().getName() + ".failed", "Error: The connection interface [ {0} ] does not implement the close() method", new Object[] {c.getName()})); } } else { // test is NA result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( "com.sun.enterprise.tools.verifier.tests.connector.cci.notApp", "The CCI interfaces do not seem to be implemented by this resource adapter")); } return result; }
/** * The ejb element specifies the URI of a ejb-jar, relative to the top level of the application * package. * * @param descriptor the Application deployment descriptor * @return <code>Result</code> the results for this assertion */ public Result check(Application descriptor) { Result result = getInitializedResult(); if (descriptor.getBundleDescriptors(EjbBundleDescriptor.class).size() > 0) { boolean oneFailed = false; for (Iterator itr = descriptor.getBundleDescriptors(EjbBundleDescriptor.class).iterator(); itr.hasNext(); ) { EjbBundleDescriptor ejbd = (EjbBundleDescriptor) itr.next(); // not sure what we can do to test this string? if (ejbd.getModuleDescriptor().getArchiveUri().endsWith(".jar")) { result.passed( smh.getLocalString( getClass().getName() + ".passed", "[ {0} ] specifies the URI [ {1} ] of an ejb-jar, relative to the top level of the application package [ {2} ].", new Object[] { ejbd.getName(), ejbd.getModuleDescriptor().getArchiveUri(), descriptor.getName() })); } else { if (!oneFailed) { oneFailed = true; } result.addErrorDetails( smh.getLocalString( getClass().getName() + ".failed", "Error: [ {0} ] does not specify the URI [ {1} ] of an ejb-jar, relative to the top level of the application package [ {2} ], or does not end with \".jar\"", new Object[] { ejbd.getName(), ejbd.getModuleDescriptor().getArchiveUri(), descriptor.getName() })); } } if (oneFailed) { result.setStatus(Result.FAILED); } else { result.setStatus(Result.PASSED); } } else { result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable", "There are no ejb components in application [ {0} ]", new Object[] {descriptor.getName()})); } return result; }
public Result check(WebBundleDescriptor descriptor) { Result result = getInitializedResult(); ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor(); boolean oneFailed = false; boolean notApp = false; try { WebProperty[] webProps = ((SunWebAppImpl) descriptor.getSunDescriptor()).getWebProperty(); if (webProps.length > 0) { oneFailed = checkWebProperties(webProps, result, descriptor, this); } else { notApp = true; addNaDetails(result, compName); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable", "NOT APPLICABLE [AS-WEB sun-web-app] web property element not defined within the web archive [ {0} ].", new Object[] {descriptor.getName()})); } if (oneFailed) { result.setStatus(Result.FAILED); } else if (notApp) { result.setStatus(Result.NOT_APPLICABLE); } else { result.setStatus(Result.PASSED); } } catch (Exception ex) { oneFailed = true; addErrorDetails(result, compName); result.failed( smh.getLocalString( getClass().getName() + ".failed", "FAILED [AS-WEB sun-web-app] could not create the web-property object")); } return result; }
/** * iterates over all declared filter in the archive file and delegates actual test on individual * filter class to runIndividualFilterTest * * @param descriptor the Web deployment descriptor * @return <code>Result</code> the results for this assertion */ public Result check(WebBundleDescriptor descriptor) { Result result; ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor(); Enumeration filterEnum = descriptor.getServletFilterDescriptors().elements(); if (filterEnum.hasMoreElements()) { boolean oneFailed = false; // test the filters in this .war result = loadWarFile(descriptor); while (filterEnum.hasMoreElements()) { ServletFilterDescriptor filter = (ServletFilterDescriptor) filterEnum.nextElement(); Class filterClass = loadClass(result, filter.getClassName()); if (!runIndividualFilterTest(result, filterClass)) oneFailed = true; } if (oneFailed) { result.setStatus(Result.FAILED); } else { result.setStatus(Result.PASSED); } } else { result = getInitializedResult(); result.setStatus(Result.NOT_APPLICABLE); result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( "com.sun.enterprise.tools.verifier.tests.web.FilterClass" + ".notApplicable", "There are no filter components within the web archive [ {0} ]", new Object[] {descriptor.getName()})); } return result; }
/** * run an individual home method test * * @param method the home method to test * @param descriptor the deployment descriptor for the entity bean * @param result the result object */ protected void runIndividualHomeMethodTest( Method method, EjbDescriptor descriptor, Result result) { Method m; ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor(); try { // retrieve the remote interface methods ClassLoader jcl = getVerifierContext().getClassLoader(); Class ejbClass = Class.forName(descriptor.getEjbClassName(), false, jcl); // Bug: 4952890. first character of this name should be converted to UpperCase. String methodName = method .getName() .replaceFirst( method.getName().substring(0, 1), method.getName().substring(0, 1).toUpperCase()); String expectedMethodName = "ejbHome" + methodName; do { // retrieve the EJB Class Methods m = getMethod(ejbClass, expectedMethodName, method.getParameterTypes()); } while (((ejbClass = ejbClass.getSuperclass()) != null) && (m == null)); if (m != null) { int modifiers = m.getModifiers(); if (Modifier.isPublic(modifiers) && !Modifier.isStatic(modifiers)) { addGoodDetails(result, compName); result.addGoodDetails( smh.getLocalString( getClass().getName() + ".passed", "For method [ {1} ] in Home Interface [ {0} ], ejbHome method is public and not static", new Object[] {method.getDeclaringClass().getName(), method.getName()})); result.setStatus(Result.PASSED); // return true; } else { addErrorDetails(result, compName); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".notApplicable", "Error : For method [ {1} ] defined in Home Interface [ {0} ], the ejbHome method is either static or not public", new Object[] {method.getDeclaringClass().getName(), method.getName()})); result.setStatus(Result.FAILED); // return false; } } else { addErrorDetails(result, compName); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".failed", "Error : For method [ {1} ] defined in Home Interface [ {0} ], no ejbHome name matching method was found", new Object[] {method.getDeclaringClass().getName(), method.getName()})); result.setStatus(Result.FAILED); // return true; } } catch (ClassNotFoundException e) { Verifier.debug(e); addErrorDetails(result, compName); result.failed( smh.getLocalString( getClass().getName() + ".failedException", "Error: Home interface [ {0} ] does not exist or is not loadable within bean [ {1} ]", new Object[] {getClassName(descriptor), descriptor.getName()})); // return false; result.setStatus(Result.FAILED); } }
/** * The Web form-error-page value defines the location in the web application where the page can be * used for error page can be found within web application test * * @param descriptor the Web deployment descriptor * @return <code>Result</code> the results for this assertion */ public Result check(WebBundleDescriptor descriptor) { Result result = getInitializedResult(); ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor(); if (descriptor.getLoginConfiguration() != null) { boolean foundIt = false; // ZipEntry ze=null; // JarFile jar=null; FileArchive arch = null; String formErrorPage = descriptor.getLoginConfiguration().getFormErrorPage(); if (formErrorPage.length() > 0) { try { // File f = // Verifier.getArchiveFile(descriptor.getModuleDescriptor().getArchiveUri()); // if(f==null){ String uri = getAbstractArchiveUri(descriptor); try { arch = new FileArchive(); arch.open(uri); } catch (IOException e) { throw e; } // }else{ // jar = new JarFile(f); // } if (formErrorPage.startsWith("/")) formErrorPage = formErrorPage.substring(1); // if (f!=null){ // ze = jar.getEntry(formErrorPage); // foundIt = (ze != null); // } // else{ File fep = new File(new File(arch.getURI()), formErrorPage); if (fep.exists()) foundIt = true; fep = null; // } // if (jar!=null) // jar.close(); } catch (Exception ex) { // should be aldready set? foundIt = false; } if (foundIt) { result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.passed( smh.getLocalString( getClass().getName() + ".passed", "The form-error-page [ {0} ] value defines the location in the web application where the error page that is displayed when login is not successful can be found within web application [ {1} ]", new Object[] {formErrorPage, descriptor.getName()})); } else { result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.failed( smh.getLocalString( getClass().getName() + ".failed", "Error: The form-error-page [ {0} ] value does not define the location in the web application where the error page that is displayed when login is not successful can be found within web application [ {1} ]", new Object[] {formErrorPage, descriptor.getName()})); } } else { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable", "There are no form-error-page elements within this web archive [ {0} ]", new Object[] {descriptor.getName()})); } } else { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable", "There are no form-error-page elements within this web archive [ {0} ]", new Object[] {descriptor.getName()})); } return result; }
/** * Optionally implemented SessionSynchronization interface transaction demarcation test. If an * enterprise bean implements the javax.ejb.SessionSynchronization interface, the Application * Assembler can specify only the following values for the transaction attributes of the bean's * methods: Required RequiresNew Mandatory * * @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(); boolean oneFound = false; if (descriptor instanceof EjbSessionDescriptor) { try { Context context = getVerifierContext(); ClassLoader jcl = context.getClassLoader(); Class c = Class.forName( descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader()); // walk up the class tree do { Class[] interfaces = c.getInterfaces(); for (int i = 0; i < interfaces.length; i++) { if (interfaces[i].getName().equals("javax.ejb.SessionSynchronization")) { oneFound = true; break; } } } while ((c = c.getSuperclass()) != null); } catch (ClassNotFoundException e) { Verifier.debug(e); addErrorDetails(result, compName); result.failed( smh.getLocalString( getClass().getName() + ".failedException1", "Error: [ {0} ] class not found.", new Object[] {descriptor.getEjbClassName()})); return result; } // If an enterprise bean implements the javax.ejb.SessionSynchronization // interface, the Application Assembler can specify only the following // values for the transaction attributes of the bean's methods: // Required, RequiresNew, Mandatory if (oneFound) { String transactionAttribute = ""; ContainerTransaction containerTransaction = null; boolean oneFailed = false; if (!descriptor.getMethodContainerTransactions().isEmpty()) { for (Enumeration ee = descriptor.getMethodContainerTransactions().keys(); ee.hasMoreElements(); ) { MethodDescriptor methodDescriptor = (MethodDescriptor) ee.nextElement(); containerTransaction = (ContainerTransaction) descriptor.getMethodContainerTransactions().get(methodDescriptor); if (!(containerTransaction != null && properAttribDefined(containerTransaction))) { transactionAttribute = containerTransaction.getTransactionAttribute(); addErrorDetails(result, compName); result.failed( smh.getLocalString( getClass().getName() + ".failed", "Error: TransactionAttribute [ {0} ] for method [ {1} ] is not valid.", new Object[] {transactionAttribute, methodDescriptor.getName()})); } } } } } if (result.getStatus() != Result.FAILED) { addGoodDetails(result, compName); result.passed( smh.getLocalString( getClass().getName() + ".passed", "TransactionAttributes are defined properly for the bean")); } return result; }
/** * Entity Bean's ejbCreate(...) methods return test. Each entity Bean class may define zero or * more ejbCreate(...) methods. The number and signatures of a entity Bean's create methods are * specific to each EJB class. The method signatures must follow these rules: * * <p>The method name must be ejbCreate. * * <p>The return type must be primary key type. * * @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 persistence = ((EjbEntityDescriptor) descriptor).getPersistenceType(); if (EjbEntityDescriptor.BEAN_PERSISTENCE.equals(persistence)) { boolean oneFailed = false; boolean oneWarning = false; int foundAtLeastOne = 0; try { Context context = getVerifierContext(); ClassLoader jcl = context.getClassLoader(); Class c = Class.forName( descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader()); String primaryKeyType = ((EjbEntityDescriptor) descriptor).getPrimaryKeyClassName(); boolean ejbCreateFound = false; boolean returnsPrimaryKeyType = false; // start do while loop here.... do { Method[] methods = c.getDeclaredMethods(); for (int i = 0; i < methods.length; i++) { // reset flags from last time thru loop ejbCreateFound = false; returnsPrimaryKeyType = false; // The method name must be ejbCreate. if (methods[i].getName().startsWith("ejbCreate")) { foundAtLeastOne++; ejbCreateFound = true; // The return type must be primary key type. Class rt = methods[i].getReturnType(); if (rt.getName().equals(primaryKeyType)) { returnsPrimaryKeyType = true; } // now display the appropriate results for this particular ejbCreate // method if (ejbCreateFound && !returnsPrimaryKeyType) { if (primaryKeyType.equals("java.lang.Object")) { oneWarning = true; result.addWarningDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addWarningDetails( smh.getLocalString( getClass().getName() + ".debug1", "For EJB Class [ {0} ] method [ {1} ]", new Object[] {descriptor.getEjbClassName(), methods[i].getName()})); result.addWarningDetails( smh.getLocalString( getClass().getName() + ".warning", "Warning: An [ {0} ] method was found, but [ {1} ] method has [ {2} ] return type. Deployment descriptor primary key type [ {3} ]. Definition of the primary key type is deferred to deployment time ?", new Object[] { methods[i].getName(), methods[i].getName(), methods[i].getReturnType().getName(), primaryKeyType })); } else { oneFailed = true; result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".debug1", "For EJB Class [ {0} ] method [ {1} ]", new Object[] {descriptor.getEjbClassName(), methods[i].getName()})); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".failed", "Error: An [ {0} ] method was found, but [ {1} ] method has illegal return value. [ {2} ] methods must return primary key type [ {3} ].", new Object[] { methods[i].getName(), methods[i].getName(), methods[i].getName(), primaryKeyType })); break; } } } } if (oneFailed == true) break; } while (((c = c.getSuperclass()) != null) && (foundAtLeastOne == 0)); if (foundAtLeastOne == 0) { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable0", "[ {0} ] does not declare any ejbCreate(...) methods.", new Object[] {descriptor.getEjbClassName()})); } if (oneFailed == false && foundAtLeastOne > 0) { result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addGoodDetails( smh.getLocalString( getClass().getName() + ".debug1", "For EJB Class [ {0} ]", new Object[] {descriptor.getEjbClassName()})); result.addGoodDetails( smh.getLocalString( getClass().getName() + ".passed", "[ {0} ] properly declares ejbCreate<method> method to return primary key type [ {1} ].", new Object[] {descriptor.getEjbClassName(), primaryKeyType})); } } 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()})); oneFailed = true; } if (oneFailed) { result.setStatus(result.FAILED); } else if (foundAtLeastOne == 0) { result.setStatus(result.NOT_APPLICABLE); } else { if (oneWarning) { result.setStatus(result.WARNING); } else { result.setStatus(result.PASSED); } } return result; } else { // if (CONTAINER_PERSISTENCE.equals(persistence)) { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable1", "Expected [ {0} ] managed persistence, but [ {1} ] bean has [ {2} ] managed persistence.", new Object[] { EjbEntityDescriptor.BEAN_PERSISTENCE, descriptor.getName(), persistence })); 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; } }
/** * Entity bean's Primary Key Class test. If the enterprise bean is a Entity Bean, the Bean * provider specifies the fully qualified name of the Entity bean's primary key class in the * "primary-class" element. The Bean provider 'must' specify the primary key class for an Entity * with bean managed persistence, and 'may' (but is not required to) specify the primary key class * for an Entity with Container-managed persistence. * * @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 persistence = ((EjbEntityDescriptor) descriptor).getPersistenceType(); if (EjbEntityDescriptor.BEAN_PERSISTENCE.equals(persistence)) { logger.log( Level.FINE, getClass().getName() + ".debug1", new Object[] {descriptor.getName(), "bean"}); String primkey = ((EjbEntityDescriptor) descriptor).getPrimaryKeyClassName(); if (!primkey.equals("java.lang.String")) { try { Class c = Class.forName(primkey, false, getVerifierContext().getClassLoader()); result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.passed( smh.getLocalString( getClass().getName() + ".passed", "Primary Key Class [ {0} ] exist and is loadable", new Object[] {primkey})); } catch (Exception e) { Verifier.debug(e); result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.failed( smh.getLocalString( getClass().getName() + ".failedException", "Error: Loading Primary Key Class [ {0} ]", new Object[] {primkey})); return result; } } else { result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.passed( smh.getLocalString( getClass().getName() + ".passed1", "Primary Key Class is [ {0} ]", new Object[] {primkey})); } return result; } else if (EjbEntityDescriptor.CONTAINER_PERSISTENCE.equals(persistence)) { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable1", "Entity Bean [ {0} ] with [ {1} ] managed persistence, primkey optional.", new Object[] {descriptor.getName(), persistence})); return result; } else { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable2", "Expected [ {0} ] managed persistence, but [ {1} ] bean has [ {2} ] managed persistence.", new Object[] { EjbEntityDescriptor.BEAN_PERSISTENCE, descriptor.getName(), persistence })); 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; } }
/** * Entity Bean's ejbPostCreate(...) methods test. Each entity Bean class may define zero or more * ejbPostCreate(...) methods. The number and signatures of a entity Bean's create methods are * specific to each EJB class. The method signatures must follow these rules: * * <p>The method name must be ejbPostCreate. * * <p>The method must not be declared as static. * * @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) { boolean oneFailed = false; int foundAtLeastOne = 0; try { Context context = getVerifierContext(); ClassLoader jcl = context.getClassLoader(); Class c = Class.forName( descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader()); boolean ejbPostCreateFound = false; boolean isStatic = false; // start do while loop here.... do { Method[] methods = c.getDeclaredMethods(); for (int i = 0; i < methods.length; i++) { // reset flags from last time thru loop ejbPostCreateFound = false; isStatic = false; // The method name must be ejbPostCreate. if (methods[i].getName().startsWith("ejbPostCreate")) { foundAtLeastOne++; ejbPostCreateFound = true; // The method must not be declared as final or static. int modifiers = methods[i].getModifiers(); if (Modifier.isStatic(modifiers)) { isStatic = true; } // now display the appropriate results for this particular // ejbPostCreate method if (ejbPostCreateFound && (!isStatic)) { result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addGoodDetails( smh.getLocalString( getClass().getName() + ".debug1", "For EJB Class [ {0} ] method [ {1} ]", new Object[] {descriptor.getEjbClassName(), methods[i].getName()})); result.addGoodDetails( smh.getLocalString( getClass().getName() + ".passed", "[ {0} ] properly declares non-static [ {1} ] method.", new Object[] {descriptor.getEjbClassName(), methods[i].getName()})); } else if (ejbPostCreateFound && isStatic) { oneFailed = true; result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".debug1", "For EJB Class [ {0} ] ejbPostCreate(...) Method [ {1} ]", new Object[] {descriptor.getEjbClassName(), methods[i].getName()})); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".failed", "Error: A static [ {0} ] method was found, but [ {1} ] cannot be declared as static.", new Object[] {methods[i].getName(), methods[i].getName()})); } } } } while (((c = c.getSuperclass()) != null) && (foundAtLeastOne == 0)); if (foundAtLeastOne == 0) { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable1", "[ {0} ] does not declare any ejbPostCreate(...) methods.", new Object[] {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()})); oneFailed = true; } if (oneFailed) { result.setStatus(result.FAILED); } else if (foundAtLeastOne == 0) { result.setStatus(result.NOT_APPLICABLE); } else { result.setStatus(result.PASSED); } 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; } }
/** * Entity bean's Primary Key Class type test. If the enterprise bean is a Entity Bean, the Bean * provider specifies the fully qualified name of the Entity bean's primary key class in the * "primary-class" element. The Bean provider 'must' specify the primary key class for an Entity * with bean managed persistence, and 'may' (but is not required to) specify the primary key class * for an Entity with Container-managed persistence. * * <p>Special case: Unknown primary key class In special situations, the Bean Provider may choose * not to specify the primary key class for an entity bean with container-managed persistence. * This case happens if the Bean Provider wants to allow the Deployer to select the primary key * fields at deployment time. The Deployer uses instructions supplied by the Bean Provider (these * instructions are beyond the scope of the EJB spec.) to define a suitable primary key class. * * <p>In this special case, the type of the argument of the findByPrimaryKey method must be * declared as java.lang.Object, and the return value of ejbCreate() must be declared as * java.lang.Object. The Bean Provider must specify the primary key class in the deployment * descriptor as of the type java.lang.Object. * * <p>The primary key class is specified at deployment time when the Bean Provider develops * enterprise beans that is intended to be used with multiple back-ends that provide persistence, * and when these multiple back-ends require different primary key structures. * * @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 persistence = ((EjbEntityDescriptor) descriptor).getPersistenceType(); if (EjbEntityDescriptor.CONTAINER_PERSISTENCE.equals(persistence)) { String primkey = ((EjbEntityDescriptor) descriptor).getPrimaryKeyClassName(); // primkey can be not set, via setting xml element // <prim-key-class> to "java.lang.Object" if (primkey.equals("java.lang.Object")) { result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.passed( smh.getLocalString( getClass().getName() + ".passed", "Properly defined primary key class type [ {0} ]", new Object[] {"java.lang.Object"})); } else { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable1", "Primary Key Class is [ {0} ]", new Object[] {primkey})); } return result; } else if (EjbEntityDescriptor.BEAN_PERSISTENCE.equals(persistence)) { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable2", "Entity Bean with [ {0} ] managed persistence, primkey mandatory.", new Object[] {persistence})); return result; } else { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable3", "Expected [ {0} ] managed persistence, but [ {1} ] bean has [ {2} ] managed persistence.", new Object[] { EjbEntityDescriptor.CONTAINER_PERSISTENCE, descriptor.getName(), persistence })); 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; } }
/** * 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; } }
/** * The alt-dd element specifies a URI to the post-assembly deployment descriptor relative to the * root of the application * * @param descriptor the Application deployment descriptor * @return <code>Result</code> the results for this assertion */ public Result check(Application descriptor) { Result result = getInitializedResult(); if (descriptor.getEjbBundleDescriptors().size() > 0) { boolean oneFailed = false; int na = 0; for (Iterator itr = descriptor.getEjbBundleDescriptors().iterator(); itr.hasNext(); ) { EjbBundleDescriptor ejbd = (EjbBundleDescriptor) itr.next(); if (ejbd.getModuleDescriptor().getAlternateDescriptor() != null) { if (!(ejbd.getModuleDescriptor().getAlternateDescriptor().equals(""))) { JarFile jarFile = null; InputStream deploymentEntry = null; // File f = null; // if (Verifier.getEarFile() != null) // f = new File(Verifier.getEarFile()); try { // if (f==null){ String uri = getAbstractArchiveUri(descriptor); // try { FileArchive arch = new FileArchive(); arch.open(uri); deploymentEntry = arch.getEntry(ejbd.getModuleDescriptor().getAlternateDescriptor()); // }catch (Exception e) { } // }else{ // // jarFile = new JarFile(f); // ZipEntry deploymentEntry1 = // jarFile.getEntry(ejbd.getModuleDescriptor().getAlternateDescriptor()); // if (deploymentEntry1 != null){ // deploymentEntry = // jarFile.getInputStream(deploymentEntry1); // } // } if (deploymentEntry != null) { result.addGoodDetails( smh.getLocalString( getClass().getName() + ".passed", "Found alternate EJB deployment descriptor URI file [ {0} ] within [ {1} ]", new Object[] { ejbd.getModuleDescriptor().getAlternateDescriptor(), ejbd.getName() })); } else { if (!oneFailed) { oneFailed = true; } result.addErrorDetails( smh.getLocalString( getClass().getName() + ".failed", "Error: No alternate EJB deployment descriptor URI file found, looking for [ {0} ] within [ {1} ]", new Object[] { ejbd.getModuleDescriptor().getAlternateDescriptor(), ejbd.getName() })); } // jarFile.close(); } catch (FileNotFoundException ex) { Verifier.debug(ex); if (!oneFailed) { oneFailed = true; } result.failed( smh.getLocalString( getClass().getName() + ".failedException", "Error: File not found trying to read deployment descriptor file [ {0} ] within [ {1} ]", new Object[] { ejbd.getModuleDescriptor().getAlternateDescriptor(), ejbd.getName() })); } catch (IOException ex) { Verifier.debug(ex); if (!oneFailed) { oneFailed = true; } result.failed( smh.getLocalString( getClass().getName() + ".failedException1", "Error: IO Error trying to read deployment descriptor file [ {0} ] within [ {1} ]", new Object[] { ejbd.getModuleDescriptor().getAlternateDescriptor(), ejbd.getName() })); } finally { try { if (deploymentEntry != null) deploymentEntry.close(); } catch (Exception x) { } } } } else { na++; result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable1", "There is no java EJB alternative deployment descriptor in [ {0} ]", new Object[] {ejbd.getName()})); } } if (oneFailed) { result.setStatus(Result.FAILED); } else if (na == descriptor.getEjbBundleDescriptors().size()) { result.setStatus(Result.NOT_APPLICABLE); } else { result.setStatus(Result.PASSED); } } else { result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable", "There are no EJB components in application [ {0} ]", new Object[] {descriptor.getName()})); } return result; }
public static boolean checkWebProperties( WebProperty[] webProps, Result result, WebBundleDescriptor descriptor, Object obj) { String compName = result.getComponentName(); String name; String value; boolean oneFailed = false; String[] names = null; if (webProps.length > 0) { names = new String[webProps.length]; for (int rep = 0; rep < webProps.length; rep++) { name = webProps[rep].getAttributeValue( WebProperty.NAME); // *************needs verification from ko]umar Sg value = webProps[rep].getAttributeValue(WebProperty.VALUE); names[rep] = name; if (name != null && value != null && name.length() != 0 && value.length() != 0) { // check if the name already exist in this web-prop boolean isDuplicate = false; for (int rep1 = 0; rep1 < rep; rep1++) { if (name.equals(names[rep1])) { isDuplicate = true; break; } } if (!isDuplicate) { result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName})); result.passed( smh.getLocalString( obj.getClass().getName() + ".passed", "PASSED [AS-WEB property] Proper web property with name [ {0} ] and value [ {1} ] defined.", new Object[] {name, value})); } else { if (!oneFailed) oneFailed = true; result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName})); result.failed( smh.getLocalString( obj.getClass().getName() + ".failed2", "FAILED [AS-WEB property] name [ {0} ] and value [ {1} ], the name must be unique in the entire list of web property.", new Object[] {name, value})); } } else { if (!oneFailed) oneFailed = true; result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName})); result.failed( smh.getLocalString( obj.getClass().getName() + ".failed1", "FAILED [AS-WEB property] name [ {0} ] and value [ {1} ], attributes must be of finite length.", new Object[] {name, value})); } } } return oneFailed; }
/** * Test for each message-listener , that "activationspec-class" implements * "javax.resource.spi.ActivationSpec". * * @param descriptor deployment descriptor for the rar file * @return result object containing the result of the individual test performed */ public Result check(ConnectorDescriptor descriptor) { Result result = getInitializedResult(); ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor(); if (!descriptor.getInBoundDefined()) { result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( "com.sun.enterprise.tools.verifier.tests.connector.messageinflow.notApp", "Resource Adapter does not provide inbound communication")); return result; } InboundResourceAdapter ra = descriptor.getInboundResourceAdapter(); Set msgListeners = ra.getMessageListeners(); boolean oneFailed = false; Iterator iter = msgListeners.iterator(); while (iter.hasNext()) { MessageListener msgListener = (MessageListener) iter.next(); String impl = msgListener.getActivationSpecClass(); Class implClass = null; try { implClass = Class.forName(impl, false, getVerifierContext().getClassLoader()); } catch (ClassNotFoundException e) { result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.failed( smh.getLocalString( "com.sun.enterprise.tools.verifier.tests.connector.messageinflow.nonexist", "Error: The class [ {0} ] as defined under activationspec-class in the deployment descriptor does not exist", new Object[] {impl})); return result; } if (!isImplementorOf(implClass, "javax.resource.spi.ActivationSpec")) { oneFailed = true; result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.failed( smh.getLocalString( getClass().getName() + ".failed", "Error: activationspec-class [ {0} ] does not implement javax.resource.spi.ActivationSpec.", new Object[] {impl})); return result; } } if (!oneFailed) { result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.passed( smh.getLocalString( getClass().getName() + ".passed", "Success: all activationspec-class implement javax.resource.spi.ActivationSpec")); } return result; }
/** * Define ejbFindByPrimaryKey method arguments test. * * <p>Every entity enterprise Bean class must define the ejbFindByPrimaryKey method. * * <p>The methods arguments types must be legal types for RMI-IIOP. * * @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.BEAN_PERSISTENCE.equals(persistentType)) { Class[] ejbFinderMethodParameterTypes; boolean ejbFindByPrimaryKeyMethodFound = false; boolean oneFailed = false; boolean isLegalRMIIIOP = false; try { // retrieve the EJB Class Methods Context context = getVerifierContext(); ClassLoader jcl = context.getClassLoader(); Class EJBClass = Class.forName( descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader()); // start do while loop here.... do { Method[] ejbFinderMethods = EJBClass.getDeclaredMethods(); for (int j = 0; j < ejbFinderMethods.length; ++j) { if (ejbFinderMethods[j].getName().equals("ejbFindByPrimaryKey")) { // Every entity enterprise Bean class must define the // ejbFindByPrimaryKey method. ejbFindByPrimaryKeyMethodFound = true; // The methods arguments types must be legal types for RMI-IIOP. ejbFinderMethodParameterTypes = ejbFinderMethods[j].getParameterTypes(); if (RmiIIOPUtils.isValidRmiIIOPParameters(ejbFinderMethodParameterTypes)) { // these method parameters are valid, continue isLegalRMIIIOP = true; } if (ejbFindByPrimaryKeyMethodFound && isLegalRMIIIOP) { result.addGoodDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addGoodDetails( smh.getLocalString( getClass().getName() + ".debug1", "For EJB Class [ {0} ] Finder Method [ {1} ]", new Object[] {EJBClass.getName(), ejbFinderMethods[j].getName()})); result.addGoodDetails( smh.getLocalString( getClass().getName() + ".passed", "An [ {0} ] method with valid RMI-IIOP argument types was found.", new Object[] {ejbFinderMethods[j].getName()})); } else if (ejbFindByPrimaryKeyMethodFound && (!isLegalRMIIIOP)) { oneFailed = true; result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".debug1", "For EJB Class [ {0} ] Finder Method [ {1} ]", new Object[] {EJBClass.getName(), ejbFinderMethods[j].getName()})); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".failed", "Error: An [ {0} ] method was found, but [ {1} ] method has illegal parameter values. [ {2} ] methods arguments types must be legal types for RMI-IIOP.", new Object[] { ejbFinderMethods[j].getName(), ejbFinderMethods[j].getName(), ejbFinderMethods[j].getName() })); } // found one, and there should only be one, break out break; } } } while (((EJBClass = EJBClass.getSuperclass()) != null) && (!ejbFindByPrimaryKeyMethodFound)); if (!ejbFindByPrimaryKeyMethodFound) { oneFailed = true; result.addErrorDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".debug3", "For EJB Class [ {0} ]", new Object[] {descriptor.getEjbClassName()})); result.addErrorDetails( smh.getLocalString( getClass().getName() + ".failed1", "Error: No ejbFindByPrimaryKey method was found in bean class.")); } } 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: EJB Class [ {0} ] does not exist or is not loadable.", new Object[] {descriptor.getEjbClassName()})); oneFailed = true; } if (oneFailed) { result.setStatus(result.FAILED); } else { result.setStatus(result.PASSED); } } else { // (CONTAINER_PERSISTENCE.equals(persistentType)) result.addNaDetails( smh.getLocalString( "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()})); result.notApplicable( smh.getLocalString( getClass().getName() + ".notApplicable2", "Expected persistence type [ {0} ], but bean [ {1} ] has persistence type [ {2} ]", new Object[] { EjbEntityDescriptor.BEAN_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; } }