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: XObjectFactory.java 468655 2006-10-28 07:12:06Z minchau $ 20 */ 21 package org.apache.xpath.objects; 22 23 import org.apache.xml.dtm.Axis; 24 import org.apache.xml.dtm.DTM; 25 import org.apache.xml.dtm.DTMAxisIterator; 26 import org.apache.xml.dtm.DTMIterator; 27 import org.apache.xpath.XPathContext; 28 import org.apache.xpath.axes.OneStepIterator; 29 30 31 public class XObjectFactory 32 { 33 34 /** 35 * Create the right XObject based on the type of the object passed. This 36 * function can not make an XObject that exposes DOM Nodes, NodeLists, and 37 * NodeIterators to the XSLT stylesheet as node-sets. 38 * 39 * @param val The java object which this object will wrap. 40 * 41 * @return the right XObject based on the type of the object passed. 42 */ create(Object val)43 static public XObject create(Object val) 44 { 45 46 XObject result; 47 48 if (val instanceof XObject) 49 { 50 result = (XObject) val; 51 } 52 else if (val instanceof String) 53 { 54 result = new XString((String) val); 55 } 56 else if (val instanceof Boolean) 57 { 58 result = new XBoolean((Boolean)val); 59 } 60 else if (val instanceof Double) 61 { 62 result = new XNumber(((Double) val)); 63 } 64 else 65 { 66 result = new XObject(val); 67 } 68 69 return result; 70 } 71 72 /** 73 * Create the right XObject based on the type of the object passed. 74 * This function <emph>can</emph> make an XObject that exposes DOM Nodes, NodeLists, and 75 * NodeIterators to the XSLT stylesheet as node-sets. 76 * 77 * @param val The java object which this object will wrap. 78 * @param xctxt The XPath context. 79 * 80 * @return the right XObject based on the type of the object passed. 81 */ create(Object val, XPathContext xctxt)82 static public XObject create(Object val, XPathContext xctxt) 83 { 84 85 XObject result; 86 87 if (val instanceof XObject) 88 { 89 result = (XObject) val; 90 } 91 else if (val instanceof String) 92 { 93 result = new XString((String) val); 94 } 95 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