summaryrefslogtreecommitdiffstats
path: root/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/e4x/E4XInterceptor.java
blob: 1031a2577cca62c72615bd82391331acd8086e3b (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
package org.apache.tuscany.container.rhino.e4x;

import java.io.ByteArrayInputStream;

import javax.xml.namespace.QName;

import org.apache.tuscany.core.message.Message;
import org.apache.tuscany.core.wire.Interceptor;
import org.apache.tuscany.core.wire.InvocationRuntimeException;
import org.apache.tuscany.databinding.sdo.SDOXMLHelper;
import org.apache.xmlbeans.XmlObject;

import commonj.sdo.helper.TypeHelper;

public class E4XInterceptor implements Interceptor {

    private Interceptor next;

    private QName elementQN;

    private TypeHelper typeHelper;

    private ClassLoader classLoader;

    E4XInterceptor(QName elementQN, TypeHelper typeHelper, ClassLoader classLoader) {
        this.elementQN = elementQN;
        this.typeHelper = typeHelper;
        this.classLoader = classLoader;
    }

    public Message invoke(Message message) {
        toXmlObject(message);
        Message responseMessage = next.invoke(message);
        fromXmlObject(responseMessage);
        return responseMessage;
    }

    protected void toXmlObject(Message message) {
        Object[] body = (Object[]) message.getBody();
        byte[] xmlBytes = SDOXMLHelper.toXMLBytes(classLoader, typeHelper, body, elementQN, true);
        try {
            message.setBody(new Object[] { XmlObject.Factory.parse(new ByteArrayInputStream(xmlBytes)) });
        } catch (Exception e) {
            throw new InvocationRuntimeException(e);
        }
    }

    protected void fromXmlObject(Message message) {
        Object body = message.getBody();
        if (body instanceof XmlObject) {
            byte[] xmlBytes = ((XmlObject) body).toString().getBytes();
            Object[] os = SDOXMLHelper.toObjects(classLoader, typeHelper, xmlBytes, true);
            if (os == null || os.length < 1) {
                message.setBody(os);
            } else {
                message.setBody(os[0]);
            }
        }
    }

    public void setNext(Interceptor next) {
        this.next = next;
    }

}