/** * Copyright (C) 2010 STMicroelectronics * * This file is part of "Mind Compiler" 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. * * 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 Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Contact: mind@ow2.org * * Authors: Matthieu Leclercq * Contributors: */ package org.ow2.mind; import java.io.PrintStream; import org.antlr.stringtemplate.StringTemplateGroupLoader; import org.objectweb.fractal.adl.Loader; import org.objectweb.fractal.adl.NodeFactory; import org.objectweb.fractal.adl.merger.NodeMerger; import org.objectweb.fractal.adl.xml.XMLNodeFactory; import org.ow2.mind.annotation.AnnotationChecker; import org.ow2.mind.annotation.AnnotationFactory; import org.ow2.mind.annotation.AnnotationLocator; import org.ow2.mind.annotation.AnnotationValueEvaluator; import org.ow2.mind.annotation.BasicAnnotationChecker; import org.ow2.mind.annotation.BasicAnnotationFactory; import org.ow2.mind.annotation.BasicAnnotationLocator; import org.ow2.mind.error.ErrorManager; import org.ow2.mind.error.StreamErrorManager; import org.ow2.mind.inject.AbstractMindModule; import org.ow2.mind.st.STNodeFactoryImpl; import org.ow2.mind.st.STNodeMergerImpl; import org.ow2.mind.st.StringTemplateComponentLoader; import org.ow2.mind.st.XMLSTNodeFactoryImpl; import org.ow2.mind.st.templates.parser.StringTemplateLoader; import org.ow2.mind.value.BasicValueEvaluator; import org.ow2.mind.value.BasicValueKindDecorator; import org.ow2.mind.value.PathValueEvaluator; import org.ow2.mind.value.ValueEvaluator; import org.ow2.mind.value.ValueKindDecorator; import com.google.inject.Binder; import com.google.inject.Provider; import com.google.inject.multibindings.Multibinder; import com.google.inject.name.Names; public class CommonFrontendModule extends AbstractMindModule { // --------------------------------------------------------------------------- // Globals // --------------------------------------------------------------------------- /** * Creates a {@link Multibinder} that can be used to bind * {@link GenericResourceLocator}. * * @param binder the binder to use to create {@link Multibinder}. * @return a {@link Multibinder}. * @see Multibinder#newSetBinder */ public synchronized static Multibinder<GenericResourceLocator> getGenericResourceLocatorBinder( final Binder binder) { return Multibinder.newSetBinder(binder, GenericResourceLocator.class); } protected void configureInputResourceLocator() { bind(InputResourceLocator.class).to(BasicInputResourceLocator.class); // create an empty Multibinder for GenericResourceLocator. getGenericResourceLocatorBinder(binder()); } protected void configureNodeFactory() { bind(NodeFactory.class).toProvider(new Provider<NodeFactory>() { public NodeFactory get() { final NodeFactory nodeFactory = new STNodeFactoryImpl(); nodeFactory.setClassLoader(this.getClass().getClassLoader()); return nodeFactory; } }); } protected void configureNodeMerger() { bind(NodeMerger.class).toProvider(new Provider<NodeMerger>() { public NodeMerger get() { final NodeMerger nodeMerger = new STNodeMergerImpl(); nodeMerger.setClassLoader(this.getClass().getClassLoader()); return nodeMerger; } }); } protected void configureXMLNodeFactory() { bind(XMLNodeFactory.class).toProvider(new Provider<XMLNodeFactory>() { public XMLNodeFactory get() { final XMLNodeFactory xmlNodeFactory = new XMLSTNodeFactoryImpl(); // set my class loader as classloader used by XMLNodeFactory xmlNodeFactory.setClassLoader(this.getClass().getClassLoader()); return xmlNodeFactory; } }); } // --------------------------------------------------------------------------- // Annotations // --------------------------------------------------------------------------- protected void configureAnnotationFactory() { bind(AnnotationFactory.class).to(BasicAnnotationFactory.class); } protected void configureAnnotationLocator() { bind(AnnotationLocator.class).to(BasicAnnotationLocator.class); } protected void configureAnnotationChecker() { bind(AnnotationChecker.class).to(BasicAnnotationChecker.class); } // --------------------------------------------------------------------------- // ErrorManager // --------------------------------------------------------------------------- protected void configureErrorManager() { bind(ErrorManager.class).to(StreamErrorManager.class); bind(PrintStream.class).annotatedWith( Names.named(StreamErrorManager.ERROR_STREAM_NAME)).toInstance( System.err); bind(PrintStream.class).annotatedWith( Names.named(StreamErrorManager.WARNING_STREAM_NAME)).toInstance( System.err); bind(Boolean.class).annotatedWith( Names.named(StreamErrorManager.PRINT_STACK_TRACE_NAME)).toInstance( Boolean.FALSE); } // --------------------------------------------------------------------------- // StringTemplate // --------------------------------------------------------------------------- protected void configureStringTemplateGroupLoader() { bind(StringTemplateGroupLoader.class).to( StringTemplateComponentLoader.class); bind(Loader.class).annotatedWith( Names.named(StringTemplateComponentLoader.STRING_TEMPLATE_LOADER_NAME)) .to(StringTemplateLoader.class); } // --------------------------------------------------------------------------- // Value // --------------------------------------------------------------------------- protected void configureValueEvaluator() { bind(ValueEvaluator.class) .toChainStartingWith(AnnotationValueEvaluator.class) .followedBy(PathValueEvaluator.class) .endingWith(BasicValueEvaluator.class); } protected void configureValueKindDecorator() { bind(ValueKindDecorator.class).to(BasicValueKindDecorator.class); } }