//// BXPropertyDescription.m// BaseTen//// Copyright (C) 2006-2008 Marko Karppinen & Co. LLC.//// Before using this software, please review the available licensing options// by visiting http://basetenframework.org/licensing/ or by contacting// us at sales@karppinen.fi. Without an additional license, this software// may be distributed only in compliance with the GNU General Public License.////// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License, version 2.0,// as published by the Free Software Foundation.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program; if not, write to the Free Software// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA//// $Id$//#import "BXPropertyDescription.h"#import "BXPropertyDescriptionPrivate.h"#import "BXEntityDescription.h"#import "BXLogger.h"/** * \brief A superclass for various description classes. * \note This class's documented methods are thread-safe. Creating objects, however, is not. * \note For this class to work in non-GC applications, the corresponding database context must be retained as well. * \ingroup descriptions */@implementationBXPropertyDescription/** \brief Entity for this property. */-(BXEntityDescription*)entity{returnmEntity;}/** \brief Retain on copy. */-(id)copyWithZone:(NSZone*)zone{return[selfretain];}//FIXME: need we this?#if 0- (id) mutableCopyWithZone: (NSZone *) zone{ id retval = [[[self class] allocWithZone: zone] initWithName: mName entity: mEntity]; //Probably best not to set flags? return retval;}#endif-(id)initWithCoder:(NSCoder*)decoder{if((self=[superinitWithCoder:decoder])){mEntity=[decoderdecodeObjectForKey:@"entity"];[selfsetOptional:[decoderdecodeBoolForKey:@"isOptional"]];}returnself;}-(void)encodeWithCoder:(NSCoder*)coder{[coderencodeObject:mEntityforKey:@"entity"];[coderencodeBool:[selfisOptional]forKey:@"isOptional"];[superencodeWithCoder:coder];}-(unsignedint)hash{returnmHash;}-(BOOL)isEqual:(id)anObject{BOOLretval=NO;if(anObject==self)retval=YES;elseif([superisEqual:anObject]&&[anObjectisKindOfClass:[selfclass]]){BXPropertyDescription*aDesc=(BXPropertyDescription*)anObject;retval=[mEntityisEqual:aDesc->mEntity];}returnretval;}-(NSString*)description{//return [NSString stringWithFormat: @"<%@ (%p) name: %@ entity: %@>", [self class], self, name, mEntity];return[selfqualifiedName];}-(NSComparisonResult)caseInsensitiveCompare:(BXPropertyDescription*)anotherObject{NSComparisonResultretval=NSOrderedSame;if(self!=anotherObject){retval=[[selfentity]caseInsensitiveCompare:[anotherObjectentity]];if(NSOrderedSame==retval)retval=[[selfname]caseInsensitiveCompare:[anotherObjectname]];}returnretval;}/** \brief Whether the property is optional. */-(BOOL)isOptional{return(mFlags&kBXPropertyOptional?YES:NO);}/** \brief The property's subtype. */-(enumBXPropertyKind)propertyKind{returnkBXPropertyNoKind;}@end@implementationBXPropertyDescription(PrivateMethods)-(void)setOptional:(BOOL)optional{if(optional)mFlags|=kBXPropertyOptional;elsemFlags&=~kBXPropertyOptional;}/** * \internal * \brief The designated initializer. */-(id)initWithName:(NSString*)aNameentity:(BXEntityDescription*)anEntity{if((self=[superinitWithName:aName])){mEntity=anEntity;mHash=[superhash]^[mEntityhash];}returnself;}-(id)initWithName:(NSString*)name{[selfdoesNotRecognizeSelector:_cmd];returnnil;}-(NSString*)qualifiedName{return[NSStringstringWithFormat:@"%@.%@.%@",[mEntityschemaName],[mEntityname],mName];}@end