jaxp/src/com/sun/org/apache/xpath/internal/compiler/FuncLoader.java
changeset 12457 c348e06f0e82
parent 6 7f561c08de6b
child 12458 d601e4bba306
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/src/com/sun/org/apache/xpath/internal/compiler/FuncLoader.java	Thu Apr 12 08:38:26 2012 -0700
@@ -0,0 +1,108 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed 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: FuncLoader.java,v 1.1.2.1 2005/08/01 01:30:35 jeffsuttor Exp $
+ */
+package com.sun.org.apache.xpath.internal.compiler;
+
+import javax.xml.transform.TransformerException;
+
+import com.sun.org.apache.xpath.internal.functions.Function;
+
+/**
+ * Lazy load of functions into the function table as needed, so we don't
+ * have to load all the functions allowed in XPath and XSLT on startup.
+ * @xsl.usage advanced
+ */
+public class FuncLoader
+{
+
+  /** The function ID, which may correspond to one of the FUNC_XXX values
+   *  found in {@link com.sun.org.apache.xpath.internal.compiler.FunctionTable}, but may
+   *  be a value installed by an external module.  */
+  private int m_funcID;
+
+  /** The class name of the function.  Must not be null.   */
+  private String m_funcName;
+
+  /**
+   * Get the local class name of the function class.  If function name does
+   * not have a '.' in it, it is assumed to be relative to
+   * 'com.sun.org.apache.xpath.internal.functions'.
+   *
+   * @return The class name of the {com.sun.org.apache.xpath.internal.functions.Function} class.
+   */
+  public String getName()
+  {
+    return m_funcName;
+  }
+
+  /**
+   * Construct a function loader
+   *
+   * @param funcName The class name of the {com.sun.org.apache.xpath.internal.functions.Function}
+   *             class, which, if it does not have a '.' in it, is assumed to
+   *             be relative to 'com.sun.org.apache.xpath.internal.functions'.
+   * @param funcID  The function ID, which may correspond to one of the FUNC_XXX
+   *    values found in {@link com.sun.org.apache.xpath.internal.compiler.FunctionTable}, but may
+   *    be a value installed by an external module.
+   */
+  public FuncLoader(String funcName, int funcID)
+  {
+
+    super();
+
+    m_funcID = funcID;
+    m_funcName = funcName;
+  }
+
+  /**
+   * Get a Function instance that this instance is liaisoning for.
+   *
+   * @return non-null reference to Function derivative.
+   *
+   * @throws javax.xml.transform.TransformerException if ClassNotFoundException,
+   *    IllegalAccessException, or InstantiationException is thrown.
+   */
+  Function getFunction() throws TransformerException
+  {
+    try
+    {
+      String className = m_funcName;
+      if (className.indexOf(".") < 0) {
+        className = "com.sun.org.apache.xpath.internal.functions." + className;
+      }
+      //hack for loading only built-in function classes.
+      String subString = className.substring(0,className.lastIndexOf('.'));
+      if(!(subString.equals ("com.sun.org.apache.xalan.internal.templates") ||
+           subString.equals ("com.sun.org.apache.xpath.internal.functions"))) {
+            throw new TransformerException("Application can't install his own xpath function.");
+      }
+
+      return (Function) ObjectFactory.newInstance(
+          className, ObjectFactory.findClassLoader(), true);
+
+    }
+    catch (ObjectFactory.ConfigurationError e)
+    {
+      throw new TransformerException(e.getException());
+    }
+  }
+}