package com.bao.lc.site.s2.commands;
import java.net.URI;
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.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URIUtils;
import org.htmlparser.Parser;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import com.bao.lc.AppConfig;
import com.bao.lc.bean.IDValuePair;
import com.bao.lc.bean.ResultCode;
import com.bao.lc.client.impl.PostRedirectStrategy;
import com.bao.lc.client.utils.HttpClientUtils;
import com.bao.lc.common.LinkTextRegexFilter;
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 DoLogin extends BasicHttpCommand
{
private static Log log = LogFactory.getLog(DoLogin.class);
public DoLogin()
{
super();
}
@Override
protected IDValuePair postExecute(Context context) throws Exception
{
HttpResponse rsp = HttpCommandParams.getResponse(context);
String encoding = "UTF-8";
// save the member center page
String userPage = HttpClientUtils.saveToString(rsp.getEntity(), encoding);
context.put(ZyConstants.USER_PAGE_CONTENT_KEY, userPage);
PostRedirectStrategy redirectStrategy = HttpCommandParams.getRedirectStrategy(context);
if(redirectStrategy == null)
{
throw new IllegalStateException("Can't find the redirectStrategy.");
}
if(!redirectStrategy.isPostRedirected())
{
throw new IllegalStateException("Login doesn't find any redirect.");
}
HttpUriRequest finalRequest = redirectStrategy.getFinalRequest();
context.put(ZyConstants.USER_PAGE_URI, finalRequest.getURI().toString());
// set login state
context.put(ZyConstants.LOGIN_STATE_KEY, Boolean.TRUE);
//Parse logout URI request
parseLogoutRequest(context, userPage, finalRequest.getURI(), encoding);
//No next hop
context.remove(HttpCommandPNames.TARGET_REQUEST);
context.remove(HttpCommandPNames.TARGET_REFERER);
String user = MapUtils.getString(context, ZyConstants.PARAM_USER);
log.info("User [" + user + "] login successfully.");
return ResultCode.RC_OK;
}
private void parseLogoutRequest(Context context, String userPage, URI userPageURI,
String encoding) throws ParserException
{
Parser parser = MiscUtils.createParser(userPage, encoding, log);
NodeList logoutList = parser.parse(new LinkTextRegexFilter(AppConfig.getInstance()
.getPropInternal("zy.logout.link.mark")));
if(logoutList.size() <= 0)
{
throw new ParserException("No logout link found!");
}
if(logoutList.size() > 1)
{
log.warn("Found more than 1 logout link. size = " + logoutList.size());
}
LinkTag logoutLink = (LinkTag) logoutList.elementAt(0);
String link = logoutLink.getLink();
URI logoutURI = URIUtils.resolve(userPageURI, link);
HttpGet get = new HttpGet(logoutURI);
context.put(ZyConstants.LOGOUT_URI_REQUEST, get);
}
}