/* * JBoss, Home of Professional Open Source * Copyright 2010, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This 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 2.1 of * the License, or (at your option) any later version. * * This software 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 software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.richfaces.cdk; import static com.google.common.base.Preconditions.checkNotNull; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Writer; import java.nio.charset.Charset; import java.util.Collections; import java.util.Locale; import java.util.Map; import java.util.ServiceLoader; import java.util.logging.Level; import org.richfaces.cdk.apt.AptModule; import org.richfaces.cdk.apt.CacheType; import org.richfaces.cdk.apt.LibraryCache; import org.richfaces.cdk.apt.LibraryCacheImpl; import org.richfaces.cdk.generate.java.ClassGeneratorModule; import org.richfaces.cdk.generate.taglib.TaglibModule; import org.richfaces.cdk.model.ModelModule; import org.richfaces.cdk.model.validator.ValidatorImpl; import org.richfaces.cdk.templatecompiler.TemplateModule; import org.richfaces.cdk.xmlconfig.XmlModule; import com.google.common.collect.Maps; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.Stage; import com.google.inject.name.Names; import com.google.inject.util.Modules; /** * @author asmirnov * @version $Id$ * */ public class Generator { public static final String RENDERER_UTILS_CLASS = "rendererUtils"; public static final String OPTIONS = "OPTIONS"; private CdkClassLoader loader; private Logger log = new JavaLogger(); private Injector injector; private String namespace; private Locale locale = Locale.getDefault(); private Charset charset = Charset.defaultCharset(); private Map<Outputs, FileManager> outputFolders = Maps.newEnumMap(Outputs.class); private Map<Sources, FileManager> sources = Maps.newEnumMap(Sources.class); private LibraryBuilder libraryBuilder; private Map<String, String> options = Maps.newHashMap(); private java.util.logging.Logger logger; public Generator() { EmptyFileManager emptyFileManager = new EmptyFileManager(); for (Sources source : Sources.values()) { sources.put(source, emptyFileManager); } for (Outputs output : Outputs.values()) { outputFolders.put(output, emptyFileManager); } } public void setLoader(CdkClassLoader loader) { this.loader = loader; } public void setLog(Logger log) { this.log = log; // setup freemaker logger. try { freemarker.log.Logger.selectLoggerLibrary(freemarker.log.Logger.LIBRARY_JAVA); freemarker.log.Logger.setCategoryPrefix(JavaLogger.CDK_LOG + "."); logger = java.util.logging.Logger.getLogger(JavaLogger.CDK_LOG); logger.addHandler(new CDKHandler(log)); if (log.isDebugEnabled()) { logger.setLevel(Level.ALL); } else if (log.isInfoEnabled()) { logger.setLevel(Level.INFO); } else if (log.isWarnEnabled()) { logger.setLevel(Level.WARNING); } else { logger.setLevel(Level.SEVERE); } } catch (ClassNotFoundException e) { log.error(e); // DO Nothing, JDK 6 has built-in Logger facility; } } public void addOutputFolder(Outputs type, File outputFolder) { this.outputFolders.put(type, new OutputFileManagerImpl(outputFolder)); } public void addSources(Sources type, Iterable<File> files, Iterable<File> folders) { this.sources.put(type, new SourceFileManagerImpl(files, folders)); } public void setOptions(Map<String, String> options) { this.options = options; } public void init() { TimeMeasure time = new TimeMeasure("module instantiation", log).info(true).start(); Module[] defaultModules = new Module[] { new CdkConfigurationModule(), new AptModule(), new ModelModule(), new ClassGeneratorModule(), new TemplateModule(), new XmlModule(), new TaglibModule() }; ServiceLoader<CdkModule> overlayModules = ServiceLoader.load(CdkModule.class); Module modules = Modules.override(defaultModules).with(overlayModules); injector = Guice.createInjector(Stage.DEVELOPMENT, modules); time.stop(); if (!log.isDebugEnabled()) { try { freemarker.log.Logger.selectLoggerLibrary(freemarker.log.Logger.LIBRARY_NONE); } catch (ClassNotFoundException e) { // Do nothing. } } // Create builder instance. this.libraryBuilder = injector.getInstance(LibraryBuilder.class); } public void execute() { checkNotNull(libraryBuilder, "initialized"); libraryBuilder.build(); } public static final class EmptyFileManager implements FileManager { @Override public Iterable<File> getFolders() { return Collections.emptyList(); } @Override public Iterable<File> getFiles() { return Collections.emptyList(); } @Override public File getFile(String path) throws FileNotFoundException { throw new FileNotFoundException(); } @Override public Writer createOutput(String path, long lastModified) throws IOException { throw new IOException("read-only"); } } public class CdkConfigurationModule extends AbstractModule { @Override protected void configure() { bind(CdkClassLoader.class).toInstance(loader); bind(Logger.class).toInstance(log); bind(Locale.class).toInstance(locale); bind(Charset.class).toInstance(charset); bind(Generator.class).toInstance(Generator.this); for (Map.Entry<Outputs, FileManager> entry : outputFolders.entrySet()) { bind(FileManager.class).annotatedWith(new OutputImpl(entry.getKey())).toInstance(entry.getValue()); } for (Map.Entry<Sources, FileManager> entry : sources.entrySet()) { bind(FileManager.class).annotatedWith(new SourceImpl(entry.getKey())).toInstance(entry.getValue()); } for (CacheType cacheType : CacheType.values()) { LibraryCache cache = new LibraryCacheImpl(cacheType); requestInjection(cache); bind(LibraryCache.class).annotatedWith(new CacheImpl(cacheType)).toInstance(cache); } bind(ModelValidator.class).to(ValidatorImpl.class); bind(NamingConventions.class).to(RichFacesConventions.class); Names.bindProperties(binder(), options); } } public String getNamespace() { return namespace; } public void setNamespace(String namespace) { this.namespace = namespace; } public void setLocale(Locale locale) { this.locale = locale; } public void setCharset(Charset charset) { this.charset = charset; } }