5 // Created by Mike Mayo on 10/1/10.
6 // The OpenStack project is provided under the Apache 2.0 license.
10 #import "NSObject+NSCoding.h"
15 @synthesize status, created, updated, canBeLaunched;
18 #pragma mark Serialization
20 - (void)encodeWithCoder:(NSCoder *)coder {
21 [coder encodeObject:identifier forKey:@"id"];
22 [coder encodeObject:name forKey:@"name"];
23 [coder encodeObject:status forKey:@"status"];
24 [coder encodeObject:created forKey:@"created"];
25 [coder encodeObject:updated forKey:@"updated"];
26 [coder encodeBool:canBeLaunched forKey:@"canBeLaunched"];
29 - (id)initWithCoder:(NSCoder *)coder {
32 identifier = [[coder decodeObjectForKey:@"id"] retain];
33 name = [[coder decodeObjectForKey:@"name"] retain];
34 status = [[coder decodeObjectForKey:@"status"] retain];
35 created = [[coder decodeObjectForKey:@"created"] retain];
36 updated = [[coder decodeObjectForKey:@"updated"] retain];
38 canBeLaunched = [coder decodeBoolForKey:@"canBeLaunched"];
40 @catch (NSException *exception) {
47 - (id)copyWithZone:(NSZone *)zone {
48 Image *copy = [[Image allocWithZone:zone] init];
49 copy.identifier = self.identifier;
50 copy.name = self.name;
51 copy.status = self.status;
58 + (Image *)fromJSON:(NSDictionary *)dict {
59 Image *image = [[[Image alloc] initWithJSONDict:dict] autorelease];
60 // [self autoParse:&image fromJSONDict:dict];
61 image.status = [dict objectForKey:@"status"];
68 - (NSString *)logoPrefix {
69 if ([name hasPrefix:@"CentOS"]) {
71 } else if ([name hasPrefix:@"Gentoo"]) {
73 } else if ([name hasPrefix:@"Debian"]) {
75 } else if ([name hasPrefix:@"Fedora"]) {
77 } else if ([name hasPrefix:@"Ubuntu"]) {
79 } else if ([name hasPrefix:@"Arch"]) {
81 } else if ([name hasPrefix:@"Red Hat"]) {
83 } else if ([name hasPrefix:@"Windows"]) {
91 #pragma mark Comparison
93 // overriding to handle version numbers in image names to create a natural ordering
94 - (NSComparisonResult)compare:(ComputeModel *)aComputeModel {
95 NSComparisonResult result = NSOrderedSame;
96 NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
97 NSArray *tokensA = [self.name componentsSeparatedByString:@" "];
98 NSArray *tokensB = [aComputeModel.name componentsSeparatedByString:@" "];
100 for (int i = 0; (i < [tokensA count] && i < [tokensB count]) && result == NSOrderedSame; i++) {
102 NSString *tokenA = [tokensA objectAtIndex:i];
103 NSString *tokenB = [tokensB objectAtIndex:i];
105 // problem: 8.04.2 is not a number, so we need to tokenize again on .
107 NSArray *versionTokensA = [tokenA componentsSeparatedByString:@"."];
108 NSArray *versionTokensB = [tokenB componentsSeparatedByString:@"."];
110 for (int j = 0; (j < [versionTokensA count] || j < [versionTokensB count]) && result == NSOrderedSame; j++) {
112 NSString *versionTokenA = [versionTokensA objectAtIndex:j];
113 NSString *versionTokenB = [versionTokensB objectAtIndex:j];
114 NSNumber *numberA = [formatter numberFromString:versionTokenA];
115 NSNumber *numberB = [formatter numberFromString:versionTokenB];
117 if (numberA && numberB) {
118 result = [numberA compare:numberB];
120 result = [versionTokenA compare:versionTokenB];
131 #pragma mark Memory Management