blob: fceb458b7b05e92f4a7f58d795f99fac1dce711d [file] [log] [blame]
/*
* 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.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 com.google.gwt.user.client.ui.TextBoxBase.TextAlignConstant;
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();
private static final String TEXT_ALIGN_CONSTANT = 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 final MortalLogger logger;
private final FieldReferenceConverter converter;
/**
* Class names of parsers for values of attributes with no namespace prefix,
* keyed by method parameter signatures.
*/
private final Map<String, AttributeParser> parsers = new HashMap<String, AttributeParser>();
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));
addAttributeParser(STRING,
new StringAttributeParser(converter, types.parse(STRING)));
EnumAttributeParser unitParser = new EnumAttributeParser(converter,
(JEnumType) types.parse(UNIT), logger);
addAttributeParser(DOUBLE + "," + UNIT, new LengthAttributeParser(
doubleParser, unitParser, logger));
} catch (TypeOracleException e) {
throw new RuntimeException(e);
}
}
public AttributeParser get(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, types[0], logger);
}
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();
}
}