001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the "License");
007 * you may not use this file except in compliance with the License.
008 * You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 /*
019 * $Id: ElemExsltFuncResult.java 468643 2006-10-28 06:56:03Z minchau $
020 */
021 package org.apache.xalan.templates;
022
023 import javax.xml.transform.TransformerException;
024
025 import org.apache.xalan.transformer.TransformerImpl;
026 import org.apache.xpath.XPathContext;
027 import org.apache.xpath.objects.XObject;
028
029 /**
030 * Handles the EXSLT result element within an EXSLT function element.
031 */
032 public class ElemExsltFuncResult extends ElemVariable
033 {
034 static final long serialVersionUID = -3478311949388304563L;
035 /*
036 * To keep the binary compatibility put those three private global
037 * variables back, although they are never used in this verison
038 */
039 // A flag indicating whether the return result is set
040 private boolean m_isResultSet = false;
041
042 // The return result
043 private XObject m_result = null;
044
045 // The frame size of the current caller
046 private int m_callerFrameSize = 0;
047
048 /**
049 * Generate the EXSLT function return value, and assign it to the variable
050 * index slot assigned for it in ElemExsltFunction compose().
051 *
052 */
053 public void execute(TransformerImpl transformer) throws TransformerException
054 {
055 XPathContext context = transformer.getXPathContext();
056
057 if (transformer.getDebug())
058 transformer.getTraceManager().fireTraceEvent(this);
059
060 // Verify that result has not already been set by another result
061 // element. Recursion is allowed: intermediate results are cleared
062 // in the owner ElemExsltFunction execute().
063 if (transformer.currentFuncResultSeen()) {
064 throw new TransformerException("An EXSLT function cannot set more than one result!");
065 }
066
067 int sourceNode = context.getCurrentNode();
068
069 // Set the return value;
070 XObject var = getValue(transformer, sourceNode);
071 transformer.popCurrentFuncResult();
072 transformer.pushCurrentFuncResult(var);
073
074 if (transformer.getDebug())
075 transformer.getTraceManager().fireTraceEndEvent(this);
076 }
077
078 /**
079 * Get an integer representation of the element type.
080 *
081 * @return An integer representation of the element, defined in the
082 * Constants class.
083 * @see org.apache.xalan.templates.Constants
084 */
085 public int getXSLToken()
086 {
087 return Constants.EXSLT_ELEMNAME_FUNCRESULT;
088 }
089
090 /**
091 * Return the node name, defined in the
092 * Constants class.
093 * @see org.apache.xalan.templates.Constants
094 * @return The node name
095 *
096 */
097 public String getNodeName()
098 {
099 return Constants.EXSLT_ELEMNAME_FUNCRESULT_STRING;
100 }
101 }