Author: adrianocrestani Date: Mon Jun 30 23:16:32 2008 New Revision: 673004
URL: http://svn.apache.org/viewvc?rev=673004&view=rev Log: -adding to implementation.query support to return more than one result from a xquery execution Added: tuscany/java/sca/modules/databinding-saxon/src/main/java/org/apache/tuscany/sca/databinding/saxon/ItemList2ObjectTransformer.java tuscany/java/sca/modules/databinding-saxon/src/main/java/org/apache/tuscany/sca/databinding/saxon/collection/ tuscany/java/sca/modules/databinding-saxon/src/main/java/org/apache/tuscany/sca/databinding/saxon/collection/ItemList.java Modified: tuscany/java/sca/modules/databinding-saxon/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.PullTransformer tuscany/java/sca/modules/implementation-xquery/src/main/java/org/apache/tuscany/sca/implementation/xquery/XQueryInvoker.java Added: tuscany/java/sca/modules/databinding-saxon/src/main/java/org/apache/tuscany/sca/databinding/saxon/ItemList2ObjectTransformer.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/databinding-saxon/src/main/java/org/apache/tuscany/sca/databinding/saxon/ItemList2ObjectTransformer.java?rev=673004&view=auto ============================================================================== --- tuscany/java/sca/modules/databinding-saxon/src/main/java/org/apache/tuscany/sca/databinding/saxon/ItemList2ObjectTransformer.java (added) +++ tuscany/java/sca/modules/databinding-saxon/src/main/java/org/apache/tuscany/sca/databinding/saxon/ItemList2ObjectTransformer.java Mon Jun 30 23:16:32 2008 @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.sca.databinding.saxon; + +import java.lang.reflect.Array; + +import net.sf.saxon.om.Item; +import net.sf.saxon.om.NodeInfo; +import net.sf.saxon.trans.XPathException; +import net.sf.saxon.value.Value; + +import org.apache.tuscany.sca.databinding.PullTransformer; +import org.apache.tuscany.sca.databinding.TransformationContext; +import org.apache.tuscany.sca.databinding.TransformationException; +import org.apache.tuscany.sca.databinding.impl.BaseTransformer; +import org.apache.tuscany.sca.databinding.saxon.collection.ItemList; + +/** + * Transforms each object contained in the ItemList object. + * + * If the object type is the same as the target type, it is not transformed. + * + * If the object is a NodeInfo, it's transformed to a DataObject. + * + * If the object is a Value, it's transformed to a Java object. + * + * If the target type is not an array, the first transformed object is returned. + * + * If the first transformed object type is not a target type, then a + * TransformException is thrown + * + * If the target type is an array, a array of this type is created containing + * all transformed objects and it is returned + * + * If any transformed object is not a target type, then a TransformException is + * thrown + * + * @version $Rev: 659284 $ $Date: 2008-05-22 14:26:18 -0800 (Thu, 22 May 2008) $ + */ +public class ItemList2ObjectTransformer extends + BaseTransformer<ItemList, Object> implements + PullTransformer<ItemList, Object> { + + private NodeInfo2DataObjectTransformer nodeInfo2DataObjectTransformer = new NodeInfo2DataObjectTransformer(); + + public ItemList2ObjectTransformer() { + } + + @Override + protected Class<ItemList> getSourceType() { + return ItemList.class; + } + + @Override + protected Class<Object> getTargetType() { + return Object.class; + } + + @Override + public int getWeight() { + return 30 + nodeInfo2DataObjectTransformer.getWeight(); + } + + public Object transform(ItemList source, TransformationContext context) { + + if (source.size() == 0) { + return null; + } + + Class<?> targetType = context.getTargetDataType().getPhysical(); + + if (targetType.isArray()) { + int i = 0; + Class<?> componentClass = targetType.getComponentType(); + Object[] result = (Object[]) Array.newInstance(componentClass, + source.size()); + + try { + + if (componentClass.isAssignableFrom(NodeInfo.class) + || componentClass.isAssignableFrom(Value.class)) { + + for (Item item : source) { + result[i++] = item; + } + + } else { + + for (Item item : source) { + + if (item instanceof NodeInfo) { + result[i] = nodeInfo2DataObjectTransformer + .transform((NodeInfo) item, context); + + } else if (item instanceof Value) { + result[i] = Value.convertToJava(item); + + } else { + result[i] = item; + } + + i++; + + } + + } + + } catch (ArrayStoreException ex) { + throw new TransformationException(ex); + + } catch (XPathException ex) { + throw new TransformationException(ex); + } + + return result; + + } else { + Item item = source.iterator().next(); + + if (item.getClass().isAssignableFrom(targetType)) { + return item; + + } else if (item instanceof NodeInfo) { + return nodeInfo2DataObjectTransformer.transform( + (NodeInfo) item, context); + + } else { + + try { + return Value.convertToJava(item); + + } catch (XPathException e) { + throw new TransformationException(e); + } + + } + + } + + } + +} Added: tuscany/java/sca/modules/databinding-saxon/src/main/java/org/apache/tuscany/sca/databinding/saxon/collection/ItemList.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/databinding-saxon/src/main/java/org/apache/tuscany/sca/databinding/saxon/collection/ItemList.java?rev=673004&view=auto ============================================================================== --- tuscany/java/sca/modules/databinding-saxon/src/main/java/org/apache/tuscany/sca/databinding/saxon/collection/ItemList.java (added) +++ tuscany/java/sca/modules/databinding-saxon/src/main/java/org/apache/tuscany/sca/databinding/saxon/collection/ItemList.java Mon Jun 30 23:16:32 2008 @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.databinding.saxon.collection; + +import java.util.ArrayList; + +import net.sf.saxon.om.Item; + +/** + * Stores a list of Item objects. + * + * Used by the implementation.xquery to store a collection of results + * generated by the xquery execution. + * + * @version $Rev: 659284 $ $Date: 2008-05-22 14:26:18 -0800 (Thu, 22 May 2008) $ + */ +public class ItemList extends ArrayList<Item> {} Modified: tuscany/java/sca/modules/databinding-saxon/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.PullTransformer URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/databinding-saxon/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.PullTransformer?rev=673004&r1=673003&r2=673004&view=diff ============================================================================== --- tuscany/java/sca/modules/databinding-saxon/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.PullTransformer (original) +++ tuscany/java/sca/modules/databinding-saxon/src/main/resources/META-INF/services/org.apache.tuscany.sca.databinding.PullTransformer Mon Jun 30 23:16:32 2008 @@ -24,3 +24,9 @@ org.apache.tuscany.sca.databinding.saxon.Value2SimpleTypeTransformer;source=net.sf.saxon.value.Value,target=java:simpleType,weight=80000 org.apache.tuscany.sca.databinding.saxon.NodeInfo2DataObjectTransformer;source=net.sf.saxon.om.NodeInfo,target=commonj.sdo.DataObject,weight=1000 org.apache.tuscany.sca.databinding.saxon.DataObject2NodeInfoTransformer;source=commonj.sdo.DataObject,target=net.sf.saxon.om.NodeInfo,weight=1000 +org.apache.tuscany.sca.databinding.saxon.ItemList2ObjectTransformer;source=org.apache.tuscany.sca.databinding.saxon.collection.ItemList,target=net.sf.saxon.om.NodeInfo,weight=1000 +org.apache.tuscany.sca.databinding.saxon.ItemList2ObjectTransformer;source=org.apache.tuscany.sca.databinding.saxon.collection.ItemList,target=net.sf.saxon.value.Value,weight=1000 +org.apache.tuscany.sca.databinding.saxon.ItemList2ObjectTransformer;source=org.apache.tuscany.sca.databinding.saxon.collection.ItemList,target=commonj.sdo.DataObject,weight=1000 +org.apache.tuscany.sca.databinding.saxon.ItemList2ObjectTransformer;source=org.apache.tuscany.sca.databinding.saxon.collection.ItemList,target=java:complex,weight=1000 +org.apache.tuscany.sca.databinding.saxon.ItemList2ObjectTransformer;source=org.apache.tuscany.sca.databinding.saxon.collection.ItemList,target=java:simple,weight=1000 +org.apache.tuscany.sca.databinding.saxon.ItemList2ObjectTransformer;source=org.apache.tuscany.sca.databinding.saxon.collection.ItemList,target=java:array,weight=1000 Modified: tuscany/java/sca/modules/implementation-xquery/src/main/java/org/apache/tuscany/sca/implementation/xquery/XQueryInvoker.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-xquery/src/main/java/org/apache/tuscany/sca/implementation/xquery/XQueryInvoker.java?rev=673004&r1=673003&r2=673004&view=diff ============================================================================== --- tuscany/java/sca/modules/implementation-xquery/src/main/java/org/apache/tuscany/sca/implementation/xquery/XQueryInvoker.java (original) +++ tuscany/java/sca/modules/implementation-xquery/src/main/java/org/apache/tuscany/sca/implementation/xquery/XQueryInvoker.java Mon Jun 30 23:16:32 2008 @@ -46,6 +46,7 @@ import net.sf.saxon.value.Value; import org.apache.tuscany.sca.databinding.saxon.SaxonDataBindingHelper; +import org.apache.tuscany.sca.databinding.saxon.collection.ItemList; import org.apache.tuscany.sca.interfacedef.DataType; import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.interfacedef.java.JavaInterface; @@ -106,10 +107,7 @@ * object be attached in some way to the invocation request? * 5. All parameters, reference proxies and property values are mapped * to external variables of the XQuery script - * 6. The query is executed and the result is returned depending on its type - * (i.e. it could be either a node NodeInfo or Value object). Currently - * no collections are supported, i.e. if there is more then one element - * in the result only the first one will be returned + * 6. The query is executed and all the results are stored in a ItemList object * * NOTE: During execution of the XQuery a static variable is set with * the current configuration. This variable is used by the NodeInfo transformers @@ -169,15 +167,33 @@ } finally { SaxonDataBindingHelper.CURR_EXECUTING_CONFIG = oldConfigValue; } + + ItemList list = new ItemList(); Item item = iterator.next(); - if (item == null) { - return null; + + while (item != null) { + list.add(item); + item = iterator.next(); + } - if (item instanceof NodeInfo) { - return item; - } else { - return Value.asValue(item); + + if (list.size() == 0) { + return null; + + } else if (list.size() == 1) { + + item = list.iterator().next(); + + if (item instanceof NodeInfo) { + return item; + } else { + return Value.asValue(item); + } + } + + return list; + } public Message invoke(Message msg) {
