/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the  "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// $Id: JAXPExtensionsProvider.java 468655 2006-10-28 07:12:06Z minchau $

package org.apache.xpath.jaxp;

import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPathFunctionResolver;
import javax.xml.xpath.XPathFunction;
import javax.xml.xpath.XPathFunctionException;

import org.apache.xpath.ExtensionsProvider;
import org.apache.xpath.XPathContext;
import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XNodeSet;
import org.apache.xpath.res.XPATHErrorResources;
import org.apache.xalan.res.XSLMessages;

import org.apache.xpath.functions.FuncExtFunction;
import java.util.Vector;
import java.util.ArrayList;
import javax.xml.namespace.QName;

Author:Ramesh Mandava ( ramesh.mandava@sun.com )
/** * * @author Ramesh Mandava ( ramesh.mandava@sun.com ) */
public class JAXPExtensionsProvider implements ExtensionsProvider { private final XPathFunctionResolver resolver; private boolean extensionInvocationDisabled = false; public JAXPExtensionsProvider(XPathFunctionResolver resolver) { this.resolver = resolver; this.extensionInvocationDisabled = false; } public JAXPExtensionsProvider(XPathFunctionResolver resolver, boolean featureSecureProcessing ) { this.resolver = resolver; this.extensionInvocationDisabled = featureSecureProcessing; }
Is the extension function available?
/** * Is the extension function available? */
public boolean functionAvailable(String ns, String funcName) throws javax.xml.transform.TransformerException { try { if ( funcName == null ) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_ARG_CANNOT_BE_NULL, new Object[] {"Function Name"} ); throw new NullPointerException ( fmsg ); } //Find the XPathFunction corresponding to namespace and funcName javax.xml.namespace.QName myQName = new QName( ns, funcName ); javax.xml.xpath.XPathFunction xpathFunction = resolver.resolveFunction ( myQName, 0 ); if ( xpathFunction == null ) { return false; } return true; } catch ( Exception e ) { return false; } }
Is the extension element available?
/** * Is the extension element available? */
public boolean elementAvailable(String ns, String elemName) throws javax.xml.transform.TransformerException { return false; }
Execute the extension function.
/** * Execute the extension function. */
public Object extFunction(String ns, String funcName, Vector argVec, Object methodKey) throws javax.xml.transform.TransformerException { try { if ( funcName == null ) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_ARG_CANNOT_BE_NULL, new Object[] {"Function Name"} ); throw new NullPointerException ( fmsg ); } //Find the XPathFunction corresponding to namespace and funcName javax.xml.namespace.QName myQName = new QName( ns, funcName ); // JAXP 1.3 spec says When XMLConstants.FEATURE_SECURE_PROCESSING // feature is set then invocation of extension functions need to // throw XPathFunctionException if ( extensionInvocationDisabled ) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED, new Object[] { myQName.toString() } ); throw new XPathFunctionException ( fmsg ); } // Assuming user is passing all the needed parameters ( including // default values ) int arity = argVec.size(); javax.xml.xpath.XPathFunction xpathFunction = resolver.resolveFunction ( myQName, arity ); // not using methodKey ArrayList argList = new ArrayList( arity); for ( int i=0; i<arity; i++ ) { Object argument = argVec.elementAt( i ); // XNodeSet object() returns NodeVector and not NodeList // Explicitly getting NodeList by using nodelist() if ( argument instanceof XNodeSet ) { argList.add ( i, ((XNodeSet)argument).nodelist() ); } else if ( argument instanceof XObject ) { Object passedArgument = ((XObject)argument).object(); argList.add ( i, passedArgument ); } else { argList.add ( i, argument ); } } return ( xpathFunction.evaluate ( argList )); } catch ( XPathFunctionException xfe ) { // If we get XPathFunctionException then we want to terminate // further execution by throwing WrappedRuntimeException throw new org.apache.xml.utils.WrappedRuntimeException ( xfe ); } catch ( Exception e ) { throw new javax.xml.transform.TransformerException ( e ); } }
Execute the extension function.
/** * Execute the extension function. */
public Object extFunction(FuncExtFunction extFunction, Vector argVec) throws javax.xml.transform.TransformerException { try { String namespace = extFunction.getNamespace(); String functionName = extFunction.getFunctionName(); int arity = extFunction.getArgCount(); javax.xml.namespace.QName myQName = new javax.xml.namespace.QName( namespace, functionName ); // JAXP 1.3 spec says When XMLConstants.FEATURE_SECURE_PROCESSING // feature is set then invocation of extension functions need to // throw XPathFunctionException if ( extensionInvocationDisabled ) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_EXTENSION_FUNCTION_CANNOT_BE_INVOKED, new Object[] { myQName.toString() } ); throw new XPathFunctionException ( fmsg ); } XPathFunction xpathFunction = resolver.resolveFunction( myQName, arity ); ArrayList argList = new ArrayList( arity); for ( int i=0; i<arity; i++ ) { Object argument = argVec.elementAt( i ); // XNodeSet object() returns NodeVector and not NodeList // Explicitly getting NodeList by using nodelist() if ( argument instanceof XNodeSet ) { argList.add ( i, ((XNodeSet)argument).nodelist() ); } else if ( argument instanceof XObject ) { Object passedArgument = ((XObject)argument).object(); argList.add ( i, passedArgument ); } else { argList.add ( i, argument ); } } return ( xpathFunction.evaluate ( argList )); } catch ( XPathFunctionException xfe ) { // If we get XPathFunctionException then we want to terminate // further execution by throwing WrappedRuntimeException throw new org.apache.xml.utils.WrappedRuntimeException ( xfe ); } catch ( Exception e ) { throw new javax.xml.transform.TransformerException ( e ); } } }