Package org.jeecgframework.web.cgform.controller.generate

Source Code of org.jeecgframework.web.cgform.controller.generate.GenerateController

package org.jeecgframework.web.cgform.controller.generate;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.jeecgframework.codegenerate.database.JeecgReadTable;
import org.jeecgframework.codegenerate.generate.CgformCodeGenerate;
import org.jeecgframework.codegenerate.generate.onetomany.CgformCodeGenerateOneToMany;
import org.jeecgframework.codegenerate.pojo.CreateFileProperty;
import org.jeecgframework.codegenerate.pojo.onetomany.CodeParamEntity;
import org.jeecgframework.codegenerate.pojo.onetomany.SubTableEntity;
import org.jeecgframework.codegenerate.util.CodeResourceUtil;
import org.jeecgframework.core.common.controller.BaseController;
import org.jeecgframework.core.common.model.json.AjaxJson;
import org.jeecgframework.core.util.StringUtil;
import org.jeecgframework.web.cgform.entity.button.CgformButtonEntity;
import org.jeecgframework.web.cgform.entity.button.CgformButtonSqlEntity;
import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity;
import org.jeecgframework.web.cgform.entity.config.CgFormHeadEntity;
import org.jeecgframework.web.cgform.entity.enhance.CgformEnhanceJsEntity;
import org.jeecgframework.web.cgform.entity.generate.GenerateEntity;
import org.jeecgframework.web.cgform.entity.generate.GenerateSubListEntity;
import org.jeecgframework.web.cgform.service.button.CgformButtonServiceI;
import org.jeecgframework.web.cgform.service.button.CgformButtonSqlServiceI;
import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI;
import org.jeecgframework.web.cgform.service.enhance.CgformEnhanceJsServiceI;
import org.jeecgframework.web.system.service.SystemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
*
* @Title:CgGenerateController
* @description:智能表单代码生成器[根据智能表单配置+代码生成设置->生成代码]
* @author 赵俊夫
* @date Sep 7, 2013 12:19:32 PM
* @version V1.0
*/
@Controller
@RequestMapping("/generateController")
public class GenerateController extends BaseController {
  /**
   * Logger for this class
   */
  private static final Logger logger = Logger
      .getLogger(GenerateController.class);
  @Autowired
  private  SystemService systemService;
  @Autowired
  private CgFormFieldServiceI cgFormFieldService;
  @Autowired
  private CgformButtonServiceI cgformButtonService;
  @Autowired
  private CgformButtonSqlServiceI cgformButtonSqlService;
  @Autowired
  private CgformEnhanceJsServiceI cgformEnhanceJsService;
 
  /**
   * 代码生成配置页面
   * @param request
   * @return
   */
  @RequestMapping(params = "gogenerate")
  public ModelAndView gogenerate( CgFormHeadEntity cgFormHead,HttpServletRequest request) {
    if (StringUtil.isNotEmpty(cgFormHead.getId())) {
      cgFormHead = cgFormFieldService.getEntity(
          CgFormHeadEntity.class, cgFormHead.getId());
    }else{
      throw new RuntimeException("表单配置不存在");
    }
    String returnModelAndView = null;
    Map<String,String> entityNameMap = new HashMap<String,String>(0);
    if(cgFormHead.getJformType()==1 || cgFormHead.getJformType()==3){
      //如果是单表或者附表,则进入单表模型
      returnModelAndView = "jeecg/cgform/generate/single";
    }else{
      //如果是主表,则进入一对多模型
      List<CgFormHeadEntity> subTableList = new ArrayList<CgFormHeadEntity>();
      if(StringUtil.isNotEmpty(cgFormHead.getSubTableStr())){
        String[] subTables = cgFormHead.getSubTableStr().split(",");
        for(String subTable :subTables){
          CgFormHeadEntity subHead = cgFormFieldService.getCgFormHeadByTableName(subTable);
          subTableList.add(subHead);
          entityNameMap.put(subHead.getTableName(), JeecgReadTable.formatFieldCapital(subHead.getTableName()));
        }
      }
      request.setAttribute("subTableList", subTableList);
      returnModelAndView = "jeecg/cgform/generate/one2many";
    }
    String projectPath = CodeResourceUtil.getProject_path();
    try{
        Cookie[] cookies=request.getCookies();
        if(cookies!=null){
        for(int i=0;i<cookies.length;i++){
            if(cookies[i].getName().equals("cookie_projectPath")){
            String value =  cookies[i].getValue();
            if(value!=null&&!"".equals(value)){
              projectPath=cookies[i].getValue();
              projectPath= URLDecoder.decode(projectPath, "UTF-8");
                }
             }
            request.setAttribute("projectPath",projectPath);
        }
        }
    }catch(Exception e){
        e.printStackTrace();
    }
    String entityName = JeecgReadTable.formatFieldCapital(cgFormHead.getTableName());
    entityNameMap.put(cgFormHead.getTableName(), entityName);
    request.setAttribute("cgFormHeadPage", cgFormHead);
    request.setAttribute("entityNames",entityNameMap );
    return new ModelAndView(returnModelAndView);
  }
  /**
   * 代码生成执行-单表
   * @param generateEntity
   * @param request
   * @return
   * @throws Exception
   */
  @RequestMapping(params = "dogenerate")
  public void dogenerate(CgFormHeadEntity cgFormHead,GenerateEntity generateEntity,CreateFileProperty createFileProperty,
      HttpServletRequest request,HttpServletResponse response) throws Exception {
    //step.1 准备好智能表单的配置
    if (StringUtil.isNotEmpty(cgFormHead.getId())) {
      cgFormHead = cgFormFieldService.getEntity(
          CgFormHeadEntity.class, cgFormHead.getId());
      getCgformConfig(cgFormHead, generateEntity);
    }else{
      throw new RuntimeException("表单配置不存在");
    }
    AjaxJson j =  new AjaxJson();
    String tableName = generateEntity.getTableName();
    String ftlDescription = generateEntity.getFtlDescription();
    try {
      //step.2 判断表是否存在
      boolean tableexist = new JeecgReadTable().checkTableExist(tableName);
      if(tableexist){
        //step.3 调用代码生成器
        new CgformCodeGenerate(createFileProperty,generateEntity).generateToFile();
        j.setMsg("成功生成增删改查->功能:"+ftlDescription);
      }else{
        j.setMsg("表["+tableName+"] 在数据库中,不存在");
      }
     
    } catch (Exception e1) {
      e1.printStackTrace();
      j.setMsg(e1.getMessage());
      throw new RuntimeException(e1.getMessage());
    }
    try {
      String projectPath = URLEncoder.encode(generateEntity.getProjectPath(), "UTF-8");
      Cookie cookie = new Cookie("cookie_projectPath",projectPath );       
      cookie.setMaxAge(60*60*24*30); //cookie 保存30天
      response.addCookie(cookie);
      response.getWriter().print(j.getJsonStr());
      response.getWriter().flush();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /**
   * 代码生成执行-一对多
   * @param generateEntity
   * @param request
   * @return
   */
  @RequestMapping(params = "dogenerateOne2Many")
  @ResponseBody
  public void dogenerateOne2Many(CodeParamEntity codeParamEntityIn,GenerateSubListEntity subTableListEntity,HttpServletRequest request,HttpServletResponse response){
    AjaxJson j =  new AjaxJson();
    //step.1 设置主表
    //从前台获取:codeParamEntityIn
    //step.2 设置子表集合
    //从前台获取:subTabParamIn,并设置外键字段
    try{
      //step.3 填充主表的所有智能表单配置
      String mainTable = codeParamEntityIn.getTableName();
      //主表的智能表单配置
      GenerateEntity mainG = new GenerateEntity();
      mainG.setProjectPath(subTableListEntity.getProjectPath());
      CgFormHeadEntity mCgFormHead = cgFormFieldService.getCgFormHeadByTableName(mainTable);
      getCgformConfig(mCgFormHead, mainG);
      //step.4 填充子表的所有智能表单配置
      Map<String,GenerateEntity> subsG = new HashMap<String,GenerateEntity>();
      List<SubTableEntity>  subTabParamIn = subTableListEntity.getSubTabParamIn();
      for(SubTableEntity po:subTabParamIn){
        String sTableName = po.getTableName();
        CgFormHeadEntity cgSubHead = cgFormFieldService.getCgFormHeadByTableName(sTableName);
        List<CgFormFieldEntity> colums = cgSubHead.getColumns();
        String[] foreignKeys =getForeignkeys(colums);
        po.setForeignKeys(foreignKeys);
        GenerateEntity subG = new GenerateEntity();
        getCgformConfig(cgSubHead, subG);
        subG.setEntityName(po.getEntityName());
        subG.setEntityPackage(po.getEntityPackage());
        subG.setFieldRowNum(1);
        subG.setFtlDescription(po.getFtlDescription());
        subG.setForeignKeys(foreignKeys);
        subG.setTableName(po.getTableName());
        subG.setProjectPath(subTableListEntity.getProjectPath());
        subsG.put(sTableName, subG);
      }
      codeParamEntityIn.setSubTabParam(subTabParamIn);
      //step.5 一对多(父子表)数据模型,代码生成
         CgformCodeGenerateOneToMany.oneToManyCreate(subTabParamIn, codeParamEntityIn,mainG,subsG);
      j.setMsg("成功生成增删改查->功能:"+codeParamEntityIn.getFtlDescription());
    }catch (Exception e) {
      e.printStackTrace();
      j.setMsg(e.getMessage());
      throw new RuntimeException(e.getMessage());
    }
    try {
      String projectPath = URLEncoder.encode(subTableListEntity.getProjectPath(), "UTF-8");
      Cookie cookie = new Cookie("cookie_projectPath",projectPath );           
      cookie.setMaxAge(60*60*24*30); //cookie 保存30天
      response.addCookie(cookie);
      response.getWriter().print(j.getJsonStr());
      response.getWriter().flush();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /**
   * 获取智能表单中外键:根据是否设置了主表以及主表字段来判断
   * @param colums
   * @return
   */
  private String[] getForeignkeys(List<CgFormFieldEntity> colums) {
    List<String> fs = new ArrayList<String>(0);
    for(CgFormFieldEntity c : colums){
      if(StringUtil.isNotEmpty(c.getMainTable()) && StringUtil.isNotEmpty(c.getMainField())){
        fs.add(c.getFieldName().toUpperCase());
      }
    }
    String[] foreignkeys = (String[]) fs.toArray(new String[fs.size()]);
    return foreignkeys;
  }
  /**
   * 获取智能表单的所有配置
   * @param cgFormHead
   * @param generateEntity
   * @throws Exception
   */
  private void getCgformConfig(CgFormHeadEntity cgFormHead,
      GenerateEntity generateEntity) throws Exception {
    int filedNums = cgFormHead.getColumns().size();
    List<CgformButtonEntity> buttons = null;
    Map<String, String[]> buttonSqlMap = new LinkedHashMap<String, String[]>();
    //表单配置
    cgFormHead = cgFormFieldService.getEntity(
        CgFormHeadEntity.class, cgFormHead.getId());
    //按钮配置
    buttons = cgformButtonService.getCgformButtonListByFormId(cgFormHead.getId());
    //按钮SQL增强
    for(CgformButtonEntity cb:buttons){
      CgformButtonSqlEntity cbs = cgformButtonSqlService.getCgformButtonSqlByCodeFormId(cb.getButtonCode(), cgFormHead.getId());
      buttonSqlMap.put(cb.getButtonCode(), cbs==null?new String[]{}:cbs.getCgbSqlStr().replaceAll("(\r\n|\r|\n|\n\r)", "").split(";"));
    }
    CgformButtonSqlEntity cbsAdd = cgformButtonSqlService.getCgformButtonSqlByCodeFormId("add", cgFormHead.getId());
    buttonSqlMap.put("add", cbsAdd==null?new String[]{}:cbsAdd.getCgbSqlStr().replaceAll("(\r\n|\r|\n|\n\r)", "").split(";"));
    CgformButtonSqlEntity cbsUpdate = cgformButtonSqlService.getCgformButtonSqlByCodeFormId("update", cgFormHead.getId());
    buttonSqlMap.put("update", cbsUpdate==null?new String[]{}:cbsUpdate.getCgbSqlStr().replaceAll("(\r\n|\r|\n|\n\r)", "").split(";"));
    CgformButtonSqlEntity cbsDelete = cgformButtonSqlService.getCgformButtonSqlByCodeFormId("delete", cgFormHead.getId());
    buttonSqlMap.put("delete", cbsDelete==null?new String[]{}:cbsDelete.getCgbSqlStr().replaceAll("(\r\n|\r|\n|\n\r)", "").split(";"));
    //JS增强-列表
    CgformEnhanceJsEntity listJs =   cgformEnhanceJsService.getCgformEnhanceJsByTypeFormId("list", cgFormHead.getId());
    CgformEnhanceJsEntity listJsCopy = null;
    try{
      listJsCopy = listJs.deepCopy();
    }catch (Exception e) {
      logger.debug(e.getMessage());
    }
    //JS增强-表单
    CgformEnhanceJsEntity formJs =   cgformEnhanceJsService.getCgformEnhanceJsByTypeFormId("form", cgFormHead.getId());
    CgformEnhanceJsEntity formJsCopy = null;
    try{
      formJsCopy = formJs.deepCopy();
    }catch (Exception e) {
      logger.debug(e.getMessage());
    }
    //将js中带有online字段名的 转换成java命名
    for(CgFormFieldEntity field : cgFormHead.getColumns()){
      String fieldName = field.getFieldName();
      if(listJsCopy!=null){
        listJsCopy.setCgJsStr(listJsCopy.getCgJsStr().replace(fieldName, JeecgReadTable.formatField(fieldName)));
      }
      if(formJsCopy!=null){
        formJsCopy.setCgJsStr(formJsCopy.getCgJsStr().replace(fieldName, JeecgReadTable.formatField(fieldName)));
      }
    }
    generateEntity.setButtons(buttons);
    generateEntity.setButtonSqlMap(buttonSqlMap);
    generateEntity.setCgFormHead(cgFormHead);
    generateEntity.setListJs(listJsCopy);
    generateEntity.setFormJs(formJsCopy);
  }
  /**
   * 跳转到文件夹目录树
   * @param request
   * @return
   */
  @RequestMapping(params = "goFileTree")
  public ModelAndView goFileTree(HttpServletRequest request) {
    return new ModelAndView("jeecg/cgform/generate/fileTree");
  }
  /**
   * 返回子目录json
   * @param parentNode
   * @return
   */
  @RequestMapping(params = "doExpandFileTree")
  @ResponseBody
  public Object doExpandFileTree(String parentNode){
    JSONArray fjson = new JSONArray();
    try{
      if(StringUtil.isEmpty(parentNode)){
        //返回磁盘驱动器根目录
        File[] roots = File.listRoots();
        for(File r:roots){
          JSONObject item = new JSONObject();
          item.put("id", r.getAbsolutePath());
          item.put("text", r.getPath());
          item.put("iconCls", "icon-folder");
          if(hasDirs(r)){
            item.put("state", "closed");
          }else{
            item.put("state", "open");
          }
          fjson.add(item);
        }
      }else{
        try {
          parentNode =  new String(parentNode.getBytes("ISO-8859-1"), "UTF-8");
        } catch (UnsupportedEncodingException e1) {
          e1.printStackTrace();
        }
        //返回子目录集
        File parent = new File(parentNode);
        File[] chs = parent.listFiles();
        for(File r:chs){
          JSONObject item = new JSONObject();
          if(r.isDirectory()){
            item.put("id", r.getAbsolutePath());
            item.put("text", r.getPath());
            if(hasDirs(r)){
              item.put("state", "closed");
            }else{
              item.put("state", "open");
            }
            fjson.add(item);
          }else{
           
          }
        }
      }
    }catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException("该文件夹不可选择");
    }
    return fjson;
  }
  private boolean hasDirs(File dir){
    try{
      if(dir.listFiles().length==0){
  //      item.put("state", "open");
        return false;
      }else{
  //      item.put("state", "closed");
        return true;
      }
    }catch (Exception e) {
      logger.info(e.getMessage());
      return false;
    }
  }
}
TOP

Related Classes of org.jeecgframework.web.cgform.controller.generate.GenerateController

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.