1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the  "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18/*
19 * $Id: ExtensionNamespaceSupport.java 468637 2006-10-28 06:51:02Z minchau $
20 */
21package org.apache.xalan.extensions;
22
23import java.lang.reflect.Constructor;
24
25import javax.xml.transform.TransformerException;
26
27/**
28 * During styleseet composition, an ExtensionNamespaceSupport object is created for each extension
29 * namespace the stylesheet uses. At the beginning of a transformation, TransformerImpl generates
30 * an ExtensionHandler for each of these objects and adds an entry to the ExtensionsTable hashtable.
31 */
32public class ExtensionNamespaceSupport
33{
34  // Namespace, ExtensionHandler class name, constructor signature
35  // and arguments.
36  String m_namespace = null;
37  String m_handlerClass = null;
38  Class [] m_sig = null;
39  Object [] m_args = null;
40
41  public ExtensionNamespaceSupport(String namespace,
42                                   String handlerClass,
43                                   Object[] constructorArgs)
44  {
45    m_namespace = namespace;
46    m_handlerClass = handlerClass;
47    m_args = constructorArgs;
48    // Create the constructor signature.
49    m_sig = new Class[m_args.length];
50    for (int i = 0; i < m_args.length; i++)
51    {
52      if (m_args[i] != null)
53        m_sig[i] = m_args[i].getClass();//System.out.println("arg class " + i + " " +m_sig[i]);
54      else // If an arguments is null, pick the constructor later.
55      {
56        m_sig = null;
57        break;
58      }
59    }
60  }
61
62  public String getNamespace()
63  {
64    return m_namespace;
65  }
66
67  /**
68   * Launch the ExtensionHandler that this ExtensionNamespaceSupport object defines.
69   */
70  public ExtensionHandler launch()
71    throws TransformerException
72  {
73    ExtensionHandler handler = null;
74    try
75    {
76      Class cl = ExtensionHandler.getClassForName(m_handlerClass);
77      Constructor con = null;
78      //System.out.println("class " + cl + " " + m_args + " " + m_args.length + " " + m_sig);
79      if (m_sig != null)
80        con = cl.getConstructor(m_sig);
81      else // Pick the constructor based on number of args.
82      {
83        Constructor[] cons = cl.getConstructors();
84        for (int i = 0; i < cons.length; i ++)
85        {
86          if (cons[i].getParameterTypes().length == m_args.length)
87          {
88            con = cons[i];
89            break;
90          }
91        }
92      }
93      // System.out.println("constructor " + con);
94      if (con != null)
95        handler = (ExtensionHandler)con.newInstance(m_args);
96      else
97        throw new TransformerException("ExtensionHandler constructor not found");
98    }
99    catch (Exception e)
100    {
101      throw new TransformerException(e);
102    }
103    return handler;
104  }
105
106}
107