From: Alexey L. <lou...@us...> - 2003-11-17 23:40:41
|
User: loubyansky Date: 03/11/17 15:40:39 Modified: src/main/org/jboss/ejb/plugins/cmp/jdbc JDBCTypeFactory.java Log: fixed [ 837092 ] CMP Field Update Optimization is Broken. CMP fields of primitive types, their wrappers, java.lang.String, audit and version fields of type java.util.Date rely on equals() implementation on dirty checking and have check-dirty-after-get=false. Other fields, by default, use invalid-unless-null dirty state strategy checking and have check-dirty-after-get=true. Revision Changes Path 1.17 +46 -25 jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCTypeFactory.java Index: JDBCTypeFactory.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCTypeFactory.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- JDBCTypeFactory.java 5 Nov 2003 18:23:58 -0000 1.16 +++ JDBCTypeFactory.java 17 Nov 2003 23:40:37 -0000 1.17 @@ -46,7 +46,7 @@ /** * This implementation uses field's value as its state. */ - private static final CMPFieldStateFactory SIMPLE = new CMPFieldStateFactory() + public static final CMPFieldStateFactory EQUALS = new CMPFieldStateFactory() { public Object getFieldState(Object fieldValue) { @@ -60,6 +60,23 @@ }; /** + * This implementation will always suppose that the state is invalid unless + * both states are null. + */ + private static final CMPFieldStateFactory INVALID_UNLESS_NULL = new CMPFieldStateFactory() + { + public Object getFieldState(Object fieldValue) + { + return fieldValue; + } + + public boolean isStateValid(Object state, Object fieldValue) + { + return state == null ? fieldValue == null : false; + } + }; + + /** * Field state factory for java.util.Map implementations. The state is * a deep copy of the value. */ @@ -67,7 +84,7 @@ { public Object getFieldState(Object fieldValue) { - return fieldValue == null ? null : new HashMap((Map) fieldValue); + return fieldValue == null ? null : new HashMap((Map)fieldValue); } public boolean isStateValid(Object state, Object fieldValue) @@ -84,7 +101,7 @@ { public Object getFieldState(Object fieldValue) { - return fieldValue == null ? null : new ArrayList((List) fieldValue); + return fieldValue == null ? null : new ArrayList((List)fieldValue); } public boolean isStateValid(Object state, Object fieldValue) @@ -101,7 +118,7 @@ { public Object getFieldState(Object fieldValue) { - return fieldValue == null ? null : new HashSet((Set) fieldValue); + return fieldValue == null ? null : new HashSet((Set)fieldValue); } public boolean isStateValid(Object state, Object fieldValue) @@ -190,16 +207,20 @@ { stateFactory = ARRAY; } + else if(isDefaultImmutable(clazz)) + { + stateFactory = EQUALS; + } else { - stateFactory = SIMPLE; + stateFactory = INVALID_UNLESS_NULL; } return stateFactory; } - public static final boolean checkDirtyAfterGet(Class clazz) + public static final boolean isDefaultImmutable(Class clazz) { - boolean result = true; + boolean result = false; if(clazz.isPrimitive() || clazz == Boolean.class || clazz == Byte.class @@ -212,7 +233,7 @@ || clazz == String.class ) { - result = false; + result = true; } return result; } @@ -240,7 +261,7 @@ HashMap valueClassesByType = new HashMap(); for(Iterator i = valueClasses.iterator(); i.hasNext();) { - JDBCValueClassMetaData valueClass = (JDBCValueClassMetaData) i.next(); + JDBCValueClassMetaData valueClass = (JDBCValueClassMetaData)i.next(); valueClassesByType.put(valueClass.getJavaType(), valueClass); } @@ -248,7 +269,7 @@ // convert the value class meta data to a jdbc complex type for(Iterator i = valueClasses.iterator(); i.hasNext();) { - JDBCValueClassMetaData valueClass = (JDBCValueClassMetaData) i.next(); + JDBCValueClassMetaData valueClass = (JDBCValueClassMetaData)i.next(); JDBCTypeComplex type = createTypeComplex(valueClass, valueClassesByType); complexTypes.put(valueClass.getJavaType(), type); @@ -259,7 +280,7 @@ { if(complexTypes.containsKey(javaType)) { - return (JDBCTypeComplex) complexTypes.get(javaType); + return (JDBCTypeComplex)complexTypes.get(javaType); } else { @@ -309,7 +330,7 @@ // transform properties into an array JDBCTypeComplexProperty[] properties = new JDBCTypeComplexProperty[propertyList.size()]; - properties = (JDBCTypeComplexProperty[]) propertyList.toArray(properties); + properties = (JDBCTypeComplexProperty[])propertyList.toArray(properties); return new JDBCTypeComplex(properties, valueClass.getJavaType()); } @@ -337,7 +358,7 @@ Mapper mapper = null; JDBCUserTypeMappingMetaData userTypeMapping = - (JDBCUserTypeMappingMetaData) userTypeMappings.get(javaType.getName()); + (JDBCUserTypeMappingMetaData)userTypeMappings.get(javaType.getName()); if(userTypeMapping != null) { String mappedTypeStr = userTypeMapping.getMappedType(); @@ -345,7 +366,7 @@ { final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); Class mapperClass = contextClassLoader.loadClass(userTypeMapping.getMapper()); - mapper = (Mapper) mapperClass.newInstance(); + mapper = (Mapper)mapperClass.newInstance(); javaType = contextClassLoader.loadClass(mappedTypeStr); if(cmpField.getSQLType() == null) { @@ -377,7 +398,7 @@ { // get the default properties for a field of its type JDBCTypeComplex type = - (JDBCTypeComplex) complexTypes.get(cmpField.getFieldType()); + (JDBCTypeComplex)complexTypes.get(cmpField.getFieldType()); JDBCTypeComplexProperty[] defaultProperties = type.getProperties(); // create a map of the overrides based on flat property name @@ -386,7 +407,7 @@ for(int i = 0; i < cmpField.getPropertyOverrides().size(); ++i) { JDBCCMPFieldPropertyMetaData p = - (JDBCCMPFieldPropertyMetaData) cmpField.getPropertyOverrides().get(i); + (JDBCCMPFieldPropertyMetaData)cmpField.getPropertyOverrides().get(i); overrides.put(p.getPropertyName(), p); } @@ -400,7 +421,7 @@ // pop off the override, if present JDBCCMPFieldPropertyMetaData override; - override = (JDBCCMPFieldPropertyMetaData) overrides.remove( + override = (JDBCCMPFieldPropertyMetaData)overrides.remove( defaultProperties[i].getPropertyName()); if(override == null) @@ -453,7 +474,7 @@ // did we find all overriden properties if(overrides.size() > 0) { - String propertyName = (String) overrides.keySet().iterator().next(); + String propertyName = (String)overrides.keySet().iterator().next(); throw new EJBException("Property " + propertyName + " in field " + cmpField.getFieldName() + " is not a property of value object " + cmpField.getFieldType().getName()); @@ -476,7 +497,7 @@ for(int i = 0; i < valueClassProperties.size(); ++i) { JDBCValuePropertyMetaData propertyMetaData = - (JDBCValuePropertyMetaData) valueClassProperties.get(i); + (JDBCValuePropertyMetaData)valueClassProperties.get(i); properties.addAll(createComplexProperties(propertyMetaData, valueClassesByType, propertyStack)); } @@ -537,7 +558,7 @@ // this property is a value object, recurse JDBCValueClassMetaData valueClass = - (JDBCValueClassMetaData) valueClassesByType.get(javaType); + (JDBCValueClassMetaData)valueClassesByType.get(javaType); properties.addAll(createComplexProperties( valueClass, valueClassesByType, @@ -601,7 +622,7 @@ { buf.append("."); } - buf.append((String) propertyNames.get(i)); + buf.append((String)propertyNames.get(i)); } return buf.toString(); } @@ -615,7 +636,7 @@ { buf.append("_"); } - buf.append((String) columnNames.get(i)); + buf.append((String)columnNames.get(i)); } return buf.toString(); } @@ -624,7 +645,7 @@ { for(int i = 0; i < notNulls.size(); i++) { - if(((Boolean) notNulls.get(i)).booleanValue()) + if(((Boolean)notNulls.get(i)).booleanValue()) { return true; } @@ -634,12 +655,12 @@ public final Method[] getGetters() { - return (Method[]) getters.toArray(new Method[getters.size()]); + return (Method[])getters.toArray(new Method[getters.size()]); } public final Method[] getSetters() { - return (Method[]) setters.toArray(new Method[setters.size()]); + return (Method[])setters.toArray(new Method[setters.size()]); } } } |