@Override public Type type(Context ctx) { List<Class<?>> argumentClasses = new ArrayList<>(); List<Type> argumentTypes = new ArrayList<>(); for (Expression argument : arguments) { argumentTypes.add(argument.type(ctx)); if (argument.type(ctx).equals(getType(Object[].class))) { argumentClasses.add(Object[].class); } else { argumentClasses.add(getJavaType(ctx.getClassLoader(), argument.type(ctx))); } } Type returnType; try { if (ctx.getThisType().equals(owner.type(ctx))) { for (org.objectweb.asm.commons.Method method : ctx.getMethods().keySet()) { if (method.getName().equals(methodName)) { if (method.getArgumentTypes().length == arguments.size()) { Type[] methodTypes = method.getArgumentTypes(); boolean isSame = true; for (int i = 0; i < arguments.size(); i++) { if (!methodTypes[i].equals(argumentTypes.get(i))) { isSame = false; break; } } if (isSame) return method.getReturnType(); } } } throw new NoSuchMethodException(); } else { Class<?> ownerJavaType = getJavaType(ctx.getClassLoader(), owner.type(ctx)); Method method = ownerJavaType.getMethod(methodName, argumentClasses.toArray(new Class<?>[] {})); Class<?> returnClass = method.getReturnType(); returnType = getType(returnClass); } } catch (NoSuchMethodException e) { throw new RuntimeException( format( "No method %s.%s(%s). %s", owner.type(ctx).getClassName(), methodName, (!argumentClasses.isEmpty() ? argsToString(argumentClasses) : ""), exceptionInGeneratedClass(ctx))); } return returnType; }
Class<?> getPluginClass(String packageName, String className) throws NameNotFoundException, ClassNotFoundException { Context pluginContext = this.mAppContext.createPackageContext( packageName, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); ClassLoader pluginCL = pluginContext.getClassLoader(); return pluginCL.loadClass(className); }
/** * 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 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; } }
/** * 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; } }
@Override public Type load(Context ctx) { GeneratorAdapter g = ctx.getGeneratorAdapter(); owner.load(ctx); List<Class<?>> argumentClasses = new ArrayList<>(); List<Type> argumentTypes = new ArrayList<>(); for (Expression argument : arguments) { argument.load(ctx); argumentTypes.add(argument.type(ctx)); argumentClasses.add(getJavaType(ctx.getClassLoader(), argument.type(ctx))); } Type returnType; try { if (ctx.getThisType().equals(owner.type(ctx))) { org.objectweb.asm.commons.Method method = null; for (org.objectweb.asm.commons.Method m : ctx.getMethods().keySet()) { if (m.getName().equals(methodName)) { if (m.getArgumentTypes().length == arguments.size()) { Type[] methodTypes = m.getArgumentTypes(); boolean isSame = true; for (int i = 0; i < arguments.size(); i++) { if (!methodTypes[i].equals(argumentTypes.get(i))) { isSame = false; break; } } if (isSame) { method = m; break; } } } } if (method == null) throw new NoSuchMethodException(); g.invokeVirtual(owner.type(ctx), method); return method.getReturnType(); } Class<?> ownerJavaType = getJavaType(ctx.getClassLoader(), owner.type(ctx)); Method method = ownerJavaType.getMethod(methodName, argumentClasses.toArray(new Class<?>[] {})); Class<?> returnClass = method.getReturnType(); returnType = getType(returnClass); invokeVirtualOrInterface( g, ownerJavaType, new org.objectweb.asm.commons.Method( methodName, returnType, argumentTypes.toArray(new Type[] {}))); } catch (NoSuchMethodException e) { throw new RuntimeException( format( "No method %s.%s(%s). %s", owner.type(ctx).getClassName(), methodName, (!argumentClasses.isEmpty() ? argsToString(argumentClasses) : ""), exceptionInGeneratedClass(ctx))); } return returnType; }