diff options
author | ddunne | 2011-10-18 21:57:34 +0000 |
---|---|---|
committer | Ryan D. Brooks | 2011-10-18 21:57:34 +0000 |
commit | db3664948f2f45635f2654acce67add37f1190e5 (patch) | |
tree | d501b4cfa0502dd88357e292c090e7707b9c58b0 | |
parent | c6f321880ab6cbcfdac0b405117b6a5e830f3f67 (diff) | |
download | org.eclipse.osee-db3664948f2f45635f2654acce67add37f1190e5.tar.gz org.eclipse.osee-db3664948f2f45635f2654acce67add37f1190e5.tar.xz org.eclipse.osee-db3664948f2f45635f2654acce67add37f1190e5.zip |
feature: Improve performance of EnumEntryFieldTest and added unit test
2 files changed, 40 insertions, 11 deletions
diff --git a/plugins/org.eclipse.osee.framework.core.model.test/src/org/eclipse/osee/framework/core/model/fields/EnumEntryFieldTest.java b/plugins/org.eclipse.osee.framework.core.model.test/src/org/eclipse/osee/framework/core/model/fields/EnumEntryFieldTest.java index abadc072253..a3727cfee6c 100644 --- a/plugins/org.eclipse.osee.framework.core.model.test/src/org/eclipse/osee/framework/core/model/fields/EnumEntryFieldTest.java +++ b/plugins/org.eclipse.osee.framework.core.model.test/src/org/eclipse/osee/framework/core/model/fields/EnumEntryFieldTest.java @@ -10,17 +10,19 @@ *******************************************************************************/ package org.eclipse.osee.framework.core.model.fields; +import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import org.junit.Assert; +import java.util.List; import org.eclipse.osee.framework.core.exception.OseeArgumentException; import org.eclipse.osee.framework.core.exception.OseeCoreException; import org.eclipse.osee.framework.core.model.OseeEnumEntry; import org.eclipse.osee.framework.core.model.internal.fields.EnumEntryField; import org.eclipse.osee.framework.core.model.mocks.MockDataFactory; import org.eclipse.osee.framework.jdk.core.util.GUID; +import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -147,4 +149,23 @@ public class EnumEntryFieldTest { eX.setOrdinal(-1); field.set(Collections.singleton(eX)); } + + @Test + public void testPerformance() throws OseeCoreException { + long startTime = System.currentTimeMillis(); + EnumEntryField field = new EnumEntryField(new ArrayList<OseeEnumEntry>()); + for (int x = 0; x < 160; x++) { + /** + * Although in-efficient, this is how framework is adding enum entries, so base test and results off that + **/ + List<OseeEnumEntry> entries = new ArrayList<OseeEnumEntry>(); + entries.addAll(field.get()); + entries.add(new OseeEnumEntry(GUID.create(), "name " + x, x)); + field.set(entries); + } + long elapsedTime = System.currentTimeMillis() - startTime; + System.out.println(String.format("testPerformance took %dms", elapsedTime)); + assertTrue("Loading EnumEntryField should take less than 150ms currently " + elapsedTime + "ms", + elapsedTime < 150); + } } diff --git a/plugins/org.eclipse.osee.framework.core.model/src/org/eclipse/osee/framework/core/model/internal/fields/EnumEntryField.java b/plugins/org.eclipse.osee.framework.core.model/src/org/eclipse/osee/framework/core/model/internal/fields/EnumEntryField.java index b1e7b51706b..89321f111e4 100644 --- a/plugins/org.eclipse.osee.framework.core.model/src/org/eclipse/osee/framework/core/model/internal/fields/EnumEntryField.java +++ b/plugins/org.eclipse.osee.framework.core.model/src/org/eclipse/osee/framework/core/model/internal/fields/EnumEntryField.java @@ -11,8 +11,11 @@ package org.eclipse.osee.framework.core.model.internal.fields; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; +import org.eclipse.osee.framework.core.exception.OseeArgumentException; import org.eclipse.osee.framework.core.exception.OseeCoreException; import org.eclipse.osee.framework.core.model.OseeEnumEntry; import org.eclipse.osee.framework.core.util.Conditions; @@ -62,21 +65,26 @@ public class EnumEntryField extends CollectionField<OseeEnumEntry> { } private void checkEnumEntryIntegrity(Collection<OseeEnumEntry> oseeEnumEntries) throws OseeCoreException { + // Use maps to speed up validation + Map<String, OseeEnumEntry> nameToEnum = new HashMap<String, OseeEnumEntry>(); + Map<Integer, OseeEnumEntry> ordinalToEnum = new HashMap<Integer, OseeEnumEntry>(); for (OseeEnumEntry entry : oseeEnumEntries) { Conditions.checkNotNullOrEmpty(entry.getName(), "Osee Enum Entry name"); Conditions.checkExpressionFailOnTrue(entry.ordinal() < 0, "Osee Enum Entry ordinal must be greater than zero"); - for (OseeEnumEntry existingEntry : oseeEnumEntries) { - if (!entry.equals(existingEntry)) { - Conditions.checkExpressionFailOnTrue(entry.getName().equals(existingEntry.getName()), - "Unique enumEntry name violation - %s already exists.", entry); - - Conditions.checkExpressionFailOnTrue( - entry.ordinal() == existingEntry.ordinal(), - "Unique enumEntry ordinal violation - ordinal [%d] is used by existing entry:[%s] and new entry:[%s]", - entry.ordinal(), existingEntry, entry); - } + if (nameToEnum.containsKey(entry.getName())) { + throw new OseeArgumentException("Unique enumEntry name violation - %s already exists.", entry); + } else { + nameToEnum.put(entry.getName(), entry); + } + if (ordinalToEnum.containsKey(entry.ordinal())) { + OseeEnumEntry existingEntry = ordinalToEnum.get(entry.ordinal()); + throw new OseeArgumentException( + "Unique enumEntry ordinal violation - ordinal [%d] is used by existing entry:[%s] and new entry:[%s]", + entry.ordinal(), existingEntry, entry); + } else { + ordinalToEnum.put(entry.ordinal(), entry); } } } |