| | |
| | | import com.gitblit.IStoredSettings; |
| | | import com.gitblit.Keys; |
| | | import com.gitblit.extensions.TicketHook; |
| | | import com.gitblit.manager.IManager; |
| | | import com.gitblit.manager.INotificationManager; |
| | | import com.gitblit.manager.IPluginManager; |
| | | import com.gitblit.manager.IRepositoryManager; |
| | |
| | | * @author James Moger |
| | | * |
| | | */ |
| | | public abstract class ITicketService { |
| | | public abstract class ITicketService implements IManager { |
| | | |
| | | public static final String SETTING_UPDATE_DIFFSTATS = "migration.updateDiffstats"; |
| | | |
| | | private static final String LABEL = "label"; |
| | | |
| | |
| | | private final Map<String, List<TicketLabel>> labelsCache; |
| | | |
| | | private final Map<String, List<TicketMilestone>> milestonesCache; |
| | | |
| | | private final boolean updateDiffstats; |
| | | |
| | | private static class TicketKey { |
| | | final String repository; |
| | |
| | | |
| | | this.labelsCache = new ConcurrentHashMap<String, List<TicketLabel>>(); |
| | | this.milestonesCache = new ConcurrentHashMap<String, List<TicketMilestone>>(); |
| | | |
| | | this.updateDiffstats = settings.getBoolean(SETTING_UPDATE_DIFFSTATS, true); |
| | | } |
| | | |
| | | /** |
| | | * Start the service. |
| | | * @since 1.4.0 |
| | | */ |
| | | @Override |
| | | public abstract ITicketService start(); |
| | | |
| | | /** |
| | | * Stop the service. |
| | | * @since 1.4.0 |
| | | */ |
| | | @Override |
| | | public final ITicketService stop() { |
| | | indexer.close(); |
| | | ticketsCache.invalidateAll(); |
| | |
| | | */ |
| | | public boolean isAcceptingTicketUpdates(RepositoryModel repository) { |
| | | return isReady() |
| | | && repository.hasCommits |
| | | && repository.isBare |
| | | && !repository.isFrozen |
| | | && !repository.isMirror; |
| | |
| | | Repository db = null; |
| | | try { |
| | | db = repositoryManager.getRepository(repository.name); |
| | | TicketMilestone milestone = getMilestone(repository, oldName); |
| | | TicketMilestone tm = getMilestone(repository, oldName); |
| | | if (tm == null) { |
| | | return false; |
| | | } |
| | | StoredConfig config = db.getConfig(); |
| | | config.unsetSection(MILESTONE, oldName); |
| | | config.setString(MILESTONE, newName, STATUS, milestone.status.name()); |
| | | config.setString(MILESTONE, newName, COLOR, milestone.color); |
| | | if (milestone.due != null) { |
| | | config.setString(MILESTONE, newName, STATUS, tm.status.name()); |
| | | config.setString(MILESTONE, newName, COLOR, tm.color); |
| | | if (tm.due != null) { |
| | | config.setString(MILESTONE, newName, DUE, |
| | | new SimpleDateFormat(DUE_DATE_PATTERN).format(milestone.due)); |
| | | new SimpleDateFormat(DUE_DATE_PATTERN).format(tm.due)); |
| | | } |
| | | config.save(); |
| | | |
| | | milestonesCache.remove(repository.name); |
| | | |
| | | TicketNotifier notifier = createNotifier(); |
| | | for (QueryResult qr : milestone.tickets) { |
| | | for (QueryResult qr : tm.tickets) { |
| | | Change change = new Change(createdBy); |
| | | change.setField(Field.milestone, newName); |
| | | TicketModel ticket = updateTicket(repository, qr.number, change); |
| | |
| | | Repository db = null; |
| | | try { |
| | | TicketMilestone tm = getMilestone(repository, milestone); |
| | | if (tm == null) { |
| | | return false; |
| | | } |
| | | db = repositoryManager.getRepository(repository.name); |
| | | StoredConfig config = db.getConfig(); |
| | | config.unsetSection(MILESTONE, milestone); |
| | |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * Returns the set of assigned ticket ids in the repository. |
| | | * |
| | | * @param repository |
| | | * @return a set of assigned ticket ids in the repository |
| | | * @since 1.6.0 |
| | | */ |
| | | public abstract Set<Long> getIds(RepositoryModel repository); |
| | | |
| | | /** |
| | | * Assigns a new ticket id. |
| | |
| | | ticket = getTicketImpl(repository, ticketId); |
| | | // if ticket exists |
| | | if (ticket != null) { |
| | | if (ticket.hasPatchsets()) { |
| | | if (ticket.hasPatchsets() && updateDiffstats) { |
| | | Repository r = repositoryManager.getRepository(repository.name); |
| | | try { |
| | | Patchset patchset = ticket.getCurrentPatchset(); |
| | |
| | | */ |
| | | protected abstract TicketModel getTicketImpl(RepositoryModel repository, long ticketId); |
| | | |
| | | |
| | | /** |
| | | * Returns the journal used to build a ticket. |
| | | * |
| | | * @param repository |
| | | * @param ticketId |
| | | * @return the journal for the ticket, if it exists, otherwise null |
| | | * @since 1.6.0 |
| | | */ |
| | | public final List<Change> getJournal(RepositoryModel repository, long ticketId) { |
| | | if (hasTicket(repository, ticketId)) { |
| | | List<Change> journal = getJournalImpl(repository, ticketId); |
| | | return journal; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * Retrieves the ticket journal. |
| | | * |
| | | * @param repository |
| | | * @param ticketId |
| | | * @return a ticket, if it exists, otherwise null |
| | | * @since 1.6.0 |
| | | */ |
| | | protected abstract List<Change> getJournalImpl(RepositoryModel repository, long ticketId); |
| | | |
| | | /** |
| | | * Get the ticket url |
| | | * |