Problem: [ak] Hack: Will/Can NEVER be met/satisfied because NEWLY created 
ERAttachment has an inaccessible relationship to it’s corresponding data in 
ERAttachmentData. 

The stringent data validation below throws exception and can’t save the data! 
Any ideas and/or work arounds?

Thanks.

Kwasi O-Ahoofe

===============================
The link to repository: 
https://github.com/wocommunity/wonder/blob/master/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXDatabaseContext.java
 
<https://github.com/wocommunity/wonder/blob/master/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXDatabaseContext.java>


Offending Code:

Begins: ===>>>>
        @Override
        public void _verifyNoChangesToReadonlyEntity(EODatabaseOperation dbOp) {
                EOEntity entity = dbOp.entity();
                
                NSLog.out.appendln(
                "\n \n Begin:  << _verifyNoChangesToReadonlyEntity>>  " + 
this.name() + " \n \n" +
                "\n \n mEOEntity entity: \n \t"  + ((EOEnterpriseObject) 
dbOp.entity()).entityName()  +           
                "\n \n EODatabaseOperation dbOp(): \n \t"  +   
dbOp.databaseOperator()  +
                
                "\n \n dbOp << primaryKeyAttributeNames() >>: \n \t"  + 
dbOp.entity().primaryKeyAttributeNames()  +                     
                "\n \n  [ dbOp.dbSnapshot() ] : \n \t"  + 
                        ERXMutableDictionary.toPropertyList( dbOp.dbSnapshot() 
) +                                       
                "\n \n End:  << _verifyNoChangesToReadonlyEntity >>: " + 
this.name() + "  Method \n \n");
        
                
                if (entity.isReadOnly()) {
                        switch (dbOp.databaseOperator()) {
                        case 0: // '\0'
                                return;

                        case 1: // '\001'
                                throw new IllegalStateException("cannot insert 
object:" + dbOp.object() + " that corresponds to read-only entity: " + 
entity.name() + " in databaseContext " + this);

                        case 3: // '\003'
                                throw new IllegalStateException("cannot delete 
object:" + dbOp.object() + " that corresponds to read-only entity:" + 
entity.name() + " in databaseContext " + this);

                        case 2: // '\002'
                                if (!dbOp.dbSnapshot().equals(dbOp.newRow())) {
                                        throw new IllegalStateException("cannot 
update '" + dbOp.rowDiffsForAttributes(entity.attributes()).allKeys() + "' keys 
on object:" + dbOp.object() + " that corresponds to read-only entity: " + 
entity.name() + " in databaseContext " + this);
                                }
                                return;
                        }
                }
                
                // HACK: ak these methods are protected, so we call them via KVC
                if (dbOp.databaseOperator() == 2 && ((Boolean) 
NSKeyValueCoding.Utility.valueForKey(entity, 
"_hasNonUpdateableAttributes")).booleanValue()) {
                        NSArray keys = (NSArray) 
NSKeyValueCoding.Utility.valueForKey(entity, "dbSnapshotKeys");
                        NSDictionary dbSnapshot = dbOp.dbSnapshot();
                        NSDictionary newRow = dbOp.newRow();
                        for (int i = keys.count() - 1; i >= 0; i--) {
                                String key = (String) keys.objectAtIndex(i);
                                EOAttribute att = entity.attributeNamed(key);
                                // FIX: ak when you have single-table 
inheritance and in the
                                // child there are foreign keys that are not in 
the parent
                                // THEN, if the entity 
_hasNonUpdateableAttributes (public PK or
                                // read only props) the DB op is checked
                                // against the attributes. BUT this dictionary 
has all entries,
                                // even from the child (most likely NULL values)
                                // and the current implementation doesn't check 
against the case
                                // when the attribute isn't present in the 
first place.
                                // SO we add this check and live happily ever 
after
                                if (att != null && att._isNonUpdateable() && 
!dbSnapshot.objectForKey(key).equals(newRow.objectForKey(key))) {
                                        if (att.isReadOnly()) {
                                                throw new 
IllegalStateException("cannot update read-only key '" + key + "' on object:" + 
dbOp.object() + " of entity: " + entity.name() + " in databaseContext " + this);
                                        }
                                        throw new IllegalStateException("cannot 
update primary-key '" + key + "' from '" + dbSnapshot.objectForKey(key) + "' to 
'" + newRow.objectForKey(key) + "' on object:" + dbOp.object() + " of entity: " 
+ entity.name() + " in databaseContext " + this);
                                }
                        }

                }               

        }       
Ends: ===>>>>
        


Attachment: smime.p7s
Description: S/MIME cryptographic signature

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to