source: trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/eventcore/SOAPEventType.java @ 1906

Last change on this file since 1906 was 1906, checked in by pharms, 9 years ago
  • created support for client names
  • adapted support for service names
File size: 10.8 KB
Line 
1//   Copyright 2012 Georg-August-Universität Göttingen, Germany
2//
3//   Licensed under the Apache License, Version 2.0 (the "License");
4//   you may not use this file except in compliance with the License.
5//   You may obtain a copy of the License at
6//
7//       http://www.apache.org/licenses/LICENSE-2.0
8//
9//   Unless required by applicable law or agreed to in writing, software
10//   distributed under the License is distributed on an "AS IS" BASIS,
11//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//   See the License for the specific language governing permissions and
13//   limitations under the License.
14
15package de.ugoe.cs.autoquest.plugin.http.eventcore;
16
17import java.net.MalformedURLException;
18import java.net.URL;
19import java.util.Properties;
20import java.util.logging.Level;
21
22import javax.xml.soap.SOAPException;
23import javax.xml.soap.SOAPMessage;
24
25import de.ugoe.cs.autoquest.plugin.http.HTTPUtils;
26import de.ugoe.cs.autoquest.plugin.http.logdata.Header;
27import de.ugoe.cs.autoquest.plugin.http.logdata.HttpExchange;
28import de.ugoe.cs.util.console.Console;
29
30/**
31 * <p>
32 * represents the specific HTTP event for a SOAP message exchange. It contains the SOAP request
33 * and response envelopes and is more concrete when comparing object. E.g., it considers the
34 * called SOAP operation on performing comparison.
35 * </p>
36 *
37 * @author Patrick Harms
38 */
39public final class SOAPEventType extends HTTPEventType {
40
41    /**  */
42    private static final long serialVersionUID = 1L;
43   
44    /**
45     * <p>
46     * the SOAP request belonging to the event
47     * </p>
48     */
49    transient private final SOAPMessage soapRequest;
50   
51    /**
52     * <p>
53     * the SOAP response belonging to the event
54     * </p>
55     */
56    transient private final SOAPMessage soapResponse;
57   
58    /**
59     * <p>
60     * the SOAP method called in this request
61     * </p>
62     */
63    private final String calledMethod;
64   
65    /**
66     * <p>
67     * the name of the client; this is either the host/ip and port of the sender or, if a path
68     * map is available, a human readable name that may be based also on the receiver
69     * </p>
70     */
71    private final String clientName;
72   
73    /**
74     * <p>
75     * the name of the service; this is either the path or, if a path map is available, a human
76     * readable name that is mapped to the path
77     * </p>
78     */
79    private final String serviceName;
80   
81    /**
82     * <p>
83     * the human readable name of this event type
84     * </p>
85     */
86    private final String name;
87
88    /**
89     * <p>
90     * initializes the event type with the represented HTTP exchange and the already extracted
91     * SOAP request and response.
92     * </p>
93     *
94     * @param exchange     the represented HTTP exchange
95     * @param soapRequest  the already extracted SOAP request
96     * @param soapResponse the already extracted SOAP response
97     * @param urlNameMap   used to map paths of servives to logical names
98     */
99    public SOAPEventType(HttpExchange exchange, SOAPMessage soapRequest, SOAPMessage soapResponse, Properties urlNameMap) {
100        super(exchange);
101        this.soapRequest = soapRequest;
102        this.soapResponse = soapResponse;
103        this.calledMethod = normalizeCalledMethod(determineCalledMethod(exchange, soapRequest));
104       
105        String path = null;
106       
107        if ((exchange.getRequest() != null) && (exchange.getRequest().getUrl() != null)) {
108            try {
109                path = new URL(exchange.getRequest().getUrl()).getPath();
110            }
111            catch (MalformedURLException e) {
112                // ignore and continue
113            }
114        }
115       
116        StringBuffer nameBuffer = new StringBuffer("SOAPEvent");
117       
118        // determine the client name
119        if (urlNameMap == null) {
120            clientName = exchange.getSender().getHost() + ":" + exchange.getSender().getPort();
121        }
122        else {
123            // check for a mapping of the sender host
124            String key = "clientName.sender." + exchange.getSender().getHost();
125            String value = urlNameMap.getProperty(key);
126           
127            if (value == null) {
128                key += ":" + exchange.getSender().getPort();
129                value = urlNameMap.getProperty(key);
130            }
131           
132            if (value == null) {
133                key = "clientName.receiver." + exchange.getReceiver().getHost();
134                value = urlNameMap.getProperty(key);
135            }
136           
137            if (value == null) {
138                key += ":" + exchange.getReceiver().getPort();
139                value = urlNameMap.getProperty(key);
140            }
141           
142            if (value != null) {
143                clientName = value;
144            }
145            else {
146                clientName = exchange.getSender().getHost() + ":" + exchange.getSender().getPort();
147            }
148        }
149
150        nameBuffer.append(clientName);
151       
152        // determine the service name
153        if (path != null) {
154            nameBuffer.append(", ");
155            if (urlNameMap == null) {
156                serviceName = path;
157            }
158            else {
159                String value = urlNameMap.getProperty("serviceName.path." + path);
160                if (value != null) {
161                    serviceName = value;
162                }
163                else {
164                    serviceName = path;
165                }
166            }
167            nameBuffer.append(serviceName);
168        }
169        else {
170            serviceName = "NA";
171        }
172       
173        if (calledMethod != null) {
174            nameBuffer.append(", ");
175            nameBuffer.append(calledMethod);
176        }
177       
178        String senderStr = HTTPUtils.toString(exchange.getSender());
179        String receiverStr = HTTPUtils.toString(exchange.getReceiver());
180       
181        if ((senderStr != null) && (receiverStr != null)) {
182            nameBuffer.append(", ");
183            nameBuffer.append(senderStr);
184            nameBuffer.append(" --> ");
185            nameBuffer.append(receiverStr);
186        }
187        else if (senderStr != null) {
188            nameBuffer.append(", ");
189            nameBuffer.append(senderStr);
190        }
191        else if (receiverStr != null) {
192            nameBuffer.append(", ");
193            nameBuffer.append(receiverStr);
194        }
195       
196        nameBuffer.append(")");
197       
198        this.name = nameBuffer.toString();
199    }
200
201    /**
202     * <p>
203     * the SOAP method called in this request
204     * </p>
205     *
206     * @return the SOAP method called in this request
207     */
208    public String getCalledMethod() {
209        return calledMethod;
210    }
211   
212    /**
213     * <p>
214     * the name of the client calling in this request
215     * </p>
216     *
217     * @return the name of the client calling in this request
218     */
219    public String getClientName() {
220        return clientName;
221    }
222   
223    /**
224     * <p>
225     * the name of the service called in this request
226     * </p>
227     *
228     * @return the name of the service called in this request
229     */
230    public String getServiceName() {
231        return serviceName;
232    }
233
234    /**
235     * @return the soapRequest
236     */
237    public SOAPMessage getSoapRequest() {
238        return soapRequest;
239    }
240
241    /**
242     * @return the soapResponse
243     */
244    public SOAPMessage getSoapResponse() {
245        return soapResponse;
246    }
247
248    /* (non-Javadoc)
249     * @see de.ugoe.cs.autoquest.eventcore.IEventType#getName()
250     */
251    @Override
252    public String getName() {
253        return name;
254    }
255
256    /* (non-Javadoc)
257     * @see de.ugoe.cs.autoquest.plugin.http.eventcore.HTTPEventType#toString()
258     */
259    @Override
260    public String toString() {
261        return name;
262    }
263
264    /* (non-Javadoc)
265     * @see de.ugoe.cs.autoquest.plugin.http.eventcore.HTTPEventType#equals(java.lang.Object)
266     */
267    @Override
268    public boolean equals(Object obj) {
269        if (this == obj) {
270            return true;
271        }
272        else if (obj instanceof SOAPEventType) {
273            if (!obj.getClass().isAssignableFrom(this.getClass())) {
274                return false;
275            }
276           
277            return
278                super.equals(obj) &&
279                HTTPUtils.equals(calledMethod, ((SOAPEventType) obj).calledMethod) &&
280                HTTPUtils.equals(serviceName, ((SOAPEventType) obj).serviceName) &&
281                HTTPUtils.equals(clientName, ((SOAPEventType) obj).clientName);
282        }
283        else {
284            return false;
285        }
286    }
287
288    /* (non-Javadoc)
289     * @see de.ugoe.cs.autoquest.plugin.http.eventcore.HTTPEventType#hashCode()
290     */
291    @Override
292    public int hashCode() {
293        int hashCode = super.hashCode();
294        if (calledMethod != null) {
295            hashCode += calledMethod.hashCode();
296        }
297        if( serviceName != null ) {
298            hashCode += serviceName.hashCode();
299        }
300        if( clientName != null ) {
301            hashCode += clientName.hashCode();
302        }
303        return hashCode;
304    }
305
306    /**
307     * <p>
308     * determines the name of the method called in a SOAP request either through the HTTP header
309     * or through the SOAP body
310     * </p>
311     */
312    private String determineCalledMethod(HttpExchange exchange, SOAPMessage soapRequest) {
313        // first check for a header containing the SOAP action
314       
315        if ((exchange.getRequest() != null) && (exchange.getRequest().getHeaders() != null) &&
316            (exchange.getRequest().getHeaders().getHeader() != null))
317        {
318            for (Header header : exchange.getRequest().getHeaders().getHeader()) {
319                if ("SOAPAction".equalsIgnoreCase(header.getKey())) {
320                    return header.getValue();
321                }
322            }
323        }
324       
325        // if there is none, use the root element of the body
326        try {
327            if ((soapRequest.getSOAPBody() != null) &&
328                (soapRequest.getSOAPBody().getChildNodes() != null) &&
329                (soapRequest.getSOAPBody().getChildNodes().getLength() > 0))
330            {
331                return soapRequest.getSOAPBody().getChildNodes().item(0).getNodeName();
332            }
333        }
334        catch (SOAPException e) {
335            Console.traceln(Level.WARNING, "could not process SOAP message correctly: " + e);
336            Console.logException(e);
337        }
338       
339        return null;
340    }
341   
342    /**
343     * removes unnecessary characters from the method name
344     */
345    private String normalizeCalledMethod(String calledMethod) {
346        if (calledMethod != null) {
347            if (calledMethod.startsWith("\"") && calledMethod.endsWith("\"")) {
348                calledMethod = calledMethod.substring(1, calledMethod.length() - 1);
349            }
350            if (calledMethod.startsWith("urn:")) {
351                calledMethod = calledMethod.substring(4);
352            }
353            if (calledMethod.startsWith("http://")) {
354                calledMethod = calledMethod.split("/")[calledMethod.split("/").length-1];
355            }
356        }
357        return calledMethod;
358    }
359}
Note: See TracBrowser for help on using the repository browser.