package com.sun.j2ee.blueprints.admin.client;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParsePosition;
import java.util.ArrayList;
import java.net.URL;
import java.net.MalformedURLException;
import java.net.HttpURLConnection;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.DataOutputStream;
import java.io.BufferedReader;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.NamedNodeMap;
import org.xml.sax.InputSource;
public class HttpPostPetStoreProxy implements PetStoreProxy {
private static final String requestType =
"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"?>\n";
private URL url = null;
private DocumentBuilder documentBuilder = null;
private DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
public HttpPostPetStoreProxy() {
}
public void setup(String host, String port, String sessionID) {
try {
url = new URL("http://" + host + ":" + port
+ "/admin/ApplRequestProcessor;jsessionid=" + sessionID);
} catch(MalformedURLException e) {
e.printStackTrace();
}
try {
documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
} catch (Exception e) {
e.printStackTrace();
}
}
private Document doHttpPost(String request) {
InputStream ist = null;
OutputStream ost = null;
HttpURLConnection uc = null;
try {
uc = (HttpURLConnection)(url.openConnection());
uc.setRequestMethod("POST");
uc.setDoOutput(true);
uc.setUseCaches(false);
uc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
uc.setRequestProperty("JSESSIONID", "HAHAHAHA");
uc.connect();
ost = uc.getOutputStream();
DataOutputStream out = new DataOutputStream(ost);
out.writeBytes(request);
out.flush();
out.close();
ost = null;
ist = uc.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(ist));
StringBuffer sb = new StringBuffer();
char[] c = new char[1];
while (in.read(c, 0, 1) == 1) {
sb.append(c[0]);
}
InputSource src = new InputSource(new StringReader(sb.toString()));
return documentBuilder.parse(src);
} catch (Exception e) {
if (uc != null) {
uc.disconnect();
}
return null;
} finally { if (ost != null) {
try {
ost.close();
}
catch (IOException ignore) {
}
}
if (ist != null) {
try {
ist.close();
}
catch (IOException ignore) {
}
}
}
}
private String genRequest(StringBuffer body) {
StringBuffer sb = new StringBuffer(requestType);
sb.append("<Request>\n");
sb.append(body.toString());
sb.append("</Request>\n");
return sb.toString();
}
private String getBody(Node node) {
try {
return node.getFirstChild().getNodeValue();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private String getBody(Document doc, String tag) {
return getBody(doc.getElementsByTagName(tag).item(0));
}
private Date getDate(Node node) {
try {
String s = getBody(node);
return dateFormat.parse(s, new ParsePosition(0));
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
private Date getDate(Document doc, String tag) {
return getDate(doc.getElementsByTagName(tag).item(0));
}
private int getInt(Node node) {
try {
String s = getBody(node);
return Integer.parseInt(s);
}
catch (Exception e) {
e.printStackTrace();
return -1;
}
}
private float getFloat(Node node) {
String s = null;
try {
s = getBody(node);
return Float.parseFloat(s);
}
catch (Exception e) {
e.printStackTrace();
return -1.0f;
}
}
private int getInt(Document doc, String tag) {
return getInt(doc.getElementsByTagName(tag).item(0));
}
private String getAttribute(Node node, String key) {
NamedNodeMap nodeMap = node.getAttributes();
if (nodeMap != null) {
Node item = nodeMap.getNamedItem(key);
return (item != null) ? item.getNodeValue() : null;
}
else {
return null;
}
}
private String parseOrderStatus(String s) {
if (s.equals("PENDING")) {
return PetStoreProxy.Order.PENDING;
}
else if (s.equals("APPROVED")) {
return PetStoreProxy.Order.APPROVED;
}
else if (s.equals("DENIED")) {
return PetStoreProxy.Order.DENIED;
}
else if (s.equals("COMPLETED")) {
return PetStoreProxy.Order.COMPLETED;
}
else {
return null;
}
}
private PetStoreProxy.Order parseOrder(Node orderNode) {
String id = null;
String userId = null;
Date date = null;
float amount = -1.0f;
String status = null;
NodeList children = orderNode.getChildNodes();
for(int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
if (child.getNodeType() != Node.ELEMENT_NODE) {
continue;
}
String name = child.getNodeName();
if (name.equals("OrderId")) {
id = getBody(child);
}
else if (name.equals("UserId")) {
userId = getBody(child);
}
else if (name.equals("OrderDate")) {
date = getDate(child);
}
else if (name.equals("OrderAmount")) {
amount = getFloat(child);
}
else if (name.equals("OrderStatus")) {
status = parseOrderStatus(getBody(child));
}
}
return new PetStoreProxy.Order(id, userId, date, amount, status);
}
public PetStoreProxy.Order[] getOrders(String status) {
StringBuffer sb = new StringBuffer("<Type>GETORDERS</Type>");
sb.append("<Status>");
sb.append(status);
sb.append("</Status>");
Document doc = doHttpPost(genRequest(sb));
NodeList orderNodes = doc.getElementsByTagName("Order");
ArrayList orders = new ArrayList(orderNodes.getLength());
for(int i = 0; i < orderNodes.getLength(); i++) {
PetStoreProxy.Order order = parseOrder(orderNodes.item(i));
if (order != null) {
orders.add(order);
}
}
return (PetStoreProxy.Order[])(orders.toArray(new PetStoreProxy.Order[orders.size()]));
}
private void appendElement(StringBuffer sb, String tag, String value) {
if (value != null) {
sb.append("<");
sb.append(tag);
sb.append(">");
sb.append(value);
sb.append("</");
sb.append(tag);
sb.append(">\n");
}
else {
sb.append("<");
sb.append(tag);
sb.append("/>");
}
}
private String genSalesRequest(String type, Date start, Date end, String category) {
StringBuffer sb = new StringBuffer();
appendElement(sb, "Type", type);
appendElement(sb, "Start", dateFormat.format(start));
appendElement(sb, "End", dateFormat.format(end));
appendElement(sb, "ReqCategory", category);
return genRequest(sb);
}
public PetStoreProxy.Sales[] getRevenue(Date start, Date end, String category) {
String request = genSalesRequest("REVENUE", start, end, category);
Document doc = doHttpPost(request);
String tag = (category == null) ? "Category" : "Item";
NodeList salesNodes = doc.getElementsByTagName(tag);
ArrayList sales = new ArrayList(salesNodes.getLength());
for(int i = 0; i < salesNodes.getLength(); i++) {
Node salesNode = salesNodes.item(i);
String key = getAttribute(salesNode, "name");
float revenue = getFloat(salesNode);
if ((key != null) && (revenue >= 0.0)) {
sales.add(new PetStoreProxy.Sales(key, revenue));
}
}
return (PetStoreProxy.Sales[])(sales.toArray(new PetStoreProxy.Sales[sales.size()]));
}
public PetStoreProxy.Sales[] getOrders(Date start, Date end, String category) {
String request = genSalesRequest("ORDERS", start, end, category);
Document doc = doHttpPost(request);
String tag = (category == null) ? "Category" : "Item";
NodeList salesNodes = doc.getElementsByTagName(tag);
ArrayList sales = new ArrayList(salesNodes.getLength());
for(int i = 0; i < salesNodes.getLength(); i++) {
Node salesNode = salesNodes.item(i);
String key = getAttribute(salesNode, "name");
int nOrders = getInt(salesNode);
if ((key != null) && (nOrders >= 0)) {
sales.add(new PetStoreProxy.Sales(key, nOrders));
}
}
return (PetStoreProxy.Sales[])(sales.toArray(new PetStoreProxy.Sales[sales.size()]));
}
public void updateStatus(PetStoreProxy.Order[] orders, String status) {
StringBuffer sb = new StringBuffer();
appendElement(sb, "Type", "UPDATESTATUS");
appendElement(sb, "TotalCount", Integer.toString(orders.length));
for(int i = 0; i < orders.length; i++) {
sb.append("<Order>");
appendElement(sb, "OrderId", orders[i].getId());
appendElement(sb, "OrderStatus", status);
sb.append("</Order>");
}
Document doc = doHttpPost(genRequest(sb));
if (!getBody(doc, "Status").equals("SUCCESS")) {
}
}
public void updateStatus(PetStoreProxy.Order order, String status) {
updateStatus(new PetStoreProxy.Order[]{order}, status);
}
}