Package org.lilyproject.server.modules.repository

Source Code of org.lilyproject.server.modules.repository.RepositoryDecoratorActivator

/*
* Copyright 2012 NGDATA nv
*
* 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 org.lilyproject.server.modules.repository;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.lilyproject.plugin.PluginHandle;
import org.lilyproject.plugin.PluginRegistry;
import org.lilyproject.plugin.PluginUser;
import org.lilyproject.repository.api.Repository;
import org.lilyproject.repository.spi.RepositoryDecoratorFactory;
import org.lilyproject.runtime.conf.Conf;

/**
* Applies all the RepositoryDecorators to a Repository.
*/
public class RepositoryDecoratorActivator implements PluginUser<RepositoryDecoratorFactory> {
    private PluginRegistry pluginRegistry;
    private Map<String, RepositoryDecoratorFactory> decorators = new HashMap<String, RepositoryDecoratorFactory>();
    private List<String> configuredDecorators = new ArrayList<String>();
    private Log log = LogFactory.getLog(getClass());

    public RepositoryDecoratorActivator(PluginRegistry pluginRegistry, Conf conf) {
        this.pluginRegistry = pluginRegistry;

        for (Conf decoratorConf : conf.getChild("decorators").getChildren("decorator")) {
            configuredDecorators.add(decoratorConf.getValue());
        }
    }

    @PostConstruct
    public void init() {
        pluginRegistry.setPluginUser(RepositoryDecoratorFactory.class, this);
    }

    @PreDestroy
    public void destroy() {
        pluginRegistry.unsetPluginUser(RepositoryDecoratorFactory.class, this);
    }

    @Override
    public void pluginAdded(PluginHandle<RepositoryDecoratorFactory> pluginHandle) {
        decorators.put(pluginHandle.getName(), pluginHandle.getPlugin());
    }

    @Override
    public void pluginRemoved(PluginHandle<RepositoryDecoratorFactory> pluginHandle) {
    }

    public RepositoryDecoratorChain getDecoratedRepository(Repository repository) {
        // We don't use all the registered decorator plugins, but only those the user
        // activated through the configuration, and in the order specified in the
        // configuration

        log.info("The active repository decorators are: " + configuredDecorators);

        RepositoryDecoratorChain chain = new RepositoryDecoratorChain();

        Repository nextInChain = repository;
        chain.addEntryAtStart(RepositoryDecoratorChain.UNDECORATED_REPOSITORY_KEY, nextInChain);

        for (int i = configuredDecorators.size() - 1; i >=0; i--) {
            String decoratorName = configuredDecorators.get(i);
            RepositoryDecoratorFactory factory = decorators.get(decoratorName);
            if (factory == null) {
                throw new RuntimeException("No repository decorator registered with the name '" + decoratorName + "'");
            }
            nextInChain = factory.createInstance(nextInChain);
            chain.addEntryAtStart(decoratorName, nextInChain);
        }

        return chain;
    }

}
TOP

Related Classes of org.lilyproject.server.modules.repository.RepositoryDecoratorActivator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.