/*
 * 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.lib;

import org.apache.xalan.extensions.ExpressionContext;
import org.apache.xml.dtm.DTMIterator;
import org.apache.xml.dtm.ref.DTMNodeIterator;
import org.apache.xpath.NodeSet;

/**
 * This class contains EXSLT common extension functions.
 * It is accessed by specifying a namespace URI as follows:
 * <pre>
 *    xmlns:exslt="http://exslt.org/common"
 * </pre>
 * 
 * The documentation for each function has been copied from the relevant
 * EXSLT Implementer page.
 * 
 * @see <a href="http://www.exslt.org/">EXSLT</a>
 * @xsl.usage general
 */
public class ExsltCommon
{
  /**
   * The exsl:object-type function returns a string giving the type of the object passed 
   * as the argument. The possible object types are: 'string', 'number', 'boolean', 
   * 'node-set', 'RTF', or 'external'. 
   * 
   * Most XSLT object types can be coerced to each other without error. However, there are 
   * certain coercions that raise errors, most importantly treating anything other than a 
   * node set as a node set. Authors of utilities such as named templates or user-defined 
   * extension functions may wish to give some flexibility in the parameter and argument values 
   * that are accepted by the utility; the exsl:object-type function enables them to do so.
   * 
   * The Xalan extensions MethodResolver converts 'object-type' to 'objectType'.
   * 
   * @param obj The object to be typed.
   * @return objectType 'string', 'number', 'boolean', 'node-set', 'RTF', or 'external'.
   * 
   * @see <a href="http://www.exslt.org/">EXSLT</a>
   */
  public static String objectType (Object obj)
  {
    if (obj instanceof String)
      return "string";
    else if (obj instanceof Boolean)
      return "boolean";
    else if (obj instanceof Number)
      return "number";
    else if (obj instanceof DTMNodeIterator)
    {
      DTMIterator dtmI = ((DTMNodeIterator)obj).getDTMIterator();
      if (dtmI instanceof org.apache.xpath.axes.RTFIterator)
      	return "RTF";
      else
        return "node-set";
    }
    else
      return "unknown";
  }
    
  /**
   * The exsl:node-set function converts a result tree fragment (which is what you get 
   * when you use the content of xsl:variable rather than its select attribute to give 
   * a variable value) into a node set. This enables you to process the XML that you create 
   * within a variable, and therefore do multi-step processing. 
   * 
   * You can also use this function to turn a string into a text node, which is helpful 
   * if you want to pass a string to a function that only accepts a node set.
   * 
   * The Xalan extensions MethodResolver converts 'node-set' to 'nodeSet'.
   * 
   * @param myProcessor is passed in by the Xalan extension processor
   * @param rtf The result tree fragment to be converted to a node-set.
   * 
   * @return node-set with the contents of the result tree fragment.
   * 
   * Note: Already implemented in the xalan namespace as nodeset.
   * 
   * @see <a href="http://www.exslt.org/">EXSLT</a>
   */
  public static NodeSet nodeSet(ExpressionContext myProcessor, Object rtf)
  {
    return Extensions.nodeset(myProcessor, rtf);
  }
 
}
