Hybris95
2014-04-22 3f5b8f5d9203aa7ffb7fbe9cdbaf9dba3da6cae6
src/main/java/com/gitblit/tickets/ITicketService.java
@@ -49,6 +49,7 @@
import com.gitblit.models.TicketModel.Patchset;
import com.gitblit.models.TicketModel.Status;
import com.gitblit.tickets.TicketIndexer.Lucene;
import com.gitblit.utils.DeepCopier;
import com.gitblit.utils.DiffUtils;
import com.gitblit.utils.DiffUtils.DiffStat;
import com.gitblit.utils.StringUtils;
@@ -379,7 +380,9 @@
      } catch (IOException e) {
         log.error("failed to create label " + label + " in " + repository, e);
      } finally {
         db.close();
         if (db != null) {
            db.close();
         }
      }
      return lb;
   }
@@ -405,7 +408,9 @@
      } catch (IOException e) {
         log.error("failed to update label " + label + " in " + repository, e);
      } finally {
         db.close();
         if (db != null) {
            db.close();
         }
      }
      return false;
   }
@@ -444,7 +449,9 @@
      } catch (IOException e) {
         log.error("failed to rename label " + oldName + " in " + repository, e);
      } finally {
         db.close();
         if (db != null) {
            db.close();
         }
      }
      return false;
   }
@@ -473,7 +480,9 @@
      } catch (IOException e) {
         log.error("failed to delete label " + label + " in " + repository, e);
      } finally {
         db.close();
         if (db != null) {
            db.close();
         }
      }
      return false;
   }
@@ -548,9 +557,10 @@
   public TicketMilestone getMilestone(RepositoryModel repository, String milestone) {
      for (TicketMilestone ms : getMilestones(repository)) {
         if (ms.name.equalsIgnoreCase(milestone)) {
            TicketMilestone tm = DeepCopier.copy(ms);
            String q = QueryBuilder.q(Lucene.rid.matches(repository.getRID())).and(Lucene.milestone.matches(milestone)).build();
            ms.tickets = indexer.queryFor(q, 1, 0, Lucene.number.name(), true);
            return ms;
            tm.tickets = indexer.queryFor(q, 1, 0, Lucene.number.name(), true);
            return tm;
         }
      }
      return null;
@@ -579,7 +589,9 @@
      } catch (IOException e) {
         log.error("failed to create milestone " + milestone + " in " + repository, e);
      } finally {
         db.close();
         if (db != null) {
            db.close();
         }
      }
      return ms;
   }
@@ -611,7 +623,9 @@
      } catch (IOException e) {
         log.error("failed to update milestone " + milestone + " in " + repository, e);
      } finally {
         db.close();
         if (db != null) {
            db.close();
         }
      }
      return false;
   }
@@ -627,6 +641,22 @@
    * @since 1.4.0
    */
   public synchronized boolean renameMilestone(RepositoryModel repository, String oldName, String newName, String createdBy) {
      return renameMilestone(repository, oldName, newName, createdBy, true);
   }
   /**
    * Renames a milestone.
    *
    * @param repository
    * @param oldName
    * @param newName
    * @param createdBy
    * @param notifyOpenTickets
    * @return true if successful
    * @since 1.6.0
    */
   public synchronized boolean renameMilestone(RepositoryModel repository, String oldName,
         String newName, String createdBy, boolean notifyOpenTickets) {
      if (StringUtils.isEmpty(newName)) {
         throw new IllegalArgumentException("new milestone can not be empty!");
      }
@@ -639,7 +669,7 @@
         config.setString(MILESTONE, newName, STATUS, milestone.status.name());
         config.setString(MILESTONE, newName, COLOR, milestone.color);
         if (milestone.due != null) {
            config.setString(MILESTONE, milestone.name, DUE,
            config.setString(MILESTONE, newName, DUE,
                  new SimpleDateFormat(DUE_DATE_PATTERN).format(milestone.due));
         }
         config.save();
@@ -651,15 +681,21 @@
            Change change = new Change(createdBy);
            change.setField(Field.milestone, newName);
            TicketModel ticket = updateTicket(repository, qr.number, change);
            notifier.queueMailing(ticket);
            if (notifyOpenTickets && ticket.isOpen()) {
               notifier.queueMailing(ticket);
            }
         }
         notifier.sendAll();
         if (notifyOpenTickets) {
            notifier.sendAll();
         }
         return true;
      } catch (IOException e) {
         log.error("failed to rename milestone " + oldName + " in " + repository, e);
      } finally {
         db.close();
         if (db != null) {
            db.close();
         }
      }
      return false;
   }
@@ -674,11 +710,27 @@
    * @since 1.4.0
    */
   public synchronized boolean deleteMilestone(RepositoryModel repository, String milestone, String createdBy) {
      return deleteMilestone(repository, milestone, createdBy, true);
   }
   /**
    * Deletes a milestone.
    *
    * @param repository
    * @param milestone
    * @param createdBy
    * @param notifyOpenTickets
    * @return true if successful
    * @since 1.6.0
    */
   public synchronized boolean deleteMilestone(RepositoryModel repository, String milestone,
         String createdBy, boolean notifyOpenTickets) {
      if (StringUtils.isEmpty(milestone)) {
         throw new IllegalArgumentException("milestone can not be empty!");
      }
      Repository db = null;
      try {
         TicketMilestone tm = getMilestone(repository, milestone);
         db = repositoryManager.getRepository(repository.name);
         StoredConfig config = db.getConfig();
         config.unsetSection(MILESTONE, milestone);
@@ -686,11 +738,25 @@
         milestonesCache.remove(repository.name);
         TicketNotifier notifier = createNotifier();
         for (QueryResult qr : tm.tickets) {
            Change change = new Change(createdBy);
            change.setField(Field.milestone, "");
            TicketModel ticket = updateTicket(repository, qr.number, change);
            if (notifyOpenTickets && ticket.isOpen()) {
               notifier.queueMailing(ticket);
            }
         }
         if (notifyOpenTickets) {
            notifier.sendAll();
         }
         return true;
      } catch (IOException e) {
         log.error("failed to delete milestone " + milestone + " in " + repository, e);
      } finally {
         db.close();
         if (db != null) {
            db.close();
         }
      }
      return false;
   }
@@ -713,12 +779,21 @@
    * @since 1.4.0
    */
   public abstract boolean hasTicket(RepositoryModel repository, long ticketId);
   /**
    * Returns all tickets.  This is not a Lucene search!
    *
    * @return all tickets
    */
   public List<TicketModel> getTickets() {
      return getTickets(null, null);
   }
   /**
    * Returns all tickets.  This is not a Lucene search!
    *
    * @param repository
    * @return all tickets
    * @return all tickets of a given repository
    * @since 1.4.0
    */
   public List<TicketModel> getTickets(RepositoryModel repository) {