/**
* http://surenpi.com
*/
package org.suren.autotest.platform.controller;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.UnmarshalException;
import javax.xml.bind.Unmarshaller;
import org.dom4j.DocumentException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.suren.autotest.platform.mapping.DataSourceInfoMapper;
import org.suren.autotest.platform.mapping.PageInfoMapper;
import org.suren.autotest.platform.mapping.ProjectMapper;
import org.suren.autotest.platform.mapping.SuiteRunnerInfoMapper;
import org.suren.autotest.platform.mapping.UserInfoMapper;
import org.suren.autotest.platform.model.DataSourceInfo;
import org.suren.autotest.platform.model.PageInfo;
import org.suren.autotest.platform.model.Project;
import org.suren.autotest.platform.model.SuiteRunnerInfo;
import org.suren.autotest.platform.schemas.autotest.Autotest;
import org.suren.autotest.platform.schemas.autotest.Autotest.DataSources;
import org.suren.autotest.platform.schemas.autotest.Autotest.Pages;
import org.suren.autotest.platform.schemas.autotest.DataSourceType;
import org.suren.autotest.platform.schemas.autotest.DataSourceTypeEnum;
import org.suren.autotest.platform.schemas.autotest.EngineTypeDriverEnum;
import org.suren.autotest.platform.schemas.autotest.FieldTypeEnum;
import org.suren.autotest.platform.schemas.autotest.PageFieldLocatorTypeEnum;
import org.suren.autotest.platform.schemas.autotest.PageFieldType;
import org.suren.autotest.platform.schemas.autotest.PageType;
import org.suren.autotest.platform.schemas.autotest.StrategyEnum;
import org.suren.autotest.platform.schemas.suite.Suite;
import org.suren.autotest.platform.util.DomUtils;
import org.suren.autotest.platform.util.JAXBUtils;
import org.suren.autotest.web.framework.code.Generator;
import org.suren.autotest.web.framework.core.Callback;
import org.suren.autotest.web.framework.util.StringUtils;
import org.suren.autotest.webdriver.downloader.PathUtil;
import org.xml.sax.SAXException;
/**
* 项目集
* @author suren
* @date 2017年1月17日 下午8:40:45
*/
@Controller
@RequestMapping("page_info")
public class PageInfoController
{
@Autowired
private UserInfoMapper userMapper;
@Autowired
private ProjectMapper projectMapper;
@Autowired
private PageInfoMapper pageInfoMapper;
@Autowired
private DataSourceInfoMapper dataSourceInfoMapper;
@Autowired
private SuiteRunnerInfoMapper suiteRunnerInfoMapper;
@Resource(name = "xml_to_datasource")
private Generator dataSourceGenerator;
@Resource(name = "xml_to_suite_runner")
private Generator suiteRunnerGenerator;
@RequestMapping("add.su")
public String pageInfoAdd(Model model, String projectId)
{
PageInfo pageInfo = new PageInfo();
pageInfo.setAutotest(initAutotest());
pageInfo.setCreateTime(new Date());
Project project = projectMapper.getById(projectId);
if(project != null)
{
pageInfo.setProjectId(projectId);
pageInfo.getAutotest().getPages().setPagePackage(project.getPkgName());
}
model.addAttribute("pageInfo", pageInfo);
model.addAttribute("fieldType", FieldTypeEnum.values());
model.addAttribute("strategyType", StrategyEnum.values());
model.addAttribute("locatorType", PageFieldLocatorTypeEnum.values());
model.addAttribute("engineType", EngineTypeDriverEnum.values());
return "/page_info/test";
}
@RequestMapping("import.su")
public String autotestImport(Model model, MultipartFile file, String projectId)
{
String originalFileName = file.getOriginalFilename();
if(originalFileName.endsWith(".xml"))
{
originalFileName = originalFileName.substring(0, originalFileName.length() - ".xml".length());
}
PageInfo pageInfo = new PageInfo();
pageInfo.setProjectId(projectId);
pageInfo.setName(originalFileName);
pageInfo.setCreateTime(new Date());
model.addAttribute("pageInfo", pageInfo);
initEnums(model);
try
{
JAXBContext context = JAXBContext.newInstance(Autotest.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Autotest autotest = (Autotest) unmarshaller.unmarshal(file.getInputStream());
JAXBUtils.autotestTransfer(autotest);
pageInfo.setAutotest(autotest);
}
catch (JAXBException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
return "/page_info/test";
}
@RequestMapping("list.su")
public String list(Model model, String projectId)
{
List<PageInfo> pageInfoList = pageInfoMapper.getAllByProjectId(projectId);
model.addAttribute("pageInfoList", pageInfoList);
model.addAttribute("projectId", projectId);
return "page_info_list";
}
@RequestMapping("/del")
public String del(Model model, String id)
{
PageInfo pageInfo = pageInfoMapper.getById(id);
pageInfoMapper.delById(id);
return "redirect:/page_info/list.su?projectId=" + pageInfo.getProjectId();
}
@RequestMapping("test.su")
public void test(Model model, PageInfo pageInfo)
{
String id = pageInfo.getId();
int tabIndex = pageInfo.getTabIndex();
pageInfo = pageInfoMapper.getById(id);
if(pageInfo == null)
{
pageInfo = new PageInfo();
}
else
{
pageInfo.setTabIndex(tabIndex);
}
model.addAttribute("pageInfo", pageInfo);
try
{
JAXBContext context = JAXBContext.newInstance(Autotest.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Autotest autotest;
String content = pageInfo.getContent();
if(content == null)
{
autotest = initAutotest();
}
else
{
ByteArrayInputStream input = new ByteArrayInputStream(content.getBytes("utf-8"));
try
{
autotest = (Autotest) unmarshaller.unmarshal(input);
}
catch(UnmarshalException e)
{
autotest = initAutotest();
e.printStackTrace();
}
}
pageInfo.setAutotest(autotest);
initEnums(model);
}
catch (JAXBException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e1)
{
e1.printStackTrace();
}
}
@RequestMapping("hello.su")
public void hello(Model model, @RequestParam(defaultValue = "qwe") String id,
String name)
{
model.addAttribute("time", new Date());
PageInfo pageInfo = pageInfoMapper.getById(id);
model.addAttribute("page", pageInfo);
try
{
JAXBContext context = JAXBContext.newInstance(Autotest.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
String content = pageInfo.getContent();
if(content == null)
{
content = "";
}
ByteArrayInputStream input = new ByteArrayInputStream(content.getBytes("utf-8"));
Autotest autotest = (Autotest) unmarshaller.unmarshal(input);
Pages pages = autotest.getPages();
PageType page = pages.getPage().get(1);
for(PageType pageT : pages.getPage())
{
if(pageT.getClazz().equals(name))
{
page = pageT;
break;
}
}
// JAXBUtils.transform(page.getContent());
model.addAttribute("pages", pages);
model.addAttribute("page", page);
model.addAttribute("autotest", autotest);
model.addAttribute("fieldType", FieldTypeEnum.values());
model.addAttribute("strategyType", StrategyEnum.values());
model.addAttribute("locatorType", PageFieldLocatorTypeEnum.values());
//
// XMLSerializer ser = new XMLSerializer();
// JSON obj = ser.read(content);
// System.out.println(obj);
//
// JSONObject jsonObject = JSONObject.fromObject((obj.toString().replace("@", "")));//.substring(1, obj.toString().length()-1));
// System.out.println(jsonObject);
// model.addAttribute("hao", jsonObject);
}
catch (JAXBException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
@RequestMapping("addPage.su")
public String addPage(Model model, String id)
{
PageInfo pageInfo = pageInfoMapper.getById(id);
model.addAttribute("pageInfo", pageInfo);
try
{
JAXBContext context = JAXBContext.newInstance(Autotest.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
String content = pageInfo.getContent();
Autotest autotest;
if(content != null)
{
ByteArrayInputStream input = new ByteArrayInputStream(content.getBytes("utf-8"));
autotest = (Autotest) unmarshaller.unmarshal(input);
}
else
{
autotest = initAutotest();
}
pageInfo.setAutotest(autotest);
PageType pageType = new PageType();
pageType.setClazz("PageStuff");
PageFieldType pageFieldType = new PageFieldType();
pageFieldType.setName("PageFieldName");
pageType.getField().add(pageFieldType);
autotest.getPages().getPage().add(pageType);
model.addAttribute("autotest", autotest);
model.addAttribute("fieldType", FieldTypeEnum.values());
model.addAttribute("strategyType", StrategyEnum.values());
model.addAttribute("locatorType", PageFieldLocatorTypeEnum.values());
model.addAttribute("engineType", EngineTypeDriverEnum.values());
}
catch (JAXBException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
return "page_info/test";
}
@RequestMapping("addField")
public String addField(Model model, String id, String pageName, int tabIndex)
{
PageInfo pageInfo = pageInfoMapper.getById(id);
pageInfo.setTabIndex(tabIndex);
initEnums(model);
model.addAttribute("pageInfo", pageInfo);
try
{
JAXBContext context = JAXBContext.newInstance(Autotest.class);
ByteArrayInputStream input = new ByteArrayInputStream(pageInfo.getContent().getBytes("utf-8"));
Autotest autotest = (Autotest) context.createUnmarshaller().unmarshal(input);
pageInfo.setAutotest(autotest);
for(PageType page : autotest.getPages().getPage())
{
if(page.getClazz().equals(pageName))
{
PageFieldType field = new PageFieldType();
field.setName(System.currentTimeMillis() + "_field");
page.getField().add(field );
break;
}
}
}
catch (JAXBException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
return "page_info/test";
}
@ResponseBody
@RequestMapping(value = "updatePage.su")
public PageInfo updatePage(Model model, PageInfo pageInfo)
{
try
{
Autotest autotest = pageInfo.getAutotest();
List<DataSourceType> dataSourceList;
if(autotest.getDataSources() == null)
{
dataSourceList = new ArrayList<DataSourceType>();
DataSources dataSources = new DataSources();
autotest.setDataSources(dataSources);
dataSources.setDataSource(dataSourceList);
}
else
{
dataSourceList = autotest.getDataSources().getDataSource();
for(int i = 0; i < dataSourceList.size();)
{
DataSourceType dataSourceType = dataSourceList.get(i);
if(StringUtils.isBlank(dataSourceType.getName()))
{
dataSourceList.remove(i);
}
else
{
i++;
}
}
}
for(PageType pageType : autotest.getPages().getPage())
{
boolean notFound = true;
String dataSourceName = pageType.getDataSource();
for(DataSourceType dataSourceType : dataSourceList)
{
if(dataSourceName.equals(dataSourceType.getName()))
{
notFound = false;
break;
}
}
if(notFound && StringUtils.isNotBlank(dataSourceName))
{
DataSourceType dataSourceType = new DataSourceType();
dataSourceType.setName(dataSourceName);
dataSourceType.setType(DataSourceTypeEnum.XML_DATA_SOURCE);
dataSourceType.setResource(dataSourceName + ".xml");
dataSourceList.add(dataSourceType);
}
}
JAXBContext context = JAXBContext.newInstance(Autotest.class);
Marshaller marshaller = context.createMarshaller();
ByteArrayOutputStream out = new ByteArrayOutputStream();
marshaller.marshal(autotest, out);
try
{
pageInfo.setContent(out.toString("UTF-8"));
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
if(StringUtils.isNotBlank(pageInfo.getId()))
{
pageInfoMapper.update(pageInfo);
}
else
{
pageInfo.setCreateTime(new Date());
pageInfoMapper.save(pageInfo);
}
pageInfo.setContent(null);
}
catch (JAXBException e)
{
e.printStackTrace();
}
return pageInfo;
}
@RequestMapping("delPage.su")
public String delPage(String id, String pageName)
{
PageInfo pageInfo = pageInfoMapper.getById(id);
try
{
JAXBContext context = JAXBContext.newInstance(Autotest.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
String content = pageInfo.getContent();
if(content == null)
{
content = "";
}
ByteArrayInputStream input = new ByteArrayInputStream(content.getBytes("utf-8"));
Autotest autotest = (Autotest) unmarshaller.unmarshal(input);
List<PageType> pages = autotest.getPages().getPage();
for(PageType page : pages)
{
if(page.getClazz().equals(pageName))
{
pages.remove(page);
break;
}
}
Marshaller marshaller = context.createMarshaller();
ByteArrayOutputStream out = new ByteArrayOutputStream();
marshaller.marshal(autotest, out);
pageInfo.setContent(out.toString("UTF-8"));
pageInfoMapper.update(pageInfo);
}
catch(Exception e)
{
e.printStackTrace();
}
return "redirect:/page_info/test.su";
}
@RequestMapping(value = "/download.su")
public ResponseEntity<byte[]> download(String id)
{
PageInfo pageInfo = pageInfoMapper.getById(id);
String content = pageInfo.getContent();
content = (StringUtils.isBlank(content) ? "" : DomUtils.format(content));
String fileName = pageInfo.getName();
try
{
fileName = URLEncoder.encode(fileName, "utf-8");
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.TEXT_XML);
headers.setContentDispositionFormData("filename", fileName + ".xml");
try
{
return new ResponseEntity<byte[]>(content.getBytes("utf-8"), headers, HttpStatus.CREATED);
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
return new ResponseEntity<byte[]>("not supported encoding.".getBytes(), headers, HttpStatus.CREATED);
}
/**
* 根据给定id的页面集生成数据源,然后跳转到数据源页面(当前项目)
* @param id 页面集id
* @return
*/
@RequestMapping("/generateDataSource")
public String generateDataSource(String id)
{
final PageInfo pageInfo = pageInfoMapper.getById(id);
if(pageInfo != null && StringUtils.isNotBlank(pageInfo.getContent()))
{
final String projectId = pageInfo.getProjectId();
File outputDir = PathUtil.getRootDir();
try
{
ByteArrayInputStream input = new ByteArrayInputStream(pageInfo.getContent().getBytes("utf-8"));
dataSourceGenerator.generate(input, outputDir.toString(), new Callback<File>()
{
@Override
public void callback(File data)
{
String name = data.getName();
DataSourceInfo dataSourceInfo = new DataSourceInfo();
dataSourceInfo.setName(name.replace(".xml", ""));
dataSourceInfo.setProjectId(projectId);
try(InputStream input = new FileInputStream(data))
{
StringBuffer contentBuf = new StringBuffer();
byte[] buf = new byte[1024];
int len = -1;
while((len = input.read(buf)) != -1)
{
contentBuf.append(new String(buf, 0, len));
}
dataSourceInfo.setContent(contentBuf.toString());
}
catch (IOException e)
{
e.printStackTrace();
}
dataSourceInfoMapper.save(dataSourceInfo);
}
});
}
catch (DocumentException | SAXException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e1)
{
e1.printStackTrace();
}
return "redirect:/data_source_info/list.su?projectId=" + projectId;
}
else
{
return "redirect:/project/list.su";
}
}
@RequestMapping("/generateSuiteRunner")
public String generateSuiteRunner(String id)
{
PageInfo pageInfo = pageInfoMapper.getById(id);
if(pageInfo != null && StringUtils.isNotBlank(pageInfo.getContent()))
{
final String projectId = pageInfo.getProjectId();
File outputDir = PathUtil.getRootDir();
try
{
final String pageInfoName = pageInfo.getName();
ByteArrayInputStream input = new ByteArrayInputStream(pageInfo.getContent().getBytes("utf-8"));
suiteRunnerGenerator.generate(input, outputDir.toString(), new Callback<File>()
{
@Override
public void callback(File data)
{
SuiteRunnerInfo suiteRunnerInfo = new SuiteRunnerInfo();
suiteRunnerInfo.setProjectId(projectId);
suiteRunnerInfo.setName(pageInfoName + "测试");
suiteRunnerInfo.setCreateTime(new Date());
suiteRunnerInfo.setRemark("Generate from " + pageInfoName);
StringBuffer contentBuf = new StringBuffer();
try(InputStream input = new FileInputStream(data))
{
byte[] buf = new byte[1024];
int len = -1;
while((len = input.read(buf)) != -1)
{
contentBuf.append(new String(buf, 0, len));
}
}
catch (IOException e)
{
e.printStackTrace();
}
suiteRunnerInfo.setContent(contentBuf.toString());
try
{
JAXBContext context = JAXBContext.newInstance(Suite.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Suite suite = (Suite) unmarshaller.unmarshal(
new ByteArrayInputStream(contentBuf.toString().getBytes()));
suite.setPageConfig(pageInfoName + ".xml");
Marshaller marshaller = context.createMarshaller();
ByteArrayOutputStream out = new ByteArrayOutputStream();
marshaller.marshal(suite, out);
suiteRunnerInfo.setContent(out.toString("UTF-8"));
}
catch (JAXBException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
suiteRunnerInfoMapper.save(suiteRunnerInfo);
}
});
}
catch (DocumentException | SAXException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e1)
{
e1.printStackTrace();
}
return "redirect:/suite_runner_info/list.su?projectId=" + projectId;
}
else
{
return "redirect:/project/list.su";
}
}
@ResponseBody
@RequestMapping("count")
public int getCountByProjectId(String projectId)
{
return pageInfoMapper.getCountByProjectId(projectId);
}
private Autotest initAutotest()
{
Autotest autotest = new Autotest();
Autotest.Pages pages = new Autotest.Pages();
autotest.setPages(pages);
PageType pageType = new PageType();
pageType.setClazz("类名");
pages.getPage().add(pageType);
PageFieldType pageFieldType = new PageFieldType();
pageFieldType.setName("属性");
pageType.getField().add(pageFieldType);
return autotest;
}
private void initEnums(Model model)
{
model.addAttribute("fieldType", FieldTypeEnum.values());
model.addAttribute("strategyType", StrategyEnum.values());
model.addAttribute("locatorType", PageFieldLocatorTypeEnum.values());
model.addAttribute("engineType", EngineTypeDriverEnum.values());
model.addAttribute("dataSourceType", DataSourceTypeEnum.values());
}
}