package com.bao.lc.site;
import java.awt.Component;
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
import org.apache.commons.chain.impl.ContextBase;
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 com.bao.lc.bean.IDValuePair;
import com.bao.lc.bean.ResultCode;
import com.bao.lc.client.utils.HttpClientUtils;
import com.bao.lc.common.Builder;
import com.bao.lc.httpcommand.BasicHttpCommand;
import com.bao.lc.httpcommand.params.HttpCommandPNames;
import com.bao.lc.httpcommand.params.HttpCommandParams;
import com.bao.lc.util.AppUtils;
import com.bao.lc.util.MiscUtils;
public class RandCodeBuilder implements Builder<String>
{
private static Log log = LogFactory.getLog(RandCodeBuilder.class);
private static final String RAND_CODE_RESULT = "lc.rand.code.result";
// Required
private Context origContext = null;
private HttpUriRequest req = null;
// Optional
private String referer = null;
private String prompt = null;
private Component parentComponent;
public RandCodeBuilder()
{
reset();
}
private void reset()
{
origContext = null;
req = null;
referer = null;
prompt = null;
parentComponent = null;
}
public RandCodeBuilder context(Context context)
{
this.origContext = context;
return this;
}
public RandCodeBuilder request(HttpUriRequest request)
{
this.req = request;
return this;
}
public RandCodeBuilder referer(String referer)
{
this.referer = referer;
return this;
}
public RandCodeBuilder prompt(String str)
{
this.prompt = str;
return this;
}
public RandCodeBuilder parent(Component parentComponent)
{
this.parentComponent = parentComponent;
return this;
}
@Override
public String build()
{
String vCode = null;
try
{
//Check parameters
if(this.req == null)
{
throw new IllegalArgumentException("'request' can't be null");
}
// Prepare context
Context context = new ContextBase();
context.putAll(this.origContext);
context.put(HttpCommandPNames.TARGET_REQUEST, this.req);
if(referer != null)
{
context.put(HttpCommandPNames.TARGET_REFERER, this.referer);
}
// Execute
vCode = executeCommand(context);
// Remove the copied items to let GC happy
context.clear();
}
finally
{
reset();
}
return vCode;
}
private String executeCommand(Context context)
{
// Do execute GetVerificationCode
Command childCommand = new GetVerificationCode();
try
{
childCommand.execute(context);
}
catch(Exception e)
{
log.error("Failed to execute command@uri=" + req.getURI(), e);
return null;
}
// Get the result
String vCode = MapUtils.getString(context, RAND_CODE_RESULT);
return vCode;
}
private class GetVerificationCode extends BasicHttpCommand
{
@Override
protected IDValuePair postExecute(Context context) throws Exception
{
// 1. Get response content
HttpResponse rsp = HttpCommandParams.getResponse(context);
String fileName = AppUtils.getTempFilePath("vode.jpg");
HttpClientUtils.saveToFile(rsp.getEntity(), fileName);
// show validation code
String validationCode = MiscUtils.getValidationCode(fileName, prompt, parentComponent);
context.put(RAND_CODE_RESULT, validationCode);
// Remove next hop
HttpCommandParams.purgeRequestParams(context);
return ResultCode.RC_OK;
}
}
}