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 package org.apache.xalan.extensions; 020 021 import java.util.List; 022 import java.util.Vector; 023 024 import javax.xml.transform.TransformerException; 025 import javax.xml.xpath.XPathFunction; 026 import javax.xml.xpath.XPathFunctionException; 027 028 /** 029 * A sample implementation of XPathFunction, with support for 030 * EXSLT extension functions and Java extension functions. 031 */ 032 public class XPathFunctionImpl implements XPathFunction 033 { 034 private ExtensionHandler m_handler; 035 private String m_funcName; 036 037 /** 038 * Construct an instance of XPathFunctionImpl from the 039 * ExtensionHandler and function name. 040 */ 041 public XPathFunctionImpl(ExtensionHandler handler, String funcName) 042 { 043 m_handler = handler; 044 m_funcName = funcName; 045 } 046 047 /** 048 * @see javax.xml.xpath.XPathFunction#evaluate(java.util.List) 049 */ 050 public Object evaluate(List args) 051 throws XPathFunctionException 052 { 053 Vector argsVec = listToVector(args); 054 055 try { 056 // The method key and ExpressionContext are set to null. 057 return m_handler.callFunction(m_funcName, argsVec, null, null); 058 } 059 catch (TransformerException e) 060 { 061 throw new XPathFunctionException(e); 062 } 063 } 064 065 /** 066 * Convert a java.util.List to a java.util.Vector. 067 * No conversion is done if the List is already a Vector. 068 */ 069 private static Vector listToVector(List args) 070 { 071 if (args == null) 072 return null; 073 else if (args instanceof Vector) 074 return (Vector)args; 075 else 076 { 077 Vector result = new Vector(); 078 result.addAll(args); 079 return result; 080 } 081 } 082 }