/*
 * ProActive Parallel Suite(TM):
 * The Open Source library for parallel and distributed
 * Workflows & Scheduling, Orchestration, Cloud Automation
 * and Big Data Analysis on Enterprise Grids & Clouds.
 *
 * Copyright (c) 2007 - 2017 ActiveEon
 * Contact: [email protected]
 *
 * This library is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation: version 3 of
 * the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 * If needed, contact us to obtain a release under GPL Version 2 or 3
 * or a different license than the AGPL.
 */
package org.ow2.proactive.scheduler.common.job.factories.spi;

import java.util.Iterator;

import javax.imageio.spi.ServiceRegistry;

import org.apache.log4j.Logger;

import com.google.common.collect.ImmutableMap;


public class JobValidatorRegistry {

    private static final Logger logger = Logger.getLogger(JobValidatorRegistry.class);

    protected static ImmutableMap<String, JobValidatorService> jobValidators;

    private JobValidatorRegistry() {
        load();
    }

    public void load() {
        Iterator<JobValidatorService> loadedFactories = ServiceRegistry.lookupProviders(JobValidatorService.class);
        ImmutableMap.Builder<String, JobValidatorService> mapBuilder = new ImmutableMap.Builder();
        while (loadedFactories.hasNext()) {
            try {
                JobValidatorService validator = loadedFactories.next();
                String validatorID = validator.getClass().getCanonicalName();

                logger.debug("Job Validator Factory provider <" + validatorID + "> found");
                mapBuilder.put(validatorID, validator);
            } catch (Exception err) {
                logger.error("Failed to load job validator factory: " + err);
            }
        }
        jobValidators = mapBuilder.build();
        if (logger.isInfoEnabled()) {
            logger.info("[JobValidatorRegistry] job validators registered : " + jobValidators.keySet());
        }
    }

    private static class LazyHolder {
        private LazyHolder() {
            //empty
        }

        private static final JobValidatorRegistry INSTANCE = new JobValidatorRegistry();
    }

    public static synchronized JobValidatorRegistry getInstance() {
        return LazyHolder.INSTANCE;
    }

    public ImmutableMap<String, JobValidatorService> getRegisteredFactories()
            throws IllegalAccessException, InstantiationException {
        return jobValidators;
    }
}