| /* |
| * 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.uibinder.rebind; |
| |
| import com.google.gwt.core.ext.UnableToCompleteException; |
| import com.google.gwt.core.ext.typeinfo.JClassType; |
| import com.google.gwt.core.ext.typeinfo.JMethod; |
| import com.google.gwt.core.ext.typeinfo.JType; |
| import com.google.gwt.core.ext.typeinfo.TypeOracle; |
| import com.google.gwt.resources.client.CssResource; |
| import com.google.gwt.uibinder.attributeparsers.CssNameConverter; |
| import com.google.gwt.uibinder.rebind.model.ImplicitCssResource; |
| |
| import java.io.PrintWriter; |
| import java.util.Map; |
| import java.util.Set; |
| |
| /** |
| * Writes the source to implement an {@link ImplicitCssResource} interface. |
| */ |
| public class CssResourceWriter { |
| private static final JType[] NO_PARAMS = new JType[0]; |
| private final ImplicitCssResource css; |
| private final IndentedWriter writer; |
| private final JClassType cssResourceType; |
| private final JClassType stringType; |
| private final CssNameConverter nameConverter; |
| private final MortalLogger logger; |
| |
| public CssResourceWriter(ImplicitCssResource css, TypeOracle types, |
| PrintWriter writer, MortalLogger logger) { |
| this.css = css; |
| this.writer = new IndentedWriter(writer); |
| this.cssResourceType = types.findType(CssResource.class.getName()); |
| this.stringType = types.findType(String.class.getName()); |
| this.nameConverter = new CssNameConverter(); |
| this.logger = logger; |
| } |
| |
| public void write() throws UnableToCompleteException { |
| // Package declaration |
| String packageName = css.getPackageName(); |
| if (packageName.length() > 0) { |
| writer.write("package %1$s;", packageName); |
| writer.newline(); |
| } |
| |
| JClassType superType = css.getExtendedInterface(); |
| if (superType == null) { |
| superType = cssResourceType; |
| } |
| |
| writer.write("import %s;", superType.getQualifiedSourceName()); |
| writer.newline(); |
| |
| // Open interface |
| writer.write("public interface %s extends %s {", css.getClassName(), |
| superType.getSimpleSourceName()); |
| writer.indent(); |
| |
| writeCssMethods(superType); |
| |
| // Close interface. |
| writer.outdent(); |
| writer.write("}"); |
| } |
| |
| private boolean isOverride(String methodName, JClassType superType) { |
| JMethod method = superType.findMethod(methodName, NO_PARAMS); |
| if (method != null && stringType.equals(method.getReturnType())) { |
| return true; |
| } |
| return false; |
| } |
| |
| private void writeCssMethods(JClassType superType) |
| throws UnableToCompleteException { |
| Set<String> rawClassNames = css.getCssClassNames(); |
| Map<String, String> convertedClassNames = null; |
| |
| try { |
| convertedClassNames = nameConverter.convertSet(rawClassNames); |
| } catch (CssNameConverter.Failure e) { |
| logger.die(e.getMessage()); |
| } |
| |
| for (Map.Entry<String, String> entry : convertedClassNames.entrySet()) { |
| String className = entry.getValue(); |
| /* |
| * Only write names that we are not overriding from super, or else we'll |
| * re-obfuscate any @Shared ones |
| */ |
| if (!isOverride(className, superType)) { |
| if (!rawClassNames.contains(className)) { |
| writer.write("@ClassName(\"%s\")", entry.getKey()); |
| } |
| writer.write("String %s();", className); |
| } |
| } |
| } |
| } |