package com.atlassian.stash.internal.plugin;

import com.atlassian.bitbucket.auth.*;
import com.atlassian.bitbucket.ssh.command.SshCommandFactoryModuleDescriptor;
import com.atlassian.crowd.plugin.descriptors.PasswordEncoderModuleDescriptor;
import com.atlassian.markup.renderer.MarkupRendererComponentModuleDescriptor;
import com.atlassian.plugin.hostcontainer.HostContainer;
import com.atlassian.plugin.osgi.factory.descriptor.ComponentImportModuleDescriptor;
import com.atlassian.plugin.osgi.factory.descriptor.ComponentModuleDescriptor;
import com.atlassian.plugin.osgi.factory.descriptor.ModuleTypeModuleDescriptor;
import com.atlassian.plugin.schema.descriptor.DescribedModuleDescriptorFactory;
import com.atlassian.plugin.schema.impl.DefaultDescribedModuleDescriptorFactory;
import com.atlassian.plugin.servlet.descriptors.ServletContextListenerModuleDescriptor;
import com.atlassian.plugin.servlet.descriptors.ServletContextParamModuleDescriptor;
import com.atlassian.plugin.servlet.descriptors.ServletFilterModuleDescriptor;
import com.atlassian.plugin.servlet.descriptors.ServletModuleDescriptor;
import com.atlassian.plugin.spring.AvailableToPlugins;
import com.atlassian.plugin.web.descriptors.WebItemProviderModuleDescriptor;
import com.atlassian.plugin.web.descriptors.WebPanelRendererModuleDescriptor;
import com.atlassian.plugin.web.descriptors.WebSectionProviderModuleDescriptor;
import com.atlassian.plugin.webresource.WebResourceModuleDescriptor;
import com.atlassian.plugin.webresource.transformer.UrlReadingWebResourceTransformerModuleDescriptor;
import com.atlassian.plugins.client.resource.ClientResourceModuleDescriptor;
import com.atlassian.plugins.shortcuts.api.KeyboardShortcutModuleDescriptor;
import com.atlassian.soy.renderer.SoyFunctionModuleDescriptor;
import com.atlassian.bitbucket.home.HomeUpdateHandlerModuleDescriptor;
import com.atlassian.bitbucket.hook.PostReceiveHookModuleDescriptor;
import com.atlassian.bitbucket.hook.PreReceiveHookModuleDescriptor;
import com.atlassian.bitbucket.idx.CommitIndexerModuleDescriptor;
import com.atlassian.bitbucket.idx.CommitPropertyConfigurationModuleDescriptor;
import com.atlassian.stash.internal.plugin.web.fragments.*;
import com.atlassian.bitbucket.scm.ScmModuleDescriptor;
import com.atlassian.bitbucket.scm.ScmProtocolModuleDescriptor;
import com.atlassian.bitbucket.scm.ScmRequestCheckModuleDescriptor;
import com.atlassian.bitbucket.scm.http.HttpScmRequestHandlerModuleDescriptor;
import com.atlassian.bitbucket.scm.pull.MergeRequestCheckModuleDescriptor;
import com.atlassian.bitbucket.scm.ssh.SshScmRequestHandlerModuleDescriptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@AvailableToPlugins(DescribedModuleDescriptorFactory.class)
@Component("moduleDescriptorFactory")
public class StashModuleDescriptorFactory extends DefaultDescribedModuleDescriptorFactory {

    @Autowired
    public StashModuleDescriptorFactory(final HostContainer hostContainer) {
        super(hostContainer);

        addModuleDescriptor("client-resource", ClientResourceModuleDescriptor.class);
        addModuleDescriptor("component", ComponentModuleDescriptor.class);
        addModuleDescriptor("component-import", ComponentImportModuleDescriptor.class);
        addModuleDescriptor("encoder", PasswordEncoderModuleDescriptor.class);
        addModuleDescriptor("module-type", ModuleTypeModuleDescriptor.class);
        addModuleDescriptor("servlet", ServletModuleDescriptor.class);
        addModuleDescriptor("servlet-filter", ServletFilterModuleDescriptor.class);
        addModuleDescriptor("servlet-context-param", ServletContextParamModuleDescriptor.class);
        addModuleDescriptor("servlet-context-listener", ServletContextListenerModuleDescriptor.class);
        addModuleDescriptor("url-reading-web-resource-transformer", UrlReadingWebResourceTransformerModuleDescriptor.class);
        addModuleDescriptor("web-item-provider", WebItemProviderModuleDescriptor.class);
        addModuleDescriptor("web-section-provider", WebSectionProviderModuleDescriptor.class);
        addModuleDescriptor("web-resource", WebResourceModuleDescriptor.class);
        addModuleDescriptor("web-resource-transformer", RequestCachingWebResourceTransformerModuleDescriptor.class);

        addModuleDescriptor(ClientWebItemModuleDescriptor.XML_ELEMENT_NAME, ClientWebItemModuleDescriptor.class);
        addModuleDescriptor(ClientWebPanelModuleDescriptor.XML_ELEMENT_NAME, ClientWebPanelModuleDescriptor.class);
        addModuleDescriptor(ClientWebSectionModuleDescriptor.XML_ELEMENT_NAME, ClientWebSectionModuleDescriptor.class);
        addModuleDescriptor(CommentPropertyProviderDescriptor.XML_ELEMENT_NAME, CommentPropertyProviderDescriptor.class);
        addModuleDescriptor(CommitIndexerModuleDescriptor.XML_ELEMENT_NAME, CommitIndexerModuleDescriptor.class);
        addModuleDescriptor(CommitPropertyConfigurationModuleDescriptor.XML_ELEMENT_NAME, CommitPropertyConfigurationModuleDescriptor.class);
        addModuleDescriptor(DefaultPageDataProviderModuleDescriptor.XML_ELEMENT_NAME, DefaultPageDataProviderModuleDescriptor.class);
        addModuleDescriptor(FormFragmentModuleDescriptor.XML_ELEMENT_NAME, FormFragmentModuleDescriptor.class);
        addModuleDescriptor(HomeUpdateHandlerModuleDescriptor.XML_ELEMENT_NAME, HomeUpdateHandlerModuleDescriptor.class);
        addModuleDescriptor(HttpAuthenticationHandlerModuleDescriptor.XML_ELEMENT_NAME, HttpAuthenticationHandlerModuleDescriptor.class);
        addModuleDescriptor(HttpAuthenticationFailureHandlerModuleDescriptor.XML_ELEMENT_NAME, HttpAuthenticationFailureHandlerModuleDescriptor.class);
        addModuleDescriptor(HttpAuthenticationSuccessHandlerModuleDescriptor.XML_ELEMENT_NAME, HttpAuthenticationSuccessHandlerModuleDescriptor.class);
        addModuleDescriptor(HttpScmRequestHandlerModuleDescriptor.XML_ELEMENT_NAME, HttpScmRequestHandlerModuleDescriptor.class);
        addModuleDescriptor(JsonRendererModuleDescriptor.XML_ELEMENT_NAME, JsonRendererModuleDescriptor.class);
        addModuleDescriptor(KeyboardShortcutModuleDescriptor.XML_ELEMENT_NAME, KeyboardShortcutModuleDescriptor.class);
        addModuleDescriptor(LanguageModuleDescriptor.XML_ELEMENT_NAME, LanguageModuleDescriptor.class);
        addModuleDescriptor(MarkupRendererComponentModuleDescriptor.XML_ELEMENT_NAME, MarkupRendererComponentModuleDescriptor.class);
        addModuleDescriptor(MergeRequestCheckModuleDescriptor.XML_ELEMENT_NAME, MergeRequestCheckModuleDescriptor.class);
        addModuleDescriptor(NotificationHandlerModuleDescriptor.XML_ELEMENT_NAME, NotificationHandlerModuleDescriptor.class);
        addModuleDescriptor(PostReceiveHookModuleDescriptor.XML_ELEMENT_NAME, PostReceiveHookModuleDescriptor.class);
        addModuleDescriptor(PreReceiveHookModuleDescriptor.XML_ELEMENT_NAME, PreReceiveHookModuleDescriptor.class);
        addModuleDescriptor(PullRequestMergeabilityPropertyProviderDescriptor.XML_ELEMENT_NAME, PullRequestMergeabilityPropertyProviderDescriptor.class);
        addModuleDescriptor(PullRequestPropertyProviderDescriptor.XML_ELEMENT_NAME, PullRequestPropertyProviderDescriptor.class);
        addModuleDescriptor(RefMetadataProviderModuleDescriptor.XML_ELEMENT_NAME, RefMetadataProviderModuleDescriptor.class);
        addModuleDescriptor(RepositoryHookModuleDescriptor.XML_ELEMENT_NAME, RepositoryHookModuleDescriptor.class);
        addModuleDescriptor(ScmModuleDescriptor.XML_ELEMENT_NAME, ScmModuleDescriptor.class);
        addModuleDescriptor(ScmRequestCheckModuleDescriptor.XML_ELEMENT_NAME, ScmRequestCheckModuleDescriptor.class);
        addModuleDescriptor(ScmProtocolModuleDescriptor.XML_ELEMENT_NAME, ScmProtocolModuleDescriptor.class);
        addModuleDescriptor(SoyFunctionModuleDescriptor.XML_ELEMENT_NAME, SoyFunctionModuleDescriptor.class);
        addModuleDescriptor(SshAuthenticationHandlerModuleDescriptor.XML_ELEMENT_NAME, SshAuthenticationHandlerModuleDescriptor.class);
        addModuleDescriptor(SshAuthenticationFailureHandlerModuleDescriptor.XML_ELEMENT_NAME, SshAuthenticationFailureHandlerModuleDescriptor.class);
        addModuleDescriptor(SshAuthenticationSuccessHandlerModuleDescriptor.XML_ELEMENT_NAME, SshAuthenticationSuccessHandlerModuleDescriptor.class);
        addModuleDescriptor(SshCommandFactoryModuleDescriptor.XML_ELEMENT_NAME, SshCommandFactoryModuleDescriptor.class);
        addModuleDescriptor(SshScmRequestHandlerModuleDescriptor.XML_ELEMENT_NAME, SshScmRequestHandlerModuleDescriptor.class);
        addModuleDescriptor(StashWebItemModuleDescriptor.XML_ELEMENT_NAME, StashWebItemModuleDescriptor.class);
        addModuleDescriptor(StashWebPanelModuleDescriptor.XML_ELEMENT_NAME, StashWebPanelModuleDescriptor.class);
        addModuleDescriptor(StashWebSectionModuleDescriptor.XML_ELEMENT_NAME, StashWebSectionModuleDescriptor.class);
        addModuleDescriptor(WebFragmentLocationModuleDescriptor.XML_ELEMENT_NAME, WebFragmentLocationModuleDescriptor.class);
        addModuleDescriptor(WebPanelRendererModuleDescriptor.XML_ELEMENT_NAME, WebPanelRendererModuleDescriptor.class);
    }
}
