/* * Copyright 2009 Google Inc. * * 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 com.google.gwt.chrome.crx.linker; import com.google.gwt.chrome.crx.client.Component; import com.google.gwt.chrome.crx.linker.emiter.BrowserActionEmiter; import com.google.gwt.chrome.crx.linker.emiter.ContentScriptEmiter; import com.google.gwt.chrome.crx.linker.emiter.Emiter; import com.google.gwt.chrome.crx.linker.emiter.ExtentionsScriptEmiter; import com.google.gwt.chrome.crx.linker.emiter.GwtContentScriptEmiter; import com.google.gwt.chrome.crx.linker.emiter.ModuleDefinitionLoader; import com.google.gwt.chrome.crx.linker.emiter.PageActionEmiter; import com.google.gwt.chrome.crx.linker.emiter.PageEmiter; import com.google.gwt.chrome.crx.linker.emiter.PluginEmiter; import com.google.gwt.chrome.crx.linker.emiter.ToolStripEmiter; import com.google.gwt.core.ext.Generator; import com.google.gwt.core.ext.GeneratorContext; import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.core.ext.typeinfo.JClassType; import com.google.gwt.core.ext.typeinfo.NotFoundException; import com.google.gwt.core.ext.typeinfo.TypeOracle; /** * Generator for extension {@link Component}s. */ public class ComponentGenerator extends Generator { private static final String BROWSERACTION_USER_TYPE = "com.google.gwt.chrome.crx.client.BrowserAction"; private static final String EXTSCRIPT_USER_TYPE = "com.google.gwt.chrome.crx.client.ExtensionScript"; private static final String PAGE_USER_TYPE = "com.google.gwt.chrome.crx.client.Page"; private static final String PLUGIN_USER_TYPE = "com.google.gwt.chrome.crx.client.Plugin"; private static final String TOOLSTRIP_USER_TYPE = "com.google.gwt.chrome.crx.client.ToolStrip"; private static String emitComponent(TreeLogger logger, GeneratorContext context, String typeName) throws UnableToCompleteException { final TypeOracle typeOracle = context.getTypeOracle(); final JClassType toolStripType = typeOracle.findType(TOOLSTRIP_USER_TYPE); assert toolStripType != null; final JClassType pageType = typeOracle.findType(PAGE_USER_TYPE); assert pageType != null; final JClassType pageActionType = typeOracle.findType(Emiter.PAGEACTION_USER_TYPE); assert pageActionType != null; final JClassType browserActionType = typeOracle.findType(BROWSERACTION_USER_TYPE); assert browserActionType != null; final JClassType contentScriptType = typeOracle.findType(Emiter.CONTENTSCRIPT_USER_TYPE); assert contentScriptType != null; final JClassType gwtContentScriptType = typeOracle.findType(Emiter.GWT_CONTENTSCRIPT_USER_TYPE); assert gwtContentScriptType != null; final JClassType extensionScriptType = typeOracle.findType(EXTSCRIPT_USER_TYPE); assert extensionScriptType != null; final JClassType pluginType = typeOracle.findType(PLUGIN_USER_TYPE); assert pluginType != null; try { final JClassType classType = typeOracle.getType(typeName); if (classType.isAssignableTo(toolStripType)) { return new ToolStripEmiter().emit(logger, context, classType, null); } else if (classType.isAssignableTo(pageType)) { return new PageEmiter().emit(logger, context, classType, typeName); } else if (classType.isAssignableTo(contentScriptType)) { return new ContentScriptEmiter().emit(logger, context, classType, typeName); } else if (classType.isAssignableTo(gwtContentScriptType)) { return new GwtContentScriptEmiter(new ModuleDefinitionLoader()).emit(logger, context, classType, typeName); } else if (classType.isAssignableTo(extensionScriptType)) { return new ExtentionsScriptEmiter().emit(logger, context, classType, typeName); } else if (classType.isAssignableTo(pluginType)) { return new PluginEmiter().emit(logger, context, classType, typeName); } else if (classType.isAssignableTo(pageActionType)) { return new PageActionEmiter().emit(logger, context, classType, typeName); } else if (classType.isAssignableTo(browserActionType)) { return new BrowserActionEmiter().emit(logger, context, classType, typeName); } // TODO(knorton): Better error message. logger.log(TreeLogger.ERROR, "I can't generate one of those (" + typeName + ")"); throw new UnableToCompleteException(); } catch (NotFoundException e) { // TODO(knorton): Better error message. logger.log(TreeLogger.ERROR, "Unknown Type: " + typeName); throw new UnableToCompleteException(); } } @Override public String generate(TreeLogger logger, GeneratorContext context, String typeName) throws UnableToCompleteException { return emitComponent(logger, context, typeName); } }