1 16 19 package org.apache.xalan.extensions; 20 21 import java.io.IOException ; 22 import java.lang.reflect.Constructor ; 23 import java.lang.reflect.InvocationTargetException ; 24 import java.lang.reflect.Method ; 25 import java.lang.reflect.Modifier ; 26 import java.util.Vector ; 27 28 import javax.xml.transform.TransformerException ; 29 30 import org.apache.xalan.res.XSLMessages; 31 import org.apache.xalan.res.XSLTErrorResources; 32 import org.apache.xalan.templates.ElemTemplateElement; 33 import org.apache.xalan.templates.Stylesheet; 34 import org.apache.xalan.trace.ExtensionEvent; 35 import org.apache.xalan.transformer.TransformerImpl; 36 import org.apache.xpath.functions.FuncExtFunction; 37 import org.apache.xpath.objects.XObject; 38 39 59 60 61 public class ExtensionHandlerJavaPackage extends ExtensionHandlerJava 62 { 63 64 73 public ExtensionHandlerJavaPackage(String namespaceUri, 74 String scriptLang, 75 String className) 76 { 77 super(namespaceUri, scriptLang, className); 78 } 79 80 81 92 93 public boolean isFunctionAvailable(String function) 94 { 95 try 96 { 97 String fullName = m_className + function; 98 int lastDot = fullName.lastIndexOf("."); 99 if (lastDot >= 0) 100 { 101 Class myClass = getClassForName(fullName.substring(0, lastDot)); 102 Method [] methods = myClass.getMethods(); 103 int nMethods = methods.length; 104 function = fullName.substring(lastDot + 1); 105 for (int i = 0; i < nMethods; i++) 106 { 107 if (methods[i].getName().equals(function)) 108 return true; 109 } 110 } 111 } 112 catch (ClassNotFoundException cnfe) {} 113 114 return false; 115 } 116 117 118 125 126 public boolean isElementAvailable(String element) 127 { 128 try 129 { 130 String fullName = m_className + element; 131 int lastDot = fullName.lastIndexOf("."); 132 if (lastDot >= 0) 133 { 134 Class myClass = getClassForName(fullName.substring(0, lastDot)); 135 Method [] methods = myClass.getMethods(); 136 int nMethods = methods.length; 137 element = fullName.substring(lastDot + 1); 138 for (int i = 0; i < nMethods; i++) 139 { 140 if (methods[i].getName().equals(element)) 141 { 142 Class [] paramTypes = methods[i].getParameterTypes(); 143 if ( (paramTypes.length == 2) 144 && paramTypes[0].isAssignableFrom( 145 org.apache.xalan.extensions.XSLProcessorContext.class) 146 && paramTypes[1].isAssignableFrom( 147 org.apache.xalan.templates.ElemExtensionCall.class) ) 148 { 149 return true; 150 } 151 } 152 } 153 } 154 } 155 catch (ClassNotFoundException cnfe) {} 156 157 return false; 158 } 159 160 161 199 200 public Object callFunction (String funcName, 201 Vector args, 202 Object methodKey, 203 ExpressionContext exprContext) 204 throws TransformerException 205 { 206 207 String className; 208 String methodName; 209 Class classObj; 210 Object targetObject; 211 int lastDot = funcName.lastIndexOf("."); 212 Object [] methodArgs; 213 Object [][] convertedArgs; 214 Class [] paramTypes; 215 216 try 217 { 218 219 if (funcName.endsWith(".new")) { 221 methodArgs = new Object [args.size()]; 222 convertedArgs = new Object [1][]; 223 for (int i = 0; i < methodArgs.length; i++) 224 { 225 methodArgs[i] = args.elementAt(i); 226 } 227 Constructor c = (Constructor ) getFromCache(methodKey, null, methodArgs); 228 if (c != null) 229 { 230 try 231 { 232 paramTypes = c.getParameterTypes(); 233 MethodResolver.convertParams(methodArgs, convertedArgs, paramTypes, exprContext); 234 return c.newInstance(convertedArgs[0]); 235 } 236 catch (InvocationTargetException ite) 237 { 238 throw ite; 239 } 240 catch(Exception e) 241 { 242 } 244 } 245 className = m_className + funcName.substring(0, lastDot); 246 try 247 { 248 classObj = getClassForName(className); 249 } 250 catch (ClassNotFoundException e) 251 { 252 throw new TransformerException (e); 253 } 254 c = MethodResolver.getConstructor(classObj, 255 methodArgs, 256 convertedArgs, 257 exprContext); 258 putToCache(methodKey, null, methodArgs, c); 259 if (TransformerImpl.S_DEBUG) { 260 TransformerImpl trans = (TransformerImpl)exprContext.getXPathContext().getOwnerObject(); 261 trans.getTraceManager().fireExtensionEvent(new ExtensionEvent(trans, c, convertedArgs[0])); 262 Object result; 263 try { 264 result = c.newInstance(convertedArgs[0]); 265 } catch (Exception e) { 266 throw e; 267 } finally { 268 trans.getTraceManager().fireExtensionEndEvent(new ExtensionEvent(trans, c, convertedArgs[0])); 269 } 270 return result; 271 } else 272 return c.newInstance(convertedArgs[0]); 273 } 274 275 else if (-1 != lastDot) { 277 methodArgs = new Object [args.size()]; 278 convertedArgs = new Object [1][]; 279 for (int i = 0; i < methodArgs.length; i++) 280 { 281 methodArgs[i] = args.elementAt(i); 282 } 283 Method m = (Method ) getFromCache(methodKey, null, methodArgs); 284 if (m != null && !TransformerImpl.S_DEBUG) 285 { 286 try 287 { 288 paramTypes = m.getParameterTypes(); 289 MethodResolver.convertParams(methodArgs, convertedArgs, paramTypes, exprContext); 290 return m.invoke(null, convertedArgs[0]); 291 } 292 catch (InvocationTargetException ite) 293 { 294 throw ite; 295 } 296 catch(Exception e) 297 { 298 } 300 } 301 className = m_className + funcName.substring(0, lastDot); 302 methodName = funcName.substring(lastDot + 1); 303 try 304 { 305 classObj = getClassForName(className); 306 } 307 catch (ClassNotFoundException e) 308 { 309 throw new TransformerException (e); 310 } 311 m = MethodResolver.getMethod(classObj, 312 methodName, 313 methodArgs, 314 convertedArgs, 315 exprContext, 316 MethodResolver.STATIC_ONLY); 317 putToCache(methodKey, null, methodArgs, m); 318 if (TransformerImpl.S_DEBUG) { 319 TransformerImpl trans = (TransformerImpl)exprContext.getXPathContext().getOwnerObject(); 320 trans.getTraceManager().fireExtensionEvent(m, null, convertedArgs[0]); 321 Object result; 322 try { 323 result = m.invoke(null, convertedArgs[0]); 324 } catch (Exception e) { 325 throw e; 326 } finally { 327 trans.getTraceManager().fireExtensionEndEvent(m, null, convertedArgs[0]); 328 } 329 return result; 330 } 331 else 332 return m.invoke(null, convertedArgs[0]); 333 } 334 335 else { 337 if (args.size() < 1) 338 { 339 throw new TransformerException (XSLMessages.createMessage(XSLTErrorResources.ER_INSTANCE_MTHD_CALL_REQUIRES, new Object []{funcName })); } 342 targetObject = args.elementAt(0); 343 if (targetObject instanceof XObject) targetObject = ((XObject) targetObject).object(); 345 methodArgs = new Object [args.size() - 1]; 346 convertedArgs = new Object [1][]; 347 for (int i = 0; i < methodArgs.length; i++) 348 { 349 methodArgs[i] = args.elementAt(i+1); 350 } 351 Method m = (Method ) getFromCache(methodKey, targetObject, methodArgs); 352 if (m != null) 353 { 354 try 355 { 356 paramTypes = m.getParameterTypes(); 357 MethodResolver.convertParams(methodArgs, convertedArgs, paramTypes, exprContext); 358 return m.invoke(targetObject, convertedArgs[0]); 359 } 360 catch (InvocationTargetException ite) 361 { 362 throw ite; 363 } 364 catch(Exception e) 365 { 366 } 368 } 369 classObj = targetObject.getClass(); 370 m = MethodResolver.getMethod(classObj, 371 funcName, 372 methodArgs, 373 convertedArgs, 374 exprContext, 375 MethodResolver.INSTANCE_ONLY); 376 putToCache(methodKey, targetObject, methodArgs, m); 377 if (TransformerImpl.S_DEBUG) { 378 TransformerImpl trans = (TransformerImpl)exprContext.getXPathContext().getOwnerObject(); 379 trans.getTraceManager().fireExtensionEvent(m, targetObject, convertedArgs[0]); 380 Object result; 381 try { 382 result = m.invoke(targetObject, convertedArgs[0]); 383 } catch (Exception e) { 384 throw e; 385 } finally { 386 trans.getTraceManager().fireExtensionEndEvent(m, targetObject, convertedArgs[0]); 387 } 388 return result; 389 } else 390 return m.invoke(targetObject, convertedArgs[0]); 391 } 392 } 393 catch (InvocationTargetException ite) 394 { 395 Throwable resultException = ite; 396 Throwable targetException = ite.getTargetException(); 397 398 if (targetException instanceof TransformerException ) 399 throw ((TransformerException )targetException); 400 else if (targetException != null) 401 resultException = targetException; 402 403 throw new TransformerException (resultException); 404 } 405 catch (Exception e) 406 { 407 throw new TransformerException (e); 409 } 410 } 411 412 421 public Object callFunction(FuncExtFunction extFunction, 422 Vector args, 423 ExpressionContext exprContext) 424 throws TransformerException 425 { 426 return callFunction(extFunction.getFunctionName(), args, 427 extFunction.getMethodKey(), exprContext); 428 } 429 430 448 449 public void processElement (String localPart, 450 ElemTemplateElement element, 451 TransformerImpl transformer, 452 Stylesheet stylesheetTree, 453 Object methodKey) 454 throws TransformerException , IOException 455 { 456 Object result = null; 457 Class classObj; 458 459 Method m = (Method ) getFromCache(methodKey, null, null); 460 if (null == m) 461 { 462 try 463 { 464 String fullName = m_className + localPart; 465 int lastDot = fullName.lastIndexOf("."); 466 if (lastDot < 0) 467 throw new TransformerException (XSLMessages.createMessage(XSLTErrorResources.ER_INVALID_ELEMENT_NAME, new Object []{fullName })); try 469 { 470 classObj = getClassForName(fullName.substring(0, lastDot)); 471 } 472 catch (ClassNotFoundException e) 473 { 474 throw new TransformerException (e); 475 } 476 localPart = fullName.substring(lastDot + 1); 477 m = MethodResolver.getElementMethod(classObj, localPart); 478 if (!Modifier.isStatic(m.getModifiers())) 479 throw new TransformerException (XSLMessages.createMessage(XSLTErrorResources.ER_ELEMENT_NAME_METHOD_STATIC, new Object []{fullName })); } 481 catch (Exception e) 482 { 483 throw new TransformerException (e); 485 } 486 putToCache(methodKey, null, null, m); 487 } 488 489 XSLProcessorContext xpc = new XSLProcessorContext(transformer, 490 stylesheetTree); 491 492 try 493 { 494 if (TransformerImpl.S_DEBUG) { 495 transformer.getTraceManager().fireExtensionEvent(m, null, new Object [] {xpc, element}); 496 try { 497 result = m.invoke(null, new Object [] {xpc, element}); 498 } catch (Exception e) { 499 throw e; 500 } finally { 501 transformer.getTraceManager().fireExtensionEndEvent(m, null, new Object [] {xpc, element}); 502 } 503 } else 504 result = m.invoke(null, new Object [] {xpc, element}); 505 } 506 catch (InvocationTargetException ite) 507 { 508 Throwable resultException = ite; 509 Throwable targetException = ite.getTargetException(); 510 511 if (targetException instanceof TransformerException ) 512 throw ((TransformerException )targetException); 513 else if (targetException != null) 514 resultException = targetException; 515 516 throw new TransformerException (resultException); 517 } 518 catch (Exception e) 519 { 520 throw new TransformerException (e); 522 } 523 524 if (result != null) 525 { 526 xpc.outputToResultTree (stylesheetTree, result); 527 } 528 529 } 530 531 } 532 | Popular Tags |