/
SoapEoaMachine.java
184 lines (173 loc) · 5.79 KB
/
SoapEoaMachine.java
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/*
* Copyright 2006 Helsinki Institute for Information Technology
*
* This file is a part of Fuego middleware. Fuego middleware is free
* software; you can redistribute it and/or modify it under the terms
* of the MIT license, included as the file MIT-LICENSE in the Fuego
* middleware source distribution. If you did not receive the MIT
* license with the distribution, write to the Fuego Core project at
* fuego-core-users@hoslab.cs.helsinki.fi.
*/
package fuegocore.message.encoding.coa;
import fuegocore.message.encoding.EoaMachine;
import fuegocore.message.encoding.IdentityEoaMachine;
import fuegocore.util.xas.Event;
import fuegocore.util.xas.XasUtil;
import fuegocore.util.Util;
/**
* An extensible EOA machine for SOAP messages. This class provides a
* {@link EoaMachine} specific to SOAP messages. Extension points are
* defined at the initial sequence of namespace mappings, at the SOAP
* header, and at the content of the SOAP body. {@link EoaMachine}
* implementations may be provided by applications for any of these.
*
* <p>The {@link EoaMachine} for the namespace mapping sequence
* receives all namespace mappings not recognized by this class. It
* may remove any that it recognizes itself.
*
* <p>The {@link EoaMachine} for the SOAP header receives all events
* between the {@link Event#START_ELEMENT} and {@link
* Event#END_ELEMENT} events for the SOAP header, including these
* delimiting events. It must not remove the {@link
* Event#END_ELEMENT} event, since otherwise the {@link
* SoapDoaMachine} at the receiving end would not be able to
* distinguish the separation between the SOAP header and body.
*
* <p>The {@link EoaMachine} for the SOAP body receives all events
* between the {@link Event#START_ELEMENT} and {@link
* Event#END_ELEMENT} events for the SOAP body, but not the actual
* delimiters.
*/
public class SoapEoaMachine extends IdentityEoaMachine {
private EoaMachine nsEoa;
private EoaMachine headerEoa;
private EoaMachine bodyEoa;
private boolean isDroppableNs (Event ev) {
return (Util.equals(ev.getNamespace(), XasUtil.SOAP_NAMESPACE)
&& Util.equals(ev.getValue(), "soapenv"))
|| (Util.equals(ev.getNamespace(), XasUtil.XSD_NAMESPACE)
&& Util.equals(ev.getValue(), "xsd"))
|| (Util.equals(ev.getNamespace(), XasUtil.XSI_NAMESPACE)
&& Util.equals(ev.getValue(), "xsi"));
}
/**
* Construct a machine with no extensions. The constructed
* machine will only remove SOAP-specific events.
*/
public SoapEoaMachine () {
this(null);
}
/**
* Construct a machine with special body encoding. The
* constructed machine will pass the content of the SOAP body to
* the provided machine.
*
* @param bodyEoa the {@link EoaMachine} to use for the body of
* the SOAP message
*/
public SoapEoaMachine (EoaMachine bodyEoa) {
this(null, bodyEoa);
}
/**
* Construct a machine with special header and body encoding. The
* constructed machine will pass the contents of the SOAP header
* and the SOAP body to the corresponding machines.
*
* @param headerEoa the {@link EoaMachine} to use for the header
* of the SOAP message
* @param bodyEoa the {@link EoaMachine} to use for the body of
* the SOAP message
*/
public SoapEoaMachine (EoaMachine headerEoa, EoaMachine bodyEoa) {
this(null, headerEoa, bodyEoa);
}
/**
* Construct a machine with special encoding for all extensible
* parts. The constructed machine will pass the namespace
* mappings, the SOAP header, and the SOAP body to the
* corresponding machines.
*
* @param nsEoa the {@link EoaMachine} to use for any additional
* namespace mappings at the beginning of the SOAP message
* @param headerEoa the {@link EoaMachine} to use for the header
* of the SOAP message
* @param bodyEoa the {@link EoaMachine} to use for the body of
* the SOAP message
*/
public SoapEoaMachine (EoaMachine nsEoa, EoaMachine headerEoa,
EoaMachine bodyEoa) {
this.nsEoa = nsEoa;
this.headerEoa = headerEoa;
this.bodyEoa = bodyEoa;
}
public Event nextEvent (Event ev) {
if (ev != null) {
switch (state) {
case 0:
if (ev.getType() == Event.NAMESPACE_PREFIX) {
if (isDroppableNs(ev)) {
ev = null;
} else if (nsEoa != null) {
ev = nsEoa.nextEvent(ev);
}
} else if (ev.getType() == Event.START_ELEMENT
&& Util.equals(ev.getNamespace(),
XasUtil.SOAP_NAMESPACE)
&& Util.equals(ev.getName(), "Envelope")) {
ev = null;
state = 1;
}
break;
case 1:
if (ev.getType() == Event.START_ELEMENT
&& Util.equals(ev.getNamespace(),
XasUtil.SOAP_NAMESPACE)) {
if (Util.equals(ev.getName(), "Header")
&& headerEoa != null) {
ev = headerEoa.nextEvent(ev);
state = 2;
} else if (Util.equals(ev.getName(), "Body")) {
ev = null;
state = 3;
}
} else if (ev.getType() == Event.END_ELEMENT
&& Util.equals(ev.getNamespace(),
XasUtil.SOAP_NAMESPACE)
&& Util.equals(ev.getName(), "Envelope")) {
ev = null;
state = 0;
}
break;
case 2: {
boolean stop = false;
if (ev.getType() == Event.END_ELEMENT
&& Util.equals(ev.getNamespace(),
XasUtil.SOAP_NAMESPACE)
&& Util.equals(ev.getName(), "Header")) {
stop = true;
}
ev = headerEoa.nextEvent(ev);
if (stop) {
state = 1;
}
break;
}
case 3:
if (ev.getType() == Event.END_ELEMENT
&& Util.equals(ev.getNamespace(),
XasUtil.SOAP_NAMESPACE)
&& Util.equals(ev.getName(), "Body")) {
ev = null;
state = 1;
} else if (bodyEoa != null) {
ev = bodyEoa.nextEvent(ev);
}
break;
default:
throw new IllegalStateException("Machine in invalid state "
+ state);
}
}
return ev;
}
}