001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the "License");
007 * you may not use this file except in compliance with the License.
008 * You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 /*
019 * $Id: ExtensionNamespaceSupport.java 468637 2006-10-28 06:51:02Z minchau $
020 */
021 package org.apache.xalan.extensions;
022
023 import java.lang.reflect.Constructor;
024
025 import javax.xml.transform.TransformerException;
026
027 /**
028 * During styleseet composition, an ExtensionNamespaceSupport object is created for each extension
029 * namespace the stylesheet uses. At the beginning of a transformation, TransformerImpl generates
030 * an ExtensionHandler for each of these objects and adds an entry to the ExtensionsTable hashtable.
031 */
032 public class ExtensionNamespaceSupport
033 {
034 // Namespace, ExtensionHandler class name, constructor signature
035 // and arguments.
036 String m_namespace = null;
037 String m_handlerClass = null;
038 Class [] m_sig = null;
039 Object [] m_args = null;
040
041 public ExtensionNamespaceSupport(String namespace,
042 String handlerClass,
043 Object[] constructorArgs)
044 {
045 m_namespace = namespace;
046 m_handlerClass = handlerClass;
047 m_args = constructorArgs;
048 // Create the constructor signature.
049 m_sig = new Class[m_args.length];
050 for (int i = 0; i < m_args.length; i++)
051 {
052 if (m_args[i] != null)
053 m_sig[i] = m_args[i].getClass();//System.out.println("arg class " + i + " " +m_sig[i]);
054 else // If an arguments is null, pick the constructor later.
055 {
056 m_sig = null;
057 break;
058 }
059 }
060 }
061
062 public String getNamespace()
063 {
064 return m_namespace;
065 }
066
067 /**
068 * Launch the ExtensionHandler that this ExtensionNamespaceSupport object defines.
069 */
070 public ExtensionHandler launch()
071 throws TransformerException
072 {
073 ExtensionHandler handler = null;
074 try
075 {
076 Class cl = ExtensionHandler.getClassForName(m_handlerClass);
077 Constructor con = null;
078 //System.out.println("class " + cl + " " + m_args + " " + m_args.length + " " + m_sig);
079 if (m_sig != null)
080 con = cl.getConstructor(m_sig);
081 else // Pick the constructor based on number of args.
082 {
083 Constructor[] cons = cl.getConstructors();
084 for (int i = 0; i < cons.length; i ++)
085 {
086 if (cons[i].getParameterTypes().length == m_args.length)
087 {
088 con = cons[i];
089 break;
090 }
091 }
092 }
093 // System.out.println("constructor " + con);
094 if (con != null)
095 handler = (ExtensionHandler)con.newInstance(m_args);
096 else
097 throw new TransformerException("ExtensionHandler constructor not found");
098 }
099 catch (Exception e)
100 {
101 throw new TransformerException(e);
102 }
103 return handler;
104 }
105
106 }