if ( typeDefn.getTypeCode( ) == PropertyType.LIST_TYPE )
if ( typeDefn.getTypeCode( ) == IPropertyType.LIST_TYPE )
		public void parseAttrs( Attributes attrs )		{			choices.clear( );			propDefn = null;			String name = getAttrib( attrs, NAME_ATTRIB );			String displayNameID = getAttrib( attrs, DISPLAY_NAME_ID_ATTRIB );			String type = getAttrib( attrs, TYPE_ATTRIB );			String validator = getAttrib( attrs, VALIDATOR_ATTRIB );			String subType = getAttrib( attrs, SUB_TYPE_ATTRIB );			boolean ok = ( elementDefn != null );			if ( name == null )			{				errorHandler						.semanticError( new MetaDataParserException(								MetaDataParserException.DESIGN_EXCEPTION_NAME_REQUIRED ) );				ok = false;			}			if ( displayNameID == null )			{				errorHandler						.semanticError( new MetaDataParserException(								MetaDataParserException.DESIGN_EXCEPTION_DISPLAY_NAME_ID_REQUIRED ) );				ok = false;			}			if ( type == null )			{				errorHandler						.semanticError( new MetaDataParserException(								MetaDataParserException.DESIGN_EXCEPTION_TYPE_REQUIRED ) );				ok = false;			}			if ( !ok )				return;			// Look up the choice set name, if any.			PropertyType typeDefn = dictionary.getPropertyType( type );			if ( typeDefn == null )			{				errorHandler						.semanticError( new MetaDataParserException(								MetaDataParserException.DESIGN_EXCEPTION_INVALID_TYPE ) );				return;			}			String detailName = getAttrib( attrs, DETAIL_TYPE_ATTRIB );			ChoiceSet choiceSet = null;			StructureDefn struct = null;			PropertyType subTypeDefn = null;			switch ( typeDefn.getTypeCode( ) )			{				case PropertyType.DIMENSION_TYPE :				case PropertyType.DATE_TIME_TYPE :				case PropertyType.STRING_TYPE :				case PropertyType.LITERAL_STRING_TYPE :				case PropertyType.FLOAT_TYPE :				case PropertyType.INTEGER_TYPE :				case PropertyType.NUMBER_TYPE :					if ( detailName != null )					{						choiceSet = validateChoiceSet( detailName );						if ( choiceSet == null )							return;					}					break;				case PropertyType.CHOICE_TYPE :					if ( detailName == null )					{						errorHandler								.semanticError( new MetaDataParserException(										MetaDataParserException.DESIGN_EXCEPTION_CHOICE_TYPE_REQUIRED ) );						return;					}					choiceSet = validateChoiceSet( detailName );					if ( choiceSet == null )						return;					break;				case PropertyType.COLOR_TYPE :					choiceSet = validateChoiceSet( ColorPropertyType.COLORS_CHOICE_SET );					if ( choiceSet == null )						return;					break;				case PropertyType.STRUCT_TYPE :				case PropertyType.STRUCT_REF_TYPE :					if ( detailName == null )					{						errorHandler								.semanticError( new MetaDataParserException(										MetaDataParserException.DESIGN_EXCEPTION_STRUCT_TYPE_REQUIRED ) );						return;					}					struct = (StructureDefn) dictionary							.getStructure( detailName );					if ( struct == null )					{						errorHandler								.semanticError( new MetaDataParserException(										MetaDataParserException.DESIGN_EXCEPTION_INVALID_STRUCT_TYPE ) );						return;					}					break;				case PropertyType.ELEMENT_REF_TYPE :					if ( detailName == null )					{						errorHandler								.semanticError( new MetaDataParserException(										MetaDataParserException.DESIGN_EXCEPTION_ELEMENT_REF_TYPE_REQUIRED ) );						return;					}					if ( detailName.equals( THIS_KEYWORD ) )						detailName = elementDefn.getName( );					break;				case PropertyType.LIST_TYPE :					if ( subType == null )					{						errorHandler								.semanticError( new MetaDataParserException(										MetaDataParserException.DESIGN_EXCEPTION_MISSING_SUB_TYPE ) );					}					else					{						subTypeDefn = dictionary.getPropertyType( subType );						if ( subTypeDefn == null )						{							errorHandler									.semanticError( new MetaDataParserException(											MetaDataParserException.DESIGN_EXCEPTION_INVALID_TYPE ) );							return;						}						else if ( subTypeDefn.getTypeCode( ) == PropertyType.ELEMENT_REF_TYPE )						{							if ( detailName == null )							{								errorHandler										.semanticError( new MetaDataParserException(												MetaDataParserException.DESIGN_EXCEPTION_ELEMENT_REF_TYPE_REQUIRED ) );								return;							}							if ( detailName.equals( THIS_KEYWORD ) )								detailName = elementDefn.getName( );						}					}					break;				default :					// Ignore the detail name for other types.					detailName = null;			}			propDefn = new SystemPropertyDefn( );			propDefn.setName( name );			propDefn.setDisplayNameID( displayNameID );			propDefn.setType( typeDefn );			if ( typeDefn.getTypeCode( ) == PropertyType.LIST_TYPE )				propDefn.setSubType( subTypeDefn );			propDefn.setGroupNameKey( groupNameID );			propDefn.setCanInherit( getBooleanAttrib( attrs,					CAN_INHERIT_ATTRIBUTE, true ) );			propDefn.setIntrinsic( getBooleanAttrib( attrs,					IS_INTRINSIC_ATTRIB, false ) );			propDefn.setStyleProperty( getBooleanAttrib( attrs,					IS_STYLE_PROPERTY_ATTRIB, false ) );			propDefn.setValueRequired( getBooleanAttrib( attrs,					VALUE_REQUIRED_ATTRIB, false ) );			propDefn.setSince( attrs.getValue( SINCE_ATTRIB ) );			propDefn.setRuntimeSettable( getBooleanAttrib( attrs,					RUNTIME_SETTABLE_ATTRIB, true ) );			if ( propDefn.getTypeCode( ) == PropertyType.EXPRESSION_TYPE )			{				propDefn.setReturnType( attrs.getValue( RETURN_TYPE_ATTRIB ) );				propDefn.setContext( attrs.getValue( CONTEXT_ATTRIB ) );			}			if ( !StringUtil.isBlank( validator ) )			{				propDefn.setValueValidator( validator );			}			if ( typeDefn.getTypeCode( ) == PropertyType.STRUCT_TYPE )				propDefn.setIsList( getBooleanAttrib( attrs, IS_LIST_ATTRIB,						false ) );			if ( choiceSet != null )				propDefn.setDetails( choiceSet );			else if ( struct != null )				propDefn.setDetails( struct );			else if ( detailName != null )				propDefn.setDetails( detailName );			try			{				elementDefn.addProperty( propDefn );			}			catch ( MetaDataException e )			{				errorHandler						.semanticError( new MetaDataParserException(								e,								MetaDataParserException.DESIGN_EXCEPTION_BUILD_FAILED ) );			}		}