package com.koders.se.parser; import com.koders.se.search.WikiDOC; import net.sf.mpxj.ProjectFile; import net.sf.mpxj.Resource; import net.sf.mpxj.ResourceAssignment; import net.sf.mpxj.Task; import net.sf.mpxj.mpp.MPPReader; import net.sf.mpxj.mpx.MPXReader; import net.sf.mpxj.mspdi.MSPDIReader; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; /** * Microsoft project 解析器 */ public class MppDocHandler implements DocumentHandler { public Document getDocument(InputStream is) throws DocumentHandlerException { ProjectFile mpx = readProject(is); String bodyText = dumpText(mpx); if (bodyText != null) { Document doc = new Document(); doc.add(new Field(WikiDOC.DOC_TITLE, dumpTitle(mpx), Field.Store.YES, Field.Index.TOKENIZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); doc.add(new Field(WikiDOC.DOC_CONTENT, bodyText, Field.Store.COMPRESS, Field.Index.TOKENIZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); return doc; } return null; } public static ProjectFile readProject(InputStream is) throws DocumentHandlerException { is = new BufferedInputStream(is); is.mark(0);//下面需要重复使用输入流,所以重新包装并设置重置标记 ProjectFile mpx = null; try { mpx = new MPXReader().read(is); } catch (Exception ex) { try { is.reset();//重置 } catch (IOException e) { e.printStackTrace(); } } if (mpx == null) { try { mpx = new MPPReader().read(is); } catch (Exception ex) { try { is.reset(); } catch (IOException e) { e.printStackTrace(); } } } if (mpx == null) { try { mpx = new MSPDIReader().read(is); } catch (Exception ex) { } } if (mpx == null) { throw new DocumentHandlerException("Failed to read file"); } return mpx; } private final static SimpleDateFormat f = new SimpleDateFormat("yyyy年M月d日"); private final static String IndentString = " "; private List idList = new ArrayList(); private List nameList = new ArrayList(); private List resList = new ArrayList(); private List startList = new ArrayList(); private List endList = new ArrayList(); public String dumpTitle(ProjectFile file) { String title = ""; List childTasks = file.getChildTasks(); for (int i = 0; i < childTasks.size(); i++) { Task task = (Task) childTasks.get(i); title += task.getName() + " "; } return title; } public String dumpText(ProjectFile file) { idList.add("【编号】"); nameList.add("【任务名】"); resList.add("【资源】"); startList.add("【开始时间】"); endList.add("【结束时间】"); List childTasks = file.getChildTasks(); for (int i = 0; i < childTasks.size(); i++) { Task task = (Task) childTasks.get(i); idList.add(" " + task.getID().toString()); nameList.add(task.getName()); resList.add(listTaskRes(task)); startList.add(f.format(task.getStart())); endList.add(f.format(task.getFinish())); listHierarchy(task, IndentString); } idList = fixLength(idList); nameList = fixLength(nameList); resList = fixLength(resList); startList = fixLength(startList); endList = fixLength(endList); StringBuffer buf = new StringBuffer(); for (int i = 0, size = nameList.size(); i < size; i++) { buf.append(idList.get(i)) .append(nameList.get(i)) .append(IndentString) .append(resList.get(i)) .append(IndentString) .append(startList.get(i)) .append(IndentString) .append(endList.get(i)) .append("\n"); } idList.clear(); nameList.clear(); startList.clear(); endList.clear(); resList.clear(); return buf.toString(); } private List fixLength(List data) { int max = 0; for (int ii = 0; ii < data.size(); ii++) { String str = (String) data.get(ii); int tmp = str.getBytes().length; max = (max < tmp ? tmp : max); } List ret = new ArrayList(); for (int ii = 0; ii < data.size(); ii++) { String str = (String) data.get(ii); int tmp = max - str.getBytes().length; for (int i = 0; i < tmp; i++) { str = str.concat(" "); } ret.add(str); } return ret; } private void listHierarchy(Task task, String indent) { List childTasks = task.getChildTasks(); for (int i = 0; i < childTasks.size(); i++) { Task child = (Task) childTasks.get(i); idList.add(" " + child.getID().toString()); nameList.add(indent + child.getName()); resList.add(listTaskRes(child)); startList.add(f.format(child.getStart())); endList.add(f.format(child.getFinish())); listHierarchy(child, indent + IndentString); } } private String listTaskRes(Task task) { StringBuffer buf = new StringBuffer(); List assignments = task.getResourceAssignments(); for (int i = 0; i < assignments.size(); i++) { ResourceAssignment assignment = (ResourceAssignment) assignments.get(i); Resource resource = assignment.getResource(); if (resource != null) { buf.append(resource.getName()).append(" "); } } return buf.toString(); } public static void main(String[] args) throws Exception { MppDocHandler mppDocHandler = new MppDocHandler(); ProjectFile projectFile = MppDocHandler.readProject(new FileInputStream("项目实施计划.mpp")); String s = mppDocHandler.dumpText(projectFile); System.out.println(s); } }
【编号】【任务名】 【资源】 【开始时间】 【结束时间】 0 **扩建项目实施计划_0903 2008年4月1日 2008年7月1日 1 项目启动 2008年4月1日 2008年4月8日 2 组建项目组、制订项目计划 2008年4月1日 2008年4月8日 3 项目启动会 2008年4月1日 2008年4月1日 60 综合业务管理子系统需求分析 张四季 黄纬 笋素爱 李海涛 李贤宇 2008年4月1日 2008年5月4日 61 业务管理 张四季 黄纬 笋素爱 李海涛 2008年4月1日 2008年4月15日 62 提交调研提纲文档 张四季 黄纬 笋素爱 2008年4月1日 2008年4月1日 63 需求内容调研 张四季 黄纬 笋素爱 2008年4月2日 2008年4月3日 64 业务种类设置 张四季 黄纬 笋素爱 2008年4月2日 2008年4月3日 65 增值业务支撑 张四季 黄纬 笋素爱 2008年4月2日 2008年4月3日 66 监控策略设置 张四季 黄纬 笋素爱 2008年4月2日 2008年4月3日 67 封堵策略设置 张四季 黄纬 笋素爱 2008年4月2日 2008年4月3日 68 广告策略设置 张四季 黄纬 笋素爱 2008年4月2日 2008年4月3日 69 需求分析 张四季 黄纬 笋素爱 2008年4月7日 2008年4月7日 70 整理调研文档 2008年4月7日 2008年4月7日 71 编写需求说明书-业务管理部分 2008年4月7日 2008年4月7日 72 页面原型设计 张四季 黄纬 笋素爱 2008年4月8日 2008年4月14日 73 业务管理需求与页面原型确认 张四季 黄纬 笋素爱 2008年4月15日 2008年4月15日 74 资料管理 笋素爱 2008年4月16日 2008年4月23日 75 提交调研提纲文档 2008年4月16日 2008年4月16日 76 需求内容调研 2008年4月17日 2008年4月17日 77 客户资料管理 2008年4月17日 2008年4月17日 78 黑名单管理 2008年4月17日 2008年4月17日 79 白名单管理 2008年4月17日 2008年4月17日 80 ADSL帐号管理 2008年4月17日 2008年4月17日 81 IP地址管理 2008年4月17日 2008年4月17日 82 需求分析 2008年4月18日 2008年4月18日 83 整理调研文档 2008年4月18日 2008年4月18日 84 编写需求说明书-资料管理部分 2008年4月18日 2008年4月18日 85 页面原型设计 2008年4月21日 2008年4月22日 86 资料管理需求与页面原型确认 2008年4月23日 2008年4月23日 87 数据管理 张四季 黄纬 2008年4月16日 2008年4月23日 88 提交调研提纲文档 2008年4月16日 2008年4月16日 89 需求内容调研 2008年4月17日 2008年4月17日 90 数据采集 2008年4月17日 2008年4月17日 91 数据转换 2008年4月17日 2008年4月17日 92 数据导出 2008年4月17日 2008年4月17日 93 需求分析 2008年4月18日 2008年4月18日 94 整理调研文档 2008年4月18日 2008年4月18日 95 编写需求说明书数据管理部分 2008年4月18日 2008年4月18日 96 页面原型设计 2008年4月21日 2008年4月22日 97 数据管理需求与页面原型确认 2008年4月23日 2008年4月23日 98 综合查询 笋素爱 2008年4月24日 2008年5月4日 99 提交调研提纲文档 2008年4月24日 2008年4月24日 100 需求内容调研 2008年4月25日 2008年4月25日 101 客户基本信息查询 2008年4月25日 2008年4月25日 102 ADSL帐号查询 2008年4月25日 2008年4月25日 103 专线IP查询 2008年4月25日 2008年4月25日 104 业务策略查询 2008年4月25日 2008年4月25日 105 流量数据查询 2008年4月25日 2008年4月25日 106 需求分析 2008年4月28日 2008年4月28日 107 整理调研文档 2008年4月28日 2008年4月28日 108 编写需求说明书-综合查询部分 2008年4月28日 2008年4月28日 109 页面原型设计 2008年4月29日 2008年4月30日 110 综合查询需求与页面原型确认 2008年5月4日 2008年5月4日 208 提交第一版需求说明书 全体需求人员 2008年5月5日 2008年5月5日 |