一条老狗

           老狗拉破车
posts - 12, comments - 11, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JIRA插件开发(二) [原创]

Posted on 2007-10-24 11:40 一条老狗 阅读(2136) 评论(0)  编辑  收藏 所属分类: Java

JIRA插件开发的工作本早已结束。
但近日有个朋友来问,如何在IssueNavigator显示时,显示用户的帐号名(username),而不是其FullName。

当时我为他提供了两种思路:

思路1。写一个自定义字段插件,这个插件就是按用户名来显示报告者及被分派者。
然后再自定义问题导航栏,把你的自定义字段添加进去即可。

思路2。继承并覆盖问题导航功能的Action,直接修改其显示的数据。

这个问题挺有意思,今日闲来无事,对第二种思路写了点代码来实现一下。

首先我们继承IssueNavigator类:

public class IssueNavigator extends com.atlassian.jira.web.action.issue.IssueNavigator {

    
private boolean convertedResults = false;
    
public SearchResults getSearchResults() throws SearchException {
        SearchResults results 
= super.getSearchResults();
        
if (!convertedResults && results != null{
            convertedResults 
= true;

            List issueList 
= results.getIssues();
            
for (int i = 0; i < issueList.size(); i++{
                com.atlassian.jira.issue.DocumentIssueImpl issue 
=
                        (com.atlassian.jira.issue.DocumentIssueImpl)issueList.get(i);

                Document document 
= null;
                
try {
                    Field f 
= issue.getClass().getDeclaredField("document");
                    f.setAccessible(
true);
                    document 
= (Document)f.get(issue);
                    f.setAccessible(
false);
                }
 catch (NoSuchFieldException e) {
                    e.printStackTrace();
                }
 catch (IllegalAccessException e) {
                    e.printStackTrace();
                }


                DocumentIssueImpl newIssue 
= new DocumentIssueImpl(
                        document,
                        ComponentManager.getInstance().getConstantsManager(),
                        ComponentManager.getInstance().getFieldManager(),
                        ComponentManager.getInstance().getIssueManager(),
                        ComponentManager.getInstance().getIssueFactory(),
                        ComponentManager.getInstance().getAttachmentManager(),
                        ComponentManager.getInstance().getProjectFactory()
                );

                issueList.set(i, newIssue); 
            }

        }


        
return results;
    }


}

然后覆盖其 getSearchResults() 方法,将issueList中的对象换为我们的新对象(DocumentIssueImpl)。
注意: 这里面为了取回document对象,使有了反射。或许有其它办法,这里只做一个测试,不考虑其它问题。

为此,我们需要再继承一个类 DocumentIssueImpl:
public class DocumentIssueImpl extends com.atlassian.jira.issue.DocumentIssueImpl {

    
private User resetUserFullName(User user) {
        user.setFullName(user.getName());
        
return user;
    }


    
public User getAssignee()
    
{
        
return resetUserFullName(super.getAssignee());
    }


    
public User getReporter()
    
{
        
return resetUserFullName(super.getReporter());
    }

}

然后我们覆盖其 getAssignee() getReporter() 方法,把username赋值给fullname
这样当调用 getFullName 时返回的就是 username了。

然后插件配置文件中覆盖IssueNavigation Action

<action name="xxx.IssueNavigator" alias="IssueNavigator">
    
<view name="success">/secure/views/navigator/navigator.jsp</view>
    
<view name="error">/secure/views/navigator/navigator.jsp</view>
</action>

完成!


只有注册用户登录后才能发表评论。


网站导航: