From a502d96a860456ec5e8c96761db70f7cabb74751 Mon Sep 17 00:00:00 2001
From: Paul Martin <paul@paulsputer.com>
Date: Sat, 30 Apr 2016 04:19:14 -0400
Subject: [PATCH] Merge pull request #1073 from gitblit/1062-DocEditorUpdates

---
 src/main/java/com/gitblit/tickets/RedisTicketService.java |   78 +++++++++++++++++++++++++++++++++++++-
 1 files changed, 75 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/gitblit/tickets/RedisTicketService.java b/src/main/java/com/gitblit/tickets/RedisTicketService.java
index 2c5b181..0f9ad17 100644
--- a/src/main/java/com/gitblit/tickets/RedisTicketService.java
+++ b/src/main/java/com/gitblit/tickets/RedisTicketService.java
@@ -20,6 +20,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import java.util.TreeSet;
 
 import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 
@@ -42,6 +43,8 @@
 import com.gitblit.models.TicketModel.Change;
 import com.gitblit.utils.ArrayUtils;
 import com.gitblit.utils.StringUtils;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
 
 /**
  * Implementation of a ticket service based on a Redis key-value store.  All
@@ -52,6 +55,7 @@
  * @author James Moger
  *
  */
+@Singleton
 public class RedisTicketService extends ITicketService {
 
 	private final JedisPool pool;
@@ -60,6 +64,7 @@
 		journal, ticket, counter
 	}
 
+	@Inject
 	public RedisTicketService(
 			IRuntimeManager runtimeManager,
 			IPluginManager pluginManager,
@@ -79,6 +84,10 @@
 
 	@Override
 	public RedisTicketService start() {
+		log.info("{} started", getClass().getSimpleName());
+		if (!isReady()) {
+			log.warn("{} is not ready!", getClass().getSimpleName());
+		}
 		return this;
 	}
 
@@ -184,6 +193,30 @@
 		return false;
 	}
 
+	@Override
+	public Set<Long> getIds(RepositoryModel repository) {
+		Set<Long> ids = new TreeSet<Long>();
+		Jedis jedis = pool.getResource();
+		try {// account for migrated tickets
+			Set<String> keys = jedis.keys(key(repository, KeyType.journal, "*"));
+			for (String tkey : keys) {
+				// {repo}:journal:{id}
+				String id = tkey.split(":")[2];
+				long ticketId = Long.parseLong(id);
+				ids.add(ticketId);
+			}
+		} catch (JedisException e) {
+			log.error("failed to assign new ticket id in Redis @ " + getUrl(), e);
+			pool.returnBrokenResource(jedis);
+			jedis = null;
+		} finally {
+			if (jedis != null) {
+				pool.returnResource(jedis);
+			}
+		}
+		return ids;
+	}
+
 	/**
 	 * Assigns a new ticket id.
 	 *
@@ -197,7 +230,14 @@
 			String key = key(repository, KeyType.counter, null);
 			String val = jedis.get(key);
 			if (isNull(val)) {
-				jedis.set(key, "0");
+				long lastId = 0;
+				Set<Long> ids = getIds(repository);
+				for (long id : ids) {
+					if (id > lastId) {
+						lastId = id;
+					}
+				}
+				jedis.set(key, "" + lastId);
 			}
 			long ticketNumber = jedis.incr(key);
 			return ticketNumber;
@@ -273,8 +313,7 @@
 	}
 
 	/**
-	 * Retrieves the ticket from the repository by first looking-up the changeId
-	 * associated with the ticketId.
+	 * Retrieves the ticket from the repository.
 	 *
 	 * @param repository
 	 * @param ticketId
@@ -312,6 +351,39 @@
 	}
 
 	/**
+	 * Retrieves the journal for the ticket.
+	 *
+	 * @param repository
+	 * @param ticketId
+	 * @return a journal, if it exists, otherwise null
+	 */
+	@Override
+	protected List<Change> getJournalImpl(RepositoryModel repository, long ticketId) {
+		Jedis jedis = pool.getResource();
+		if (jedis == null) {
+			return null;
+		}
+
+		try {
+			List<Change> changes = getJournal(jedis, repository, ticketId);
+			if (ArrayUtils.isEmpty(changes)) {
+				log.warn("Empty journal for {}:{}", repository, ticketId);
+				return null;
+			}
+			return changes;
+		} catch (JedisException e) {
+			log.error("failed to retrieve journal from Redis @ " + getUrl(), e);
+			pool.returnBrokenResource(jedis);
+			jedis = null;
+		} finally {
+			if (jedis != null) {
+				pool.returnResource(jedis);
+			}
+		}
+		return null;
+	}
+
+	/**
 	 * Returns the journal for the specified ticket.
 	 *
 	 * @param repository

--
Gitblit v1.9.1