Package com.webobjects.eocontrol

Source Code of com.webobjects.eocontrol.EOGenericRecord$_DictionaryBinding

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);
    }
  }
}
TOP

Related Classes of com.webobjects.eocontrol.EOGenericRecord$_DictionaryBinding

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.