/* * 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.model; import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.core.ext.typeinfo.JClassType; import com.google.gwt.core.ext.typeinfo.JField; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.rebind.MortalLogger; import com.google.gwt.uibinder.rebind.UiBinderContext; /** * Descriptor for a field of the owner class. * <p> * Please notice that some fields defined in the XML and in the generated binder * class may not be present in the owner class - for instance, they may not be * relevant to the code of the owner class. * The fields in the binder class are instead represented by an instance of * {@link com.google.gwt.uibinder.rebind.FieldWriter}. */ public class OwnerField { private final String name; private final OwnerFieldClass fieldType; private final boolean isProvided; /** * Constructor. * * @param field the field of the owner class * @param logger * @param context */ public OwnerField(JField field, MortalLogger logger, UiBinderContext context) throws UnableToCompleteException { this.name = field.getName(); // Get the field type and ensure it's a class or interface JClassType fieldClassType = field.getType().isClassOrInterface(); if (fieldClassType == null) { logger.die("Type for field " + name + " is not a class: " + field.getType().getSimpleSourceName()); } this.fieldType = OwnerFieldClass.getFieldClass(fieldClassType, logger, context); // Get the UiField annotation and process it UiField annotation = field.getAnnotation(UiField.class); if (annotation == null) { logger.die("Field " + name + " is not annotated with @UiField"); } isProvided = annotation.provided(); } /** * Returns the name of the field in the owner class. */ public String getName() { return name; } /** * Gets the type associated with this field. */ public JClassType getRawType() { // This shorten getType().getRawType() and make tests easier. return getType().getRawType(); } /** * Returns a descriptor for the type of the field. */ public OwnerFieldClass getType() { return fieldType; } /** * Returns whether this field's value is provided by owner class. * If it's not provided, then it's the binder's responsibility to assign it. */ public boolean isProvided() { return isProvided; } @Override public String toString() { return String.format("%s.%s#%s", fieldType.getRawType().getPackage(), fieldType.getRawType().getName(), name); } }