package com.sogou.qadev.service.cynthia.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.sogou.qadev.service.cynthia.bean.Action;
import com.sogou.qadev.service.cynthia.bean.Flow;
import com.sogou.qadev.service.cynthia.bean.Script;
import com.sogou.qadev.service.cynthia.bean.Stat;
import com.sogou.qadev.service.cynthia.bean.Template;
import com.sogou.qadev.service.cynthia.bean.UUID;
import com.sogou.qadev.service.cynthia.factory.DataAccessFactory;
import com.sogou.qadev.service.cynthia.service.DataAccessSession;
import com.sogou.qadev.service.cynthia.util.CynthiaUtil;
import com.sogou.qadev.service.cynthia.util.XMLUtil;
/**
* @description:script mount processor
* @author:liming
* @mail:liming@sogou-inc.com
* @date:2014-5-5 下午8:30:47
* @version:v1.0
*/
@Controller
@RequestMapping("/mountScript")
public class MountScriptTemplateController extends BaseController {
/**
* @description:get all templates with script info
* @date:2014-5-5 下午8:31:02
* @version:v1.0
* @param das
* @return
*/
public String getAllTemplateWithScriptXml(DataAccessSession das) {
Template[] allTemplates = das.queryAllTemplates();
StringBuffer result = new StringBuffer();
result.append(baseXml);
result.append("<templates>");
for(Template template : allTemplates)
{
Script[] templateScripts = das.queryTemplateScripts(template.getId());
result.append("<template>");
result.append("<id>");
result.append(template.getId().toString());
result.append("</id>");
result.append("<name>");
result.append(XMLUtil.toSafeXMLString(template.getName()));
result.append("</name>");
result.append("<scripts>");
for(Script templateScript : templateScripts)
{
result.append("<script>");
result.append("<id>");
result.append(templateScript.getId().toString());
result.append("</id>");
result.append("<name>");
result.append(XMLUtil.toSafeXMLString(templateScript.getName()));
result.append("</name>");
result.append("</script>");
}
result.append("</scripts>");
result.append("</template>");
templateScripts = null;
}
result.append("</templates>");
allTemplates = null;
return result.toString();
}
/**
* @description:get all templates(id and name)
* @date:2014-5-5 下午8:31:26
* @version:v1.0
* @param das
* @return
*/
public String getAllTemplatesXml(DataAccessSession das)
{
Template[] allTemplates = das.queryAllTemplates();
StringBuffer result = new StringBuffer();
result.append(baseXml);
result.append("<templates>");
for(Template template : allTemplates)
{
result.append("<template>");
result.append("<id>");
result.append(template.getId().toString());
result.append("</id>");
result.append("<name>");
result.append(XMLUtil.toSafeXMLString(template.getName()));
result.append("</name>");
result.append("</template>");
}
result.append("</templates>");
allTemplates = null;
return result.toString();
}
@RequestMapping("/getAllTemplates.do")
@ResponseBody
public String getAllTemplate(@RequestParam("type")String type) throws Exception {
if(type!=null&&"script".equals(type))
return getAllTemplateWithScriptXml(das);
else
return getAllTemplatesXml(das);
}
/**
* @description:mount a script for template
* @date:2014-5-5 下午8:31:49
* @version:v1.0
* @param request
* @param response
* @return
* @throws Exception
*/
@ResponseBody
@RequestMapping("/mountScriptTemplate.do")
public String mountScriptTemplate(HttpServletRequest request,HttpServletResponse response) throws Exception {
String scriptId = request.getParameter("scriptId");
String templateId = request.getParameter("templateId");
String actions = request.getParameter("actions");
String stats = request.getParameter("stats");
Script script = das.queryScript(DataAccessFactory.getInstance().createUUID(scriptId));
UUID[] oldTemplateIds = script.getTemplateIds();
if(!CynthiaUtil.idInArray(oldTemplateIds,templateId))
{
List<UUID> oldTemplateIdsList = new ArrayList<UUID>();
if(oldTemplateIds!=null)
{
for(UUID oldTemplateId : oldTemplateIds)
{
oldTemplateIdsList.add(oldTemplateId);
}
}
if(templateId!=null&&!templateId.equals("")&&!"null".equals(templateId))
oldTemplateIdsList.add(DataAccessFactory.getInstance().createUUID(templateId));
script.setTemplateIds(oldTemplateIdsList.toArray(new UUID[oldTemplateIdsList.size()]));
}
Template newTemplate = das.queryTemplate(DataAccessFactory.getInstance().createUUID(templateId));
Flow newFlow = das.queryFlow(newTemplate.getFlowId());
Stat[] newFlowStats= newFlow.getStats();
Action[] newFlowActions=newFlow.getActions();
List<UUID> newFlowStatIds = new ArrayList<UUID>();
List<UUID> newFlowActionIds = new ArrayList<UUID>();
for(Stat stat : newFlowStats)
{
newFlowStatIds.add(stat.getId());
}
for(Action action : newFlowActions)
{
newFlowActionIds.add(action.getId());
}
if(actions!=null)
{
UUID[] oldActionIds = script.getActionIds();
List<UUID> oldActionIdsList = new ArrayList<UUID>();
if(oldActionIds != null)
{
for(UUID oldActionId : oldActionIds)
{
oldActionIdsList.add(oldActionId);
}
}
UUID[] newActionIds = CynthiaUtil.stringToIdArray(actions);
for(UUID actionId : newActionIds)
{
if(!oldActionIdsList.contains(actionId))
{
oldActionIdsList.add(actionId);
}
newFlowActionIds.remove(actionId);
}
for(UUID actionId : newFlowActionIds)
{
if(oldActionIdsList.contains(actionId))
oldActionIdsList.remove(actionId);
}
script.setActionIds(oldActionIdsList.toArray(new UUID[oldActionIdsList.size()]));
}
if(stats != null)
{
UUID[] oldStatIds = script.getEndStatIds();
List<UUID> oldStatIdsList = new ArrayList<UUID>();
if(oldStatIds != null)
{
for(UUID oldStatId : oldStatIds)
{
oldStatIdsList.add(oldStatId);
}
}
UUID[] newStatIds = CynthiaUtil.stringToIdArray(stats);
for(UUID statId : newStatIds)
{
if(!oldStatIdsList.contains(statId))
{
oldStatIdsList.add(statId);
}
newFlowStatIds.remove(statId);
}
for(UUID statId : newFlowStatIds)
{
if(oldStatIdsList.contains(statId))
oldStatIdsList.remove(statId);
}
script.setEndStatIds(oldStatIdsList.toArray(new UUID[oldStatIdsList.size()]));
}
das.updateScript(script);
StringBuffer result = new StringBuffer(this.baseXml);
result.append("<root>");
result.append("<id>").append(script.getId()).append("</id>");
result.append("</root>");
return result.toString();
}
@ResponseBody
@RequestMapping("/unMountScriptTemplate.do")
public String unMountScriptTemplate(@RequestParam("scriptId") String scriptId, @RequestParam("templateId") String templateId) throws Exception {
Script script = das.queryScript(DataAccessFactory.getInstance().createUUID(scriptId));
UUID[] oldTemplateIds = script.getTemplateIds();
List<UUID> newTemplateIds = new ArrayList<UUID>();
for(UUID oldTemplateId : oldTemplateIds)
{
if(!oldTemplateId.toString().equals(templateId))
{
newTemplateIds.add(oldTemplateId);
}
}
script.setTemplateIds(newTemplateIds.toArray(new UUID[newTemplateIds.size()]));
UUID[] oldStatIds = script.getEndStatIds();
UUID[] oldActionIds = script.getActionIds();
List<UUID> oldStatIdsList = new ArrayList<UUID>();
List<UUID> oldActionIdsList =new ArrayList<UUID>();
if(oldStatIds != null)
{
for(UUID oldStatId : oldStatIds)
{
oldStatIdsList.add(oldStatId);
}
}
if(oldActionIds!=null)
{
for(UUID oldActionId : oldActionIds)
{
oldActionIdsList.add(oldActionId);
}
}
List<UUID> newFlowIds = new ArrayList<UUID>();
for(UUID tempId : newTemplateIds)
{
Template template = das.queryTemplate(tempId);
if(template!=null)
newFlowIds.add(template.getFlowId());
}
Template removedTemplate = das.queryTemplate(DataAccessFactory.getInstance().createUUID(templateId));
if(!newFlowIds.contains(removedTemplate.getFlowId()))
{
Flow removedFlow = das.queryFlow(removedTemplate.getFlowId());
Stat[] removedFlowStats = removedFlow.getStats();
for(Stat stat : removedFlowStats)
{
if(oldStatIdsList.contains(stat.getId()))
oldStatIdsList.remove(stat.getId());
}
Action[] removedFlowActions = removedFlow.getActions();
for(Action action : removedFlowActions)
{
if(oldActionIdsList.contains(action.getId()))
{
oldActionIdsList.remove(action.getId());
}
}
}
script.setEndStatIds(oldStatIdsList.toArray(new UUID[oldStatIdsList.size()]));
script.setActionIds(oldActionIdsList.toArray(new UUID[oldActionIdsList.size()]));
das.updateScript(script);
StringBuffer result = new StringBuffer(this.baseXml);
result.append("<root>");
result.append("<id>").append(script.getId()).append("</id>");
result.append("</root>");
return result.toString();
}
/**
* @description:init all scripts mounted on template
* @date:2014-5-5 下午8:32:06
* @version:v1.0
* @param templateIdStr
* @return
* @throws Exception
*/
@ResponseBody
@RequestMapping("/initTemplateScripts.do")
public String initTemplateScripts(@RequestParam("templateId") String templateIdStr) throws Exception {
UUID templateId = DataAccessFactory.getInstance().createUUID(templateIdStr);
Script[] templateScripts = das.queryTemplateScripts(templateId);
Script[] allowedScripts = das.queryAllowedTemplateScripts(templateId);
Template template = das.queryTemplate(templateId);
Flow flow = das.queryFlow(template.getFlowId());
Stat[] stats = flow.getStats();
Action [] actions = flow.getActions();
StringBuffer xml = new StringBuffer(this.baseXml);
xml.append("<root>");
xml.append("<template>");
xml.append("<id>").append(template.getId()).append("</id>");
xml.append("<name>").append(XMLUtil.toSafeXMLString(template.getName())).append("</name>");
xml.append("<stats>");
for(Stat stat : stats)
{
xml.append("<stat>");
xml.append("<id>").append(stat.getId()).append("</id>");
xml.append("<name>").append(XMLUtil.toSafeXMLString(stat.getName())).append("</name>");
xml.append("</stat>");
}
xml.append("</stats>");
xml.append("<actions>");
for(Action action : actions)
{
xml.append("<action>");
xml.append("<id>").append(action.getId()).append("</id>");
xml.append("<name>").append(XMLUtil.toSafeXMLString(action.getName())).append("</name>");
xml.append("</action>");
}
xml.append("</actions>");
xml.append("</template>");
xml.append("<mountscripts>");
for(Script script : templateScripts)
{
xml.append("<script>");
xml.append("<id>").append(script.getId()).append("</id>");
xml.append("<name>").append(XMLUtil.toSafeXMLString(script.getName())).append("</name>");
xml.append("</script>");
}
xml.append("</mountscripts>");
xml.append("<allowedscripts>");
for(Script script : allowedScripts)
{
xml.append("<script>");
xml.append("<id>").append(script.getId()).append("</id>");
xml.append("<name>").append(XMLUtil.toSafeXMLString(script.getName())).append("</name>");
xml.append("</script>");
}
xml.append("</allowedscripts>");
xml.append("</root>");
return xml.toString();
}
}