/*
 * 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$
 */
package org.apache.xalan.extensions;

import java.util.Hashtable;

/**
 * Abstract base class handling the java language extensions for XPath.
 * This base class provides cache management shared by all of the
 * various java extension handlers.
 *
 * @xsl.usage internal
 */
public abstract class ExtensionHandlerJava extends ExtensionHandler
{

  /** Extension class name         */
  protected String m_className = "";

  /** Table of cached methods          */
  private Hashtable m_cachedMethods = new Hashtable();

  /**
   * Construct a new extension handler given all the information
   * needed.
   *
   * @param namespaceUri the extension namespace URI that I'm implementing
   * @param funcNames    string containing list of functions of extension NS
   * @param lang         language of code implementing the extension
   * @param srcURL       value of src attribute (if any) - treated as a URL
   *                     or a classname depending on the value of lang. If
   *                     srcURL is not null, then scriptSrc is ignored.
   * @param scriptSrc    the actual script code (if any)
   * @param scriptLang   the scripting language
   * @param className    the extension class name 
   */
  protected ExtensionHandlerJava(String namespaceUri, String scriptLang,
                                 String className)
  {

    super(namespaceUri, scriptLang);

    m_className = className;
  }

  /**
   * Look up the entry in the method cache.
   * @param methodKey   A key that uniquely identifies this invocation in
   *                    the stylesheet.
   * @param objType     A Class object or instance object representing the type
   * @param methodArgs  An array of the XObject arguments to be used for
   *                    function mangling.
   *
   * @return The given method from the method cache
   */
  public Object getFromCache(Object methodKey, Object objType,
                             Object[] methodArgs)
  {

    // Eventually, we want to insert code to mangle the methodKey with methodArgs
    return m_cachedMethods.get(methodKey);
  }

  /**
   * Add a new entry into the method cache.
   * @param methodKey   A key that uniquely identifies this invocation in
   *                    the stylesheet.
   * @param objType     A Class object or instance object representing the type
   * @param methodArgs  An array of the XObject arguments to be used for
   *                    function mangling.
   * @param methodObj   A Class object or instance object representing the method
   *
   * @return The cached method object
   */
  public Object putToCache(Object methodKey, Object objType,
                           Object[] methodArgs, Object methodObj)
  {

    // Eventually, we want to insert code to mangle the methodKey with methodArgs
    return m_cachedMethods.put(methodKey, methodObj);
  }
}
