org.openlmis.fulfillment.extension.ExtensionManager.java Source code

Java tutorial

Introduction

Here is the source code for org.openlmis.fulfillment.extension.ExtensionManager.java

Source

/*
 * This program is part of the OpenLMIS logistics management information system platform software.
 * Copyright  2017 VillageReach
 *
 * This program 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, either
 * version 3 of the License, or (at your option) any later version.
 * 
 * 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. For additional information contact info@OpenLMIS.org.
 */

package org.openlmis.fulfillment.extension;

import lombok.Getter;
import lombok.Setter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * Class responsible for returning the right implementation of extension point.
 */
@Component
public class ExtensionManager {

    private static final String EXTENSIONS_DIR = "/extensions";
    private static final String CONFIG_FILE = "extensions.properties";
    private static final Logger LOGGER = LoggerFactory.getLogger(ExtensionManager.class);

    @Autowired
    private ApplicationContext appContext;

    @Getter
    @Setter
    private HashMap<String, String> extensions = new HashMap<String, String>();

    /**
     * Returns implementation of an extension with given id (based on config file) and class.
     * If mapping doesn't exist, returns one of given class (default).
     *
     * @param pointId id of extension point
     * @param pointClass class of extension point
     * @return extension point
     */
    public <T> T getExtension(String pointId, Class<T> pointClass) throws ExtensionException {
        T extensionPoint;
        String extensionId = extensions.get(pointId);
        try {
            if (extensionId != null) {
                extensionPoint = appContext.getBean(extensionId, pointClass);
            } else {
                extensionPoint = appContext.getBean(pointClass);
            }
        } catch (NoSuchBeanDefinitionException ex) {
            throw new ExtensionException(
                    "It was not possible to find an extension with id " + extensionId + " or " + pointClass, ex);
        }
        return extensionPoint;
    }

    @PostConstruct
    private void loadConfigurationFile() {
        Properties prop = new Properties();
        try {
            prop.load(new FileInputStream(new File(EXTENSIONS_DIR, CONFIG_FILE)));
            for (final Map.Entry<Object, Object> entry : prop.entrySet()) {
                extensions.put((String) entry.getKey(), (String) entry.getValue());
            }
        } catch (IOException ex) {
            LOGGER.debug("It was not possible to load extensions" + " configuration from extension.properties file",
                    ex);
        }
    }
}