blob: 731befc979a6d39b482df6f4df541118e34769ce [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.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.uibinder.attributeparsers.FieldReferenceConverter.Delegate;
import com.google.gwt.uibinder.attributeparsers.FieldReferenceConverter.IllegalFieldReferenceException;
import com.google.gwt.uibinder.rebind.FieldReference;
import com.google.gwt.uibinder.rebind.MortalLogger;
import com.google.gwt.uibinder.rebind.XMLElement;
/**
* Fall through attribute parser. Accepts a field reference or nothing.
*/
class StrictAttributeParser implements AttributeParser {
/**
* Package protected for testing.
*/
static class FieldReferenceDelegate implements Delegate {
private boolean sawReference = false;
private final JType[] types;
FieldReferenceDelegate(JType... types) {
this.types = types;
}
public JType[] getTypes() {
return types;
}
public String handleFragment(String fragment)
throws IllegalFieldReferenceException {
if (fragment.length() > 0) {
throw new IllegalFieldReferenceException();
}
return fragment;
}
public String handleReference(String reference)
throws IllegalFieldReferenceException {
assertOnly();
sawReference = true;
return reference;
}
private void assertOnly() {
if (sawReference) {
throw new IllegalFieldReferenceException();
}
}
}
private final FieldReferenceConverter converter;
protected final MortalLogger logger;
private final JType[] types;
StrictAttributeParser(FieldReferenceConverter converter, MortalLogger logger,
JType... types) {
this.converter = converter;
this.logger = logger;
this.types = types;
}
/**
* If the value holds a single field reference "{like.this}", converts it to a
* Java Expression.
* <p>
* In any other case (e.g. more than one field reference), an
* UnableToCompleteException is thrown.
*/
public String parse(XMLElement source, String value) throws UnableToCompleteException {
if ("".equals(value.trim())) {
logger.die(source, "Cannot use empty value as type %s", FieldReference.renderTypesList(types));
}
try {
return converter.convert(source, value, new FieldReferenceDelegate(types));
} catch (IllegalFieldReferenceException e) {
logger.die(source, "Cannot parse value: \"%s\" as type %s", value, FieldReference.renderTypesList(types));
return null; // Unreachable
}
}
}