@@ -352,6 +352,7 @@ public class GitBlit extends GitblitManager { | |||
// core managers | |||
IRuntimeManager.class, | |||
IPluginManager.class, | |||
INotificationManager.class, | |||
IUserManager.class, | |||
IAuthenticationManager.class, | |||
@@ -379,6 +380,10 @@ public class GitBlit extends GitblitManager { | |||
return runtimeManager; | |||
} | |||
@Provides @Singleton IPluginManager providePluginManager() { | |||
return pluginManager; | |||
} | |||
@Provides @Singleton INotificationManager provideNotificationManager() { | |||
return notificationManager; | |||
} | |||
@@ -410,6 +415,7 @@ public class GitBlit extends GitblitManager { | |||
@Provides @Singleton NullTicketService provideNullTicketService() { | |||
return new NullTicketService( | |||
runtimeManager, | |||
pluginManager, | |||
notificationManager, | |||
userManager, | |||
repositoryManager); | |||
@@ -418,6 +424,7 @@ public class GitBlit extends GitblitManager { | |||
@Provides @Singleton FileTicketService provideFileTicketService() { | |||
return new FileTicketService( | |||
runtimeManager, | |||
pluginManager, | |||
notificationManager, | |||
userManager, | |||
repositoryManager); | |||
@@ -426,6 +433,7 @@ public class GitBlit extends GitblitManager { | |||
@Provides @Singleton BranchTicketService provideBranchTicketService() { | |||
return new BranchTicketService( | |||
runtimeManager, | |||
pluginManager, | |||
notificationManager, | |||
userManager, | |||
repositoryManager); | |||
@@ -434,6 +442,7 @@ public class GitBlit extends GitblitManager { | |||
@Provides @Singleton RedisTicketService provideRedisTicketService() { | |||
return new RedisTicketService( | |||
runtimeManager, | |||
pluginManager, | |||
notificationManager, | |||
userManager, | |||
repositoryManager); |
@@ -139,13 +139,13 @@ public class ReindexTickets { | |||
Class<?> serviceClass = Class.forName(serviceName); | |||
if (RedisTicketService.class.isAssignableFrom(serviceClass)) { | |||
// Redis ticket service | |||
ticketService = new RedisTicketService(runtimeManager, null, null, repositoryManager).start(); | |||
ticketService = new RedisTicketService(runtimeManager, null, null, null, repositoryManager).start(); | |||
} else if (BranchTicketService.class.isAssignableFrom(serviceClass)) { | |||
// Branch ticket service | |||
ticketService = new BranchTicketService(runtimeManager, null, null, repositoryManager).start(); | |||
ticketService = new BranchTicketService(runtimeManager, null, null, null, repositoryManager).start(); | |||
} else if (FileTicketService.class.isAssignableFrom(serviceClass)) { | |||
// File ticket service | |||
ticketService = new FileTicketService(runtimeManager, null, null, repositoryManager).start(); | |||
ticketService = new FileTicketService(runtimeManager, null, null, null, repositoryManager).start(); | |||
} else { | |||
System.err.println("Unknown ticket service " + serviceName); | |||
System.exit(1); |
@@ -0,0 +1,46 @@ | |||
/* | |||
* Copyright 2014 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.extensions; | |||
import ro.fortsoft.pf4j.ExtensionPoint; | |||
import com.gitblit.models.TicketModel; | |||
import com.gitblit.models.TicketModel.Change; | |||
/** | |||
* Extension point for plugins to respond to Ticket changes. | |||
* | |||
* @author James Moger | |||
* | |||
*/ | |||
public abstract class TicketHook implements ExtensionPoint { | |||
/** | |||
* Called when a new ticket is created. | |||
* | |||
* @param ticket | |||
*/ | |||
public abstract void onNewTicket(TicketModel ticket); | |||
/** | |||
* Called when an existing ticket is updated. Tickets can be updated for | |||
* many, many reasons like state changes votes, watches, etc. | |||
* | |||
* @param ticket | |||
* @param change | |||
*/ | |||
public abstract void onUpdateTicket(TicketModel ticket, Change change); | |||
} |
@@ -58,6 +58,7 @@ import org.eclipse.jgit.treewalk.TreeWalk; | |||
import com.gitblit.Constants; | |||
import com.gitblit.git.ReceiveCommandEvent; | |||
import com.gitblit.manager.INotificationManager; | |||
import com.gitblit.manager.IPluginManager; | |||
import com.gitblit.manager.IRepositoryManager; | |||
import com.gitblit.manager.IRuntimeManager; | |||
import com.gitblit.manager.IUserManager; | |||
@@ -92,11 +93,13 @@ public class BranchTicketService extends ITicketService implements RefsChangedLi | |||
public BranchTicketService( | |||
IRuntimeManager runtimeManager, | |||
IPluginManager pluginManager, | |||
INotificationManager notificationManager, | |||
IUserManager userManager, | |||
IRepositoryManager repositoryManager) { | |||
super(runtimeManager, | |||
pluginManager, | |||
notificationManager, | |||
userManager, | |||
repositoryManager); |
@@ -29,6 +29,7 @@ import org.eclipse.jgit.lib.Repository; | |||
import com.gitblit.Constants; | |||
import com.gitblit.manager.INotificationManager; | |||
import com.gitblit.manager.IPluginManager; | |||
import com.gitblit.manager.IRepositoryManager; | |||
import com.gitblit.manager.IRuntimeManager; | |||
import com.gitblit.manager.IUserManager; | |||
@@ -58,11 +59,13 @@ public class FileTicketService extends ITicketService { | |||
public FileTicketService( | |||
IRuntimeManager runtimeManager, | |||
IPluginManager pluginManager, | |||
INotificationManager notificationManager, | |||
IUserManager userManager, | |||
IRepositoryManager repositoryManager) { | |||
super(runtimeManager, | |||
pluginManager, | |||
notificationManager, | |||
userManager, | |||
repositoryManager); |
@@ -35,7 +35,9 @@ import org.slf4j.LoggerFactory; | |||
import com.gitblit.IStoredSettings; | |||
import com.gitblit.Keys; | |||
import com.gitblit.extensions.TicketHook; | |||
import com.gitblit.manager.INotificationManager; | |||
import com.gitblit.manager.IPluginManager; | |||
import com.gitblit.manager.IRepositoryManager; | |||
import com.gitblit.manager.IRuntimeManager; | |||
import com.gitblit.manager.IUserManager; | |||
@@ -94,6 +96,8 @@ public abstract class ITicketService { | |||
protected final IRepositoryManager repositoryManager; | |||
protected final IPluginManager pluginManager; | |||
protected final TicketIndexer indexer; | |||
private final Cache<TicketKey, TicketModel> ticketsCache; | |||
@@ -136,6 +140,7 @@ public abstract class ITicketService { | |||
*/ | |||
public ITicketService( | |||
IRuntimeManager runtimeManager, | |||
IPluginManager pluginManager, | |||
INotificationManager notificationManager, | |||
IUserManager userManager, | |||
IRepositoryManager repositoryManager) { | |||
@@ -143,6 +148,7 @@ public abstract class ITicketService { | |||
this.log = LoggerFactory.getLogger(getClass()); | |||
this.settings = runtimeManager.getSettings(); | |||
this.runtimeManager = runtimeManager; | |||
this.pluginManager = pluginManager; | |||
this.notificationManager = notificationManager; | |||
this.userManager = userManager; | |||
this.repositoryManager = repositoryManager; | |||
@@ -832,6 +838,17 @@ public abstract class ITicketService { | |||
if (success) { | |||
TicketModel ticket = getTicket(repository, ticketId); | |||
indexer.index(ticket); | |||
// call the ticket hooks | |||
if (pluginManager != null) { | |||
for (TicketHook hook : pluginManager.getExtensions(TicketHook.class)) { | |||
try { | |||
hook.onNewTicket(ticket); | |||
} catch (Exception e) { | |||
log.error("Failed to execute extension", e); | |||
} | |||
} | |||
} | |||
return ticket; | |||
} | |||
return null; | |||
@@ -862,6 +879,17 @@ public abstract class ITicketService { | |||
TicketModel ticket = getTicket(repository, ticketId); | |||
ticketsCache.put(key, ticket); | |||
indexer.index(ticket); | |||
// call the ticket hooks | |||
if (pluginManager != null) { | |||
for (TicketHook hook : pluginManager.getExtensions(TicketHook.class)) { | |||
try { | |||
hook.onUpdateTicket(ticket, change); | |||
} catch (Exception e) { | |||
log.error("Failed to execute extension", e); | |||
} | |||
} | |||
} | |||
return ticket; | |||
} | |||
return null; |
@@ -19,6 +19,7 @@ import java.util.Collections; | |||
import java.util.List; | |||
import com.gitblit.manager.INotificationManager; | |||
import com.gitblit.manager.IPluginManager; | |||
import com.gitblit.manager.IRepositoryManager; | |||
import com.gitblit.manager.IRuntimeManager; | |||
import com.gitblit.manager.IUserManager; | |||
@@ -37,11 +38,13 @@ public class NullTicketService extends ITicketService { | |||
public NullTicketService( | |||
IRuntimeManager runtimeManager, | |||
IPluginManager pluginManager, | |||
INotificationManager notificationManager, | |||
IUserManager userManager, | |||
IRepositoryManager repositoryManager) { | |||
super(runtimeManager, | |||
pluginManager, | |||
notificationManager, | |||
userManager, | |||
repositoryManager); |
@@ -32,6 +32,7 @@ import redis.clients.jedis.exceptions.JedisException; | |||
import com.gitblit.Keys; | |||
import com.gitblit.manager.INotificationManager; | |||
import com.gitblit.manager.IPluginManager; | |||
import com.gitblit.manager.IRepositoryManager; | |||
import com.gitblit.manager.IRuntimeManager; | |||
import com.gitblit.manager.IUserManager; | |||
@@ -61,11 +62,13 @@ public class RedisTicketService extends ITicketService { | |||
public RedisTicketService( | |||
IRuntimeManager runtimeManager, | |||
IPluginManager pluginManager, | |||
INotificationManager notificationManager, | |||
IUserManager userManager, | |||
IRepositoryManager repositoryManager) { | |||
super(runtimeManager, | |||
pluginManager, | |||
notificationManager, | |||
userManager, | |||
repositoryManager); |
@@ -111,6 +111,29 @@ public class MyPatchsetHook extends PatchsetHook { | |||
} | |||
``` | |||
### Extension Point: Ticket Hook | |||
You can provide your own custom ticket hook by extending the *TicketHook* class. | |||
```java | |||
import com.gitblit.extensions.TicketHook; | |||
import com.gitblit.models.TicketModel; | |||
import com.gitblit.models.TicketModel.Change; | |||
import ro.fortsoft.pf4j.Extension; | |||
@Extension | |||
public class MyTicketHook extends TicketHook { | |||
@Override | |||
public void onNewTicket(TicketModel ticket) { | |||
} | |||
@Override | |||
public void onUpdateTicket(TicketModel ticket, Change change) { | |||
} | |||
} | |||
``` | |||
### Mac OSX Fonts | |||
Gitblit's core SSH commands and those in the *powertools* plugin rely on use of ANSI border characters to provide a pretty presentation of data. Unfortunately, the fonts provided by Apple - while very nice - don't work well with ANSI border characters. The following public domain fixed-width, fixed-point, bitmapped fonts work very nicely. I find the 6x12 font with a line spacing of ~0.8 to be quite acceptable. |
@@ -17,10 +17,12 @@ package com.gitblit.tests; | |||
import com.gitblit.IStoredSettings; | |||
import com.gitblit.manager.INotificationManager; | |||
import com.gitblit.manager.IPluginManager; | |||
import com.gitblit.manager.IRepositoryManager; | |||
import com.gitblit.manager.IRuntimeManager; | |||
import com.gitblit.manager.IUserManager; | |||
import com.gitblit.manager.NotificationManager; | |||
import com.gitblit.manager.PluginManager; | |||
import com.gitblit.manager.RepositoryManager; | |||
import com.gitblit.manager.RuntimeManager; | |||
import com.gitblit.manager.UserManager; | |||
@@ -50,12 +52,14 @@ public class BranchTicketServiceTest extends TicketServiceTest { | |||
IStoredSettings settings = getSettings(deleteAll); | |||
IRuntimeManager runtimeManager = new RuntimeManager(settings).start(); | |||
IPluginManager pluginManager = new PluginManager(runtimeManager).start(); | |||
INotificationManager notificationManager = new NotificationManager(settings).start(); | |||
IUserManager userManager = new UserManager(runtimeManager).start(); | |||
IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, userManager).start(); | |||
BranchTicketService service = new BranchTicketService( | |||
runtimeManager, | |||
pluginManager, | |||
notificationManager, | |||
userManager, | |||
repositoryManager).start(); |
@@ -17,10 +17,12 @@ package com.gitblit.tests; | |||
import com.gitblit.IStoredSettings; | |||
import com.gitblit.manager.INotificationManager; | |||
import com.gitblit.manager.IPluginManager; | |||
import com.gitblit.manager.IRepositoryManager; | |||
import com.gitblit.manager.IRuntimeManager; | |||
import com.gitblit.manager.IUserManager; | |||
import com.gitblit.manager.NotificationManager; | |||
import com.gitblit.manager.PluginManager; | |||
import com.gitblit.manager.RepositoryManager; | |||
import com.gitblit.manager.RuntimeManager; | |||
import com.gitblit.manager.UserManager; | |||
@@ -49,12 +51,14 @@ public class FileTicketServiceTest extends TicketServiceTest { | |||
IStoredSettings settings = getSettings(deleteAll); | |||
IRuntimeManager runtimeManager = new RuntimeManager(settings).start(); | |||
IPluginManager pluginManager = new PluginManager(runtimeManager).start(); | |||
INotificationManager notificationManager = new NotificationManager(settings).start(); | |||
IUserManager userManager = new UserManager(runtimeManager).start(); | |||
IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, userManager).start(); | |||
FileTicketService service = new FileTicketService( | |||
runtimeManager, | |||
pluginManager, | |||
notificationManager, | |||
userManager, | |||
repositoryManager).start(); |
@@ -18,10 +18,12 @@ package com.gitblit.tests; | |||
import com.gitblit.IStoredSettings; | |||
import com.gitblit.Keys; | |||
import com.gitblit.manager.INotificationManager; | |||
import com.gitblit.manager.IPluginManager; | |||
import com.gitblit.manager.IRepositoryManager; | |||
import com.gitblit.manager.IRuntimeManager; | |||
import com.gitblit.manager.IUserManager; | |||
import com.gitblit.manager.NotificationManager; | |||
import com.gitblit.manager.PluginManager; | |||
import com.gitblit.manager.RepositoryManager; | |||
import com.gitblit.manager.RuntimeManager; | |||
import com.gitblit.manager.UserManager; | |||
@@ -57,12 +59,14 @@ public class RedisTicketServiceTest extends TicketServiceTest { | |||
IStoredSettings settings = getSettings(deleteAll); | |||
IRuntimeManager runtimeManager = new RuntimeManager(settings).start(); | |||
IPluginManager pluginManager = new PluginManager(runtimeManager).start(); | |||
INotificationManager notificationManager = new NotificationManager(settings).start(); | |||
IUserManager userManager = new UserManager(runtimeManager).start(); | |||
IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, userManager).start(); | |||
RedisTicketService service = new RedisTicketService( | |||
runtimeManager, | |||
pluginManager, | |||
notificationManager, | |||
userManager, | |||
repositoryManager).start(); |