package com.bao.lc.site.s2.commands;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.chain.Context;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.tags.FormTag;
import org.htmlparser.tags.InputTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import com.bao.lc.bean.IDValuePair;
import com.bao.lc.bean.ResultCode;
import com.bao.lc.client.RequestBuilder;
import com.bao.lc.client.utils.HttpClientUtils;
import com.bao.lc.httpcommand.BasicHttpCommand;
import com.bao.lc.httpcommand.params.HttpCommandPNames;
import com.bao.lc.httpcommand.params.HttpCommandParams;
import com.bao.lc.site.s2.ZyConstants;
import com.bao.lc.util.MiscUtils;
public class GetLoginPage extends BasicHttpCommand
{
private static Log log = LogFactory.getLog(GetLoginPage.class);
public GetLoginPage()
{
super();
}
@Override
protected IDValuePair postExecute(Context context) throws Exception
{
HttpResponse rsp = HttpCommandParams.getResponse(context);
parse(context, rsp);
return ResultCode.RC_OK;
}
@SuppressWarnings("unchecked")
private void parse(Context context, HttpResponse rsp) throws Exception
{
String encoding = "UTF-8";
String text = HttpClientUtils.saveToString(rsp.getEntity(), encoding);
// Parse
Parser parser = MiscUtils.createParser(text, encoding, log);
// Set filters
NodeFilter[] predicates = { new HasAttributeFilter("id", "Form1"),
new HasAttributeFilter("name", "Form1"), new NodeClassFilter(FormTag.class) };
NodeFilter filter = new AndFilter(predicates);
// parse
NodeList formNodeList = parser.parse(filter);
if(formNodeList.size() != 1)
{
throw new ParserException("Found [" + formNodeList.size() + "] form(s), Expected [1].");
}
// Found the form
FormTag form = (FormTag) formNodeList.elementAt(0);
NodeList inputNodeList = form.getFormInputs();
if(inputNodeList.size() <= 0)
{
throw new ParserException("Found [0] form input.");
}
// Parameters extraction
Map<String, String> params = new HashMap<String, String>();
for(int i = 0, size = inputNodeList.size(); i < size; i++)
{
InputTag input = (InputTag) inputNodeList.elementAt(i);
String name = input.getAttribute("name");
String value = input.getAttribute("value");
if("memtype".equals(name))
{
if("card".equalsIgnoreCase(input.getAttribute("id")))
{
params.put(name, value);
}
continue;
}
if("userName".equals(name))
{
params.put(name, MapUtils.getString(context, ZyConstants.PARAM_USER));
continue;
}
if("password".equals(name))
{
params.put(name, MapUtils.getString(context, ZyConstants.PARAM_PASSWORD));
continue;
}
// collect all the other fields.
params.put(name, value);
}
// Method
String method = form.getFormMethod();
// Location
String location = buildLocation("card", params.get("redirctTo"));
URI baseURI = HttpCommandParams.getTargetRequestURI(context);
RequestBuilder rb = new RequestBuilder();
rb.method(method).baseURI(baseURI).reference(location);
rb.paramMap(params).encoding(encoding);
HttpUriRequest nextRequest = rb.create();
context.put(HttpCommandPNames.TARGET_REQUEST, nextRequest);
context.put(HttpCommandPNames.TARGET_REFERER, baseURI.toString());
}
private String buildLocation(String type, String redirct)
{
StringBuilder sb = new StringBuilder("Login.aspx?flag=login&type=");
sb.append(MiscUtils.escapeJS(type));
sb.append("&url-redirect-to=");
sb.append(MiscUtils.escapeJS(redirct));
return sb.toString();
}
}