/*
|
* CDDL HEADER START
|
*
|
* The contents of this file are subject to the terms of the
|
* Common Development and Distribution License, Version 1.0 only
|
* (the "License"). You may not use this file except in compliance
|
* with the License.
|
*
|
* You can obtain a copy of the license at
|
* trunk/proctor/resource/legal-notices/Proctor.LICENSE
|
* or https://proctor.dev.java.net/Proctor.LICENSE.
|
* See the License for the specific language governing permissions
|
* and limitations under the License.
|
*
|
* When distributing Covered Code, include this CDDL HEADER in each
|
* file and include the License file at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
|
* add the following below this CDDL HEADER, with the fields enclosed
|
* by brackets "[]" replaced with your own identifying information:
|
* Portions Copyright [yyyy] [name of copyright owner]
|
*
|
* CDDL HEADER END
|
*
|
*
|
* Portions Copyright 2009 Sun Microsystems, Inc.
|
*/
|
|
package com.ibm.staf.service.opends.tester;
|
|
import java.io.BufferedReader;
|
import java.io.ByteArrayInputStream;
|
import java.io.Reader;
|
import java.io.StringReader;
|
import java.util.HashMap;
|
import java.util.Iterator;
|
import java.util.Map;
|
import java.util.StringTokenizer;
|
import javax.xml.bind.JAXBContext;
|
import javax.xml.bind.JAXBElement;
|
import javax.xml.bind.Unmarshaller;
|
import javax.xml.soap.MessageFactory;
|
import javax.xml.soap.MimeHeaders;
|
import javax.xml.soap.SOAPBody;
|
import javax.xml.soap.SOAPElement;
|
import javax.xml.soap.SOAPMessage;
|
import org.opends.dsml.protocol.BatchResponse;
|
|
public class ResponseChecker {
|
|
private Map<String, String> header = new HashMap<String, String>();
|
private String httpCode;
|
private BatchResponse batchResponse;
|
private String body;
|
public ResponseChecker(String response) throws Exception {
|
this(new StringReader(response));
|
|
}
|
|
public ResponseChecker(Reader response) throws Exception {
|
|
// this.source = new StringBuilder();
|
boolean headerDone = false;
|
String line = null;
|
BufferedReader reader = new BufferedReader(response);
|
StringBuilder sb = new StringBuilder();
|
|
// assign first line of header to httpCode
|
// then assign all header to <key>:<value> to header map
|
// finally fill sb with body of request
|
while ((line = reader.readLine()) != null) {
|
if (!headerDone) {
|
if (line.length() == 0) {
|
headerDone = true;
|
}
|
if (!headerDone) {
|
if (httpCode == null) {
|
httpCode = line;
|
} else {
|
String[] entry = line.split(":");
|
header.put(entry[0].trim().toLowerCase(), entry[1].trim());
|
}
|
}
|
} else {
|
sb.append(line);
|
}
|
}
|
this.body = sb.toString();
|
|
if (httpCode != null) {
|
if (httpCode.split(" ")[1].equals("200")) {
|
|
// reconstruct header for SOAP engine
|
MimeHeaders mimeHeaders = new MimeHeaders();
|
for (Map.Entry<String, String> entry : header.entrySet()) {
|
String name = entry.getKey();
|
String value = entry.getValue();
|
StringTokenizer token = new StringTokenizer(value, ",");
|
while (token.hasMoreTokens()) {
|
mimeHeaders.addHeader(name, token.nextToken().trim());
|
}
|
}
|
MessageFactory messageFactory = MessageFactory.newInstance();
|
SOAPMessage message = messageFactory.createMessage(mimeHeaders, new ByteArrayInputStream(this.body.getBytes()));
|
|
//DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
//dbf.setNamespaceAware(true);
|
//DocumentBuilder db = dbf.newDocumentBuilder();
|
//Document doc = db.newDocument();
|
SOAPBody soapBody = message.getSOAPBody();
|
|
Iterator iterator = soapBody.getChildElements();
|
while (iterator.hasNext()) {
|
Object object = iterator.next();
|
if (!(object instanceof SOAPElement)) {
|
continue;
|
}
|
SOAPElement soapElement = (SOAPElement) object;
|
|
JAXBContext jaxbContext = JAXBContext.newInstance(BatchResponse.class);
|
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
|
|
JAXBElement<BatchResponse> batchResponseElement = unmarshaller.unmarshal(soapElement, BatchResponse.class);
|
|
this.batchResponse = batchResponseElement.getValue();
|
}
|
}
|
}
|
|
}
|
|
public boolean equals(Object o) {
|
if (o == this) {
|
return true;
|
}
|
if (!(o instanceof ResponseChecker)) {
|
return false;
|
}
|
ResponseChecker other = (ResponseChecker) o;
|
|
// check code "HTTP/1.1 200 OK".split(" ")[1] = "200"
|
if (!this.httpCode.split(" ")[1].equals(other.httpCode.split(" ")[1])) {
|
return false;
|
}
|
|
if (!Checker.equals(batchResponse, other.batchResponse)) {
|
return false;
|
}
|
|
return true;
|
}
|
}
|