Home | History | Annotate | Download | only in extensions
      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: ExtensionHandler.java 468637 2006-10-28 06:51:02Z minchau $
     20  */
     21 package org.apache.xalan.extensions;
     22 
     23 import java.io.IOException;
     24 import java.util.Vector;
     25 
     26 import javax.xml.transform.TransformerException;
     27 
     28 import org.apache.xalan.templates.ElemTemplateElement;
     29 import org.apache.xalan.templates.Stylesheet;
     30 import org.apache.xalan.transformer.TransformerImpl;
     31 import org.apache.xpath.functions.FuncExtFunction;
     32 
     33 /**
     34  * Abstract base class for handling an extension namespace for XPath.
     35  * Provides functions to test a function's existence and call a function.
     36  * Also provides functions for calling an element and testing for
     37  * an element's existence.
     38  *
     39  * @author Sanjiva Weerawarana (sanjiva (at) watson.ibm.com)
     40  * @xsl.usage internal
     41  */
     42 public abstract class ExtensionHandler
     43 {
     44 
     45   /** uri of the extension namespace */
     46   protected String m_namespaceUri;
     47 
     48   /** scripting language of implementation */
     49   protected String m_scriptLang;
     50 
     51   /**
     52    * This method loads a class using the context class loader if we're
     53    * running under Java2 or higher.
     54    *
     55    * @param className Name of the class to load
     56    */
     57   static Class getClassForName(String className)
     58       throws ClassNotFoundException
     59   {
     60     // Hack for backwards compatibility with XalanJ1 stylesheets
     61     if(className.equals("org.apache.xalan.xslt.extensions.Redirect")) {
     62       className = "org.apache.xalan.lib.Redirect";
     63     }
     64 
     65     return ObjectFactory.findProviderClass(
     66         className, ObjectFactory.findClassLoader(), true);
     67   }
     68 
     69   /**
     70    * Construct a new extension namespace handler given all the information
     71    * needed.
     72    *
     73    * @param namespaceUri the extension namespace URI that I'm implementing
     74    * @param scriptLang   language of code implementing the extension
     75    */
     76   protected ExtensionHandler(String namespaceUri, String scriptLang)
     77   {
     78     m_namespaceUri = namespaceUri;
     79     m_scriptLang = scriptLang;
     80   }
     81 
     82   /**
     83    * Tests whether a certain function name is known within this namespace.
     84    * @param function name of the function being tested
     85    * @return true if its known, false if not.
     86    */
     87   public abstract boolean isFunctionAvailable(String function);
     88 
     89   /**
     90    * Tests whether a certain element name is known within this namespace.
     91    * @param element Name of element to check
     92    * @return true if its known, false if not.
     93    */
     94   public abstract boolean isElementAvailable(String element);
     95 
     96   /**
     97    * Process a call to a function.
     98    *
     99    * @param funcName Function name.
    100    * @param args     The arguments of the function call.
    101    * @param methodKey A key that uniquely identifies this class and method call.
    102    * @param exprContext The context in which this expression is being executed.
    103    *
    104    * @return the return value of the function evaluation.
    105    *
    106    * @throws TransformerException          if parsing trouble
    107    */
    108   public abstract Object callFunction(
    109     String funcName, Vector args, Object methodKey,
    110       ExpressionContext exprContext) throws TransformerException;
    111 
    112   /**
    113    * Process a call to a function.
    114    *
    115    * @param extFunction The XPath extension function.
    116    * @param args     The arguments of the function call.
    117    * @param exprContext The context in which this expression is being executed.
    118    *
    119    * @return the return value of the function evaluation.
    120    *
    121    * @throws TransformerException          if parsing trouble
    122    */
    123   public abstract Object callFunction(
    124     FuncExtFunction extFunction, Vector args,
    125       ExpressionContext exprContext) throws TransformerException;
    126 
    127   /**
    128    * Process a call to this extension namespace via an element. As a side
    129    * effect, the results are sent to the TransformerImpl's result tree.
    130    *
    131    * @param localPart      Element name's local part.
    132    * @param element        The extension element being processed.
    133    * @param transformer    Handle to TransformerImpl.
    134    * @param stylesheetTree The compiled stylesheet tree.
    135    * @param methodKey      A key that uniquely identifies this class and method call.
    136    *
    137    * @throws XSLProcessorException thrown if something goes wrong
    138    *            while running the extension handler.
    139    * @throws MalformedURLException if loading trouble
    140    * @throws FileNotFoundException if loading trouble
    141    * @throws IOException           if loading trouble
    142    * @throws TransformerException  if parsing trouble
    143    */
    144   public abstract void processElement(
    145     String localPart, ElemTemplateElement element, TransformerImpl transformer,
    146       Stylesheet stylesheetTree, Object methodKey) throws TransformerException, IOException;
    147 }
    148