package org.codehaus.modello.model; /* * Copyright (c) 2004, Codehaus.org * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is furnished to do * so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ import org.codehaus.modello.metadata.FieldMetadata; /** * @author <a href="mailto:jason@modello.org">Jason van Zyl </a> * @author <a href="mailto:evenisse@codehaus.org">Emmanuel Venisse </a> */ public class ModelField extends BaseElement { private String type; private String defaultValue; private String typeValidator; private boolean required; private boolean identifier; private String alias; private transient ModelClass modelClass; private static final String[] PRIMITIVE_TYPES = { "boolean", "Boolean", "char", "Character", "byte", "Byte", "short", "Short", "int", "Integer", "long", "Long", "float", "Float", "double", "Double", "String", "Date", "DOM" }; public ModelField() { super( true ); } public ModelField( ModelClass modelClass, String name ) { super( true, name ); this.modelClass = modelClass; } // ---------------------------------------------------------------------- // Property accessors // ---------------------------------------------------------------------- public String getType() { return type; } public void setType( String type ) { this.type = type; } public String getDefaultValue() { return defaultValue; } public void setDefaultValue( String defaultValue ) { this.defaultValue = defaultValue; } public String getTypeValidator() { return typeValidator; } public void setTypeValidator( String typeValidator ) { this.typeValidator = typeValidator; } public boolean isRequired() { return required; } public void setRequired( boolean required ) { this.required = required; } public boolean isIdentifier() { return identifier; } public void setIdentifier( boolean identifier ) { this.identifier = identifier; } public String getAlias() { return alias; } public void setAlias( String alias ) { this.alias = alias; } // ---------------------------------------------------------------------- // Misc // ---------------------------------------------------------------------- public ModelClass getModelClass() { return modelClass; } public FieldMetadata getMetadata( String key ) { return getMetadata( FieldMetadata.class, key ); } public boolean isPrimitive() { String type = getType(); // TODO: This should not happen if ( type == null ) { return false; } for ( String validType : PRIMITIVE_TYPES ) { if ( type.equals( validType ) ) { return true; } } return false; } public boolean isArray() { return getType().endsWith( "[]" ); } public boolean isPrimitiveArray() { String type = getType(); for ( String PRIMITIVE_TYPE : PRIMITIVE_TYPES ) { String validType = PRIMITIVE_TYPE + "[]"; if ( validType.equals( type ) ) { return true; } } return false; } // ---------------------------------------------------------------------- // BaseElement Overrides // ---------------------------------------------------------------------- public void initialize( ModelClass modelClass ) { this.modelClass = modelClass; if ( defaultValue == null ) { if ( "boolean".equals( type ) ) { defaultValue = "false"; } else if ( "float".equals( type ) || "double".equals( type ) ) { defaultValue = "0.0"; } else if ( "int".equals( type ) || "long".equals( type ) || "short".equals( type ) || "byte".equals( type ) ) { defaultValue = "0"; } else if ( "char".equals( type ) ) { defaultValue = "\0"; } } } public void validateElement() throws ModelValidationException { validateFieldNotEmpty( "field", "name", getName() ); validateFieldNotEmpty( "field '" + getName() + "'", "type", type ); // TODO: these definitions are duplicated throughout. Defined centrally, and loop through in the various uses if ( !isPrimitive() && !isPrimitiveArray() ) { throw new ModelValidationException( "Field '" + getName() + "': Illegal type: '" + type + "'." ); } } // ---------------------------------------------------------------------- // Object Overrides // ---------------------------------------------------------------------- public String toString() { return "[Field: name=" + getName() + ", alias: " + alias + ", type: " + type + ", " + "version: " + getVersionRange() + "]"; } public boolean isModelVersionField() { Model model = modelClass.getModel(); VersionDefinition versionDefinition = model.getVersionDefinition(); return ( versionDefinition != null ) && versionDefinition.isFieldType() && ( versionDefinition.getValue().equals( getName() ) || versionDefinition.getValue().equals( alias ) ); } }