191037db265ecdd914a26e056cf69207b4f50924ehkuang/*
2b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * Licensed to the Apache Software Foundation (ASF) under one
3b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * or more contributor license agreements. See the NOTICE file
4b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * distributed with this work for additional information
5b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * regarding copyright ownership. The ASF licenses this file
6b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * to you under the Apache License, Version 2.0 (the  "License");
7b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * you may not use this file except in compliance with the License.
8b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * You may obtain a copy of the License at
9b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *
10b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *     http://www.apache.org/licenses/LICENSE-2.0
1191037db265ecdd914a26e056cf69207b4f50924ehkuang *
1291037db265ecdd914a26e056cf69207b4f50924ehkuang * Unless required by applicable law or agreed to in writing, software
1391037db265ecdd914a26e056cf69207b4f50924ehkuang * distributed under the License is distributed on an "AS IS" BASIS,
1491037db265ecdd914a26e056cf69207b4f50924ehkuang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1591037db265ecdd914a26e056cf69207b4f50924ehkuang * See the License for the specific language governing permissions and
16b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * limitations under the License.
1791037db265ecdd914a26e056cf69207b4f50924ehkuang */
1891037db265ecdd914a26e056cf69207b4f50924ehkuang/*
1991037db265ecdd914a26e056cf69207b4f50924ehkuang * $Id: XObjectFactory.java 468655 2006-10-28 07:12:06Z minchau $
2091037db265ecdd914a26e056cf69207b4f50924ehkuang */
2191037db265ecdd914a26e056cf69207b4f50924ehkuangpackage org.apache.xpath.objects;
22a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
2391037db265ecdd914a26e056cf69207b4f50924ehkuangimport org.apache.xml.dtm.Axis;
2491037db265ecdd914a26e056cf69207b4f50924ehkuangimport org.apache.xml.dtm.DTM;
25a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianimport org.apache.xml.dtm.DTMAxisIterator;
26a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianimport org.apache.xml.dtm.DTMIterator;
27a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianimport org.apache.xpath.XPathContext;
28a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianimport org.apache.xpath.axes.OneStepIterator;
29a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian
3091037db265ecdd914a26e056cf69207b4f50924ehkuang
3191037db265ecdd914a26e056cf69207b4f50924ehkuangpublic class XObjectFactory
32a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian{
3391037db265ecdd914a26e056cf69207b4f50924ehkuang
3491037db265ecdd914a26e056cf69207b4f50924ehkuang  /**
3591037db265ecdd914a26e056cf69207b4f50924ehkuang   * Create the right XObject based on the type of the object passed.  This
3691037db265ecdd914a26e056cf69207b4f50924ehkuang   * function can not make an XObject that exposes DOM Nodes, NodeLists, and
3791037db265ecdd914a26e056cf69207b4f50924ehkuang   * NodeIterators to the XSLT stylesheet as node-sets.
3891037db265ecdd914a26e056cf69207b4f50924ehkuang   *
3991037db265ecdd914a26e056cf69207b4f50924ehkuang   * @param val The java object which this object will wrap.
409b35249446b07f40ac5fcc3205f2c048616efacchkuang   *
4191037db265ecdd914a26e056cf69207b4f50924ehkuang   * @return the right XObject based on the type of the object passed.
4291037db265ecdd914a26e056cf69207b4f50924ehkuang   */
4391037db265ecdd914a26e056cf69207b4f50924ehkuang  static public XObject create(Object val)
4491037db265ecdd914a26e056cf69207b4f50924ehkuang  {
4591037db265ecdd914a26e056cf69207b4f50924ehkuang
4691037db265ecdd914a26e056cf69207b4f50924ehkuang    XObject result;
4791037db265ecdd914a26e056cf69207b4f50924ehkuang
4891037db265ecdd914a26e056cf69207b4f50924ehkuang    if (val instanceof XObject)
4991037db265ecdd914a26e056cf69207b4f50924ehkuang    {
5091037db265ecdd914a26e056cf69207b4f50924ehkuang      result = (XObject) val;
5191037db265ecdd914a26e056cf69207b4f50924ehkuang    }
5291037db265ecdd914a26e056cf69207b4f50924ehkuang    else if (val instanceof String)
5391037db265ecdd914a26e056cf69207b4f50924ehkuang    {
5491037db265ecdd914a26e056cf69207b4f50924ehkuang      result = new XString((String) val);
5591037db265ecdd914a26e056cf69207b4f50924ehkuang    }
5691037db265ecdd914a26e056cf69207b4f50924ehkuang    else if (val instanceof Boolean)
5791037db265ecdd914a26e056cf69207b4f50924ehkuang    {
5891037db265ecdd914a26e056cf69207b4f50924ehkuang      result = new XBoolean((Boolean)val);
59a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    }
6091037db265ecdd914a26e056cf69207b4f50924ehkuang    else if (val instanceof Double)
6191037db265ecdd914a26e056cf69207b4f50924ehkuang    {
6291037db265ecdd914a26e056cf69207b4f50924ehkuang      result = new XNumber(((Double) val));
6391037db265ecdd914a26e056cf69207b4f50924ehkuang    }
6491037db265ecdd914a26e056cf69207b4f50924ehkuang    else
6591037db265ecdd914a26e056cf69207b4f50924ehkuang    {
6691037db265ecdd914a26e056cf69207b4f50924ehkuang      result = new XObject(val);
6791037db265ecdd914a26e056cf69207b4f50924ehkuang    }
6891037db265ecdd914a26e056cf69207b4f50924ehkuang
6991037db265ecdd914a26e056cf69207b4f50924ehkuang    return result;
709b35249446b07f40ac5fcc3205f2c048616efacchkuang  }
71b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
72b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  /**
73b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   * Create the right XObject based on the type of the object passed.
74b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   * This function <emph>can</emph> make an XObject that exposes DOM Nodes, NodeLists, and
75b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   * NodeIterators to the XSLT stylesheet as node-sets.
76b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   *
77a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian   * @param val The java object which this object will wrap.
78b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   * @param xctxt The XPath context.
79b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   *
80b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   * @return the right XObject based on the type of the object passed.
81b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   */
82b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  static public XObject create(Object val, XPathContext xctxt)
83b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  {
84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
85b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    XObject result;
86b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
87b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (val instanceof XObject)
88b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    {
899b35249446b07f40ac5fcc3205f2c048616efacchkuang      result = (XObject) val;
9091037db265ecdd914a26e056cf69207b4f50924ehkuang    }
9191037db265ecdd914a26e056cf69207b4f50924ehkuang    else if (val instanceof String)
9291037db265ecdd914a26e056cf69207b4f50924ehkuang    {
93b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      result = new XString((String) val);
94a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian    }
9591037db265ecdd914a26e056cf69207b4f50924ehkuang    else if (val instanceof Boolean)
96    {
97      result = new XBoolean((Boolean)val);
98    }
99    else if (val instanceof Number)
100    {
101      result = new XNumber(((Number) val));
102    }
103    else if (val instanceof DTM)
104    {
105      DTM dtm = (DTM)val;
106      try
107      {
108        int dtmRoot = dtm.getDocument();
109        DTMAxisIterator iter = dtm.getAxisIterator(Axis.SELF);
110        iter.setStartNode(dtmRoot);
111        DTMIterator iterator = new OneStepIterator(iter, Axis.SELF);
112        iterator.setRoot(dtmRoot, xctxt);
113        result = new XNodeSet(iterator);
114      }
115      catch(Exception ex)
116      {
117        throw new org.apache.xml.utils.WrappedRuntimeException(ex);
118      }
119    }
120    else if (val instanceof DTMAxisIterator)
121    {
122      DTMAxisIterator iter = (DTMAxisIterator)val;
123      try
124      {
125        DTMIterator iterator = new OneStepIterator(iter, Axis.SELF);
126        iterator.setRoot(iter.getStartNode(), xctxt);
127        result = new XNodeSet(iterator);
128      }
129      catch(Exception ex)
130      {
131        throw new org.apache.xml.utils.WrappedRuntimeException(ex);
132      }
133    }
134    else if (val instanceof DTMIterator)
135    {
136      result = new XNodeSet((DTMIterator) val);
137    }
138    // This next three instanceofs are a little worrysome, since a NodeList
139    // might also implement a Node!
140    else if (val instanceof org.w3c.dom.Node)
141    {
142      result = new XNodeSetForDOM((org.w3c.dom.Node)val, xctxt);
143    }
144    // This must come after org.w3c.dom.Node, since many Node implementations
145    // also implement NodeList.
146    else if (val instanceof org.w3c.dom.NodeList)
147    {
148      result = new XNodeSetForDOM((org.w3c.dom.NodeList)val, xctxt);
149    }
150    else if (val instanceof org.w3c.dom.traversal.NodeIterator)
151    {
152      result = new XNodeSetForDOM((org.w3c.dom.traversal.NodeIterator)val, xctxt);
153    }
154    else
155    {
156      result = new XObject(val);
157    }
158
159    return result;
160  }
161}
162