/* * 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.attributeparsers; import com.google.gwt.core.ext.typeinfo.JEnumType; import com.google.gwt.core.ext.typeinfo.JType; import com.google.gwt.core.ext.typeinfo.TypeOracle; import com.google.gwt.core.ext.typeinfo.TypeOracleException; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.uibinder.rebind.FieldManager; import com.google.gwt.uibinder.rebind.MortalLogger; import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant; import com.google.gwt.user.client.ui.HasVerticalAlignment.VerticalAlignmentConstant; import java.util.HashMap; import java.util.Map; /** * Managers access to all implementations of {@link AttributeParser}. */ public class AttributeParsers { private static final String HORIZ_CONSTANT = HorizontalAlignmentConstant.class.getCanonicalName(); private static final String VERT_CONSTANT = VerticalAlignmentConstant.class.getCanonicalName(); @SuppressWarnings("deprecation") private static final String TEXT_ALIGN_CONSTANT = com.google.gwt.user.client.ui.TextBoxBase.TextAlignConstant.class.getCanonicalName(); private static final String INT = "int"; private static final String STRING = String.class.getCanonicalName(); private static final String DOUBLE = "double"; private static final String BOOLEAN = "boolean"; private static final String UNIT = Unit.class.getCanonicalName(); private static final String SAFE_URI = SafeUri.class.getCanonicalName(); private final MortalLogger logger; private final FieldReferenceConverter converter; /** * Class names of parsers keyed by method parameter signatures. */ private final Map<String, AttributeParser> parsers = new HashMap<String, AttributeParser>(); private final SafeUriAttributeParser safeUriInHtmlParser; public AttributeParsers(TypeOracle types, FieldManager fieldManager, MortalLogger logger) { this.logger = logger; converter = new FieldReferenceConverter(fieldManager); try { BooleanAttributeParser boolParser = new BooleanAttributeParser(converter, types.parse(BOOLEAN), logger); addAttributeParser(BOOLEAN, boolParser); addAttributeParser(Boolean.class.getCanonicalName(), boolParser); IntAttributeParser intParser = new IntAttributeParser(converter, types.parse(INT), logger); addAttributeParser(INT, intParser); addAttributeParser(Integer.class.getCanonicalName(), intParser); DoubleAttributeParser doubleParser = new DoubleAttributeParser(converter, types.parse(DOUBLE), logger); addAttributeParser(DOUBLE, doubleParser); addAttributeParser(Double.class.getCanonicalName(), doubleParser); addAttributeParser("int,int", new IntPairAttributeParser(intParser, logger)); addAttributeParser(HORIZ_CONSTANT, new HorizontalAlignmentConstantParser( converter, types.parse(HORIZ_CONSTANT), logger)); addAttributeParser(VERT_CONSTANT, new VerticalAlignmentConstantParser( converter, types.parse(VERT_CONSTANT), logger)); addAttributeParser(TEXT_ALIGN_CONSTANT, new TextAlignConstantParser( converter, types.parse(TEXT_ALIGN_CONSTANT), logger)); StringAttributeParser stringParser = new StringAttributeParser(converter, types.parse(STRING)); addAttributeParser(STRING, stringParser); EnumAttributeParser unitParser = new EnumAttributeParser(converter, (JEnumType) types.parse(UNIT), logger); addAttributeParser(DOUBLE + "," + UNIT, new LengthAttributeParser( doubleParser, unitParser, logger)); SafeUriAttributeParser uriParser = new SafeUriAttributeParser(stringParser, converter, types.parse(SAFE_URI), logger); addAttributeParser(SAFE_URI, uriParser); safeUriInHtmlParser = new SafeUriAttributeParser(stringParser, converter, types.parse(SAFE_URI), types.parse(STRING), logger); } catch (TypeOracleException e) { throw new RuntimeException(e); } } /** * Returns a parser for the given type(s). Accepts multiple types args to * allow requesting parsers for things like for pairs of ints. */ public AttributeParser getParser(JType... types) { if (types.length == 0) { throw new RuntimeException("Asked for attribute parser of no type"); } AttributeParser rtn = getForKey(getParametersKey(types)); if (rtn != null || types.length > 1) { return rtn; } /* Maybe it's an enum */ JEnumType enumType = types[0].isEnum(); if (enumType != null) { return new EnumAttributeParser(converter, enumType, logger); } /* * Dunno what it is, so let a StrictAttributeParser look for a * {field.reference} */ return new StrictAttributeParser(converter, logger, types[0]); } /** * Returns a parser specialized for handling URI references * in html contexts, like <a href="{foo.bar}">. */ public AttributeParser getSafeUriInHtmlParser() { return safeUriInHtmlParser; } private void addAttributeParser(String signature, AttributeParser attributeParser) { parsers.put(signature, attributeParser); } private AttributeParser getForKey(String key) { return parsers.get(key); } /** * Given a types array, return a key for the attributeParsers table. */ private String getParametersKey(JType[] types) { StringBuffer b = new StringBuffer(); for (JType t : types) { if (b.length() > 0) { b.append(','); } b.append(t.getParameterizedQualifiedSourceName()); } return b.toString(); } }