FuncExtFunctionAvailable.java revision 9f8118474e9513f7a5b7d2a05e4a0fb15d1a6569
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: FuncExtFunctionAvailable.java 468655 2006-10-28 07:12:06Z minchau $
20 */
21package org.apache.xpath.functions;
22
23import org.apache.xalan.templates.Constants;
24import org.apache.xpath.ExtensionsProvider;
25import org.apache.xpath.XPathContext;
26import org.apache.xpath.compiler.FunctionTable;
27import org.apache.xpath.objects.XBoolean;
28import org.apache.xpath.objects.XObject;
29
30/**
31 * Execute the ExtFunctionAvailable() function.
32 * @xsl.usage advanced
33 */
34public class FuncExtFunctionAvailable extends FunctionOneArg
35{
36    static final long serialVersionUID = 5118814314918592241L;
37
38    transient private FunctionTable m_functionTable = null;
39
40  /**
41   * Execute the function.  The function must return
42   * a valid object.
43   * @param xctxt The current execution context.
44   * @return A valid XObject.
45   *
46   * @throws javax.xml.transform.TransformerException
47   */
48  public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
49  {
50
51    String prefix;
52    String namespace;
53    String methName;
54
55    String fullName = m_arg0.execute(xctxt).str();
56    int indexOfNSSep = fullName.indexOf(':');
57
58    if (indexOfNSSep < 0)
59    {
60      prefix = "";
61      namespace = Constants.S_XSLNAMESPACEURL;
62      methName = fullName;
63    }
64    else
65    {
66      prefix = fullName.substring(0, indexOfNSSep);
67      namespace = xctxt.getNamespaceContext().getNamespaceForPrefix(prefix);
68      if (null == namespace)
69        return XBoolean.S_FALSE;
70        methName = fullName.substring(indexOfNSSep + 1);
71    }
72
73    if (namespace.equals(Constants.S_XSLNAMESPACEURL))
74    {
75      try
76      {
77        if (null == m_functionTable) m_functionTable = new FunctionTable();
78        return m_functionTable.functionAvailable(methName) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
79      }
80      catch (Exception e)
81      {
82        return XBoolean.S_FALSE;
83      }
84    }
85    else
86    {
87      //dml
88      ExtensionsProvider extProvider = (ExtensionsProvider)xctxt.getOwnerObject();
89      return extProvider.functionAvailable(namespace, methName)
90             ? XBoolean.S_TRUE : XBoolean.S_FALSE;
91    }
92  }
93
94  /**
95   * The function table is an instance field. In order to access this instance
96   * field during evaluation, this method is called at compilation time to
97   * insert function table information for later usage. It should only be used
98   * during compiling of XPath expressions.
99   * @param aTable an instance of the function table
100   */
101  public void setFunctionTable(FunctionTable aTable){
102          m_functionTable = aTable;
103  }
104}
105