From: Anjo K. <an...@us...> - 2003-04-25 21:25:14
|
Update of /cvsroot/wonder/Wonder/Common/Frameworks/ERExtensions/Sources/er/extensions In directory sc8-pr-cvs1:/tmp/cvs-serv19693 Modified Files: ERXGenericRecord.java Log Message: first take on PK generation, it attempts to fix: - compound PK generation - using ERXEOControl instead of ERXUtilities - compound PK strings, encryption - greatly reduced indirection of calls - PK generation via class properties As this is a very core thing, it would be great if everyone would look over it... Index: ERXGenericRecord.java =================================================================== RCS file: /cvsroot/wonder/Wonder/Common/Frameworks/ERExtensions/Sources/er/extensions/ERXGenericRecord.java,v retrieving revision 1.46 retrieving revision 1.47 diff -C2 -d -r1.46 -r1.47 *** ERXGenericRecord.java 12 Apr 2003 01:42:24 -0000 1.46 --- ERXGenericRecord.java 25 Apr 2003 21:22:15 -0000 1.47 *************** *** 429,433 **** */ public String primaryKey() { ! return ERXExtensions.primaryKeyForObject(this); } --- 429,433 ---- */ public String primaryKey() { ! return ERXEOControlUtilities.primaryKeyStringForObject(this); } *************** *** 446,454 **** if (result == null) { NSDictionary pk = primaryKeyDictionary(false); - if (log.isDebugEnabled()) log.debug("pk: " + pk); NSArray primaryKeyAttributeNames=primaryKeyAttributeNames(); ! if (primaryKeyAttributeNames.count()>1) ! throw new RuntimeException("rawPrimaryKeyInTransaction does not support compound primary keys"); ! result=pk.objectForKey(primaryKeyAttributeNames.lastObject()); } return result; --- 446,452 ---- if (result == null) { NSDictionary pk = primaryKeyDictionary(false); NSArray primaryKeyAttributeNames=primaryKeyAttributeNames(); ! result = ERXArrayUtilities.valuesForKeyPaths(pk, primaryKeyAttributeNames); ! if(((NSArray)result).count() == 0) result = ((NSArray)result).lastObject(); } return result; *************** *** 457,461 **** /** * Calling this method will return the primary key of the ! * given enterprise object or if one has not been asigned * to it yet, then it will have the adaptor channel generate * one for it, cache it and then use that primary key when it --- 455,459 ---- /** * Calling this method will return the primary key of the ! * given enterprise object or if one has not been assigned * to it yet, then it will have the adaptor channel generate * one for it, cache it and then use that primary key when it *************** *** 468,473 **** */ public String primaryKeyInTransaction() { ! Object rpk=rawPrimaryKeyInTransaction(); ! return rpk!=null ? rpk.toString() : null; } --- 466,476 ---- */ public String primaryKeyInTransaction() { ! Object pk=rawPrimaryKeyInTransaction(); ! if(pk == null) ! return null; ! if(pk instanceof String || pk instanceof Number) { ! return pk.toString(); ! } ! return NSPropertyListSerialization.stringFromPropertyList(pk); } *************** *** 477,481 **** * @return the raw primary key of this object. */ ! public Object rawPrimaryKey() { return ERXExtensions.rawPrimaryKeyForObject(this); } /** --- 480,486 ---- * @return the raw primary key of this object. */ ! public Object rawPrimaryKey() { ! return ERXEOControlUtilities.primaryKeyObjectForObject(this); ! } /** *************** *** 485,489 **** */ public String encryptedPrimaryKey() { ! String pk = ERXExtensions.primaryKeyForObject(this); return pk==null ? null : ERXCrypto.blowfishEncode(pk); } --- 490,494 ---- */ public String encryptedPrimaryKey() { ! String pk = ERXEOControlUtilities.primaryKeyStringForObject(this); return pk==null ? null : ERXCrypto.blowfishEncode(pk); } *************** *** 529,552 **** * a new primary key dictionary is created, cached and returned. */ - // FIXME: This should work for compound pks as well, ie don't try to gen a new pk - // if they have a compound pk. // FIXME: this method is really misnamed; it should be called rawPrimaryKeyDictionary public NSDictionary primaryKeyDictionary(boolean inTransaction) { if(_primaryKeyDictionary == null) { if (!inTransaction) { ! NSArray primaryKeyAttributeNames=primaryKeyAttributeNames(); ! if (primaryKeyAttributeNames.count()>1) { ! if(true) // ak:testing ! return null; ! else ! throw new RuntimeException("primaryKeyDictionary does not support compound primary keys"); ! } ! if (rawPrimaryKey() != null) { ! if (log.isDebugEnabled()) log.debug("Got raw key: "+ rawPrimaryKey()); ! //FIXME: Should be getting primaryKey name from the entity of the enterprise object. ! _primaryKeyDictionary = new NSDictionary(rawPrimaryKey(), primaryKeyAttributeNames.lastObject()); ! } else if (log.isDebugEnabled()) log.debug("No raw key, trying single key"); ! _primaryKeyDictionary = ERXUtilities.primaryKeyDictionaryForEntity(editingContext(), entityName()); } } --- 534,550 ---- * a new primary key dictionary is created, cached and returned. */ // FIXME: this method is really misnamed; it should be called rawPrimaryKeyDictionary public NSDictionary primaryKeyDictionary(boolean inTransaction) { if(_primaryKeyDictionary == null) { if (!inTransaction) { ! Object rawPK = rawPrimaryKey(); ! if (rawPK != null) { ! if (log.isDebugEnabled()) log.debug("Got raw key: "+ rawPK); ! NSArray primaryKeyAttributeNames=primaryKeyAttributeNames(); ! _primaryKeyDictionary = new NSDictionary(rawPK instanceof NSArray ? (NSArray)rawPK : new NSArray(rawPK), primaryKeyAttributeNames); ! } else { if (log.isDebugEnabled()) log.debug("No raw key, trying single key"); ! _primaryKeyDictionary = ERXEOControlUtilities.newPrimaryKeyDictionaryForObject(this); ! } } } |