package com.webobjects.eoaccess; import java.lang.reflect.InvocationTargetException; import java.math.BigDecimal; import java.sql.Timestamp; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.TimeZone; import org.apache.commons.lang3.CharEncoding; import com.webobjects.eocontrol.changeNotification.EOChangeNotificationOptions; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSData; import com.webobjects.foundation.NSDictionary; import com.webobjects.foundation.NSForwardException; import com.webobjects.foundation.NSKeyValueCoding; import com.webobjects.foundation.NSLog; import com.webobjects.foundation.NSMutableArray; import com.webobjects.foundation.NSMutableDictionary; import com.webobjects.foundation.NSRange; import com.webobjects.foundation.NSSelector; import com.webobjects.foundation.NSTimestamp; import com.webobjects.foundation._NSStringUtilities; import com.webobjects.foundation._NSUtilities; import com.webobjects.jdbcadaptor.JDBCAdaptorException; public class EOAttribute extends EOProperty implements EOPropertyListEncoding, EOSQLExpression.SQLValue { enum Characteristic { ExternalType("externalType"), ColumnName("columnName"), ReadOnly("readOnly"), ClassName("className"), ValueType("valueType"), Width("width"), Precision("precision"), Scale("scale"), WriteFormat("writeFormat"), ReadFormat("readFormat"), UserInfo("userInfo"), ServerTimeZone("serverTimeZone"), ValueFactoryClassName("valueFactoryClassName"), ValueFactoryMethodName("valueFactoryMethodName"), AdaptorValueConversionClassName("adaptorValueConversionClassName"), AdaptorValueConversionMethodName("adaptorValueConversionMethodName"), FactoryMethodArgumentType("factoryMethodArgumentType"), AllowsNull("allowsNull"), ParameterDirection("parameterDirection"), InternalInfo("_internalInfo"); private String _externalName; Characteristic(String externalName) { _externalName = externalName; } public String externalName() { return _externalName; } public static Characteristic characteristicForName(String value) { String lower = value.toLowerCase(); for (Characteristic c : values()) { if (c.externalName().equalsIgnoreCase(lower)) { return c; } } return null; } } public synchronized Map overwrittenCharacteristics() { if (_overwrittenCharacteristics == null) { Map list = new HashMap(); for (Characteristic c : Characteristic.values()) { list.put(c, Boolean.FALSE); } _overwrittenCharacteristics = list; } return _overwrittenCharacteristics; } protected void _setOverrideForCharacteristic(Characteristic key) { overwrittenCharacteristics().put(key, Boolean.TRUE); } public boolean overridesPrototypeDefinitionForCharacteristic(Characteristic key) { Boolean value = (Boolean) overwrittenCharacteristics().get(key); return value == null ? false : value.booleanValue(); } public void _updateFromPrototype() { if (_prototype == null) return; if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.ExternalType)) _setExternalType(_prototype.externalType()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.ColumnName)) _setColumnName(_prototype.columnName()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.ReadOnly)) _setReadOnly(_prototype.isReadOnly()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.ClassName)) _setClassName(_prototype.className()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.ValueType)) _setValueType(_prototype.valueType()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.Width)) _setWidth(_prototype.width()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.Precision)) _setPrecision(_prototype.precision()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.Scale)) _setScale(_prototype.scale()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.WriteFormat)) _setWriteFormat(_prototype.writeFormat()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.ReadFormat)) _setReadFormat(_prototype.readFormat()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.ServerTimeZone)) _setServerTimeZone(_prototype.serverTimeZone()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.ValueFactoryClassName)) _setValueFactoryClassName(_prototype.valueFactoryClassName()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.ValueFactoryMethodName)) _setValueFactoryMethodName(_prototype.valueFactoryMethodName()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.AdaptorValueConversionClassName)) _setAdaptorValueConversionClassName(_prototype.adaptorValueConversionClassName()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.AdaptorValueConversionMethodName)) _setAdaptorValueConversionMethodName(_prototype.adaptorValueConversionMethodName()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.FactoryMethodArgumentType)) _setFactoryMethodArgumentType(_prototype.factoryMethodArgumentType()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.AllowsNull)) _setAllowsNull(_prototype.allowsNull()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.ParameterDirection)) _setParameterDirection(_prototype.parameterDirection()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.UserInfo)) if (_prototype.userInfo() != null) _setUserInfo(_prototype.userInfo().immutableClone()); else _setUserInfo(NSDictionary.emptyDictionary()); if (!overridesPrototypeDefinitionForCharacteristic(Characteristic.InternalInfo)) if (_prototype._internalInfo() != null) __setInternalInfo(_prototype._internalInfo().immutableClone()); else __setInternalInfo(NSDictionary.emptyDictionary()); } public void _resetPrototype() { if (_prototypeName != null) { _prototype = null; prototype(); } } protected boolean _hasAnyOverrides() { boolean result = false; for (Iterator i = overwrittenCharacteristics().values().iterator(); i.hasNext();) { Boolean anEnum = (Boolean) i.next(); result |= anEnum.booleanValue(); } return result; } public EOAttribute() { _flags_isNonUpdateable = false; _flags_isNonUpdateableInitialized = false; _flags_allowsNull = true; _adaptorValueType = -1; _valueTypeClassName = ""; } @Override public String name() { return _name; } @Override public String toString() { return _toString(0); } public String _toString(int indent) { String indentString = ""; for (int i = 0; i < indent; i++) indentString = new StringBuilder().append(indentString).append('\t').toString(); StringBuilder aLog = new StringBuilder(); aLog.append(new StringBuilder().append(indentString).append("<EOAttribute ").append(name()).append('\n').toString()); String aKey = ""; try { NSMutableDictionary aDictionary = new NSMutableDictionary(); encodeIntoPropertyList(aDictionary); for (Enumeration enumerator = aDictionary.keyEnumerator(); enumerator.hasMoreElements(); aLog.append(new StringBuilder().append(indentString).append('\t').append(aKey).append(" : '").append(aDictionary.objectForKey(aKey)).append("'\n").toString())) aKey = (String) enumerator.nextElement(); } catch (Exception exception) { aLog.append(new StringBuilder().append(indentString).append('\t').append(getClass().getName()).append(".toString: characteristics ").append(aKey).append(" exception ").append(exception).append('\n').toString()); } aLog.append(new StringBuilder().append(indentString).append('>').toString()); return aLog.toString(); } @Override public EOEntity entity() { return _parent; } public EOStoredProcedure storedProcedure() { return _parentStoredProcedure; } public Object parent() { if (_parent != null) return _parent; return _parentStoredProcedure; } private EOModel _parentModel() { if (_parent != null) return _parent.model(); if (_parentStoredProcedure != null) return _parentStoredProcedure.model(); return null; } private void _parent_setIsEdited() { if (_parent != null) _parent._setIsEdited(); else if (_parentStoredProcedure != null) _parentStoredProcedure._setIsEdited(); } private NSArray _parent_primaryKeyAttributes() { if (_parent != null) return _parent.primaryKeyAttributes(); return null; } private EOAttribute _parent_attributeNamed(String name) { if (_parent != null) return _parent.attributeNamed(name); return null; } private void _parent_removeAttribute(EOAttribute att) { if (_parent != null) _parent.removeAttribute(att); } public String prototypeName() { return _prototypeName; } public EOAttribute prototype() { if (_prototype == null && _prototypeName != null) if (_parent != null) _prototype = _parent.model().prototypeAttributeNamed(_prototypeName); else if (_parentStoredProcedure != null) _prototype = _parentStoredProcedure.model().prototypeAttributeNamed(_prototypeName); return _prototype; } public String externalType() { return _externalType; } public String columnName() { return _columnName; } public String definition() { return _definitionArray == null ? null : _definitionArray.valueForSQLExpression(null); } public boolean isFlattened() { if (_definitionArray == null) return false; int count; if ((count = _definitionArray.count()) < 2) return false; for (int index = 0; index < count - 1; index++) { Object property = _definitionArray.objectAtIndex(index); if (!(property instanceof EORelationship)) return false; } return _definitionArray.lastObject() instanceof EOAttribute; } public boolean isDerived() { return _definitionArray != null; } public boolean isReadOnly() { return _flags_isReadOnly || isDerived() && !isFlattened(); } public boolean _isPrimaryKeyClassProperty() { NSArray pkAtts = _parent_primaryKeyAttributes(); if (pkAtts == null) return false; if (!pkAtts.containsObject(this)) return false; return _parent.classProperties().containsObject(this); } public boolean _isNonUpdateable() { if (_flags_isNonUpdateableInitialized) { return _flags_isNonUpdateable; } _flags_isNonUpdateable = isReadOnly() || _isPrimaryKeyClassProperty(); _flags_isNonUpdateableInitialized = true; return _flags_isNonUpdateable; } /** * @return valueClassName * @deprecated Method valueClassName is deprecated */ @Deprecated public String valueClassName() { return _valueClassName; } public String className() { return _className; } public String valueType() { return _valueType; } protected char _valueTypeChar() { if (_valueType != null && _valueType.length() == 1) return _valueType.charAt(0); return _VTUnknown; } public int width() { return _width; } public int precision() { return _precision; } public int scale() { return _scale; } public boolean allowsNull() { return _flags_allowsNull; } public String readFormat() { return _readFormat; } public String writeFormat() { return _writeFormat; } public int parameterDirection() { return _parameterDirection; } public NSDictionary userInfo() { return _userInfo; } public NSDictionary _internalInfo() { return _internalInfo; } public EOAttribute(NSDictionary plist, Object owner) { _flags_isNonUpdateable = false; _flags_isNonUpdateableInitialized = false; _name = (String) plist.objectForKey("name"); _adaptorValueType = -1; _valueTypeClassName = ""; setParent(owner); String string; if ((string = (String) plist.objectForKey("prototypeName")) != null) setPrototype(_parentModel().prototypeAttributeNamed(string)); if ((string = (String) plist.objectForKey("externalType")) != null) setExternalType(string); if ((string = (String) plist.objectForKey("isReadOnly")) != null) setReadOnly(string.equals("Y")); if ((string = (String) plist.objectForKey("allowsNull")) != null || _prototypeName == null) setAllowsNull(string != null && string.equals("Y")); if ((string = (String) plist.objectForKey("valueType")) != null) setValueType(string); if ((string = (String) plist.objectForKey("valueClassName")) != null) setValueClassName(string); if ((string = (String) plist.objectForKey("className")) != null) setClassName(string); string = (String) plist.objectForKey("writeFormat"); if (string == null) { string = (String) plist.objectForKey("updateFormat"); if (string == null) string = (String) plist.objectForKey("insertFormat"); } if (string != null) setWriteFormat(string); string = (String) plist.objectForKey("readFormat"); if (string == null) string = (String) plist.objectForKey("selectFormat"); if (string != null) setReadFormat(string); int num = _NSStringUtilities.integerFromPlist(plist, "maximumLength", -1); if (num == -1) num = _NSStringUtilities.integerFromPlist(plist, "width", -1); if (num != -1) setWidth(num); if ((string = (String) plist.objectForKey("factoryMethodArgumentType")) != null) _argumentType = _factoryMethodArgumentTypeFromString(string); if ((string = (String) plist.objectForKey("adaptorValueConversionClassName")) != null) setAdaptorValueConversionClassName(string); if ((string = (String) plist.objectForKey("adaptorValueConversionMethodName")) != null) setAdaptorValueConversionMethodName(string); if ((string = (String) plist.objectForKey("valueFactoryClassName")) != null) setValueFactoryClassName(string); if ((string = (String) plist.objectForKey("valueFactoryMethodName")) != null) setValueFactoryMethodName(string); num = _NSStringUtilities.integerFromPlist(plist, "precision", -1); if (num != -1) setPrecision(num); num = _NSStringUtilities.integerFromPlist(plist, "scale", -1); if (num != -1) setScale(num); if (_width == 0 && _externalType != null) { int leftParen = _externalType.indexOf("("); if (leftParen != -1) { int rightParen = _externalType.indexOf(")"); if (rightParen != -1) { String sizeString = _externalType.substring(leftParen + 1, rightParen); int max; try { max = Integer.parseInt(sizeString); } catch (NumberFormatException e) { NSLog._conditionallyLogPrivateException(e); max = 0; } if (max != 0) { setWidth(max); setExternalType(_externalType.substring(0, leftParen)); } } } } String tzName = (String) plist.objectForKey("serverTimeZone"); if (tzName != null) { TimeZone tz = TimeZone.getTimeZone(tzName); setServerTimeZone(tz); } num = _NSStringUtilities.integerFromPlist(plist, "parameterDirection", -1); if (num != -1) setParameterDirection(num); Object val = plist.objectForKey("userInfo"); if (val == null) val = plist.objectForKey("userDictionary"); setUserInfo((NSDictionary) val); if ((val = plist.objectForKey("internalInfo")) != null) _setInternalInfo((NSDictionary) val); } private boolean shouldEncodeIvarWithPrototypeCharacteristic(int ivar, Characteristic key) { return ivar != 0 && (_prototype == null || overridesPrototypeDefinitionForCharacteristic(key)); } private boolean shouldEncodeIvarWithPrototypeCharacteristic(Object ivar, Characteristic key) { return ivar != null && (_prototype == null || overridesPrototypeDefinitionForCharacteristic(key)); } private boolean shouldEncodeScalarIvarWithPrototypeCharacteristic(int scalarIvar, Characteristic key) { return _prototype == null && scalarIvar != 0 || _prototype != null && overridesPrototypeDefinitionForCharacteristic(key); } public void encodeIntoPropertyList(NSMutableDictionary result) { if (_name != null) result.setObjectForKey(_name, "name"); Object plist = prototypeName(); if (plist != null) result.setObjectForKey(plist, "prototypeName"); plist = columnName(); if (plist != null) { if (shouldEncodeIvarWithPrototypeCharacteristic(_columnName, Characteristic.ColumnName)) result.setObjectForKey(plist, "columnName"); } else { plist = definition(); if (plist != null) result.setObjectForKey(plist, "definition"); } if (shouldEncodeIvarWithPrototypeCharacteristic(_externalType, Characteristic.ExternalType)) result.setObjectForKey(_externalType, "externalType"); if (shouldEncodeIvarWithPrototypeCharacteristic(_valueType, Characteristic.ValueType)) result.setObjectForKey(_valueType, "valueType"); if (shouldEncodeIvarWithPrototypeCharacteristic(_className, Characteristic.ClassName)) result.setObjectForKey(_className, "className"); if (shouldEncodeIvarWithPrototypeCharacteristic(_writeFormat, Characteristic.WriteFormat)) result.setObjectForKey(_writeFormat, "writeFormat"); if (shouldEncodeIvarWithPrototypeCharacteristic(_readFormat, Characteristic.ReadFormat)) result.setObjectForKey(_readFormat, "readFormat"); if (shouldEncodeScalarIvarWithPrototypeCharacteristic(_width, Characteristic.Width)) result.setObjectForKey(String.valueOf(_width), "width"); if (shouldEncodeIvarWithPrototypeCharacteristic(_serverTimeZone, Characteristic.ServerTimeZone)) { plist = _serverTimeZone.getID(); if (plist != null) result.setObjectForKey(plist, "serverTimeZone"); } if (shouldEncodeIvarWithPrototypeCharacteristic(_valueFactoryClassName, Characteristic.ValueFactoryClassName)) result.setObjectForKey(_valueFactoryClassName, "valueFactoryClassName"); if (shouldEncodeIvarWithPrototypeCharacteristic(_valueFactoryMethodName, Characteristic.ValueFactoryMethodName)) result.setObjectForKey(_valueFactoryMethodName, "valueFactoryMethodName"); if (shouldEncodeIvarWithPrototypeCharacteristic(_adaptorValueConversionClassName, Characteristic.AdaptorValueConversionClassName)) result.setObjectForKey(_adaptorValueConversionClassName, "adaptorValueConversionClassName"); if (shouldEncodeIvarWithPrototypeCharacteristic(_adaptorValueConversionMethodName, Characteristic.AdaptorValueConversionMethodName)) result.setObjectForKey(_adaptorValueConversionMethodName, "adaptorValueConversionMethodName"); if (shouldEncodeIvarWithPrototypeCharacteristic(_argumentType, Characteristic.FactoryMethodArgumentType)) result.setObjectForKey(_stringForFactoryMethodArgumentType(_argumentType), "factoryMethodArgumentType"); if (shouldEncodeScalarIvarWithPrototypeCharacteristic(_precision, Characteristic.Precision)) result.setObjectForKey(String.valueOf(_precision), "precision"); if (shouldEncodeScalarIvarWithPrototypeCharacteristic(_scale, Characteristic.Scale)) result.setObjectForKey(String.valueOf(_scale), "scale"); if (shouldEncodeScalarIvarWithPrototypeCharacteristic(_flags_isReadOnly ? 1 : 0, Characteristic.ReadOnly)) result.setObjectForKey(isReadOnly() ? "Y" : "N", "isReadOnly"); if (shouldEncodeScalarIvarWithPrototypeCharacteristic(_flags_allowsNull ? 1 : 0, Characteristic.AllowsNull)) result.setObjectForKey(allowsNull() ? "Y" : "N", "allowsNull"); if (shouldEncodeScalarIvarWithPrototypeCharacteristic(_parameterDirection, Characteristic.ParameterDirection)) result.setObjectForKey(String.valueOf(_parameterDirection), "parameterDirection"); if (shouldEncodeIvarWithPrototypeCharacteristic(_userInfo, Characteristic.UserInfo)) result.setObjectForKey(_userInfo.clone(), "userInfo"); if (shouldEncodeIvarWithPrototypeCharacteristic(_internalInfo, Characteristic.InternalInfo)) result.setObjectForKey(_internalInfo.clone(), "internalInfo"); } public void awakeWithPropertyList(NSDictionary plist) { Object encoding; String string; if ((string = (String) plist.objectForKey("definition")) != null) { _setDefinitionWithoutFlushingCaches(string); _parent_setIsEdited(); } else if ((string = (String) plist.objectForKey("columnName")) != null) setColumnName(string); else if ((encoding = plist.objectForKey("externalName")) != null) if (encoding instanceof String) setColumnName((String) encoding); else if (encoding instanceof NSDictionary) _definitionArray = (_EOExpressionArray) _objectForPlist(encoding); } public boolean overridesPrototypeDefinitionForKey(String key) { Characteristic aCharacteristic = Characteristic.characteristicForName(key); return aCharacteristic == null ? false : overridesPrototypeDefinitionForCharacteristic(aCharacteristic); } public void setName(String name) { if (name.equals(_name)) return; EOEntity entity = entity(); EOModel model = null; EOModelGroup group = null; if (entity != null) model = entity.model(); if (model != null) group = model.modelGroup(); if (group != null) group.loadAllModelObjects(); _name = name; _parent_setIsEdited(); } public void setPrototype(EOAttribute prototype) { if (_prototype == prototype) return; _overwrittenCharacteristics = null; if (prototype == null) { _prototype = null; _prototypeName = null; } else if (_prototypeName == null || !_prototypeName.equals(prototype.name())) { _prototypeName = prototype.name(); if (_prototypeName != null) { _prototype = _parentModel().prototypeAttributeNamed(_prototypeName); if (_prototype == null) _prototype = prototype; _updateFromPrototype(); } else { _prototype = null; _prototypeName = null; } } } public void setReadOnly(boolean yn) { if (_flags_isReadOnly != yn) { if (!yn && isDerived() && !isFlattened()) throw new IllegalArgumentException("Unable to remove read only on a derived not flattened attribute"); _setReadOnly(yn); _setOverrideForCharacteristic(Characteristic.ReadOnly); } } private void _setReadOnly(boolean yn) { if (_flags_isReadOnly != yn) { if (!yn && isDerived() && !isFlattened()) throw new IllegalArgumentException("Unable to remove read only on a derived not flattened attribute"); _flags_isReadOnly = yn; _parent_setIsEdited(); if (_parent != null) _parent._clearAttributesCaches(); _flags_isNonUpdateableInitialized = false; } } public void setColumnName(String columnName) { if (columnName == null && _columnName == null) { return; } _setColumnName(columnName); _setOverrideForCharacteristic(Characteristic.ColumnName); return; } private void _setColumnName(String columnName) { if (columnName == null && _columnName == null) { return; } _definitionArray = null; _columnName = columnName; _parent_setIsEdited(); return; } public void setDefinition(String definition) { if (definition == null && _definitionArray == null) { return; } _setDefinitionWithoutFlushingCaches(definition); _setValuesFromTargetAttribute(); _parent_setIsEdited(); return; } public void setExternalType(String string) { if (_externalType == null || !_externalType.equals(string)) { _setExternalType(string); _setOverrideForCharacteristic(Characteristic.ExternalType); } } private void _setExternalType(String string) { if (_externalType == null || !_externalType.equals(string)) { _externalType = string == null || string.length() <= 0 ? null : string; _parent_setIsEdited(); } } public void setValueType(String string) { if (_valueType == null || !_valueType.equals(string)) { _setValueType(string); _setOverrideForCharacteristic(Characteristic.ValueType); } } private void _setValueType(String string) { if (_valueType == null || !_valueType.equals(string)) _valueType = string == null || string.length() <= 0 ? null : string; } private String _javaNameForObjcName(String name) { if (name == null) return null; if (name.startsWith(CN_NSPrefix)) { if (name.equals(CN_NSString)) return CN_JavaString; if (name.equals(CN_NSNumber)) return CN_JavaNumber; if (name.equals(CN_NSDecimalNumber)) return CN_JavaBigDecimal; if (name.equals(CN_NSCalendarDate)) return CN_JavaNSTimestamp; if (name.equals(CN_NSGregorianDate)) return CN_JavaNSTimestamp; if (name.equals(CN_NSData)) return CN_JavaNSData; } else if (name.equals("")) return null; return name; } private String _objcNameForJavaName(String name) { if (name == null) return null; if (name.equals(CN_JavaString)) return CN_NSString; if (name.equals(CN_JavaNumber)) return CN_NSNumber; if (name.equals(CN_JavaBigDecimal)) return CN_NSDecimalNumber; if (name.equals(CN_JavaNSTimestamp)) return CN_NSCalendarDate; if (name.equals(CN_JavaNSData)) return CN_NSData; if (name.equals("")) return null; return _NSStringUtilities.lastComponentInString(name, '.'); } /** * @param name * valueClassName * @deprecated Method setValueClassName is deprecated */ @Deprecated public void setValueClassName(String name) { _valueClassName = name == null || name.length() <= 0 ? null : name; _className = _javaNameForObjcName(_valueClassName); _adaptorValueType = -1; _valueTypeClassName = ""; _setOverrideForCharacteristic(Characteristic.ClassName); } public void setClassName(String name) { _setClassName(name); _setOverrideForCharacteristic(Characteristic.ClassName); } private void _setClassName(String name) { _className = name == null || name.length() <= 0 ? null : name; _valueClassName = _objcNameForJavaName(_className); _adaptorValueType = -1; _valueTypeClassName = ""; } public void setWidth(int length) { _setWidth(length); _setOverrideForCharacteristic(Characteristic.Width); } private void _setWidth(int length) { _width = length; } public void setPrecision(int precision) { _setPrecision(precision); _setOverrideForCharacteristic(Characteristic.Precision); } private void _setPrecision(int precision) { _precision = precision; } public void setScale(int scale) { _setScale(scale); _setOverrideForCharacteristic(Characteristic.Scale); } private void _setScale(int scale) { _scale = scale; } public void setAllowsNull(boolean allowsNull) { if (allowsNull == _flags_allowsNull) { return; } _setAllowsNull(allowsNull); _setOverrideForCharacteristic(Characteristic.AllowsNull); return; } private void _setAllowsNull(boolean allowsNull) { if (allowsNull == _flags_allowsNull) { return; } _flags_allowsNull = allowsNull; return; } public void setWriteFormat(String string) { _setWriteFormat(string); _setOverrideForCharacteristic(Characteristic.WriteFormat); } private void _setWriteFormat(String string) { _writeFormat = _setNewFormatStringOld(string, _writeFormat); } public void setReadFormat(String string) { _setReadFormat(string); _setOverrideForCharacteristic(Characteristic.ReadFormat); } private void _setReadFormat(String string) { _readFormat = _setNewFormatStringOld(string, _readFormat); } public void setParameterDirection(int parameterDirection) { _setParameterDirection(parameterDirection); _setOverrideForCharacteristic(Characteristic.ParameterDirection); } private void _setParameterDirection(int parameterDirection) { _parameterDirection = parameterDirection; } public void setUserInfo(NSDictionary dictionary) { _setUserInfo(dictionary); _setOverrideForCharacteristic(Characteristic.UserInfo); } private void _setUserInfo(NSDictionary dictionary) { _userInfo = dictionary == null || dictionary.count() <= 0 ? null : (NSDictionary) dictionary.clone(); _parent_setIsEdited(); } protected void _setInternalInfo(NSDictionary dictionary) { __setInternalInfo(dictionary); _setOverrideForCharacteristic(Characteristic.InternalInfo); } private void __setInternalInfo(NSDictionary dictionary) { _internalInfo = dictionary == null || dictionary.count() <= 0 ? null : (NSDictionary) dictionary.clone(); _parent_setIsEdited(); } public void beautifyName() { setName(_EOStringUtil.nameForExternalNameSeparatorStringInitialCaps(name(), "_", false)); } public TimeZone serverTimeZone() { if (_serverTimeZone == null) return TimeZone.getDefault(); return _serverTimeZone; } public void setServerTimeZone(TimeZone tz) { _setServerTimeZone(tz); _setOverrideForCharacteristic(Characteristic.ServerTimeZone); } private void _setServerTimeZone(TimeZone tz) { _serverTimeZone = (TimeZone) tz.clone(); } public Object newValueForBytes(byte bytes[], int length) { return newValueForImmutableBytes(bytes); } public Object newValueForImmutableBytes(byte bytes[]) { Class dataClass = NSData._CLASS; Object value = null; NSData data = null; if (_valueClass == null) { _valueClass = _NSUtilities.classWithName(className());//_valueClassName); if (_valueClass == null) _valueClass = dataClass; } if (_valueClass == dataClass || _argumentType == FactoryMethodArgumentIsData || _valueFactoryMethod == null) { data = new NSData(bytes, new NSRange(0, bytes.length), true); if (_valueClass == dataClass || _valueFactoryMethod == null) return data; } switch (_argumentType) { default: break; case FactoryMethodArgumentIsData: try { value = _valueFactoryMethod.invoke(valueFactoryClass()==null?_valueClass:valueFactoryClass(), data); } catch (IllegalAccessException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (IllegalArgumentException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (InvocationTargetException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (NoSuchMethodException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } break; case FactoryMethodArgumentIsBytes: try { value = _valueFactoryMethod.invoke(valueFactoryClass()==null?_valueClass:valueFactoryClass(), bytes); } catch (IllegalAccessException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (IllegalArgumentException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (InvocationTargetException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (NoSuchMethodException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } break; case FactoryMethodArgumentIsString: try { value = _valueFactoryMethod.invoke(valueFactoryClass()==null?_valueClass:valueFactoryClass(), _NSStringUtilities.stringForBytes(bytes, CharEncoding.UTF_8)); if (!NSLog.debugLoggingAllowedForLevelAndGroups(NSLog.DebugLevelInformational, NSLog.DebugGroupDatabaseAccess)) break; if (NSLog.debugLoggingAllowedForLevel(NSLog.DebugLevelDetailed)) NSLog.debug.appendln(new RuntimeException("Deprecated implicit bytes->String conversion. Assuming UTF-8 encoding.")); else NSLog.debug.appendln("Deprecated implicit bytes->String conversion. Assuming UTF-8 encoding. Set debug level to NSLog.DebugLevelDetailed for more information."); } catch (IllegalAccessException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (IllegalArgumentException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (InvocationTargetException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (NoSuchMethodException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } break; } return value; } /** * @param bytes * @param length * @return newValueForBytesString * @deprecated Method newValueForBytesString is deprecated */ @Deprecated public Object newValueForBytesString(byte bytes[], int length) { Class stringClass = String.class; Object value = null; Object value1 = null; if (_valueClass == null) { _valueClass = _NSUtilities.classWithName(className());//_valueClassName); if (_valueClass == null) _valueClass = stringClass; } if (_valueClass == stringClass) { String result = _NSStringUtilities.stringForBytes(bytes, 0, length, CharEncoding.UTF_8); if (NSLog.debugLoggingAllowedForLevelAndGroups(NSLog.DebugLevelInformational, NSLog.DebugGroupDatabaseAccess)) if (NSLog.debugLoggingAllowedForLevel(NSLog.DebugLevelDetailed)) NSLog.debug.appendln(new RuntimeException("Deprecated implicit bytes->String conversion. Assuming UTF-8 encoding.")); else NSLog.debug.appendln("Deprecated implicit bytes->String conversion. Assuming UTF-8 encoding. Set debug level to NSLog.DebugLevelDetailed for more information."); return result; } if (_valueClass == stringClass || _argumentType == 1 || _valueFactoryMethod == null) { value = _NSStringUtilities.stringForBytes(bytes, 0, length, CharEncoding.UTF_8); if (NSLog.debugLoggingAllowedForLevelAndGroups(NSLog.DebugLevelInformational, NSLog.DebugGroupDatabaseAccess)) if (NSLog.debugLoggingAllowedForLevel(NSLog.DebugLevelDetailed)) NSLog.debug.appendln(new RuntimeException("Deprecated implicit bytes->String conversion. Assuming UTF-8 encoding.")); else NSLog.debug.appendln("Deprecated implicit bytes->String conversion. Assuming UTF-8 encoding. Set debug level to NSLog.DebugLevelDetailed for more information."); if (_valueClass == stringClass || _valueFactoryMethod == null) return value; } switch (_argumentType) { case FactoryMethodArgumentIsData: default: break; case FactoryMethodArgumentIsString: try { value1 = _valueFactoryMethod.invoke(valueFactoryClass()==null?_valueClass:valueFactoryClass(), value); } catch (IllegalAccessException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (IllegalArgumentException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (InvocationTargetException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (NoSuchMethodException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } value = value1; break; case FactoryMethodArgumentIsBytes: try { value1 = _valueFactoryMethod.invoke(valueFactoryClass()==null?_valueClass:valueFactoryClass(), new Object[] { bytes, _NSUtilities.IntegerForInt(length) }); } catch (IllegalAccessException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (IllegalArgumentException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (InvocationTargetException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (NoSuchMethodException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } value = value1; break; } return value; } public Object newValueForDate(Object value) { if(valueFactoryMethod() != null) { if(!(value instanceof Date)) { throw new JDBCAdaptorException(new StringBuilder().append(value).append(" of type ").append(value.getClass().getName()).append(" is not a valid Date type. You must use java.sql.Timestamp, java.sql.Date, or java.sql.Time").toString(), null); } Date date = (Date)value; //Call the custom factory method try { if(valueFactoryClass() != null) { Class<?> factoryClass = valueFactoryClass(); return valueFactoryMethod().invoke(factoryClass, date); } Class<?> c = _NSUtilities.classWithName(className()); return valueFactoryMethod().invoke(c, date); } catch(IllegalAccessException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch(IllegalArgumentException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch(NoSuchMethodException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch(InvocationTargetException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } } else { if(value instanceof Timestamp) { return new NSTimestamp((Timestamp)value); } if(value instanceof Date) { Date temp = (Date)value; return new NSTimestamp(temp.getTime()); } else { throw new JDBCAdaptorException(new StringBuilder().append(value).append(" of type ").append(value.getClass().getName()).append(" is not a valid Date type. You must use java.sql.Timestamp, java.sql.Date, or java.sql.Time").toString(), null); } } } public Object newValueForString(String str) { Class stringClass = String.class; Object value = null; if (_valueClass == null) { _valueClass = _NSUtilities.classWithName(className());//_valueClassName); if (_valueClass == null) _valueClass = stringClass; } if (_valueClass == stringClass || _valueFactoryMethod == null) return str; switch (_argumentType) { default: break; case FactoryMethodArgumentIsString: try { value = _valueFactoryMethod.invoke(valueFactoryClass()==null?_valueClass:valueFactoryClass(), str); } catch (IllegalAccessException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (IllegalArgumentException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (InvocationTargetException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (NoSuchMethodException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } break; case FactoryMethodArgumentIsBytes: try { value = _valueFactoryMethod.invoke(valueFactoryClass()==null?_valueClass:valueFactoryClass(), _NSStringUtilities.bytesForString(str, CharEncoding.UTF_8)); if (!NSLog.debugLoggingAllowedForLevelAndGroups(NSLog.DebugLevelInformational, NSLog.DebugGroupDatabaseAccess)) break; if (NSLog.debugLoggingAllowedForLevel(NSLog.DebugLevelDetailed)) NSLog.debug.appendln(new RuntimeException("Deprecated implicit String->bytes conversion. Assuming UTF-8 encoding.")); else NSLog.debug.appendln("Deprecated implicit String->bytes conversion. Assuming UTF-8 encoding. Set debug level to NSLog.DebugLevelDetailed for more information."); } catch (IllegalAccessException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (IllegalArgumentException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (InvocationTargetException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (NoSuchMethodException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } break; case FactoryMethodArgumentIsData: try { value = _valueFactoryMethod.invoke(valueFactoryClass()==null?_valueClass:valueFactoryClass(), new NSData(str, CharEncoding.UTF_8)); if (!NSLog.debugLoggingAllowedForLevelAndGroups(NSLog.DebugLevelInformational, NSLog.DebugGroupDatabaseAccess)) break; if (NSLog.debugLoggingAllowedForLevel(NSLog.DebugLevelDetailed)) NSLog.debug.appendln(new RuntimeException("Deprecated implicit String->NSData conversion. Assuming UTF-8 encoding.")); else NSLog.debug.appendln("Deprecated implicit String->NSData conversion. Assuming UTF-8 encoding. Set debug level to NSLog.DebugLevelDetailed for more information."); } catch (IllegalAccessException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (IllegalArgumentException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (InvocationTargetException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (NoSuchMethodException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } break; } return value; } public Class valueFactoryClass() { return _valueFactoryClass; } public String valueFactoryClassName() { return _valueFactoryClassName; } public String valueFactoryMethodName() { return _valueFactoryMethodName; } public NSSelector valueFactoryMethod() { return _valueFactoryMethod; } public Object adaptorValueByConvertingAttributeValue(Object value) { Object convertedValue = value; NSSelector conversionMethod = adaptorValueConversionMethod(); Class conversionClass = adaptorValueConversionClass(); if (conversionMethod != null) try { if (conversionClass != null) { convertedValue = conversionMethod.invoke(conversionClass,new Object[]{value}); } else { convertedValue = conversionMethod.invoke(value); } } catch (NoSuchMethodException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (InvocationTargetException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (IllegalAccessException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (IllegalArgumentException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } int valueType = adaptorValueType(); //To preserve the illusion of consistency, convert the byte[] to an NSData here if(FactoryMethodArgumentIsBytes == factoryMethodArgumentType() && valueFactoryMethod() != null) { byte[] bytes = (byte[])convertedValue; convertedValue = new NSData(bytes); } //Make an additional check here to support custom date types. if(!(AdaptorDateType == valueType && conversionMethod != null && Date.class.isInstance(convertedValue))) { if (!valueClasses[valueType].isInstance(convertedValue) && (valueClasses[valueType] != Number.class || !(convertedValue instanceof Boolean))) { EOEntity parentEntity = (EOEntity) parent(); String entityName = parentEntity == null ? "<unspecified>" : parentEntity.name(); throw new IllegalArgumentException(new StringBuilder().append("EOAttribute adaptorValueByConvertingAttributeValue(Object): Unable to convert value of class ").append(convertedValue.getClass().getName()).append(" for attribute '").append(name()).append("' in entity '").append(entityName).append("' to adaptor type EOAttribute.Adaptor").append(valueTypeNames[valueType]).append("Type. Check the signature of the conversion method ").append(className()).append('.').append(conversionMethod == null ? "NotFound" : conversionMethod.name()).append("().").toString()); } } return convertedValue; } public String adaptorValueConversionMethodName() { return _adaptorValueConversionMethodName; } public NSSelector adaptorValueConversionMethod() { return _adaptorValueConversionMethod; } public String adaptorValueConversionClassName() { return _adaptorValueConversionClassName; } public Class adaptorValueConversionClass() { return _adaptorValueConversionClass; } public int adaptorValueType() { if (_adaptorValueType != -1) return _adaptorValueType; String className = className();//_valueClassName; if (className == null) className = CN_NSData; Class valueClass = _NSUtilities.classWithName(className); if (valueClass == null) throw new IllegalStateException(new StringBuilder().append("adaptorValueType: unable to load class named '").append(className).append("' for attribute ").append(name()).append(" on entity ").append(entity().name()).toString()); if (valueFactoryMethodName() == null) { if (valueClass == String.class) _adaptorValueType = AdaptorCharactersType; else if (_NSUtilities._isClassANumberOrABoolean(valueClass)) _adaptorValueType = AdaptorNumberType; else if (NSTimestamp.class.isAssignableFrom(valueClass)) _adaptorValueType = AdaptorDateType; else if (NSData.class.isAssignableFrom(valueClass)) _adaptorValueType = AdaptorBytesType; } else if (_argumentType == FactoryMethodArgumentIsString) _adaptorValueType = AdaptorCharactersType; else if (_argumentType == FactoryMethodArgumentIsData) _adaptorValueType = AdaptorBytesType; else if (_argumentType == FactoryMethodArgumentIsDate) _adaptorValueType = AdaptorDateType; else if (_argumentType == FactoryMethodArgumentIsBytes) _adaptorValueType = AdaptorBytesType; if (_adaptorValueType == -1) _adaptorValueType = AdaptorBytesType; return _adaptorValueType; } /** * @return adaptorValueClass * @deprecated use {@link #adaptorValueClass()} */ @Deprecated protected Class _adaptorValueClass() { return adaptorValueClass(); } public Class adaptorValueClass() { switch (adaptorValueType()) { case AdaptorCharactersType: return String.class; case AdaptorDateType: return NSTimestamp.class; case AdaptorNumberType: switch (_valueTypeChar()) { case _VTBoolean: return Boolean.class; case _VTShort: return Short.class; case _VTInteger: return Integer.class; case _VTLong: return Long.class; case _VTFloat: return Float.class; case _VTDouble: return Double.class; case _VTBigDecimal: return BigDecimal.class; case _VTByte: return Byte.class; } if (NSLog.debugLoggingAllowedForLevel(NSLog.DebugLevelInformational)) NSLog.debug.appendln(new StringBuilder().append("value type '").append(_valueTypeChar()).append("' on attribute \"").append(name()).append("\" of entity \"").append(entity().name()).append("\" is invalid.\nYou should fix your EOModel.").toString()); return Integer.class; case AdaptorBytesType: if (adaptorValueConversionMethod() != null && factoryMethodArgumentType() == FactoryMethodArgumentIsString) return String.class; return NSData.class; } return Object.class; } public String valueTypeClassName() { if (_valueTypeClassName == null) _valueTypeClassName = ""; if (_valueTypeClassName.length() == 0) { String className = _valueClassName == null ? NSData.class.getName() : _valueClassName; try { if (valueFactoryMethodName() == null) { Class valueClass = _NSUtilities.classWithName(className); if (valueClass != null) { if (_NSUtilities._isClassANumberOrABoolean(valueClass)) switch (_valueTypeChar()) { case _VTByte: valueClass = Byte.class; break; case _VTShort: valueClass = Short.class; break; case _VTInteger: valueClass = Integer.class; break; case _VTLong: valueClass = Long.class; break; case _VTFloat: valueClass = Float.class; break; case _VTDouble: valueClass = Double.class; break; case _VTBigDecimal: valueClass = BigDecimal.class; break; case _VTBoolean: valueClass = Boolean.class; break; default: if (NSLog.debugLoggingAllowedForLevel(2)) NSLog.debug.appendln(new StringBuilder().append("value type '").append(_valueTypeChar()).append("' on attribute \"").append(name()).append("\" of entity \"").append(entity().name()).append("\" is invalid.\nYou should fix your EOModel.").toString()); valueClass = Integer.class; break; } className = valueClass.getName(); } } } catch (Throwable exception) { } _valueTypeClassName = className; } return _valueTypeClassName; } public int factoryMethodArgumentType() { return _argumentType; } public void setFactoryMethodArgumentType(int argumentType) { _setFactoryMethodArgumentType(argumentType); _setOverrideForCharacteristic(Characteristic.FactoryMethodArgumentType); } private void _setFactoryMethodArgumentType(int argumentType) { _argumentType = argumentType; if (_valueFactoryMethodName != null) _valueFactoryMethod = new NSSelector(_valueFactoryMethodName, _classForArgumentType()); } private Class[] _classForArgumentType() { if (_argumentType == FactoryMethodArgumentIsString) return _NSUtilities._StringClassArray; if (_argumentType == FactoryMethodArgumentIsData) return (new Class[] { NSData.class }); if (_argumentType == FactoryMethodArgumentIsDate) return (new Class[] { Date.class }); if (_argumentType == FactoryMethodArgumentIsBytes) return (new Class[] { byte[].class }); return null; } public void setValueFactoryClassName(String factoryClassName) { _setValueFactoryClassName(factoryClassName); _setOverrideForCharacteristic(Characteristic.ValueFactoryClassName); } private void _setValueFactoryClassName(String factoryClassName) { if(factoryClassName != null && factoryClassName.length() != 0) { _valueFactoryClassName = factoryClassName; try { _valueFactoryClass = Class.forName(factoryClassName); } catch(ClassNotFoundException e) { _valueFactoryClassName = null; } } else { _valueFactoryClassName = null; _valueFactoryClass = null; } } public void setValueFactoryMethodName(String factoryMethodName) { _setValueFactoryMethodName(factoryMethodName); _setOverrideForCharacteristic(Characteristic.ValueFactoryMethodName); } private void _setValueFactoryMethodName(String factoryMethodName) { if (factoryMethodName != null && factoryMethodName.length() != 0) { if (factoryMethodName.endsWith(":")) { _valueFactoryMethodName = factoryMethodName.substring(0, factoryMethodName.length() - 1); } else { _valueFactoryMethodName = factoryMethodName; } _valueFactoryMethod = new NSSelector(_valueFactoryMethodName, _classForArgumentType()); } else { _valueFactoryMethodName = null; _valueFactoryMethod = null; } } public void setAdaptorValueConversionClassName(String conversionClassName) { _setAdaptorValueConversionClassName(conversionClassName); _setOverrideForCharacteristic(Characteristic.AdaptorValueConversionClassName); } private void _setAdaptorValueConversionClassName(String conversionClassName) { if (conversionClassName != null && conversionClassName.length() != 0) { _adaptorValueConversionClassName = conversionClassName; try { _adaptorValueConversionClass = Class.forName(conversionClassName); } catch (ClassNotFoundException e) { _adaptorValueConversionClassName = null; } } else { _adaptorValueConversionClassName = null; _adaptorValueConversionClass = null; } } public void setAdaptorValueConversionMethodName(String conversionMethodName) { _setAdaptorValueConversionMethodName(conversionMethodName); _setOverrideForCharacteristic(Characteristic.AdaptorValueConversionMethodName); } private void _setAdaptorValueConversionMethodName(String conversionMethodName) { if (conversionMethodName != null && conversionMethodName.length() != 0) { _adaptorValueConversionMethodName = conversionMethodName; if(adaptorValueConversionClass()!=null) { Class valueClass = _NSUtilities.classWithName(className()); _adaptorValueConversionMethod = new NSSelector(_adaptorValueConversionMethodName, new Class[]{valueClass}); } else { _adaptorValueConversionMethod = new NSSelector(_adaptorValueConversionMethodName, null); } } else { _adaptorValueConversionMethodName = null; _adaptorValueConversionMethod = null; } } public Object validateValue(Object valueP) throws com.webobjects.foundation.NSValidation.ValidationException { Object value = valueP; if (value == null || value == NSKeyValueCoding.NullValue) { if (allowsNull()) return valueP; if (entity().primaryKeyAttributes().indexOfIdenticalObject(this) != -1) return valueP; throw new com.webobjects.foundation.NSValidation.ValidationException(new StringBuilder().append("The ").append(name()).append(" property of ").append(entity().name()).append(" is not allowed to be null.").toString(), this, name()); } String className = className(); if (className == null) return valueP; Class aClass = _NSUtilities.classWithName(className); if (aClass == null) { if (NSLog.debugLoggingAllowedForLevelAndGroups(2, 128L)) NSLog.debug.appendln(new StringBuilder().append("Unable to find the class ").append(className).append(" in the Java runtime. Unable to validate. Please check your CLASSPATH, or the type for attribute ").append(name()).toString()); return valueP; } if (!aClass.isInstance(value)) { value = _NSUtilities.tryToConvertIntoNumberOrBooleanValueClass(value, aClass); if (!aClass.isInstance(value)) { String valueString = value.toString(); try { if (aClass == BigDecimal.class) value = new BigDecimal(valueString); else if (Number.class.isAssignableFrom(aClass)) value = _EOStringUtil.numberWithStringType(valueString, _valueTypeChar()); } catch (Exception e) { throw new com.webobjects.foundation.NSValidation.ValidationException(new StringBuilder().append("Error encountered converting value of class ").append(value.getClass().getName()).append(" to type specified in attribute '").append(name()).append("' of entity '").append(entity().name()).append('\'').toString(), this, name()); } } } if (value == null) throw new com.webobjects.foundation.NSValidation.ValidationException(new StringBuilder().append("Error encountered converting null value to type specified in attribute '").append(name()).append("' of entity '").append(entity().name()).append('\'').toString(), this, name()); int maxLen = width(); if (maxLen != 0) { int currLength = 0; Object primitiveValue; try { primitiveValue = adaptorValueByConvertingAttributeValue(value); } catch (Exception e) { throw new com.webobjects.foundation.NSValidation.ValidationException(new StringBuilder().append("Error encountered converting value of class ").append(value.getClass().getName()).append(" to type specified in attribute '").append(name()).append("' of entity '").append(entity().name()).append("'. Conversion exception is : ").append(e.getMessage()).toString(), this, name()); } if (primitiveValue instanceof String) currLength = ((String) primitiveValue).length(); else if (primitiveValue instanceof NSData) currLength = ((NSData) primitiveValue).length(); if (currLength > maxLen) throw new com.webobjects.foundation.NSValidation.ValidationException(new StringBuilder().append("The ").append(name()).append(" property of ").append(entity().name()).append(" exceeds maximum length of ").append(maxLen).append(" characters").toString(), this, name()); } return value; } boolean referencesProperty(Object property) { if (_definitionArray == null) return false; return _definitionArray.referencesObject(property); } void setParent(Object parent) { if (parent == null) { _parent = null; _parentStoredProcedure = null; } else if (parent instanceof EOEntity) { _parent = (EOEntity) parent; _parentStoredProcedure = null; } else if (parent instanceof EOStoredProcedure) { _parent = null; _parentStoredProcedure = (EOStoredProcedure) parent; } else { throw new IllegalArgumentException(new StringBuilder().append("Invalid object of type ").append(parent.getClass().getName()).append(" passed to setParent (expected EOEntity or EOStoredProcedure").toString()); } } void setEntity(EOEntity entity) { if (_parent == entity) return; if (_parent != null && this == _parent_attributeNamed(name())) _parent_removeAttribute(this); setParent(entity); } public void _setSourceToDestinationKeyMap(NSDictionary mapping) { _sourceToDestinationKeyMap = mapping; } public NSDictionary _sourceToDestinationKeyMap() { if (_sourceToDestinationKeyMap == null) _sourceToDestinationKeyMap = entity()._keyMapForRelationshipPath(relationshipPath()); return _sourceToDestinationKeyMap; } @Override public String relationshipPath() { if (!isFlattened()) return null; StringBuilder relPath = new StringBuilder(); int iCount = _definitionArray.count() - 1; for (int i = 0; i < iCount; i++) { if (i > 0) relPath.append('.'); relPath.append(((EORelationship) _definitionArray.objectAtIndex(i)).name()); } return relPath.toString(); } EOAttribute targetAttribute() { if (!isFlattened()) return null; return (EOAttribute) _definitionArray.lastObject(); } public String _setNewFormatStringOld(String newString, String old) { if (old == null || !old.equals(newString)) { _parent_setIsEdited(); return newString == null || newString.length() <= 0 ? null : newString; } return old; } public int _factoryMethodArgumentTypeFromString(String string) { String aString = (string == null ? "" : string).toLowerCase(); if (aString.equals(FactoryMethodArgumentIsBytesString.toLowerCase())) return FactoryMethodArgumentIsBytes; if (aString.equals(FactoryMethodArgumentIsStringString.toLowerCase())) return FactoryMethodArgumentIsString; if (aString.equals(FactoryMethodArgumentIsDateString.toLowerCase())) return FactoryMethodArgumentIsDate; return !aString.equals("EOFactoryMethodArgumentIsNSString".toLowerCase()) ? FactoryMethodArgumentIsData : FactoryMethodArgumentIsString; } public String _stringForFactoryMethodArgumentType(int type) { switch (type) { case FactoryMethodArgumentIsBytes: return FactoryMethodArgumentIsBytesString; case FactoryMethodArgumentIsString: return FactoryMethodArgumentIsStringString; case FactoryMethodArgumentIsData: return FactoryMethodArgumentIsDataString; case FactoryMethodArgumentIsDate: return FactoryMethodArgumentIsDateString; } return FactoryMethodArgumentIsDataString; } protected _EOExpressionArray _definitionArray() { return _definitionArray; } protected void _setDefinitionArray(_EOExpressionArray definitionArray) { if (_definitionArray == definitionArray) { return; } _definitionArray = definitionArray; _setValuesFromTargetAttribute(); _removeFromEntityArraySelector(entity().primaryKeyAttributes(), _setPrimaryKeyAttributesSelector); _parent_setIsEdited(); return; } protected void _setDefinitionWithoutFlushingCaches(String definition) { if (_parent != null) { _columnName = null; if (definition == null) { _definitionArray = null; return; } Object exprArray = _parent._parseDescriptionIsFormatArguments(definition, false, null); if (exprArray != null) { if (!(exprArray instanceof _EOExpressionArray)) exprArray = new _EOExpressionArray(exprArray); exprArray = _normalizeDefinitionPath(exprArray, null); _definitionArray = (_EOExpressionArray) exprArray; } _removeFromEntityArraySelector(_parent_primaryKeyAttributes(), _setPrimaryKeyAttributesSelector); } } protected void _setValuesFromTargetAttribute() { if (isFlattened()) { EOAttribute property = (EOAttribute) _definitionArray.lastObject(); setExternalType(property.externalType()); setClassName(property.className()); setValueType(property.valueType()); setWidth(property.width()); setAllowsNull(property.allowsNull()); setReadFormat(property.readFormat()); setWriteFormat(property.writeFormat()); setReadOnly(property.isReadOnly()); setParameterDirection(property.parameterDirection()); setUserInfo(property.userInfo()); _setInternalInfo(property._internalInfo()); int adaptorDataType = property.adaptorValueType(); if (adaptorDataType == AdaptorNumberType) { setPrecision(property.precision()); setScale(property.scale()); } else if (adaptorDataType == AdaptorDateType) setServerTimeZone(property.serverTimeZone()); else if (adaptorDataType == AdaptorBytesType) { setValueFactoryClassName(property.valueFactoryClassName()); setValueFactoryMethodName(property.valueFactoryMethodName()); setAdaptorValueConversionClassName(property.adaptorValueConversionClassName()); setAdaptorValueConversionMethodName(property.adaptorValueConversionMethodName()); setFactoryMethodArgumentType(property.factoryMethodArgumentType()); } } } protected Object _objectForPlist(Object plist) { if (plist instanceof String) return plist; if (!(plist instanceof NSDictionary)) return null; NSDictionary pl = (NSDictionary) plist; String string; if ((string = (String) pl.objectForKey("name")) != null) return entity()._parsePropertyName(string); if ((string = (String) pl.objectForKey("path")) != null) return entity()._parsePropertyName(string); NSArray array; if ((array = (NSArray) pl.objectForKey("array")) == null) return null; _EOExpressionArray result = new _EOExpressionArray(); if ((string = (String) pl.objectForKey("prefix")) != null) result.setPrefix(string); if ((string = (String) pl.objectForKey("infix")) != null) result.setInfix(string); if ((string = (String) pl.objectForKey("suffix")) != null) result.setSuffix(string); int count = array.count(); for (int i = 0; i < count; i++) { Object object = array.objectAtIndex(i); if ((object = _objectForPlist(object)) != null) result.addObject(object); } return result; } protected void _removeFromEntityArraySelector(NSArray oldArray, NSSelector sel) { if (oldArray.indexOfObject(this) != -1) { NSMutableArray newArray = new NSMutableArray(oldArray); newArray.removeIdenticalObject(this); try { sel.invoke(entity(), newArray); } catch (IllegalAccessException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (IllegalArgumentException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (InvocationTargetException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } catch (NoSuchMethodException e) { throw NSForwardException._runtimeExceptionForThrowable(e); } } } protected Object _normalizeDefinitionPath(Object definition, NSArray attributePath) { NSArray path = null; if (attributePath != null) path = attributePath; else path = NSArray.emptyArray(); if (definition instanceof String) return definition; Object nDefinition; if (definition instanceof EOAttribute) { EOAttribute attribute = (EOAttribute) definition; if (attribute == this) return null; if (attribute.isDerived()) { _EOExpressionArray attrDef = attribute._definitionArray(); nDefinition = _normalizeDefinitionPath(attrDef, path); if (nDefinition == null) return null; } else if (path.count() == 0) { nDefinition = attribute; } else { _EOExpressionArray newPath = new _EOExpressionArray(); newPath.setInfix("."); newPath.addObjectsFromArray(path); newPath.addObject(attribute); nDefinition = newPath; } return nDefinition; } int cnt; if (((_EOExpressionArray) definition)._isPropertyPath()) { _EOExpressionArray newPath = new _EOExpressionArray(); newPath.setInfix("."); newPath.addObjectsFromArray(path); cnt = ((_EOExpressionArray) definition).count() - 1; for (int i = 0; i < cnt; i++) newPath.addObject(((_EOExpressionArray) definition).objectAtIndex(i)); EOAttribute attribute = (EOAttribute) ((_EOExpressionArray) definition).lastObject(); if (attribute.isDerived()) { _EOExpressionArray attrDef = attribute._definitionArray(); nDefinition = _normalizeDefinitionPath(attrDef, newPath); if (nDefinition == null) return null; } else { newPath.addObject(attribute); nDefinition = newPath; } return nDefinition; } nDefinition = new _EOExpressionArray(); cnt = ((_EOExpressionArray) definition).count(); for (int i = 0; i < cnt; i++) { Object elem = ((_EOExpressionArray) definition).objectAtIndex(i); Object nElem = _normalizeDefinitionPath(elem, path); if (nElem == null) return null; if ((nElem instanceof _EOExpressionArray) && !((_EOExpressionArray) nElem)._isPropertyPath()) { int jcnt = ((_EOExpressionArray) nElem).count(); for (int j = 0; j < jcnt; j++) ((_EOExpressionArray) nDefinition).addObject(((_EOExpressionArray) nElem).objectAtIndex(j)); } else { ((_EOExpressionArray) nDefinition).addObject(nElem); } } return nDefinition; } public void _flushCache() { } public String valueForSQLExpression(EOSQLExpression context) { if (context != null) return context.sqlStringForAttribute(this); if (_definitionArray != null) return _definitionArray.valueForSQLExpression(context); return name(); } protected EOAttribute(EOEntity entity, String definition) { this(); _name = definition; setParent(entity); setDefinition(definition); } public static final int FactoryMethodArgumentIsData = 0; public static final int FactoryMethodArgumentIsString = 1; public static final int FactoryMethodArgumentIsBytes = 2; public static final int FactoryMethodArgumentIsDate = 3; public static final int AdaptorNumberType = 0; public static final int AdaptorCharactersType = 1; public static final int AdaptorBytesType = 2; public static final int AdaptorDateType = 3; public static final int Void = 0; public static final int InParameter = 1; public static final int OutParameter = 2; public static final int InOutParameter = 3; private static final NSSelector _setPrimaryKeyAttributesSelector; protected String _name; protected EOEntity _parent; protected EOStoredProcedure _parentStoredProcedure; protected String _prototypeName; protected EOAttribute _prototype; protected String _columnName; protected _EOExpressionArray _definitionArray; protected String _externalType; protected String _valueType; protected String _valueClassName; protected String _className; protected int _adaptorValueType; protected String _valueTypeClassName; protected String _readFormat; protected String _writeFormat; protected TimeZone _serverTimeZone; protected int _width; protected int _precision; protected int _scale; protected Class _valueClass; int _argumentType; protected String _valueFactoryClassName; protected String _valueFactoryMethodName; protected Class _valueFactoryClass; protected String _adaptorValueConversionMethodName; protected String _adaptorValueConversionClassName; protected Class _adaptorValueConversionClass; protected NSSelector _valueFactoryMethod; protected NSSelector _adaptorValueConversionMethod; protected boolean _flags_allowsNull; protected boolean _flags_isReadOnly; protected boolean _flags_isNonUpdateable; protected boolean _flags_isNonUpdateableInitialized; protected NSDictionary _sourceToDestinationKeyMap; protected int _parameterDirection; protected NSDictionary _userInfo; public NSDictionary _internalInfo; private static final String CN_JavaString = "java.lang.String"; private static final String CN_JavaNumber = "java.lang.Number"; private static final String CN_JavaBigDecimal = "java.math.BigDecimal"; private static final String CN_JavaNSTimestamp = "com.webobjects.foundation.NSTimestamp"; private static final String CN_JavaNSData = "com.webobjects.foundation.NSData"; private static final String CN_NSString = "NSString"; private static final String CN_NSNumber = "NSNumber"; private static final String CN_NSDecimalNumber = "NSDecimalNumber"; private static final String CN_NSCalendarDate = "NSCalendarDate"; private static final String CN_NSGregorianDate = "NSGregorianDate"; private static final String CN_NSData = "NSData"; private static final String CN_NSPrefix = "NS"; public static final char _VTByte = 'b'; public static final char _VTShort = 's'; public static final char _VTInteger = 'i'; public static final char _VTLong = 'l'; public static final char _VTFloat = 'f'; public static final char _VTDouble = 'd'; public static final char _VTBigDecimal = 'B'; public static final char _VTBoolean = 'c'; public static final char _VTDate = 'D'; public static final char _VTTime = 't'; public static final char _VTTimestamp = 'T'; public static final char _VTString = 'S'; public static final char _VTCharStream = 'C'; public static final char _VTEncodedBytes = 'E'; public static final char _VTCharTrimString = 'c'; public static final char _VTUnknown = ' '; public static final char _VTCoerceDate = 'M'; public static final String FactoryMethodArgumentIsBytesString = "EOFactoryMethodArgumentIsBytes"; public static final String FactoryMethodArgumentIsStringString = "EOFactoryMethodArgumentIsString"; public static final String FactoryMethodArgumentIsDataString = "EOFactoryMethodArgumentIsData"; public static final String FactoryMethodArgumentIsDateString = "EOFactoryMethodArgumentIsDate"; private Map _overwrittenCharacteristics; private static Class valueClasses[]; private static String valueTypeNames[] = { "Number", "Characters", "Bytes", "Date" }; static { _setPrimaryKeyAttributesSelector = new NSSelector("setPrimaryKeyAttributes", _NSUtilities._ArrayClassArray); valueClasses = (new Class[] { Number.class, String.class, NSData.class, NSTimestamp._CLASS }); } public void setChangeNotificationOptions( EOChangeNotificationOptions changeNotificationOptions) { // AK: method from 5.4.3.1 } public EOChangeNotificationOptions changeNotificationOptions() { // AK: method from 5.4.3.1 return null; } }