关键字: Jira和MsProject互导/java写MsProject文件/java写Mpp文件/nileader/ni掌柜 html
1. 从JIRA上读取数据。 java
2. 读写MSProject文件。正则表达式
从JIRA上读取数据,主要有两种方法:windows
方法一、 采用HTTPClient的方法来抓取页面数据(JIRA3.*.*的建议采用这种方法),api
具体实现过程当中,首先必须让JIRA站点可以容许匿名查看项目的问题.app
另外不要知道每一个项目 版本对应的pid和fixfor.dom
使用httpclient访问的时候,使用这个路径比较好:ide
#得到全部Issue的页面this JIRA_ISSUE_FULLCONTENT={domain}/sr/jira.issueviews:searchrequest-fullcontent/temp/SearchRequest.html?pid={pid}&fixfor={fixfor}&resolution=-1&sorter/field=priority&sorter/order=DESC&tempMax=10000spa
|
在这个页面中,能够一次性获取问题的issueKey, summary和desc.
通常获取这个页面源代码以后,能够经过这些正则表达式:
- // 获取问题的issueKey <h3 class="formtitle">[SANDBOX-1]
- final static Pattern ISSUE_KEY_PATTERN = Pattern.compile(
- "<h3 class=\"formtitle\">(\\s)+\\[(?s).*?&", Pattern.CANON_EQ);
- // 得到问题的Summary <a
- // href="http://jira.taobao.ali.com/browse/SANDBOX-1">TimeoutThread或Thread.setTimeout</a>
- final static Pattern ISSUE_SUMMARY_PATTERN = Pattern.compile(
- "<h3 class=\"formtitle\">(\\s)+\\[(?s).*? <a href=\""
- + JpContext.jiraDomain
- + "/browse/(\\S)+(-)([0-9])+\">(?s).*?</a>",
- Pattern.CANON_EQ);
- // 获取问题的描述<div id="description_full">......</div>
- final static Pattern ISSUE_DESC_PATTERN = Pattern.compile(
- "<td id=\"descriptionArea\">(?s).*?</td>", Pattern.CANON_EQ);
- // 获取问题的fixversion <b>修复版本:...........</tr>
- final static Pattern ISSUE_FIXVERSION_PATTERN = Pattern.compile(
- "<b>修复版本(?s).*?</tr>", Pattern.CANON_EQ);
得到issueKey以后,就能够进行子任务的获取了,具体获取方法,
- #得到指定issueKey的问题的全部子任务
- JIRA_ISSUESUB_URL={domain}/browse/{issueKey}
方法二.经过JIRA提供的API进行相应问题的获取,这种途径只能在JIRA4.0.0及以上版本中可使用.
使用JIRA的soap客户端来获取jira站点上的全部问题的方法:
首先要实例出一个soap对象
- SOAPSession soapSession = new SOAPSession(new URL(baseUrl));
- soapSession.getJiraSoapService();
这个SOAPSession实际上是帮咱们封装了com.atlassian.jira.rpc.soap.service中的一些类。
获取全部的issue
- SearchSoapExerciser se = new SearchSoapExerciser(soapSession);
- // 存储全部问题
- /** 遍历全部的issues */
- try {
- for (RemoteIssue ri : se.testJqlSearch("", 10)) {
遍历后就能够获得全部RemoteIssue对象了。
完整代码在附件中
查看jira的api http://docs.atlassian.com/software/jira/docs/api/rpc-jira-plugin/
接下去看看将问题下载到本地后,如何处理这些问题及其和子任务.
因为要将问题导入到msproject中进行管理,那么必然要进行java操做msproject文件的过程.
java操做msproject文件方面,已经有一个很好的开源包了,http://mpxj.sourceforge.net/index.html, 这个包惟一的不足之处是他可以读取msproject文件*.mpp中的内容,可是在写方面,他只能经过*.xml做为中间过渡.
读mpp文件
写:
通常的作法就是这样:
经过net.sf.mpxj.mpp.MPPReader: reads Microsoft Project MPP files来读取msproject文件内容
经过net.sf.mpxj.mspdi.MSPDIWriter: writes Microsoft MSPDI (XML) files生成一个msproject支持的文件,
- package com.test;
- import java.io.IOException;
- import net.sf.mpxj.MPXJException;
- import net.sf.mpxj.ProjectFile;
- import net.sf.mpxj.mpp.MPPReader;
- import net.sf.mpxj.mspdi.MSPDIWriter;
- import net.sf.mpxj.reader.ProjectReader;
- import net.sf.mpxj.writer.ProjectWriter;
- public class Test{
- public static void main(String[] args)throws Exception{
- ProjectReader reader = new MPPReader();
- ProjectFile project;
- try {
- project = reader.read("d:\\native.mpp");
- //生成文件
- ProjectWriter writer = new MSPDIWriter();
- try{
- writer.write(project, "d:\\test.xml");
- }catch(IOException ioe){
- throw ioe;
- }
- } catch (MPXJException mpxje) {
- throw mpxje;
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
这种作法的结果是:每次用project打开这个xml文件时候,都会进行一次导入向导:
很显然,这样的作法用户体验至关差 这里推荐一种使用Java写mpp文件的作法
方法来源:
http://sourceforge.net/projects/jawinproject/
http://msdn.microsoft.com/en-us/library/bb244274(v=office.12).aspx
利用jawin能够进行windows的com组件调用, 利用Project Object Model Reference 能够生成一个msproject 支持的文件. 这样就能够经过Java写*.mpp文件了
具体作法以下:
- //实例一个app,这个app能够想象成是一个ms project的应用程序
- /**这里要指明的一点的是,使用这种方法生成*.mpp文件的前提是你的电脑上必须安装有msproject这个软件*/
- app = new DispatchPtr("MSProject.Application");
- /**从这个连接中能够发现app有个成员是http://msdn.microsoft.com/en-us/library/bb236984(v=office.12).aspx*/
- DispatchPtr projects = (DispatchPtr) app.get("Projects");
接下去,ms 官方给咱们的提示是:
http://msdn.microsoft.com/en-us/library/bb214615(v=office.12).aspx
Use the Add method to add a Project object to the Projects collection. The following example creates a new project without prompting for project information. |
因为实例出com组件的对象,经过jawin帮咱们封装好的反射来
- /**从这个连接中能够发现http://msdn.microsoft.com/en-us/library/bb214615(v=office.12).aspx*/
- DispatchPtr project = (DispatchPtr) projects.invoke("Add");
接下去的事情好办了,有了一个project对象后,咱们至关于只要调用project下面的方法来生成一个详细的project.
所谓详细的project就是为他添加多个task.
- //生成一个task集合
- DispatchPtr tasks = (DispatchPtr) project.get("Tasks");
- //以后屡次调用来生成一个个任务
- DispatchPtr taskName = (DispatchPtr) tasks.invoke("Add");
- //固然要为任务设置属性:这要是name notes,
- issueName.put("Name", issueKey + ":" + issueSummary );
- issueName.put("Notes", issueDesc );
- issueName.put("OutlineLevel", "1");
- //在task对象中,没有明确的父子关系能够肯定,在生成的过程当中,都是更具生成的id和UniqueID顺序排下去的
- //惟一能够肯定最终在msproject中的结构的就是一个
- OutLineLevel属性了.
最后,进行保存操做,以及不要忘记进行应用程序的关闭.
- project.invoke("SaveAs", mppPath);
- app.invoke("DocClose" );
全部要用到的jar包: