package com.gx.example.itemapply.web.action;

import com.gx.example.itemapply.business.factory.Factory;
import com.gx.example.itemapply.business.valueobject.*;
import com.gx.webpage.component.model.*;
import com.gx.webpage.engine.WebPageHelper;

import javax.servlet.http.*;
import java.util.*;

/**
 * 立项申请的Action实现
 * 
 * @author Administrator
 * 
 */
public class ApplyAction implements WebPageActionApi {
	/**
	 * 由开发人员来实现按钮操作的具体功能的实现方法
	 * 
	 * @param request
	 *            客户端进行网络调用的HttpServletRequest
	 * @param commond
	 *            客户端调用的具体操作命令类型，用来区分究竟是做什么操作
	 * @param wpm
	 *            页面的定义模型，用来反调通用数据操作功能和获取页面的数据模型时候使用
	 * @param bm
	 *            具体的按钮模型实例
	 * @return 需要返回给客户端的值 格式是<table>
	 *         <tr>
	 *         <td>Key值</td>
	 *         <td>Value值</td>
	 *         </tr>
	 *         </table>， 当然table中可以有多行即多个
	 *         <tr>,每行两个td，分别是key和value
	 * @throws Exception
	 */
	public String doAction(HttpServletRequest request, String commond,
			WebPageModel wpm,
			com.gx.webpage.component.compmodel.base.ButtonModel bm)
			throws Exception {

		StringBuffer buffer = new StringBuffer();
		boolean isError = false;
		String msgStr = "操作成功";
		try {
			// 1:获取界面传递过来的数据，并封装到相应的值对象中
			// 获取主model
			ApplyMainModel amm = (ApplyMainModel) WebPageHelper
					.getModelInstance(request, ApplyMainModel.class.getName(),
							wpm, false, true);
			// 获取子model的集合
			Collection cam = (Collection) WebPageHelper.getModelInstance(
					request, ApplyChildModel.class.getName(), wpm, true, true);
			// 把子model集合设置到主model中去
			amm.setColChild(cam);

			// 2：执行业务
			//也就是在这里去调用真正的逻辑层实现，至于逻辑层采用什么样的技术和架构，与Web层就没有太大关系了
			//反正是面向接口来开发。逻辑层可以Ejb,可以Spring，可以任意其他可用的技术
			Factory.getInstance().getApplyEbi().addApply(amm);
		} catch (Exception err) {
			// 例外处理，记录日志等
			isError = true;
			msgStr = "操作失败了：" + err.getMessage();
		}

		// 3：返回值，包括客户端处理需要的属性和值
		buffer.append("<table><tr><td>TestResponse</td><td>" + isError
				+ "</td></tr>" + "<tr><td>TestMessage</td><td>" + msgStr
				+ "</td></tr></table>");
		return buffer.toString();
	}
}
