package jdepend.webserver.web; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import jdepend.core.util.TableViewInfo; import jdepend.core.util.TableViewUtil; import jdepend.framework.exception.JDependException; import jdepend.framework.file.AnalyzeData; import jdepend.metadata.JavaPackage; import jdepend.model.Component; import jdepend.model.component.CustomComponent; import jdepend.model.component.JarComponent; import jdepend.model.component.modelconf.JavaPackageComponentModelConf; import jdepend.model.result.AnalysisResult; import jdepend.util.todolist.TODOItem; import jdepend.util.todolist.TODOListIdentifyerFacade; import jdepend.webserver.model.WebAnalysisResult; import jdepend.webserver.service.AnalyseService; import jdepend.webserver.web.WebRelationGraphUtil.RelationGraphData; import org.apache.log4j.Logger; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @Controller @RequestMapping(value = "analyse") public class AnalyseController { private Logger logger = Logger.getLogger(AnalyseController.class); @Autowired private AnalyseService analyseService; @RequestMapping(value = "/upload", method = RequestMethod.GET) public String upload(HttpServletRequest request) throws JDependException { logger.info(request.getRemoteAddr() + " enter into upload jar page"); return "upload"; } @RequestMapping(value = "/upload", method = RequestMethod.POST) public String upload(@RequestParam("files") List<MultipartFile> files, @RequestParam(value = "jarComponent", required = false) Boolean jarComponent, Model model, HttpServletRequest request) throws Exception { if (jarComponent != null && files.size() == 1) { throw new JDependException("请选择至少两个jar"); } // 获取多个fileData Map<String, byte[]> fileDatas = new LinkedHashMap<String, byte[]>(); for (MultipartFile file : files) { try { String fileName = file.getOriginalFilename(); if (fileName.endsWith(".jar")) { byte[] fileData = file.getBytes(); fileDatas.put(fileName, fileData); } else { throw new JDependException("上传的文件格式必须是jar"); } } catch (IOException e) { e.printStackTrace(); throw new JDependException(e.getMessage()); } } AnalyzeData analyseData = null; try { analyseData = analyseService.createAnalyseData(fileDatas); } catch (IllegalArgumentException e) { throw new JDependException("上传的jar文件中存在中文文件名", e); } if (jarComponent == null) { List<JavaPackage> sortedInnerJavaPackages = new ArrayList<JavaPackage>( analyseService.listPackages(analyseData)); Collections.sort(sortedInnerJavaPackages); model.addAttribute("listPackages", sortedInnerJavaPackages); model.addAttribute("analysePath", analyseData.getPath()); request.getSession().setAttribute(WebConstants.SESSION_FILE, analyseData); logger.info(request.getRemoteAddr() + " enter into upload listPackages page"); return "listPackages"; } else { this.createAnalysisResult(analyseData, new JarComponent(), model, request); return "result"; } } @RequestMapping(value = "/execute", method = RequestMethod.POST) public String execute(@ModelAttribute("componentModel") String componentModel, Model model, HttpServletRequest request) throws JDependException { JavaPackageComponentModelConf componentModelConf = new JavaPackageComponentModelConf(); JSONObject componentModelObject = new JSONObject(componentModel); for (Object componentName : componentModelObject.keySet()) { JSONArray packageList = (JSONArray) componentModelObject.get((String) componentName); List<String> packageNames = new ArrayList<String>(); for (int i = 0; i < packageList.length(); i++) { packageNames.add(packageList.getString(i)); } componentModelConf.addComponentConf((String) componentName, 0, packageNames); } if (componentModelConf.getComponentConfs().size() == 0) { throw new JDependException("没有配置组件模型信息。"); } AnalyzeData data = (AnalyzeData) request.getSession().getAttribute(WebConstants.SESSION_FILE); if (data == null) { throw new JDependException("Session 中不存在 AnalyseData"); } CustomComponent component = new CustomComponent(); component.setComponentInfo(componentModelConf); this.createAnalysisResult(data, component, model, request); return "result"; } private void createAnalysisResult(AnalyzeData data, Component component, Model model, HttpServletRequest request) throws JDependException { AnalysisResult result = this.analyseService.analyze(WebConstants.DEFLAUT_GROUP, WebConstants.DEFLAUT_COMMAND, data, component); WebAnalysisResult webResult = new WebAnalysisResult(result); model.addAttribute("result", webResult); request.getSession().setAttribute(WebConstants.SESSION_RESULT, webResult); TODOListIdentifyerFacade identify = new TODOListIdentifyerFacade(); List<TODOItem> todoList = identify.identify(result); model.addAttribute("todoList", todoList); request.getSession().setAttribute(WebConstants.SESSION_RESULT_TODOLIST, todoList); List<TableViewInfo> tableInfos = TableViewUtil.view(result); model.addAttribute("tableList", tableInfos); // temp request.getSession().setAttribute("tableList", tableInfos); RelationGraphData relationGraphData = WebRelationGraphUtil.getGraphData(result.getRelations()); model.addAttribute("relation_graph_data", relationGraphData); // temp request.getSession().setAttribute("relation_graph_data", relationGraphData); request.getSession().removeAttribute(WebConstants.SESSION_FILE); logger.info(request.getRemoteAddr() + " enter into upload result page"); } @RequestMapping(value = "/view", method = RequestMethod.GET) public String view(Model model, HttpServletRequest request) throws JDependException { model.addAttribute("result", request.getSession().getAttribute(WebConstants.SESSION_RESULT)); model.addAttribute("todoList", request.getSession().getAttribute(WebConstants.SESSION_RESULT_TODOLIST)); model.addAttribute("tableList", request.getSession().getAttribute("tableList")); model.addAttribute("relation_graph_data", request.getSession().getAttribute("relation_graph_data")); return "result"; } }