From f795dfc2bc94fa127308a4429f0a48e377b3e9f9 Mon Sep 17 00:00:00 2001 From: barreiro Date: Thu, 21 May 2015 21:04:51 +0100 Subject: [PATCH] HHH-9811 - Change EntityPersister#resolveAttributeIndexes to take String[] --- .../enhance/internal/EntityEnhancer.java | 23 +++++++++------- .../internal/tracker/SimpleDirtyTracker.java | 6 ++--- .../internal/tracker/SortedDirtyTracker.java | 8 ++---- .../engine/spi/SelfDirtinessTracker.java | 6 ++--- .../entity/AbstractEntityPersister.java | 10 +++---- .../persister/entity/EntityPersister.java | 3 +-- .../enhancement/EnhancerTestUtils.java | 7 +++-- .../enhancement/tracker/DirtyTrackerTest.java | 27 +++++++++---------- .../GoofyPersisterClassProvider.java | 3 +-- .../test/legacy/CustomPersister.java | 3 +-- .../PersisterClassProviderTest.java | 3 +-- 11 files changed, 44 insertions(+), 55 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/EntityEnhancer.java b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/EntityEnhancer.java index dec1e3cb1c43..d90da2fd0481 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/EntityEnhancer.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/EntityEnhancer.java @@ -6,6 +6,11 @@ */ package org.hibernate.bytecode.enhance.internal; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; + import javassist.CannotCompileException; import javassist.CtClass; import javassist.CtField; @@ -20,11 +25,6 @@ import org.hibernate.bytecode.enhance.spi.EnhancerConstants; import org.hibernate.engine.spi.SelfDirtinessTracker; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; - /** * enhancer for regular entities * @@ -140,13 +140,18 @@ private void createDirtyTrackerMethods(CtClass managedCtClass) { MethodWriter.write( managedCtClass, "" + - "public java.util.Set %1$s() {%n" + - " if (%2$s == null) { %2$s = new %4$s(); }%n" + - " %3$s(%2$s);%n" + - " return %2$s.asSet();%n" + + "public String[] %1$s() {%n" + + " if(%3$s == null) {%n" + + " return (%2$s == null) ? new String[0] : %2$s.get();%n" + + " } else {%n" + + " if (%2$s == null) %2$s = new %5$s();%n" + + " %4$s(%2$s);%n" + + " return %2$s.get();%n" + + " }%n" + "}", EnhancerConstants.TRACKER_GET_NAME, EnhancerConstants.TRACKER_FIELD_NAME, + EnhancerConstants.TRACKER_COLLECTION_NAME, EnhancerConstants.TRACKER_COLLECTION_CHANGED_FIELD_NAME, TRACKER_IMPL ); diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/tracker/SimpleDirtyTracker.java b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/tracker/SimpleDirtyTracker.java index c8b69460b848..2ecb56fc6dff 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/tracker/SimpleDirtyTracker.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/tracker/SimpleDirtyTracker.java @@ -7,8 +7,6 @@ package org.hibernate.bytecode.enhance.internal.tracker; import java.util.Arrays; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; /** * small low memory class to keep track of changed fields @@ -44,8 +42,8 @@ public boolean isEmpty() { return names.length == 0; } - public Set asSet() { - return new CopyOnWriteArraySet( Arrays.asList( names ) ); + public String[] get() { + return names; } } diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/tracker/SortedDirtyTracker.java b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/tracker/SortedDirtyTracker.java index 7f1a82968be6..652e8017f05c 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/tracker/SortedDirtyTracker.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/tracker/SortedDirtyTracker.java @@ -6,10 +6,6 @@ */ package org.hibernate.bytecode.enhance.internal.tracker; -import java.util.Arrays; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; - /** * small low memory class to keep track of changed fields * @@ -58,8 +54,8 @@ public boolean isEmpty() { return names.length == 0; } - public Set asSet() { - return new CopyOnWriteArraySet( Arrays.asList( names ) ); + public String[] get() { + return names; } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/SelfDirtinessTracker.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/SelfDirtinessTracker.java index 688e30b8fa65..9f3e2fb2d5ce 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/SelfDirtinessTracker.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/SelfDirtinessTracker.java @@ -6,8 +6,6 @@ */ package org.hibernate.engine.spi; -import java.util.Set; - /** * Contract for an entity to report that it tracks the dirtiness of its own state, * as opposed to needing Hibernate to perform state-diff dirty calculations. @@ -30,9 +28,9 @@ public interface SelfDirtinessTracker { /** * Retrieve the names of all the persistent attributes whose values have changed. * - * @return The set of changed persistent attribute names + * @return An array of changed persistent attribute names */ - Set $$_hibernate_getDirtyAttributes(); + String[] $$_hibernate_getDirtyAttributes(); /** * Clear the stored dirty attributes diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index edbbd4d0460c..0741eb605f80 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -1868,12 +1868,12 @@ protected String[] getSubclassPropertyNameClosure() { } @Override - public int[] resolveAttributeIndexes(Set properties) { - Iterator iter = properties.iterator(); - int[] fields = new int[properties.size()]; + public int[] resolveAttributeIndexes(String[] attributeNames) { + int[] fields = new int[attributeNames.length]; int counter = 0; - while ( iter.hasNext() ) { - Integer index = entityMetamodel.getPropertyIndexOrNull( iter.next() ); + + for ( String attribute : attributeNames ) { + Integer index = entityMetamodel.getPropertyIndexOrNull( attribute ); if ( index != null ) { fields[counter++] = index; } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java index 3ae7968f7e3a..6946fb230193 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java @@ -8,7 +8,6 @@ import java.io.Serializable; import java.util.Map; -import java.util.Set; import org.hibernate.EntityMode; import org.hibernate.HibernateException; @@ -784,7 +783,7 @@ public Object createProxy(Serializable id, SessionImplementor session) public FilterAliasGenerator getFilterAliasGenerator(final String rootAlias); - public int[] resolveAttributeIndexes(Set properties); + public int[] resolveAttributeIndexes(String[] attributeNames); public boolean canUseReferenceCacheEntries(); } diff --git a/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/EnhancerTestUtils.java b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/EnhancerTestUtils.java index 8b830d9cfc54..3347d6cdec31 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/EnhancerTestUtils.java +++ b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/EnhancerTestUtils.java @@ -9,7 +9,6 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; -import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -203,9 +202,9 @@ public static void clearDirtyTracking(Object entityInstance) { public static void checkDirtyTracking(Object entityInstance, String... dirtyFields) { final SelfDirtinessTracker selfDirtinessTracker = (SelfDirtinessTracker) entityInstance; assertEquals( dirtyFields.length > 0, selfDirtinessTracker.$$_hibernate_hasDirtyAttributes() ); - Set tracked = selfDirtinessTracker.$$_hibernate_getDirtyAttributes(); - assertEquals( dirtyFields.length, tracked.size() ); - assertTrue( tracked.containsAll( Arrays.asList( dirtyFields ) ) ); + String[] tracked = selfDirtinessTracker.$$_hibernate_getDirtyAttributes(); + assertEquals( dirtyFields.length, tracked.length ); + assertTrue( Arrays.asList( tracked ).containsAll( Arrays.asList( dirtyFields ) ) ); } static EntityEntry makeEntityEntry() { diff --git a/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/tracker/DirtyTrackerTest.java b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/tracker/DirtyTrackerTest.java index 236efe140646..b64b37e15f4d 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/tracker/DirtyTrackerTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/tracker/DirtyTrackerTest.java @@ -6,11 +6,10 @@ */ package org.hibernate.test.bytecode.enhancement.tracker; -import org.hibernate.bytecode.enhance.internal.tracker.SortedDirtyTracker; import org.hibernate.bytecode.enhance.internal.tracker.SimpleDirtyTracker; -import org.junit.Test; +import org.hibernate.bytecode.enhance.internal.tracker.SortedDirtyTracker; -import java.util.Set; +import org.junit.Test; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertFalse; @@ -25,15 +24,15 @@ public class DirtyTrackerTest { public void testSimpleTracker() { SimpleDirtyTracker tracker = new SimpleDirtyTracker(); assertTrue(tracker.isEmpty()); - assertTrue(tracker.asSet().isEmpty()); + assertTrue(tracker.get().length == 0); tracker.add("foo"); assertFalse(tracker.isEmpty()); - assertArrayEquals(tracker.asSet().toArray(), new String[]{"foo"}); + assertArrayEquals(tracker.get(), new String[]{"foo"}); tracker.clear(); assertTrue(tracker.isEmpty()); - assertTrue(tracker.asSet().isEmpty()); + assertTrue(tracker.get().length == 0); tracker.add("foo"); tracker.add("bar"); @@ -41,7 +40,7 @@ public void testSimpleTracker() { tracker.add("foo"); tracker.add("another.foo"); tracker.add("another.bar"); - assertTrue(tracker.asSet().size() == 4); + assertTrue(tracker.get().length == 4); } @@ -49,15 +48,15 @@ public void testSimpleTracker() { public void testSortedTracker() { SortedDirtyTracker tracker = new SortedDirtyTracker(); assertTrue(tracker.isEmpty()); - assertTrue(tracker.asSet().isEmpty()); + assertTrue(tracker.get().length == 0); tracker.add("foo"); assertFalse(tracker.isEmpty()); - assertArrayEquals(tracker.asSet().toArray(), new String[]{"foo"}); + assertArrayEquals(tracker.get(), new String[]{"foo"}); tracker.clear(); assertTrue(tracker.isEmpty()); - assertTrue(tracker.asSet().isEmpty()); + assertTrue(tracker.get().length == 0); tracker.add("foo"); tracker.add("bar"); @@ -65,15 +64,13 @@ public void testSortedTracker() { tracker.add("foo"); tracker.add("another.foo"); tracker.add("another.bar"); - assertTrue(tracker.asSet().size() == 4); + assertTrue(tracker.get().length == 4); // we the algorithm for this implementation relies on the fact that the array is kept sorted, so let's check it really is - assertTrue(isSorted(tracker.asSet())); + assertTrue(isSorted(tracker.get())); } - private boolean isSorted(Set set) { - String[] arr = new String[set.size()]; - arr = set.toArray(arr); + private boolean isSorted(String[] arr) { for (int i = 1; i < arr.length; i++) { if (arr[i - 1].compareTo(arr[i]) > 0) { return false; diff --git a/hibernate-core/src/test/java/org/hibernate/test/cfg/persister/GoofyPersisterClassProvider.java b/hibernate-core/src/test/java/org/hibernate/test/cfg/persister/GoofyPersisterClassProvider.java index ee5a48574269..d6365d4b3768 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/cfg/persister/GoofyPersisterClassProvider.java +++ b/hibernate-core/src/test/java/org/hibernate/test/cfg/persister/GoofyPersisterClassProvider.java @@ -11,7 +11,6 @@ import java.sql.SQLException; import java.util.Comparator; import java.util.Map; -import java.util.Set; import org.hibernate.EntityMode; import org.hibernate.HibernateException; @@ -587,7 +586,7 @@ public Iterable getAttributes() { } @Override - public int[] resolveAttributeIndexes(Set attributes) { + public int[] resolveAttributeIndexes(String[] attributeNames) { return null; } diff --git a/hibernate-core/src/test/java/org/hibernate/test/legacy/CustomPersister.java b/hibernate-core/src/test/java/org/hibernate/test/legacy/CustomPersister.java index 286e68a7ee12..472cabc7b97b 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/legacy/CustomPersister.java +++ b/hibernate-core/src/test/java/org/hibernate/test/legacy/CustomPersister.java @@ -10,7 +10,6 @@ import java.util.Comparator; import java.util.Hashtable; import java.util.Map; -import java.util.Set; import org.hibernate.EntityMode; import org.hibernate.HibernateException; @@ -709,7 +708,7 @@ public Iterable getAttributes() { } @Override - public int[] resolveAttributeIndexes(Set attributes) { + public int[] resolveAttributeIndexes(String[] attributeNames) { return null; } diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/ejb3configuration/PersisterClassProviderTest.java b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/ejb3configuration/PersisterClassProviderTest.java index 68ea5ea5d088..7911df96916a 100644 --- a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/ejb3configuration/PersisterClassProviderTest.java +++ b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/ejb3configuration/PersisterClassProviderTest.java @@ -10,7 +10,6 @@ import java.util.Arrays; import java.util.Comparator; import java.util.Map; -import java.util.Set; import javax.persistence.EntityManagerFactory; import javax.persistence.PersistenceException; @@ -592,7 +591,7 @@ public FilterAliasGenerator getFilterAliasGenerator(String rootAlias) { } @Override - public int[] resolveAttributeIndexes(Set properties) { + public int[] resolveAttributeIndexes(String[] attributeNames) { return new int[0]; }