package jdepend.webserver.web;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jdepend.core.util.TableViewInfo;
import jdepend.core.util.TableViewUtil;
import jdepend.framework.context.JDependContext;
import jdepend.framework.exception.JDependException;
import jdepend.knowledge.database.AnalysisResultRepository;
import jdepend.model.result.AnalysisResult;
import jdepend.util.todolist.TODOItem;
import jdepend.util.todolist.TODOListIdentifyerFacade;
import jdepend.webserver.model.WebAnalysisResult;
import jdepend.webserver.web.WebRelationGraphUtil.RelationGraphData;
import org.apache.log4j.Logger;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.json.JSONArray;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping(value = "admin")
public class AdminController {
private Logger logger = Logger.getLogger(AdminController.class);
@RequiresPermissions("admin:list")
@RequestMapping(value = "", method = RequestMethod.GET)
public String admin(Model model, HttpServletRequest request) throws JDependException {
return this.list(model, request);
}
@RequiresPermissions("admin:list")
@RequestMapping(value = "/result/list", method = RequestMethod.GET)
public String list(Model model, HttpServletRequest request) throws JDependException {
model.addAttribute(
"resultSummrys",
AnalysisResultRepository.getInstance().getResultSummrys(WebConstants.DEFLAUT_GROUP,
WebConstants.DEFLAUT_COMMAND));
return "results";
}
@RequiresPermissions("admin:view")
@RequestMapping(value = "/result/{id}/view", method = RequestMethod.GET)
public String view(Model model, @PathVariable String id, HttpServletRequest request) throws JDependException {
AnalysisResult result = AnalysisResultRepository.getInstance().getResult(id);
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);
List<TableViewInfo> tableInfos = TableViewUtil.view(result);
model.addAttribute("tableList", tableInfos);
RelationGraphData relationGraphData = WebRelationGraphUtil.getGraphData(result.getRelations());
model.addAttribute("relation_graph_data", relationGraphData);
return "result";
}
@RequiresPermissions("admin:delete")
@RequestMapping(value = "result/delete.ajax", method = RequestMethod.POST)
public @ResponseBody
Map<String, Object> delete(@ModelAttribute("ids") String ids, HttpServletRequest request) throws JDependException {
Map<String, Object> resultMap = new HashMap<String, Object>();
JSONArray idArray = new JSONArray(ids);
for (int i = 0; i < idArray.length(); i++) {
AnalysisResultRepository.getInstance().delete(idArray.getString(i));
}
resultMap.put("code", "1");
resultMap.put("msg", "删除成功!");
return resultMap;
}
@RequiresPermissions("admin:download")
@RequestMapping(value = "result/data/download", method = RequestMethod.GET)
public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment; filename=knowledge.zip");
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
File knowledgeFile = new File(JDependContext.getWorkspacePath() + File.separator + "knowledge");
zip(bos, knowledgeFile);
bos.close();
}
private void zip(OutputStream os, File inputFile) throws Exception {
ZipOutputStream out = new ZipOutputStream(os);
zip(out, inputFile, "");
out.close();
}
private void zip(ZipOutputStream out, File f, String base) throws Exception {
if (f.isDirectory()) {
File[] fl = f.listFiles();
out.putNextEntry(new ZipEntry(base + "/"));
base = base.length() == 0 ? "" : base + "/";
for (int i = 0; i < fl.length; i++) {
zip(out, fl[i], base + fl[i].getName());
}
} else {
out.putNextEntry(new ZipEntry(base));
FileInputStream in = new FileInputStream(f);
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
in.close();
}
}
}