/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.ignite.internal.processors.subscription;

import java.util.ArrayList;
import java.util.List;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.processors.GridProcessorAdapter;
import org.apache.ignite.internal.processors.cache.persistence.DatabaseLifecycleListener;
import org.apache.ignite.internal.processors.cache.persistence.metastorage.MetastorageLifecycleListener;
import org.jetbrains.annotations.NotNull;

/**
 * Processor enables grid components to register listeners for events
 * generated by other components on local node.
 *
 * It starts very first during node startup procedure so any components could use it.
 *
 * As only local events are supported, no network communication occurs during notification process.
 */
public class GridInternalSubscriptionProcessor extends GridProcessorAdapter {
    /** */
    private List<MetastorageLifecycleListener> metastorageListeners = new ArrayList<>();

    /** */
    private List<DatabaseLifecycleListener> databaseListeners = new ArrayList<>();


    /**
     * @param ctx Kernal context.
     */
    public GridInternalSubscriptionProcessor(GridKernalContext ctx) {
        super(ctx);
    }

    /** */
    public void registerMetastorageListener(@NotNull MetastorageLifecycleListener metastorageListener) {
        if (metastorageListener == null)
            throw new NullPointerException("Metastorage subscriber should be not-null.");

        metastorageListeners.add(metastorageListener);
    }

    /** */
    public List<MetastorageLifecycleListener> getMetastorageSubscribers() {
        return metastorageListeners;
    }

    /** */
    public void registerDatabaseListener(@NotNull DatabaseLifecycleListener databaseListener) {
        if (databaseListener == null)
            throw new NullPointerException("Database subscriber should be not-null.");

        databaseListeners.add(databaseListener);
    }

    /** */
    public List<DatabaseLifecycleListener> getDatabaseListeners() {
        return databaseListeners;
    }
}
