1 23 package com.sun.enterprise.tools.verifier.tests.ejb.entity; 24 25 import com.sun.enterprise.tools.verifier.tests.ejb.EjbTest; 26 import com.sun.enterprise.deployment.*; 27 import com.sun.enterprise.tools.verifier.*; 28 import com.sun.enterprise.tools.verifier.tests.ejb.MethodUtils; 29 import com.sun.enterprise.tools.verifier.tests.ejb.EjbCheck; 30 import java.lang.ClassLoader ; 31 import com.sun.enterprise.tools.verifier.tests.*; 32 import java.util.*; 33 import java.lang.reflect.*; 34 35 40 public class TransactionDemarcationHomeInterface extends EjbTest implements EjbCheck { 41 42 static String [] EJBObjectMethods = { "getHomeHandle", "getEJBMetaData"}; 43 44 Result result = null; 45 ComponentNameConstructor compName = null; 46 47 56 public Result check(EjbDescriptor descriptor) { 57 58 result = getInitializedResult(); 59 compName = getVerifierContext().getComponentNameConstructor(); 60 boolean oneFailed = false; 61 try { 67 70 if (descriptor instanceof EjbEntityDescriptor) { 71 if(descriptor.getHomeClassName() != null && !"".equals(descriptor.getHomeClassName())) 72 oneFailed = commonToBothInterfaces(descriptor.getHomeClassName(),descriptor, MethodDescriptor.EJB_HOME); 73 else { 74 addNaDetails(result, compName); 75 result.notApplicable(smh.getLocalString 76 (getClass().getName() + ".notApplicable2", 77 "There is no home interface specified for [ {0} ]", 78 new Object [] {descriptor.getName()})); 79 return result; 80 } 81 86 if (oneFailed) { 87 result.setStatus(result.FAILED); 88 } else { 89 result.setStatus(result.PASSED); 90 } 91 92 return result; 93 } else { 94 addNaDetails(result, compName); 95 result.notApplicable(smh.getLocalString 96 (getClass().getName() + ".notApplicable", 97 "{0} expected {1} bean, but called with {2} bean.", 98 new Object [] {getClass(),"Entity","Session"})); 99 return result; 100 } 101 } catch (Throwable t) { 102 addErrorDetails(result, compName); 103 result.failed(smh.getLocalString 104 (getClass().getName() + ".failedException1", 105 "Error: Home interface does not contain class [ {0} ] within bean [ {1} ]", 106 new Object [] { t.getMessage(), descriptor.getName()})); 107 return result; 108 } 109 } 110 111 118 119 private boolean commonToBothInterfaces(String home, EjbDescriptor descriptor, String methodIntf) { 120 boolean oneFailed = false; 121 try { 122 Arrays.sort(EJBObjectMethods); 123 Class c = Class.forName(home, false, getVerifierContext().getClassLoader()); 124 Method methods[] = c.getDeclaredMethods(); 125 boolean lookForIt = false; 126 127 for (int i=0; i< methods.length; i++) { 128 if (Arrays.binarySearch(EJBObjectMethods, methods[i].getName()) < 0) { 129 try { 130 ContainerTransaction containerTransaction = null; 131 boolean resolved = false; 132 139 140 if (!descriptor.getMethodContainerTransactions().isEmpty()) { 141 for (Enumeration ee = descriptor.getMethodContainerTransactions().keys(); ee.hasMoreElements();) { 142 lookForIt = false; 143 144 MethodDescriptor methodDescriptor = (MethodDescriptor) ee.nextElement(); 145 146 150 166 167 168 if (methodDescriptor.getName().equals(MethodDescriptor.ALL_EJB_METHODS)) { 173 if (methodDescriptor.getEjbClassSymbol() == null) { 176 lookForIt = true; 177 } else if (methodDescriptor.getEjbClassSymbol().equals(MethodDescriptor.EJB_HOME)) { 178 lookForIt = true; 179 } else if (methodDescriptor.getEjbClassSymbol().equals("")) { 181 lookForIt = true; 182 }else if (methodDescriptor.getEjbClassSymbol().equals(MethodDescriptor.EJB_LOCALHOME)) { 183 lookForIt = true; 184 } else if (methodDescriptor.getEjbClassSymbol().equals(MethodDescriptor.EJB_REMOTE)) { 185 lookForIt = false; 186 } else if (methodDescriptor.getEjbClassSymbol().equals(MethodDescriptor.EJB_LOCAL)) { 187 lookForIt = false; 188 } else { 190 lookForIt = false; 193 } 194 } else if (methodDescriptor.getParameterClassNames() == null) { 195 196 if (((methodDescriptor.getEjbClassSymbol() == null) || 198 methodDescriptor.getEjbClassSymbol().equals("") || 199 methodDescriptor.getEjbClassSymbol().equals(MethodDescriptor.EJB_HOME)|| 200 methodDescriptor.getEjbClassSymbol().equals(MethodDescriptor.EJB_LOCALHOME)) && 201 (methods[i].getName().equals(methodDescriptor.getName()))) { 202 lookForIt = true; 204 } else { 205 lookForIt = false; 207 } 208 } else { 209 210 213 if (((methodDescriptor.getEjbClassSymbol() == null) || 214 methodDescriptor.getEjbClassSymbol().equals("") || 215 methodDescriptor.getEjbClassSymbol().equals(MethodDescriptor.EJB_HOME)|| 216 methodDescriptor.getEjbClassSymbol().equals(MethodDescriptor.EJB_LOCALHOME)) && 217 (methods[i].getName().equals(methodDescriptor.getName())) && 218 (MethodUtils.stringArrayEquals(methodDescriptor.getParameterClassNames(), (new MethodDescriptor(methods[i], methodIntf)).getParameterClassNames()))) { 219 lookForIt = true; 221 } else { 222 lookForIt = false; 224 } 225 226 } 227 228 if (lookForIt) { 229 containerTransaction = 230 (ContainerTransaction) descriptor.getMethodContainerTransactions().get(methodDescriptor); 231 if (containerTransaction != null) { 232 String transactionAttribute = 233 containerTransaction.getTransactionAttribute(); 234 235 if (ContainerTransaction.NOT_SUPPORTED.equals(transactionAttribute) 241 || ContainerTransaction.SUPPORTS.equals(transactionAttribute) 242 || ContainerTransaction.REQUIRED.equals(transactionAttribute) 243 || ContainerTransaction.REQUIRES_NEW.equals(transactionAttribute) 244 || ContainerTransaction.MANDATORY.equals(transactionAttribute) 245 || ContainerTransaction.NEVER.equals(transactionAttribute) 246 || (!transactionAttribute.equals(""))) { 247 addGoodDetails(result, compName); 248 result.addGoodDetails(smh.getLocalString 249 (getClass().getName() + ".passed", 250 "Valid: [ {0} ] TransactionAttribute [ {1} ] for method [ {2} ] is valid. Transaction attributes must be specified for all methods except getEJBMetaData and getHomeHandle methods of home interface [ {3} ]", 251 new Object [] {methods[i].getName(),transactionAttribute,methodDescriptor.getName(), home})); 252 resolved = true; 253 } else { 254 oneFailed = true; 255 addErrorDetails(result, compName); 256 result.addErrorDetails(smh.getLocalString 257 (getClass().getName() + ".failed", 258 "Error: [ {0} ] TransactionAttribute [ {1} ] for method [ {2} ] " + 259 "is not valid. Transaction attributes must be specified for " + 260 "all methods except getEJBMetaData and getHomeHandle methods of "+ 261 "home interface [ {3} ]", 262 new Object [] {methods[i].getName(), transactionAttribute, methodDescriptor.getName(),home})); 263 } 264 } else { 265 oneFailed = true; 266 result.addErrorDetails(smh.getLocalString 267 (getClass().getName() + ".failedException", 268 "Error: TransactionAttribute is null for method [ {0} ]", 269 new Object [] {methodDescriptor.getName()})); 270 } 271 } 272 } 273 if (!resolved) { 276 283 oneFailed = true; 284 addErrorDetails(result, compName); 285 result.addErrorDetails(smh.getLocalString 286 (getClass().getName() + ".failed1", 287 "Error: Transaction attributes must be specified for the methods defined in the home interface [ {0} ]. Method [ {1} ] has no transaction attribute defined within this bean [ {2} ].", 288 new Object [] {home, methods[i].getName(),descriptor.getName()})); 289 } 290 306 307 } else { 308 oneFailed = true; 309 addErrorDetails(result, compName); 310 result.addErrorDetails(smh.getLocalString 311 (getClass().getName() + ".failed2", 312 "Error: There are no method container transactions within this bean [ {0} ]. Transaction attributes must be specified for the methods defined in the home interface [ {1} ]. Method [ {2} ] has no transaction attribute defined.", 313 new Object [] {descriptor.getName(),home, methods[i].getName()})); 314 } 315 if(oneFailed == true && i==methods.length-1) 316 return oneFailed; 317 else 318 continue; 319 320 } catch (Exception e) { 321 addErrorDetails(result, compName); 322 result.failed(smh.getLocalString 323 (getClass().getName() + ".failedException1", 324 "Error: Home interface [ {0} ] does not contain class [ {1} ] within bean [ {2} ]", 325 new Object [] {home, e.getMessage(), descriptor.getName()})); 326 oneFailed = true; 327 return oneFailed; 328 } 329 } else { 331 oneFailed = true; 332 addErrorDetails(result, compName); 333 result.failed(smh.getLocalString 334 (getClass().getName() + ".failedExcep", 335 "Error: Method [ {0} ] should not be assigned a transaction attribute.", 336 new Object [] {methods[i].getName()})); 337 338 } 339 } return oneFailed; 341 } catch (ClassNotFoundException e) { 342 Verifier.debug(e); 343 addErrorDetails(result, compName); 344 result.failed(smh.getLocalString 345 (getClass().getName() + ".failedException2", 346 "Error: Home interface [ {0} ] does not exist or is not loadable within bean [ {1} ]", 347 new Object [] {home, descriptor.getName()})); 348 oneFailed = true; 349 return oneFailed; 350 } 351 } 352 } 353 | Popular Tags |