James Moger
2014-04-12 ba567069542e1f6769097ff78cd9612a9f08eb83
Add TicketHook extension
1 files added
11 files modified
136 ■■■■■ changed files
src/main/java/com/gitblit/GitBlit.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/ReindexTickets.java 6 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/extensions/TicketHook.java 46 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/tickets/BranchTicketService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/tickets/FileTicketService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/tickets/ITicketService.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/tickets/NullTicketService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/tickets/RedisTicketService.java 3 ●●●●● patch | view | raw | blame | history
src/site/setup_plugins.mkd 23 ●●●●● patch | view | raw | blame | history
src/test/java/com/gitblit/tests/BranchTicketServiceTest.java 4 ●●●● patch | view | raw | blame | history
src/test/java/com/gitblit/tests/FileTicketServiceTest.java 4 ●●●● patch | view | raw | blame | history
src/test/java/com/gitblit/tests/RedisTicketServiceTest.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/GitBlit.java
@@ -352,6 +352,7 @@
                    // core managers
                    IRuntimeManager.class,
                    IPluginManager.class,
                    INotificationManager.class,
                    IUserManager.class,
                    IAuthenticationManager.class,
@@ -377,6 +378,10 @@
        @Provides @Singleton IRuntimeManager provideRuntimeManager() {
            return runtimeManager;
        }
        @Provides @Singleton IPluginManager providePluginManager() {
            return pluginManager;
        }
        @Provides @Singleton INotificationManager provideNotificationManager() {
@@ -410,6 +415,7 @@
        @Provides @Singleton NullTicketService provideNullTicketService() {
            return new NullTicketService(
                    runtimeManager,
                    pluginManager,
                    notificationManager,
                    userManager,
                    repositoryManager);
@@ -418,6 +424,7 @@
        @Provides @Singleton FileTicketService provideFileTicketService() {
            return new FileTicketService(
                    runtimeManager,
                    pluginManager,
                    notificationManager,
                    userManager,
                    repositoryManager);
@@ -426,6 +433,7 @@
        @Provides @Singleton BranchTicketService provideBranchTicketService() {
            return new BranchTicketService(
                    runtimeManager,
                    pluginManager,
                    notificationManager,
                    userManager,
                    repositoryManager);
@@ -434,6 +442,7 @@
        @Provides @Singleton RedisTicketService provideRedisTicketService() {
            return new RedisTicketService(
                    runtimeManager,
                    pluginManager,
                    notificationManager,
                    userManager,
                    repositoryManager);
src/main/java/com/gitblit/ReindexTickets.java
@@ -139,13 +139,13 @@
            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);
src/main/java/com/gitblit/extensions/TicketHook.java
New file
@@ -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);
}
src/main/java/com/gitblit/tickets/BranchTicketService.java
@@ -58,6 +58,7 @@
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 BranchTicketService(
            IRuntimeManager runtimeManager,
            IPluginManager pluginManager,
            INotificationManager notificationManager,
            IUserManager userManager,
            IRepositoryManager repositoryManager) {
        super(runtimeManager,
                pluginManager,
                notificationManager,
                userManager,
                repositoryManager);
src/main/java/com/gitblit/tickets/FileTicketService.java
@@ -29,6 +29,7 @@
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 FileTicketService(
            IRuntimeManager runtimeManager,
            IPluginManager pluginManager,
            INotificationManager notificationManager,
            IUserManager userManager,
            IRepositoryManager repositoryManager) {
        super(runtimeManager,
                pluginManager,
                notificationManager,
                userManager,
                repositoryManager);
src/main/java/com/gitblit/tickets/ITicketService.java
@@ -35,7 +35,9 @@
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 @@
    protected final IRepositoryManager repositoryManager;
    protected final IPluginManager pluginManager;
    protected final TicketIndexer indexer;
    private final Cache<TicketKey, TicketModel> ticketsCache;
@@ -136,6 +140,7 @@
     */
    public ITicketService(
            IRuntimeManager runtimeManager,
            IPluginManager pluginManager,
            INotificationManager notificationManager,
            IUserManager userManager,
            IRepositoryManager repositoryManager) {
@@ -143,6 +148,7 @@
        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 @@
        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 @@
            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;
src/main/java/com/gitblit/tickets/NullTicketService.java
@@ -19,6 +19,7 @@
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 NullTicketService(
            IRuntimeManager runtimeManager,
            IPluginManager pluginManager,
            INotificationManager notificationManager,
            IUserManager userManager,
            IRepositoryManager repositoryManager) {
        super(runtimeManager,
                pluginManager,
                notificationManager,
                userManager,
                repositoryManager);
src/main/java/com/gitblit/tickets/RedisTicketService.java
@@ -32,6 +32,7 @@
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 RedisTicketService(
            IRuntimeManager runtimeManager,
            IPluginManager pluginManager,
            INotificationManager notificationManager,
            IUserManager userManager,
            IRepositoryManager repositoryManager) {
        super(runtimeManager,
                pluginManager,
                notificationManager,
                userManager,
                repositoryManager);
src/site/setup_plugins.mkd
@@ -111,6 +111,29 @@
}
```
### 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.
src/test/java/com/gitblit/tests/BranchTicketServiceTest.java
@@ -17,10 +17,12 @@
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 @@
        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();
src/test/java/com/gitblit/tests/FileTicketServiceTest.java
@@ -17,10 +17,12 @@
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 @@
        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();
src/test/java/com/gitblit/tests/RedisTicketServiceTest.java
@@ -18,10 +18,12 @@
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 @@
        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();