## Extension Points

Gitblit offers several extension points for enhancing and customizing it's runtime behavior.

Each available extension point has a sample implementation in the [gitblit-cookbook-plugin (Maven project)](https://github.com/gitblit/gitblit-cookbook-plugin).

**NOTE:**
Gitblit does not yet offer a comprehensize dependency injection architecture.  This will be addressed in a subsequent release.  For now you may access all of Gitblit's core managers through a static singleton app context:

```java
import com.gitblit.extensions.GitblitPlugin;
import com.gitblit.servlet.GitblitContext;
import com.gitblit.manager.IRuntimeManager;
import com.gitblit.manager.IUserManager;
import com.gitblit.manager.IAuthenticationManager;
import com.gitblit.manager.INotificationManager;
import com.gitblit.manager.IRepositoryManager;
import com.gitblit.manager.IProjectManager;
import com.gitblit.manager.IFederationManager;
import com.gitblit.manager.IPluginManager;
import com.gitblit.manager.IGitblit;
import ro.fortsoft.pf4j.Version;

public class ExamplePlugin extends GitblitPlugin {

    @Override
    public void start() {
        IRuntimeManager runtime = GitblitContext.getManager(IRuntimeManager.class);
        IUserManager users = GitblitContext.getManager(IUserManager.class);
        IAuthenticationManager auth = GitblitContext.getManager(IAuthenticationManager.class);
        INotificationManager notifications = GitblitContext.getManager(INotificationManager.class);
        IRepositoryManager repos = GitblitContext.getManager(IRepositoryManager.class);
        IProjectManager projects = GitblitContext.getManager(IProjectManager.class);
        IFederationManager federation = GitblitContext.getManager(IFederationManager.class);
        IPluginManager plugins = GitblitContext.getManager(IPluginManager.class);
        IGitblit gitblit = GitblitContext.getManager(IGitblit.class);
    }

    @Override
    public void stop() {
    }

    @Override
    public void onInstall() {
    }

    @Override
    public void onUpgrade(Version oldVersion) {
    }

    @Override
    public void onUninstall() {
    }
}

/**
 * You can also create Webapp plugins that register pages.
 */
public class ExampleWicketPlugin extends GitblitWicketPlugin {
    @Override
    public void start() {
    }

    @Override
    public void stop() {
    }

    @Override
    public void onInstall() {
    }

    @Override
    public void onUpgrade(Version oldVersion) {
    }

    @Override
    public void onUninstall() {
    }

    @Override
    protected void init(GitblitWicketApp app) {
        app.mount("/logo", LogoPage.class);
        app.mount("/hello", HelloWorldPage.class);
    }
}
```

### SSH Dispatch Command

*SINCE 1.5.0*

You can provide your own custom SSH command hierarchies by subclassing the *DispatchCommand* class.

```java
import ro.fortsoft.pf4j.Extension;
import org.kohsuke.args4j.Option;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.gitblit.transport.ssh.commands.CommandMetaData;
import com.gitblit.transport.ssh.commands.DispatchCommand;
import com.gitblit.transport.ssh.commands.UsageExample;

@Extension
@CommandMetaData(name = "mycommands", description = "Sample SSH dispatcher")
public class MyDispatcher extends DispatchCommand {

    @Override
    protected void setup() {
        // commands in this dispatcher
        register(CommandA.class);
        register(CommandB.class);

        // nested dispatchers
        register(SubDispatcher1.class);
        register(SubDispatcher2.class);
    }

    @CommandMetaData(name = "commanda", aliases = { "ca" }, description = "description of command a")
    @UsageExample(syntax = "${cmd} --myflag", description = "description of commanda with --myflag")
    public static class CommandA extends SshCommand {

        protected final Logger log = LoggerFactory.getLogger(getClass());

        @Option(name = "--myflag", aliases = { "-m" }, usage = "enable myflag")
        boolean myflag;

        @Override
        public void run() throws Failure {
            if (myflag) {
                log.info("Run with --myflag");
            } else {
                log.info("Run without --myflag");
            }
        }
    }
}
```

### Pre- and Post- Receive Hook

*SINCE 1.5.0*

You can provide your own custom pre and/or post receive hooks by subclassing the *ReceiveHook* class.

```java
import com.gitblit.extensions.ReceiveHook;
import java.util.Collection;
import org.eclipse.jgit.transport.ReceiveCommand;
import ro.fortsoft.pf4j.Extension;

@Extension
public class MyReceiveHook extends ReceiveHook {

    @Override
    public void onPreReceive(GitblitReceivePack receivePack, Collection<ReceiveCommand> commands) {
    }

    @Override
    public void onPostReceive(GitblitReceivePack receivePack, Collection<ReceiveCommand> commands) {
    }
}

```

### Patchset Hook

*SINCE 1.5.0*

You can provide your own custom patchset hook by subclassing the *PatchsetHook* class.

```java
import com.gitblit.extensions.PatchsetHook;
import com.gitblit.models.TicketModel;
import ro.fortsoft.pf4j.Extension;

@Extension
public class MyPatchsetHook extends PatchsetHook {

    @Override
    public void onNewPatchset(TicketModel ticket) {
    }

    @Override
    public void onUpdatePatchset(TicketModel ticket) {
    }

    @Override
    public void onMergePatchset(TicketModel ticket) {
    }
}
```

### Ticket Hook

*SINCE 1.5.0*

You can provide your own custom ticket hook by subclassing 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) {
    }
}
```

### Request Filter

*SINCE 1.6.0*

You can provide your own custom request filter by subclassing the *HttpRequestFilter* class.

```java
import com.gitblit.extensions.HttpRequestFilter;
import ro.fortsoft.pf4j.Extension;

@Extension
public class MyRequestFilter extends HttpRequestFilter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
    }
}
```

### User Menu Items

*SINCE 1.6.0*

You can provide your own user menu items by subclassing the *UserMenuExtension* class.

```java
import java.util.Arrays;
import java.util.List;
import ro.fortsoft.pf4j.Extension;
import com.gitblit.extensions.UserMenuExtension;
import com.gitblit.models.Menu.ExternalLinkMenuItem;
import com.gitblit.models.Menu.MenuItem;
import com.gitblit.models.UserModel;

@Extension
public class MyUserMenuContributor extends UserMenuExtension {

    @Override
    public List<MenuItem> getMenuItems(UserModel user) {
        MenuItem item = new ExternalLinkMenuItem("Github", String.format("https://github.com/%s", user.username));
        return Arrays.asList(item);
    }
}
```

### Navigation Links

*SINCE 1.6.0*

You can provide your own top-level navigation links by subclassing the *NavLinkExtension* class.

```java
import java.util.Arrays;
import java.util.List;
import ro.fortsoft.pf4j.Extension;
import com.gitblit.extensions.NavLinkExtension;
import com.gitblit.models.UserModel;

@Extension
public class MyNavLink extends NavLinkExtension {

    @Override
    public List<NavLink> getNavLinks(UserModel user) {
        NavLink link = new ExternalLinkMenuItem("Github", String.format("https://github.com/%s", user.username));
        return Arrays.asList(link);
    }
}
```

### Server Lifecycle Listener

*SINCE 1.6.0*

You can provide a lifecycle listener to be notified when Gitblit has completely started and just before Gitblit is gracefully terminated.

```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.fortsoft.pf4j.Extension;
import com.gitblit.extensions.LifeCycleListener;

@Extension
public class MyLifeCycleListener extends LifeCycleListener {

    final Logger log = LoggerFactory.getLogger(getClass());
    
    @Override
    public void onStartup() {
    	log.info("Gitblit is Ready!!");
    }

    @Override
    public void onShutdown() {
    	log.info("Gitblit is Going Down!!");
    }
}
```

### Repository Lifecycle Listener

*SINCE 1.6.0*

You can provide a lifecycle listener to be notified when Gitblit has created or deleted a repository.

```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.fortsoft.pf4j.Extension;
import com.gitblit.extensions.RepositoryLifeCycleListener;
import com.gitblit.models.RepositoryModel;

@Extension
public class MyRepoLifeCycleListener extends RepositoryLifeCycleListener {

    final Logger log = LoggerFactory.getLogger(getClass());
    
    @Override
    public void onCreation(RepositoryModel repo) {
    	log.info("Gitblit created {}", repo);
    }

    @Override
    public void onDeletion(RepositoryModel repo) {
    	log.info("Gitblit deleted {}", repo);
    }
}
```

### User/Team Lifecycle Listener

*SINCE 1.6.0*

You can provide a lifecycle listener to be notified when Gitblit has created or deleted a user or a team.

```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.fortsoft.pf4j.Extension;
import com.gitblit.extensions.UserTeamLifeCycleListener;
import com.gitblit.models.TeamModel;
import com.gitblit.models.UserModel;

@Extension
public class MyUserTeamLifeCycleListener extends UserTeamLifeCycleListener {

    final Logger log = LoggerFactory.getLogger(getClass());
    
    @Override
    public void onCreation(UserModel user) {
    	log.info("Gitblit created user {}", user);
    }

    @Override
    public void onDeletion(UserModel user) {
    	log.info("Gitblit deleted user {}", user);
    }

    @Override
    public void onCreation(TeamModel team) {
    	log.info("Gitblit created team {}", team);
    }

    @Override
    public void onDeletion(TeamModel team) {
    	log.info("Gitblit deleted team {}", team);
    }
}
```
