| /* | |
| * 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); | |
| } | |
| } | |
| } | |
| } |