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: XObjectFactory.java 468655 2006-10-28 07:12:06Z minchau $
020 */
021 package org.apache.xpath.objects;
022
023 import org.apache.xml.dtm.Axis;
024 import org.apache.xml.dtm.DTM;
025 import org.apache.xml.dtm.DTMAxisIterator;
026 import org.apache.xml.dtm.DTMIterator;
027 import org.apache.xpath.XPathContext;
028 import org.apache.xpath.axes.OneStepIterator;
029
030
031 public class XObjectFactory
032 {
033
034 /**
035 * Create the right XObject based on the type of the object passed. This
036 * function can not make an XObject that exposes DOM Nodes, NodeLists, and
037 * NodeIterators to the XSLT stylesheet as node-sets.
038 *
039 * @param val The java object which this object will wrap.
040 *
041 * @return the right XObject based on the type of the object passed.
042 */
043 static public XObject create(Object val)
044 {
045
046 XObject result;
047
048 if (val instanceof XObject)
049 {
050 result = (XObject) val;
051 }
052 else if (val instanceof String)
053 {
054 result = new XString((String) val);
055 }
056 else if (val instanceof Boolean)
057 {
058 result = new XBoolean((Boolean)val);
059 }
060 else if (val instanceof Double)
061 {
062 result = new XNumber(((Double) val));
063 }
064 else
065 {
066 result = new XObject(val);
067 }
068
069 return result;
070 }
071
072 /**
073 * Create the right XObject based on the type of the object passed.
074 * This function <emph>can</emph> make an XObject that exposes DOM Nodes, NodeLists, and
075 * NodeIterators to the XSLT stylesheet as node-sets.
076 *
077 * @param val The java object which this object will wrap.
078 * @param xctxt The XPath context.
079 *
080 * @return the right XObject based on the type of the object passed.
081 */
082 static public XObject create(Object val, XPathContext xctxt)
083 {
084
085 XObject result;
086
087 if (val instanceof XObject)
088 {
089 result = (XObject) val;
090 }
091 else if (val instanceof String)
092 {
093 result = new XString((String) val);
094 }
095 else if (val instanceof Boolean)
096 {
097 result = new XBoolean((Boolean)val);
098 }
099 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 }