關鍵字: 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包: