de.devsurf.injection.guice.integrations.commons.configuration.CommonsConfigurationFeature.java Source code

Java tutorial

Introduction

Here is the source code for de.devsurf.injection.guice.integrations.commons.configuration.CommonsConfigurationFeature.java

Source

/**
 * Copyright (C) 2010 Daniel Manzke <daniel.manzke@googlemail.com>
 *
 * Licensed 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 de.devsurf.injection.guice.integrations.commons.configuration;

import java.io.File;
import java.lang.annotation.Annotation;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.inject.Named;
import javax.inject.Singleton;

import de.devsurf.injection.guice.install.BindingStage;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.FileConfiguration;

import de.devsurf.injection.guice.configuration.Configuration;
import de.devsurf.injection.guice.scanner.features.BindingScannerFeature;

/**
 * This Class will be called for each Class, which is annotated with
 * {@link Configuration} and which needs an Apache Commons-based Configuration.
 * 
 * @author Daniel Manzke
 * 
 */
@Singleton
public class CommonsConfigurationFeature extends BindingScannerFeature {
    private Logger _logger = Logger.getLogger(CommonsConfigurationFeature.class.getName());

    @Override
    public BindingStage accept(Class<Object> annotatedClass, Map<String, Annotation> annotations) {
        if (annotations.containsKey(Configuration.class.getName())) {
            Configuration config = (Configuration) annotations.get(Configuration.class.getName());
            if (FileConfiguration.class.isAssignableFrom(config.to())) {
                return BindingStage.BOOT_BEFORE;
            }
        }
        return BindingStage.IGNORE;
    }

    @SuppressWarnings("unchecked")
    @Override
    public void process(Class<Object> annotatedClass, Map<String, Annotation> annotations) {
        Configuration config = (Configuration) annotations.get(Configuration.class.getName());
        Named name = config.name();

        // TODO Implement Location overriding
        URL url;
        switch (config.location().type()) {
        case FILE:
            File file = new File(config.location().value());
            if (!file.exists()) {
                _logger.log(Level.WARNING, "Ignoring Configuration " + name + " in " + config.location()
                        + ". In the Path " + file.getAbsolutePath() + " no Configuration was found.");
                return;
            }
            try {
                url = file.toURI().toURL();
            } catch (MalformedURLException e) {
                _logger.log(Level.WARNING, "Ignoring Configuration " + name + " in " + config.location()
                        + ". It has an illegal URL-Format.", e);
                return;
            }
            break;
        case URL:
            try {
                url = new URL(config.location().value());
            } catch (MalformedURLException e) {
                _logger.log(Level.WARNING, "Ignoring Configuration " + name + " in " + config.location()
                        + ". It has an illegal URL-Format.", e);
                return;
            }
            break;
        case CLASSPATH:
        default:
            url = this.getClass().getResource(config.location().value());
            break;
        }

        if (url == null) {
            _logger.log(Level.WARNING, "Ignoring Configuration " + name + " in " + config.location()
                    + ", because is couldn't be found in the Classpath.");
            // TODO Throw an exception if config doesn't exist?
            return;
        }

        Named named = null;
        if (name.value().length() > 0) {
            named = name;
        }

        FileConfiguration configuration;
        try {
            // Class<? extends FileConfiguration> interf =
            // config.to().asSubclass(FileConfiguration.class);
            Class<FileConfiguration> interf = (Class<FileConfiguration>) config.to();
            configuration = (FileConfiguration) injector.getInstance(interf);
            configuration.load(url);

            bindInstance(configuration, interf, named, null);
            bindInstance(configuration, FileConfiguration.class, named, null);
            bindInstance(configuration, org.apache.commons.configuration.Configuration.class, named, null);
        } catch (ConfigurationException e) {
            _logger.log(Level.WARNING, "Configuration " + name + " couldn't be loaded/bound: " + e.getMessage(), e);
        }
    }
}