/*
 * @(#)RegulationDispatchModuleInitializer.java
 *
 * Copyright 2011 Instituto Superior Tecnico
 * Founding Authors: Anil Kassamali
 * 
 *      https://fenix-ashes.ist.utl.pt/
 * 
 *   This file is part of the Dispatch Registry Module.
 *
 *   The Dispatch Registry Module is free software: you can
 *   redistribute it and/or modify it under the terms of the GNU Lesser General
 *   Public License as published by the Free Software Foundation, either version 
 *   3 of the License, or (at your option) any later version.
 *
 *   The Dispatch Registry Module 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 Lesser General Public License for more details.
 *
 *   You should have received a copy of the GNU Lesser General Public License
 *   along with the Dispatch Registry Module. If not, see .
 * 
 */
package module.regulation.dispatch.domain;
import module.regulation.dispatch.domain.metaType.MetaTypeFactory;
import pt.ist.bennu.core.domain.MyOrg;
import pt.ist.fenixWebFramework.services.Service;
/**
 * 
 * @author Anil Kassamali
 * 
 */
public class RegulationDispatchModuleInitializer extends RegulationDispatchModuleInitializer_Base {
    private static boolean isInitialized = false;
    private static ThreadLocal init = null;
    public static RegulationDispatchModuleInitializer getInstance() {
        if (init != null) {
            return init.get();
        }
        if (!isInitialized) {
            initialize();
        }
        final MyOrg myOrg = MyOrg.getInstance();
        return myOrg.getRegulationDispatchModuleInitializer();
    }
    @Service
    public synchronized static void initialize() {
        if (!isInitialized) {
            try {
                final MyOrg myOrg = MyOrg.getInstance();
                final RegulationDispatchModuleInitializer initializer = myOrg.getRegulationDispatchModuleInitializer();
                if (initializer == null) {
                    new RegulationDispatchModuleInitializer();
                }
                init = new ThreadLocal();
                init.set(myOrg.getRegulationDispatchModuleInitializer());
                isInitialized = true;
            } finally {
                init = null;
            }
        }
    }
    private RegulationDispatchModuleInitializer() {
        super();
        setMyOrg(MyOrg.getInstance());
    }
    @Override
    public void init(MyOrg root) {
        RegulationDispatchSystem system = RegulationDispatchSystem.getInstance();
        if (!system.hasMetaType()) {
            MetaTypeFactory.createMetaType();
        }
    }
}