1. package org.apache.xalan.extensions;
  2. import java.lang.reflect.Constructor;
  3. import javax.xml.transform.TransformerException;
  4. /**
  5. * During styleseet composition, an ExtensionNamespaceSupport object is created for each extension
  6. * namespace the stylesheet uses. At the beginning of a transformation, TransformerImpl generates
  7. * an ExtensionHandler for each of these objects and adds an entry to the ExtensionsTable hashtable.
  8. */
  9. public class ExtensionNamespaceSupport
  10. {
  11. // Namespace, ExtensionHandler class name, constructor signature
  12. // and arguments.
  13. String m_namespace = null;
  14. String m_handlerClass = null;
  15. Class [] m_sig = null;
  16. Object [] m_args = null;
  17. public ExtensionNamespaceSupport(String namespace,
  18. String handlerClass,
  19. Object[] constructorArgs)
  20. {
  21. m_namespace = namespace;
  22. m_handlerClass = handlerClass;
  23. m_args = constructorArgs;
  24. // Create the constructor signature.
  25. m_sig = new Class[m_args.length];
  26. for (int i = 0; i < m_args.length; i++)
  27. {
  28. if (m_args[i] != null)
  29. m_sig[i] = m_args[i].getClass();//System.out.println("arg class " + i + " " +m_sig[i]);
  30. else // If an arguments is null, pick the constructor later.
  31. {
  32. m_sig = null;
  33. break;
  34. }
  35. }
  36. }
  37. public String getNamespace()
  38. {
  39. return m_namespace;
  40. }
  41. /**
  42. * Launch the ExtensionHandler that this ExtensionNamespaceSupport object defines.
  43. */
  44. public ExtensionHandler launch()
  45. throws TransformerException
  46. {
  47. ExtensionHandler handler = null;
  48. try
  49. {
  50. Class cl = ExtensionHandler.getClassForName(m_handlerClass);
  51. Constructor con = null;
  52. //System.out.println("class " + cl + " " + m_args + " " + m_args.length + " " + m_sig);
  53. if (m_sig != null)
  54. con = cl.getConstructor(m_sig);
  55. else // Pick the constructor based on number of args.
  56. {
  57. Constructor[] cons = cl.getConstructors();
  58. for (int i = 0; i < cons.length; i ++)
  59. {
  60. if (cons[i].getParameterTypes().length == m_args.length)
  61. {
  62. con = cons[i];
  63. break;
  64. }
  65. }
  66. }
  67. // System.out.println("constructor " + con);
  68. if (con != null)
  69. handler = (ExtensionHandler)con.newInstance(m_args);
  70. else
  71. throw new TransformerException("ExtensionHandler constructor not found");
  72. }
  73. catch (Exception e)
  74. {
  75. throw new TransformerException(e);
  76. }
  77. return handler;
  78. }
  79. }