summaryrefslogtreecommitdiffstats
path: root/tags/java/sca/1.5.1/modules/databinding-saxon/src/main/java/org/apache/tuscany/sca/databinding/saxon/ItemList2ObjectTransformer.java
blob: 7122217b8b2be494880000e1423b5938e05c43c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
 * 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.convert(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.convert(item);

                } catch (XPathException e) {
                    throw new TransformationException(e);
                }

            }

        }

    }

}