/* * Copyright 2012 gitblit.com. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.gitblit.models; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.gitblit.utils.ArrayUtils; import com.gitblit.utils.StringUtils; /** * The Gitblit Issue model, its component classes, and enums. * * @author James Moger * */ public class IssueModel implements Serializable, Comparable { private static final long serialVersionUID = 1L;; public String id; public Type type; public Status status; public Priority priority; public Date created; public String summary; public String description; public String reporter; public String owner; public String milestone; public List changes; public IssueModel() { created = new Date(); type = Type.Defect; status = Status.New; priority = Priority.Medium; changes = new ArrayList(); } public String getStatus() { String s = status.toString(); if (!StringUtils.isEmpty(owner)) s += " (" + owner + ")"; return s; } public List getLabels() { List list = new ArrayList(); String labels = null; for (Change change : changes) { if (change.hasFieldChanges()) { FieldChange field = change.getField(Field.Labels); if (field != null) { labels = field.value.toString(); } } } if (!StringUtils.isEmpty(labels)) { list.addAll(StringUtils.getStringsFromValue(labels, " ")); } return list; } public boolean hasLabel(String label) { return getLabels().contains(label); } public Attachment getAttachment(String name) { Attachment attachment = null; for (Change change : changes) { if (change.hasAttachments()) { Attachment a = change.getAttachment(name); if (a != null) { attachment = a; } } } return attachment; } public void addChange(Change change) { if (changes == null) { changes = new ArrayList(); } changes.add(change); } @Override public String toString() { return summary; } @Override public int compareTo(IssueModel o) { return o.created.compareTo(created); } @Override public boolean equals(Object o) { if (o instanceof IssueModel) return id.equals(((IssueModel) o).id); return super.equals(o); } @Override public int hashCode() { return id.hashCode(); } public static class Change implements Serializable { private static final long serialVersionUID = 1L; public Date created; public String author; public Comment comment; public List fieldChanges; public List attachments; public void comment(String text) { comment = new Comment(text); } public boolean hasComment() { return comment != null; } public boolean hasAttachments() { return !ArrayUtils.isEmpty(attachments); } public boolean hasFieldChanges() { return !ArrayUtils.isEmpty(fieldChanges); } public FieldChange getField(Field field) { if (fieldChanges != null) { for (FieldChange fieldChange : fieldChanges) { if (fieldChange.field == field) { return fieldChange; } } } return null; } public void setField(Field field, Object value) { FieldChange fieldChange = new FieldChange(); fieldChange.field = field; fieldChange.value = value; if (fieldChanges == null) { fieldChanges = new ArrayList(); } fieldChanges.add(fieldChange); } public String getString(Field field) { FieldChange fieldChange = getField(field); if (fieldChange == null) { return null; } return fieldChange.value.toString(); } public void addAttachment(Attachment attachment) { if (attachments == null) { attachments = new ArrayList(); } attachments.add(attachment); } public Attachment getAttachment(String name) { for (Attachment attachment : attachments) { if (attachment.name.equalsIgnoreCase(name)) { return attachment; } } return null; } @Override public String toString() { return created.toString() + " by " + author; } } public static class Comment implements Serializable { private static final long serialVersionUID = 1L; public String text; public boolean deleted; Comment(String text) { this.text = text; } @Override public String toString() { return text; } } public static class FieldChange implements Serializable { private static final long serialVersionUID = 1L; public Field field; public Object value; @Override public String toString() { return field + ": " + value; } } public static class Attachment implements Serializable { private static final long serialVersionUID = 1L; public String name; public long size; public byte[] content; public boolean deleted; public Attachment(String name) { this.name = name; } @Override public String toString() { return name; } } public static enum Field { Summary, Description, Reporter, Owner, Type, Status, Priority, Milestone, Labels; } public static enum Type { Defect, Enhancement, Task, Review, Other; } public static enum Priority { Low, Medium, High, Critical; } public static enum Status { New, Accepted, Started, Review, Queued, Testing, Done, Fixed, WontFix, Duplicate, Invalid; public boolean atLeast(Status status) { return ordinal() >= status.ordinal(); } public boolean exceeds(Status status) { return ordinal() > status.ordinal(); } public Status next() { switch (this) { case New: return Started; case Accepted: return Started; case Started: return Testing; case Review: return Testing; case Queued: return Testing; case Testing: return Done; } return Accepted; } } }