IssueRelation.java
/*
* This software was designed and created by Jason Carroll.
* Copyright (c) 2002, 2003, 2004 Jason Carroll.
* The author can be reached at jcarroll@cowsultants.com
* ITracker website: http://www.cowsultants.com
* ITracker forums: http://www.cowsultants.com/phpBB/index.php
*
* This program is free software; you can redistribute it and/or modify
* it only under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
package org.itracker.model;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.itracker.core.resources.ITrackerResources;
/**
* A relation between issues.
*
* @author ready
*/
public class IssueRelation extends AbstractEntity {
/**
*
*/
private static final long serialVersionUID = 1L;
private Issue issue;
private Issue relatedIssue;
/**
* Indicates the kind of relation that exists between the 2 issues.
*/
private Type type;
private Integer matchingRelationId;
/**
* Default constructor (required by Hibernate).
* <p/>
* <p>
* PENDING: should be <code>private</code> so that it can only be used by
* Hibernate, to ensure that the fields which form an instance's identity
* are always initialized/never <tt>null</tt>.
* </p>
*/
public IssueRelation() {
}
public IssueRelation(Issue issue, Issue relatedIssue, Type relationType) {
setIssue(issue);
setRelatedIssue(relatedIssue);
setRelationType(relationType);
}
public Issue getIssue() {
return issue;
}
public void setIssue(Issue issue) {
if (issue == null) {
throw new IllegalArgumentException("null issue");
}
this.issue = issue;
}
public Issue getRelatedIssue() {
return relatedIssue;
}
public void setRelatedIssue(Issue relatedIssue) {
if (relatedIssue == null) {
throw new IllegalArgumentException("null relatedIssue");
}
this.relatedIssue = relatedIssue;
}
public Type getRelationType() {
return type;
}
public void setRelationType(Type type) {
this.type = type;
}
public Integer getMatchingRelationId() {
return matchingRelationId;
}
public void setMatchingRelationId(Integer matchingRelationId) {
this.matchingRelationId = matchingRelationId;
}
@Override
public String toString() {
return new ToStringBuilder(this).append("id", getId())
.append("issue", getIssue()).append("relatedIssue", getRelatedIssue())
.append("type", getRelationType()).toString();
}
public static enum Type implements IntCodeEnum<Type> {
/**
* Defines a related issue. Sample text: related to
*/
RELATED_P(1),
/**
* Defines a related issue. Sample text: related to
*/
RELATED_C(2),
/**
* Defines a duplicate issue. Sample text: duplicates
*/
DUPLICATE_P(3),
/**
* Defines a duplicate issue. Sample text: duplicate of
*/
DUPLICATE_C(4),
/**
* Defines a cloned issue. Sample text: cloned to
*/
CLONED_P(5),
/**
* Defines a cloned issue. Sample text: cloned from
*/
CLONED_C(6),
/**
* Defines a split issue. Sample text: split to
*/
SPLIT_P(7),
/**
* Defines a split issue. Sample text: split from
*/
SPLIT_C(8),
/**
* Defines a dependent issue. Sample text: dependents
*/
DEPENDENT_P(9),
/**
* Defines a dependent issue. Sample text: depends on
*/
DEPENDENT_C(10);
private final Integer code;
private Type(Integer code) {
this.code = code;
}
public Integer getCode() {
return code;
}
public Type fromCode(Integer code) {
return Type.valueOf(code);
}
public static Type valueOf(Integer code) {
for (Type val: values()) {
if (val.code.compareTo(code) == 0) {
return val;
}
}
throw new IllegalArgumentException("Unknown code : " + code);
}
/**
* Returns the key for a particular issue relation type.
*
* @return the key for the item
*/
public String getLanguageKeyCode() {
String key = ITrackerResources.KEY_BASE_ISSUE_RELATION + getCode();
return key;
}
}
}