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: ElemChoose.java 468643 2006-10-28 06:56:03Z minchau $
20  */
21 package org.apache.xalan.templates;
22 
23 import javax.xml.transform.TransformerException;
24 
25 import org.apache.xalan.res.XSLTErrorResources;
26 import org.apache.xalan.transformer.TransformerImpl;
27 import org.apache.xpath.XPathContext;
28 import org.apache.xpath.objects.XObject;
29 
30 /**
31  * Implement xsl:choose.
32  * <pre>
33  * <!ELEMENT xsl:choose (xsl:when+, xsl:otherwise?)>
34  * <!ATTLIST xsl:choose %space-att;>
35  * </pre>
36  * @see <a href="http://www.w3.org/TR/xslt#section-Conditional-Processing-with-xsl:choose">XXX in XSLT Specification</a>
37  * @xsl.usage advanced
38  */
39 public class ElemChoose extends ElemTemplateElement
40 {
41     static final long serialVersionUID = -3070117361903102033L;
42 
43   /**
44    * Get an int constant identifying the type of element.
45    * @see org.apache.xalan.templates.Constants
46    *
47    * @return The token ID for this element
48    */
getXSLToken()49   public int getXSLToken()
50   {
51     return Constants.ELEMNAME_CHOOSE;
52   }
53 
54   /**
55    * Return the node name.
56    *
57    * @return The element's name
58    */
getNodeName()59   public String getNodeName()
60   {
61     return Constants.ELEMNAME_CHOOSE_STRING;
62   }
63 
64   /**
65    * Constructor ElemChoose
66    *
67    */
ElemChoose()68   public ElemChoose(){}
69 
70   /**
71    * Execute the xsl:choose transformation.
72    *
73    *
74    * @param transformer non-null reference to the the current transform-time state.
75    *
76    * @throws TransformerException
77    */
execute(TransformerImpl transformer)78   public void execute(TransformerImpl transformer) throws TransformerException
79   {
80 
81     boolean found = false;
82 
83     for (ElemTemplateElement childElem = getFirstChildElem();
84             childElem != null; childElem = childElem.getNextSiblingElem())
85     {
86       int type = childElem.getXSLToken();
87 
88       if (Constants.ELEMNAME_WHEN == type)
89       {
90         found = true;
91 
92         ElemWhen when = (ElemWhen) childElem;
93 
94         // must be xsl:when
95         XPathContext xctxt = transformer.getXPathContext();
96         int sourceNode = xctxt.getCurrentNode();
97 
98         // System.err.println("\""+when.getTest().getPatternString()+"\"");
99 
100         // if(when.getTest().getPatternString().equals("COLLECTION/icuser/ictimezone/LITERAL='GMT +13:00 Pacific/Tongatapu'"))
101         // 	System.err.println("Found COLLECTION/icuser/ictimezone/LITERAL");
102 
103           if (when.getTest().bool(xctxt, sourceNode, when)) {
104               transformer.executeChildTemplates(when, true);
105 
106               return;
107           }
108       }
109       else if (Constants.ELEMNAME_OTHERWISE == type)
110       {
111         found = true;
112 
113         // xsl:otherwise
114         transformer.executeChildTemplates(childElem, true);
115 
116         return;
117       }
118     }
119 
120     if (!found)
121       transformer.getMsgMgr().error(
122         this, XSLTErrorResources.ER_CHOOSE_REQUIRES_WHEN);
123   }
124 
125   /**
126    * Add a child to the child list.
127    *
128    * @param newChild Child to add to this node's child list
129    *
130    * @return The child that was just added to the child list
131    *
132    * @throws DOMException
133    */
appendChild(ElemTemplateElement newChild)134   public ElemTemplateElement appendChild(ElemTemplateElement newChild)
135   {
136 
137     int type = ((ElemTemplateElement) newChild).getXSLToken();
138 
139     switch (type)
140     {
141     case Constants.ELEMNAME_WHEN :
142     case Constants.ELEMNAME_OTHERWISE :
143 
144       // TODO: Positional checking
145       break;
146     default :
147       error(XSLTErrorResources.ER_CANNOT_ADD,
148             new Object[]{ newChild.getNodeName(),
149                           this.getNodeName() });  //"Can not add " +((ElemTemplateElement)newChild).m_elemName +
150 
151     //" to " + this.m_elemName);
152     }
153 
154     return super.appendChild(newChild);
155   }
156 
157   /**
158    * Tell if this element can accept variable declarations.
159    * @return true if the element can accept and process variable declarations.
160    */
canAcceptVariables()161   public boolean canAcceptVariables()
162   {
163   	return false;
164   }
165 
166 }
167