diff options
author | donald.g.dunne | 2015-02-05 16:45:26 +0000 |
---|---|---|
committer | Donald Dunne | 2015-02-05 23:00:50 +0000 |
commit | 130ed9f3a00e8f6f18917c17f6c6421b731c3056 (patch) | |
tree | 358bd3b7a8380434eaa21ff68b131ea55ef8cdd5 | |
parent | b5d1fe5e3106fcf6e9abd9fef1310e3f0576a056 (diff) | |
download | org.eclipse.osee-130ed9f3a00e8f6f18917c17f6c6421b731c3056.tar.gz org.eclipse.osee-130ed9f3a00e8f6f18917c17f6c6421b731c3056.tar.xz org.eclipse.osee-130ed9f3a00e8f6f18917c17f6c6421b731c3056.zip |
bug[ats_ATS168392]: Improve performance of ATS Goal Order Column
Change-Id: I37570062d75ac9b4b70a5677ec0bf57446297f03
11 files changed, 183 insertions, 145 deletions
diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/IAtsClient.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/IAtsClient.java index 6af1abe5686..f166051e16a 100644 --- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/IAtsClient.java +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/IAtsClient.java @@ -155,6 +155,6 @@ public interface IAtsClient extends IAtsServices, IAtsNotifier, IAttributeResolv IArtifactMembersCache<GoalArtifact> getGoalMembersCache(); - IArtifactMembersCache<SprintArtifact> getSprintMembersCache(); + IArtifactMembersCache<SprintArtifact> getSprintItemsCache(); } diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/artifact/SprintArtifact.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/artifact/SprintArtifact.java index 7d7bf0ede81..08fd00b329f 100644 --- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/artifact/SprintArtifact.java +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/artifact/SprintArtifact.java @@ -67,7 +67,7 @@ public class SprintArtifact extends CollectorArtifact implements IAgileSprint { @Override public List<Artifact> getMembers() throws OseeCoreException { - return AtsClientService.get().getSprintMembersCache().getMembers(this); + return AtsClientService.get().getSprintItemsCache().getMembers(this); } } diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/ArtifactCollectorsCache.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/ArtifactCollectorsCache.java new file mode 100644 index 00000000000..827f6d6409e --- /dev/null +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/ArtifactCollectorsCache.java @@ -0,0 +1,150 @@ +/******************************************************************************* + * Copyright (c) 2012 Boeing. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.ats.core.client.internal; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.eclipse.osee.ats.api.data.AtsRelationTypes; +import org.eclipse.osee.ats.core.client.artifact.CollectorArtifact; +import org.eclipse.osee.ats.core.client.util.IArtifactMembersCache; +import org.eclipse.osee.framework.core.enums.DeletionFlag; +import org.eclipse.osee.framework.jdk.core.type.DoubleKeyHashMap; +import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; +import org.eclipse.osee.framework.skynet.core.artifact.Artifact; +import org.eclipse.osee.framework.skynet.core.event.OseeEventManager; +import org.eclipse.osee.framework.skynet.core.event.filter.ArtifactEventFilter; +import org.eclipse.osee.framework.skynet.core.event.filter.IEventFilter; +import org.eclipse.osee.framework.skynet.core.event.listener.IArtifactEventListener; +import org.eclipse.osee.framework.skynet.core.event.model.ArtifactEvent; +import org.eclipse.osee.framework.skynet.core.event.model.Sender; + +/** + * @author John Misinco + */ +public class ArtifactCollectorsCache<T extends CollectorArtifact> implements IArtifactMembersCache<T> { + + private static Map<Integer, List<Artifact>> cache; + private static DoubleKeyHashMap<Integer, Integer, String> goalMemberOrderMap; + private static Set<Integer> registered; + private static volatile boolean initialized = false; + + private void initializeStructures() { + if (!initialized) { + initialized = true; + cache = new HashMap<Integer, List<Artifact>>(); + registered = new HashSet<Integer>(); + goalMemberOrderMap = new DoubleKeyHashMap<Integer, Integer, String>(); + } + } + + private void registerForEvents(final T collectorArt) { + if (!registered.contains(collectorArt.getArtId())) { + IArtifactEventListener eventListener = new IArtifactEventListener() { + + @Override + public List<? extends IEventFilter> getEventFilters() { + return Arrays.asList(new ArtifactEventFilter(collectorArt)); + } + + @Override + public void handleArtifactEvent(ArtifactEvent artifactEvent, Sender sender) { + synchronized (cache) { + cache.remove(collectorArt.getArtId()); + } + } + }; + OseeEventManager.addListener(eventListener); + synchronized (registered) { + registered.add(collectorArt.getArtId()); + } + } + } + + @Override + public List<Artifact> getMembers(T collector) throws OseeCoreException { + initializeStructures(); + registerForEvents(collector); + List<Artifact> members = cache.get(collector.getArtId()); + if (members == null) { + members = collector.getRelatedArtifacts(AtsRelationTypes.Goal_Member, DeletionFlag.EXCLUDE_DELETED); + synchronized (cache) { + cache.put(collector.getArtId(), members); + fillOrderCache(collector, members); + } + } + LinkedList<Artifact> linkedList = new LinkedList<Artifact>(members); + return linkedList; + } + + @Override + public void decache(T collectorArt) { + if (initialized) { + synchronized (cache) { + cache.remove(collectorArt.getArtId()); + } + synchronized (goalMemberOrderMap) { + clearOrderCache(collectorArt); + } + } + } + + @Override + public void invalidate() { + if (initialized) { + synchronized (cache) { + cache.clear(); + } + synchronized (goalMemberOrderMap) { + goalMemberOrderMap.clear(); + } + } + } + + @Override + public String getMemberOrder(T collectorArt, Artifact member) throws OseeCoreException { + initializeStructures(); + if (goalMemberOrderMap.getSubHash(collectorArt.getArtId()) == null) { + fillOrderCache(collectorArt, getMembers(collectorArt)); + } + String order = goalMemberOrderMap.get(collectorArt.getArtId(), member.getArtId()); + return order == null ? "" : order; + } + + private void fillOrderCache(T collectorArt, List<Artifact> members) { + initializeStructures(); + synchronized (goalMemberOrderMap) { + clearOrderCache(collectorArt); + int x = 1; + for (Artifact artifact : members) { + goalMemberOrderMap.put(collectorArt.getArtId(), artifact.getArtId(), String.valueOf(x++)); + } + } + } + + private void clearOrderCache(T collectorArt) { + if (initialized) { + List<Integer> memberIds = new ArrayList<Integer>(); + Map<Integer, String> subHash = goalMemberOrderMap.getSubHash(collectorArt.getArtId()); + if (subHash != null) { + memberIds.addAll(subHash.keySet()); + for (Integer memberId : memberIds) { + goalMemberOrderMap.remove(collectorArt.getArtId(), memberId); + } + } + } + } +} diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/ArtifactMembersCache.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/ArtifactMembersCache.java deleted file mode 100644 index c6ec25936cc..00000000000 --- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/ArtifactMembersCache.java +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 Boeing. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Boeing - initial API and implementation - *******************************************************************************/ -package org.eclipse.osee.ats.core.client.internal; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.eclipse.osee.ats.api.data.AtsRelationTypes; -import org.eclipse.osee.ats.core.client.artifact.CollectorArtifact; -import org.eclipse.osee.ats.core.client.util.IArtifactMembersCache; -import org.eclipse.osee.framework.core.enums.DeletionFlag; -import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; -import org.eclipse.osee.framework.skynet.core.artifact.Artifact; -import org.eclipse.osee.framework.skynet.core.event.OseeEventManager; -import org.eclipse.osee.framework.skynet.core.event.filter.ArtifactEventFilter; -import org.eclipse.osee.framework.skynet.core.event.filter.IEventFilter; -import org.eclipse.osee.framework.skynet.core.event.listener.IArtifactEventListener; -import org.eclipse.osee.framework.skynet.core.event.model.ArtifactEvent; -import org.eclipse.osee.framework.skynet.core.event.model.Sender; - -/** - * @author John Misinco - */ -public class ArtifactMembersCache<T extends CollectorArtifact> implements IArtifactMembersCache<T> { - - private static Map<String, List<Artifact>> cache; - private static Set<String> registered; - private static volatile boolean initialized = false; - - private void initializeStructures() { - if (!initialized) { - initialized = true; - cache = new HashMap<String, List<Artifact>>(); - registered = new HashSet<String>(); - } - } - - private void registerForEvents(final T artifact) { - if (!registered.contains(artifact.getGuid())) { - IArtifactEventListener eventListener = new IArtifactEventListener() { - - @Override - public List<? extends IEventFilter> getEventFilters() { - return Arrays.asList(new ArtifactEventFilter(artifact)); - } - - @Override - public void handleArtifactEvent(ArtifactEvent artifactEvent, Sender sender) { - synchronized (cache) { - cache.remove(artifact.getGuid()); - } - } - }; - OseeEventManager.addListener(eventListener); - synchronized (registered) { - registered.add(artifact.getGuid()); - } - } - } - - @Override - public List<Artifact> getMembers(T artifact) throws OseeCoreException { - initializeStructures(); - registerForEvents(artifact); - List<Artifact> toReturn = cache.get(artifact.getGuid()); - if (toReturn == null) { - toReturn = artifact.getRelatedArtifacts(AtsRelationTypes.Goal_Member, DeletionFlag.EXCLUDE_DELETED); - synchronized (cache) { - cache.put(artifact.getGuid(), toReturn); - } - } - LinkedList<Artifact> linkedList = new LinkedList<Artifact>(toReturn); - return linkedList; - } - - @Override - public void decache(T artifact) { - synchronized (cache) { - cache.remove(artifact.getGuid()); - } - } - - @Override - public void invalidate() { - synchronized (cache) { - cache.clear(); - } - } -} diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsClientImpl.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsClientImpl.java index f1cce627586..e7c49973b83 100644 --- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsClientImpl.java +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsClientImpl.java @@ -159,8 +159,8 @@ public class AtsClientImpl implements IAtsClient { private IAtsProgramService programService; private IAtsTeamDefinitionService teamDefinitionService; private IAtsQueryService atsQueryService; - private ArtifactMembersCache<GoalArtifact> goalMembersCache; - private ArtifactMembersCache<SprintArtifact> sprintMembersCache; + private ArtifactCollectorsCache<GoalArtifact> goalMembersCache; + private ArtifactCollectorsCache<SprintArtifact> sprintItemsCache; public void setJdbcService(JdbcService jdbcService) { this.jdbcService = jdbcService; @@ -333,8 +333,8 @@ public class AtsClientImpl implements IAtsClient { if (goalMembersCache != null) { goalMembersCache.invalidate(); } - if (sprintMembersCache != null) { - sprintMembersCache.invalidate(); + if (sprintItemsCache != null) { + sprintItemsCache.invalidate(); } } @@ -732,17 +732,17 @@ public class AtsClientImpl implements IAtsClient { @Override public IArtifactMembersCache<GoalArtifact> getGoalMembersCache() { if (goalMembersCache == null) { - goalMembersCache = new ArtifactMembersCache<GoalArtifact>(); + goalMembersCache = new ArtifactCollectorsCache<GoalArtifact>(); } return goalMembersCache; } @Override - public IArtifactMembersCache<SprintArtifact> getSprintMembersCache() { - if (sprintMembersCache == null) { - sprintMembersCache = new ArtifactMembersCache<SprintArtifact>(); + public IArtifactMembersCache<SprintArtifact> getSprintItemsCache() { + if (sprintItemsCache == null) { + sprintItemsCache = new ArtifactCollectorsCache<SprintArtifact>(); } - return sprintMembersCache; + return sprintItemsCache; } } diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/util/IArtifactMembersCache.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/util/IArtifactMembersCache.java index f59a129d1d1..0ef8c5efc16 100644 --- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/util/IArtifactMembersCache.java +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/util/IArtifactMembersCache.java @@ -23,4 +23,6 @@ public interface IArtifactMembersCache<T extends CollectorArtifact> { void invalidate(); + String getMemberOrder(T memberArt, Artifact member); + }
\ No newline at end of file diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/agile/SprintManager.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/agile/SprintManager.java index de4ed989414..f30b7cc1feb 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/agile/SprintManager.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/agile/SprintManager.java @@ -15,6 +15,7 @@ import org.eclipse.osee.ats.api.data.AtsArtifactTypes; import org.eclipse.osee.ats.api.data.AtsRelationTypes; import org.eclipse.osee.ats.artifact.MembersManager; import org.eclipse.osee.ats.core.client.artifact.SprintArtifact; +import org.eclipse.osee.ats.internal.AtsClientService; import org.eclipse.osee.framework.core.data.IArtifactType; import org.eclipse.osee.framework.core.data.IRelationTypeSide; import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; @@ -61,4 +62,9 @@ public class SprintManager extends MembersManager<SprintArtifact> { return AtsArtifactTypes.AgileSprint; } + @Override + public String getMemberOrder(SprintArtifact sprintArt, Artifact member) throws OseeCoreException { + return AtsClientService.get().getSprintItemsCache().getMemberOrder(sprintArt, member); + } + } diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/GoalManager.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/GoalManager.java index ee97e8b83df..45919930e9c 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/GoalManager.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/GoalManager.java @@ -91,4 +91,10 @@ public class GoalManager extends MembersManager<GoalArtifact> { public IArtifactType getArtifactType() { return AtsArtifactTypes.Goal; } + + @Override + public String getMemberOrder(GoalArtifact goalArt, Artifact member) throws OseeCoreException { + return AtsClientService.get().getGoalMembersCache().getMemberOrder(goalArt, member); + } + } diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/MembersManager.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/MembersManager.java index 0fcbef41b3e..02abcbd7048 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/MembersManager.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/MembersManager.java @@ -27,7 +27,6 @@ import org.eclipse.osee.framework.core.data.IRelationTypeSide; import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; import org.eclipse.osee.framework.skynet.core.artifact.Artifact; import org.eclipse.osee.framework.ui.plugin.util.AWorkbench; -import org.eclipse.osee.framework.ui.skynet.util.LogUtil; import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog; /** @@ -130,31 +129,14 @@ public abstract class MembersManager<T extends CollectorArtifact> { return ""; } Collection<Artifact> collectors = getCollectors(artifact, false); - if (collectors.size() > 1) { - List<Artifact> membersSorted = new ArrayList<Artifact>(collectors); - Collections.sort(membersSorted); - StringBuffer sb = new StringBuffer(); - for (Artifact member : membersSorted) { - sb.append(String.format("%s-[%s] ", getMemberOrder((T) member, artifact), member)); - } - return sb.toString(); - } - Artifact member = collectors.iterator().next(); - return getMemberOrder((T) member, artifact); - } - - public String getMemberOrder(T memberArt, Artifact member) throws OseeCoreException { - try { - List<Artifact> members = memberArt.getMembers(); - int location = members.indexOf(member); - if (location == -1) { - return ""; - } else { - return String.valueOf(location + 1); - } - } catch (Exception ex) { - return LogUtil.getCellExceptionString(ex); + List<Artifact> collectorsSorted = new ArrayList<Artifact>(collectors); + Collections.sort(collectorsSorted); + StringBuffer sb = new StringBuffer(); + for (Artifact member : collectorsSorted) { + sb.append(String.format("%s-[%s] ", getMemberOrder((T) member, artifact), member)); } + return sb.toString(); } + public abstract String getMemberOrder(T memberArt, Artifact member) throws OseeCoreException; } diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAMembersTab.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAMembersTab.java index 1e3b7c7090d..f3c1d5718d8 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAMembersTab.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAMembersTab.java @@ -584,9 +584,6 @@ public class SMAMembersTab extends FormPage implements ISelectedAtsArtifacts, IW for (Artifact dropped : droppedArtifacts) { if (!members.contains(dropped)) { provider.addMember(dropped); - int index = isFeedbackAfter ? members.indexOf(dropTarget) + 1 : members.indexOf(dropTarget); - worldComposite.insert(dropped, index); - worldComposite.update(); } if (dropTarget != null) { provider.getArtifact().setRelationOrder(provider.getMemberRelationTypeSide(), dropTarget, @@ -594,10 +591,6 @@ public class SMAMembersTab extends FormPage implements ISelectedAtsArtifacts, IW } } provider.getArtifact().persist(SMAMembersTab.class.getSimpleName()); - worldComposite.getXViewer().refresh(provider.getArtifact()); - if (dropTarget != null) { - worldComposite.getXViewer().update(dropTarget, null); - } } else if (!dropValid) { AWorkbench.popup("Drag/Drop is disabled when table is filtered or sorted.\n\nSwitch to default table customization and try again."); } diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldContentProvider.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldContentProvider.java index 6d45782506d..a47a9439a1a 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldContentProvider.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldContentProvider.java @@ -95,7 +95,7 @@ public class WorldContentProvider implements ITreeContentProvider { } if (artifact.isOfType(AtsArtifactTypes.AgileSprint)) { List<Artifact> arts = - AtsClientService.get().getSprintMembersCache().getMembers((SprintArtifact) artifact); + AtsClientService.get().getSprintItemsCache().getMembers((SprintArtifact) artifact); relatedArts.addAll(arts); AtsBulkLoad.bulkLoadArtifacts(relatedArts); return arts.toArray(new Artifact[arts.size()]); |