org.eclipselabs.spray.xtext.util.Modules3.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipselabs.spray.xtext.util.Modules3.java

Source

/** ****************************************************************************
 * Copyright (c)  The Spray Project.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Spray Dev Team - initial API and implementation
 **************************************************************************** */
package org.eclipselabs.spray.xtext.util;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.xtext.util.Modules2;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.inject.Module;

public class Modules3 {
    private static final String EXTPOINT_OVERRIDING_MODULE = "org.eclipselabs.spray.runtime.xtext.overridingGuiceModule";
    private static final Log LOG = LogFactory.getLog(Modules3.class);

    public static Module mixin(Module... m) {
        List<Module> modules = new ArrayList<Module>(m.length);
        ListMultimap<String, Module> modulesMap = getOverrideModuleMap();

        for (Module module : m) {
            modules.add(module);
            for (Module overrideModule : modulesMap.get(module.getClass().getName())) {
                LOG.debug("Overriding Module " + module.getClass().getName() + " with "
                        + overrideModule.getClass().getName());
                modules.add(overrideModule);
            }
        }
        return Modules2.mixin(modules.toArray(m));
    }

    private static ListMultimap<String, Module> getOverrideModuleMap() {
        ListMultimap<String, Module> modulesMap = ArrayListMultimap.create();
        IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(EXTPOINT_OVERRIDING_MODULE);
        IExtension[] extensions = point.getExtensions();
        if (extensions.length != 0) {
            for (IExtension iExtension : extensions) {
                IConfigurationElement[] elements = iExtension.getConfigurationElements();
                for (IConfigurationElement e : elements) {
                    try {
                        Module m = (Module) e.createExecutableExtension("class");
                        String overriddenModuleClass = e.getAttribute("overrides");
                        modulesMap.put(overriddenModuleClass, m);
                    } catch (CoreException e1) {
                        LOG.error(e1.getMessage());
                    }
                }
            }
        }
        return modulesMap;
    }
}