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