package org.infinispan.server.endpoint.deployments;

import static org.infinispan.server.endpoint.EndpointLogger.ROOT_LOGGER;

import org.infinispan.notifications.cachelistener.filter.CacheEventFilterFactory;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StopContext;

public final class FilterFactoryExtensionProcessor extends AbstractNamedFactoryExtensionProcessor<CacheEventFilterFactory> {

    public FilterFactoryExtensionProcessor(ServiceName extensionManagerServiceName) {
        super(extensionManagerServiceName);
    }

    @Override
    public Class<CacheEventFilterFactory> getServiceClass() {
        return CacheEventFilterFactory.class;
    }

    @Override
    public AbstractExtensionManagerService<CacheEventFilterFactory> createService(String name, CacheEventFilterFactory instance) {
        return new FilterFactoryService(name, instance);
    }

    private static final class FilterFactoryService extends AbstractExtensionManagerService<CacheEventFilterFactory> {

        private FilterFactoryService(String name, CacheEventFilterFactory filterFactory) {
            super(name, filterFactory);
        }

        @Override
        public void start(StartContext context) {
            ROOT_LOGGER.debugf("Started key-value filter service with name = %s", name);
            extensionManager.getValue().addFilterFactory(name, extension);
        }

        @Override
        public String getServiceTypeName() {
            return "key-value-filter-factory";
        }

        @Override
        public void stop(StopContext context) {
            ROOT_LOGGER.debugf("Stopped key-value filter service with name = %s", name);
            extensionManager.getValue().removeFilterFactory(name);
        }

        @Override
        public CacheEventFilterFactory getValue() {
            return extension;
        }
    }

}
