package com.webobjects.eocontrol;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSKeyValueCoding;
import com.webobjects.foundation.NSLog;
import com.webobjects.foundation.NSMutableDictionary;
import com.webobjects.foundation._NSReflectionUtilities;
import com.webobjects.foundation._NSThreadsafeMutableDictionary;
import com.webobjects.foundation._NSUtilities;
/**
* Re-implemented to remove broken serialization of classDescription
*/
public class EOGenericRecord extends EOCustomObject {
public static final Class<?> _CLASS = _NSUtilities._classWithFullySpecifiedName("com.webobjects.eocontrol.EOGenericRecord");
private static final long serialVersionUID = 1L;
transient NSMutableDictionary __dictionary;
@Deprecated
public EOGenericRecord(EOEditingContext editingContext, EOClassDescription classDescription, EOGlobalID gid) {
super(editingContext, classDescription, gid);
__setClassDescription(classDescription);
}
public EOGenericRecord(EOClassDescription classDescription) {
__setClassDescription(classDescription);
}
public EOGenericRecord() {
__setClassDescription();
}
public static boolean usesDeferredFaultCreation() {
return true;
}
private void __setClassDescription() {
EOClassDescription cd = EOClassDescription.classDescriptionForClass(getClass());
if (cd == null) {
throw new IllegalStateException("Unabled to find an EOClassDescription for objects of " + getClass());
}
__setClassDescription(cd);
}
@Override
public final void __setClassDescription(EOClassDescription classDescription) {
if (classDescription == null) {
throw new IllegalArgumentException("A class description of a generic record cannot be null");
}
__classDescription = classDescription;
__dictionary = __classDescription._newDictionaryForProperties();
}
@Override
public EOClassDescription classDescription() {
EOClassDescription cd = __classDescription();
if (cd == null) {
__setClassDescription();
}
return __classDescription();
}
@Override
public NSKeyValueCoding._KeyBinding _otherStorageBinding(String key) {
boolean lazyBindingNeeded = false;
EOClassDescription classDescription = classDescription();
Class<?> objectClass = getClass();
NSArray<String> cdAttributes = classDescription != null ? classDescription.attributeKeys() : null;
if ((_usesDeferredFaultCreationForClass(objectClass)) && (cdAttributes != null)
&& (!cdAttributes.containsObject(key))) {
lazyBindingNeeded = true;
}
Class<?> enforcedNumberOrBooleanClass = null;
Class<?> inferredValueClass = null;
if (classDescription != null) {
inferredValueClass = classDescription._enforcedKVCNumberClassForKey(key);
if ((inferredValueClass != null) && (_NSUtilities._isClassANumberOrABoolean(inferredValueClass))) {
enforcedNumberOrBooleanClass = inferredValueClass;
}
}
if (inferredValueClass == null) {
inferredValueClass = _NSReflectionUtilities._inferredValueClassForKey(objectClass, key, true);
if ((inferredValueClass != null) && (_NSUtilities._isClassANumberOrABoolean(inferredValueClass))) {
enforcedNumberOrBooleanClass = inferredValueClass;
}
}
if ((__dictionary instanceof _EOMutableKnownKeyDictionary)) {
NSKeyValueCoding._KeyBinding keyBinding = ((_EOMutableKnownKeyDictionary) __dictionary).initializer()
._genericRecordKeyBindingForKey(key, lazyBindingNeeded, enforcedNumberOrBooleanClass);
if (keyBinding != null) {
return keyBinding;
}
}
if (((cdAttributes != null) && (cdAttributes.containsObject(key)))
|| ((classDescription != null) && ((classDescription.toOneRelationshipKeys().containsObject(key)) || (classDescription
.toManyRelationshipKeys().containsObject(key))))) {
return lazyBindingNeeded ? new _LazyDictionaryBinding(key, enforcedNumberOrBooleanClass)
: new _DictionaryBinding(key, enforcedNumberOrBooleanClass);
}
return new NSKeyValueCoding._KeyBinding(null, key);
}
@Override
public NSKeyValueCoding._KeyBinding _keyGetBindingForKey(String key) {
Class<?> objectClass = getClass();
_NSThreadsafeMutableDictionary mapTable = classDescription()._kvcMapForClass(objectClass)._getBindings;
NSKeyValueCoding._KeyBinding keyBinding = (NSKeyValueCoding._KeyBinding) mapTable.objectForKey(key);
if (keyBinding == null) {
keyBinding = _createKeyGetBindingForKey(key);
mapTable.setObjectForKey(keyBinding != null ? keyBinding : new NSKeyValueCoding._KeyBinding(objectClass,
key), key);
}
return keyBinding;
}
@Override
public NSKeyValueCoding._KeyBinding _keySetBindingForKey(String key) {
Class<?> objectClass = getClass();
_NSThreadsafeMutableDictionary mapTable = classDescription()._kvcMapForClass(objectClass)._setBindings;
NSKeyValueCoding._KeyBinding keyBinding = (NSKeyValueCoding._KeyBinding) mapTable.objectForKey(key);
if (keyBinding == null) {
keyBinding = _createKeySetBindingForKey(key);
mapTable.setObjectForKey(keyBinding != null ? keyBinding : new NSKeyValueCoding._KeyBinding(objectClass,
key), key);
}
return keyBinding;
}
@Override
public NSKeyValueCoding._KeyBinding _storedKeyGetBindingForKey(String key) {
Class<?> objectClass = getClass();
_NSThreadsafeMutableDictionary mapTable = classDescription()._kvcMapForClass(objectClass)._storedGetBindings;
NSKeyValueCoding._KeyBinding keyBinding = (NSKeyValueCoding._KeyBinding) mapTable.objectForKey(key);
if (keyBinding == null) {
keyBinding = _createStoredKeyGetBindingForKey(key);
mapTable.setObjectForKey(keyBinding != null ? keyBinding : new NSKeyValueCoding._KeyBinding(objectClass,
key), key);
}
return keyBinding;
}
@Override
public NSKeyValueCoding._KeyBinding _storedKeySetBindingForKey(String key) {
Class<?> objectClass = getClass();
_NSThreadsafeMutableDictionary mapTable = classDescription()._kvcMapForClass(objectClass)._storedSetBindings;
NSKeyValueCoding._KeyBinding keyBinding = (NSKeyValueCoding._KeyBinding) mapTable.objectForKey(key);
if (keyBinding == null) {
keyBinding = _createStoredKeySetBindingForKey(key);
mapTable.setObjectForKey(keyBinding != null ? keyBinding : new NSKeyValueCoding._KeyBinding(objectClass,
key), key);
}
return keyBinding;
}
public static class _LazyDictionaryBinding extends EOGenericRecord._DictionaryBinding {
public _LazyDictionaryBinding(String key) {
super(key);
}
public _LazyDictionaryBinding(String key, Class<?> enforcedNumberOrBooleanClass) {
super(key, enforcedNumberOrBooleanClass);
}
@Override
public Object valueInObject(Object object) {
Object value = super.valueInObject(object);
return value != null ? ((EOGenericRecord) object).willReadRelationship(value) : null;
}
}
public static class _DictionaryBinding extends NSKeyValueCoding._KeyBinding {
private Class<?> _enforcedNumberOrBooleanClass;
public _DictionaryBinding(String key) {
this(key, null);
}
public _DictionaryBinding(String key, Class<?> enforcedNumberOrBooleanClass) {
super(null, key);
_enforcedNumberOrBooleanClass = enforcedNumberOrBooleanClass;
}
@Override
public Object valueInObject(Object object) {
EOGenericRecord genericRecord = (EOGenericRecord) object;
genericRecord.willRead();
Object value = genericRecord.__dictionary.objectForKey(_key);
return value == NSKeyValueCoding.NullValue ? null : value;
}
@Override
public void setValueInObject(Object value, Object object) {
EOGenericRecord genericRecord = (EOGenericRecord) object;
genericRecord.willChange();
Object convertedValue = value;
if (convertedValue == null) {
convertedValue = NSKeyValueCoding.NullValue;
} else if (_enforcedNumberOrBooleanClass != null) {
try {
convertedValue = _NSUtilities.convertNumberOrBooleanIntoCompatibleValue(convertedValue,
_enforcedNumberOrBooleanClass);
} catch (ClassCastException exception) {
NSLog._conditionallyLogPrivateException(exception);
}
}
genericRecord.__dictionary.setObjectForKey(convertedValue, _key);
}
}
}