diff options
author | donald.g.dunne | 2017-06-16 23:52:23 +0000 |
---|---|---|
committer | donald.g.dunne | 2017-07-11 15:20:09 +0000 |
commit | aa810157c996a6e2f753adad740a8abab5d55d61 (patch) | |
tree | 14198b0dbc2f52ba20f2eada9a0c05a8d2b9abee /plugins | |
parent | 03f6bc3787255de495b0939c63dcb31f50d70c92 (diff) | |
download | org.eclipse.osee-aa810157c996a6e2f753adad740a8abab5d55d61.tar.gz org.eclipse.osee-aa810157c996a6e2f753adad740a8abab5d55d61.tar.xz org.eclipse.osee-aa810157c996a6e2f753adad740a8abab5d55d61.zip |
bug[ats_ATS402006]: ATS config objects not loading prior to use
Change-Id: I1b2bf4471758e74bc43f3c9500c623b55a42f99b
Diffstat (limited to 'plugins')
26 files changed, 1017 insertions, 127 deletions
diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/AtsConfigEndpointApi.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/AtsConfigEndpointApi.java index efccbdb0c32..e5695286b7d 100644 --- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/AtsConfigEndpointApi.java +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/AtsConfigEndpointApi.java @@ -31,11 +31,29 @@ import org.eclipse.osee.framework.jdk.core.type.ViewModel; @Path("config") public interface AtsConfigEndpointApi { + /** + * @return cached copy of AtsConfigurations that is reloaded every 5 minutes. Use getFromDb() for latest copy from + * database. + */ @GET @Produces(MediaType.APPLICATION_JSON) public AtsConfigurations get(); /** + * @return non-cached copy of AtsConfigurations read straight from database. Can take 30ish seconds to load. Use + * get() for quick access to cached copy. + */ + @GET + @Path("fromdb") + @Produces(MediaType.APPLICATION_JSON) + public AtsConfigurations getFromDb(); + + @GET + @Path("clearcache") + @Produces(MediaType.APPLICATION_JSON) + public AtsConfigurations clearCaches(); + + /** * @return html5 action entry page */ @GET diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/AtsConfigurations.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/AtsConfigurations.java index 97d7582ae97..5ce5cd331d0 100644 --- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/AtsConfigurations.java +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/AtsConfigurations.java @@ -33,9 +33,14 @@ public class AtsConfigurations implements IWorkDefinitionStringProvider { private ColorColumns colorColumns = new ColorColumns(); List<JaxAtsUser> users = new ArrayList<>(); List<Long> atsAdmins = new ArrayList<>(); - List<Long> atsConfigIds = new ArrayList<>(); + Long topActionableItem; + Long topTeamDefinition; + List<JaxVersion> versions = new ArrayList<>(); private Collection<String> validStateNames = new ArrayList<>(); private Map<String, String> workDefIdToWorkDef = new HashMap<>(); + private Map<Long, JaxActionableItem> idToAi = new HashMap<>(); + private Map<Long, JaxTeamDefinition> idToTeamDef = new HashMap<>(); + private Map<Long, JaxVersion> idToVersion = new HashMap<>(); public List<AtsConfiguration> getConfigs() { return configs; @@ -65,19 +70,6 @@ public class AtsConfigurations implements IWorkDefinitionStringProvider { this.users = users; } - public String getAtsConfigIdsStr() { - return Collections.toString(",", atsConfigIds); - } - - @JsonIgnore - public List<Long> getAtsConfigIds() { - return atsConfigIds; - } - - public void setAtsConfigIdsStr(String atsConfigIdsStr) { - parseStringOfLongs(this.atsConfigIds, atsConfigIdsStr); - } - public Collection<String> getValidStateNames() { return validStateNames; } @@ -120,4 +112,44 @@ public class AtsConfigurations implements IWorkDefinitionStringProvider { this.workDefIdToWorkDef = workDefIdToWorkDef; } + public Map<Long, JaxActionableItem> getIdToAi() { + return idToAi; + } + + public void setIdToAi(Map<Long, JaxActionableItem> idToAi) { + this.idToAi = idToAi; + } + + public Map<Long, JaxTeamDefinition> getIdToTeamDef() { + return idToTeamDef; + } + + public void setIdToTeamDef(Map<Long, JaxTeamDefinition> idToTeamDef) { + this.idToTeamDef = idToTeamDef; + } + + public Map<Long, JaxVersion> getIdToVersion() { + return idToVersion; + } + + public void setIdToVersion(Map<Long, JaxVersion> idToVersion) { + this.idToVersion = idToVersion; + } + + public Long getTopActionableItem() { + return topActionableItem; + } + + public void setTopActionableItem(Long topActionableItem) { + this.topActionableItem = topActionableItem; + } + + public Long getTopTeamDefinition() { + return topTeamDefinition; + } + + public void setTopTeamDefinition(Long topTeamDefinition) { + this.topTeamDefinition = topTeamDefinition; + } + } diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxActionableItem.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxActionableItem.java new file mode 100644 index 00000000000..813498a0982 --- /dev/null +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxActionableItem.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2017 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.api.config; + +import java.util.ArrayList; +import java.util.List; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.codehaus.jackson.map.ser.std.ToStringSerializer; + +/** + * @author Donald G. Dunne + */ +public class JaxActionableItem extends JaxAtsConfigObject { + + @JsonSerialize(using = ToStringSerializer.class) + Long parentId; + @JsonSerialize(using = ToStringSerializer.class) + Long teamDefId; + List<Long> children = new ArrayList<>(); + + public JaxActionableItem() { + // for jax-rs + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public Long getTeamDefId() { + return teamDefId; + } + + public void setTeamDefId(Long teamDefId) { + this.teamDefId = teamDefId; + } + + public List<Long> getChildren() { + return children; + } + + public void setChildren(List<Long> children) { + this.children = children; + } + +} diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxNewAtsConfigObject.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxNewAtsConfigObject.java index aa2bfc27337..cafa247c9e4 100644 --- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxNewAtsConfigObject.java +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxNewAtsConfigObject.java @@ -17,4 +17,5 @@ import javax.xml.bind.annotation.XmlRootElement; */ @XmlRootElement public class JaxNewAtsConfigObject extends JaxAtsObject { + // do nothing }
\ No newline at end of file diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxTeamDefinition.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxTeamDefinition.java new file mode 100644 index 00000000000..66f7a00b685 --- /dev/null +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxTeamDefinition.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2017 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.api.config; + +import java.util.ArrayList; +import java.util.List; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.codehaus.jackson.map.ser.std.ToStringSerializer; + +/** + * @author Donald G. Dunne + */ +public class JaxTeamDefinition extends JaxAtsConfigObject { + + @JsonSerialize(using = ToStringSerializer.class) + Long parentId; + List<Long> ais = new ArrayList<>(); + List<Long> versions = new ArrayList<>(); + List<Long> children = new ArrayList<>(); + + public JaxTeamDefinition() { + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public List<Long> getAis() { + return ais; + } + + public void setAis(List<Long> ais) { + this.ais = ais; + } + + public List<Long> getVersions() { + return versions; + } + + public void setVersions(List<Long> versions) { + this.versions = versions; + } + + public List<Long> getChildren() { + return children; + } + + public void setChildren(List<Long> children) { + this.children = children; + } + +} diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxVersion.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxVersion.java new file mode 100644 index 00000000000..5c6720241ed --- /dev/null +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/config/JaxVersion.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2017 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.api.config; + +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.codehaus.jackson.map.ser.std.ToStringSerializer; + +/** + * @author Donald G. Dunne + */ +public class JaxVersion extends JaxAtsConfigObject { + + @JsonSerialize(using = ToStringSerializer.class) + Long teamDefId; + + public Long getTeamDefId() { + return teamDefId; + } + + public void setTeamDefId(Long teamDefId) { + this.teamDefId = teamDefId; + } + +} diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/user/IAtsUserService.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/user/IAtsUserService.java index 5a639bfa968..4fb18c1e6bc 100644 --- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/user/IAtsUserService.java +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/user/IAtsUserService.java @@ -51,6 +51,8 @@ public interface IAtsUserService { List<? extends IAtsUser> getUsers(); + List<? extends IAtsUser> getUsersFromDb(); + IAtsUser getUserByAccountId(Long accountId); } diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/IRelationResolver.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/IRelationResolver.java index c0fa533cffa..e8cdfa33da8 100644 --- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/IRelationResolver.java +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/IRelationResolver.java @@ -58,4 +58,6 @@ public interface IRelationResolver { int getRelatedCount(ArtifactToken artifact, RelationTypeSide relationTypeSide); + Collection<Long> getRelatedIds(ArtifactId artifact, RelationTypeSide relationTypeSide); + } diff --git a/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/ats/core/client/util/AtsUserTest.java b/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/ats/core/client/util/AtsUserTest.java index e16b6d41a4d..72b34919cec 100644 --- a/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/ats/core/client/util/AtsUserTest.java +++ b/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/ats/core/client/util/AtsUserTest.java @@ -21,18 +21,18 @@ import org.eclipse.osee.framework.jdk.core.util.Collections; import org.eclipse.osee.framework.skynet.core.User; import org.eclipse.osee.framework.skynet.core.UserManager; import org.junit.Assert; -import org.junit.Before; +import org.junit.BeforeClass; /** * @author Donald G. Dunne */ public class AtsUserTest { - private IAtsUser atsUser; - private User user; + private static IAtsUser atsUser; + private static User user; - @Before - public void setUp() throws OseeCoreException { + @BeforeClass + public static void setUp() throws OseeCoreException { user = UserManager.getUser(); atsUser = AtsClientService.get().getUserService().getCurrentUser(); } @@ -48,7 +48,7 @@ public class AtsUserTest { } @org.junit.Test - public void testGetEmail() throws OseeCoreException { + public void testGetEmail() throws Exception { Assert.assertEquals(user.getEmail(), atsUser.getEmail()); } diff --git a/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/util/DbInitTest.java b/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/util/DbInitTest.java index ee9e013d674..b24b439bb71 100644 --- a/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/util/DbInitTest.java +++ b/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/util/DbInitTest.java @@ -66,7 +66,8 @@ public class DbInitTest { ClientSessionManager.releaseSession(); ClientSessionManager.getSession(); UserManager.releaseUser(); - AtsClientService.get().getUserService().releaseUser(); + AtsClientService.getConfigEndpoint().clearCaches(); + AtsClientService.get().getUserService().reloadCache(); if (UserManager.getUser().getUserId().equals("bootstrap")) { throw new OseeStateException("Should not be bootstrap user here"); 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 3673489a970..d55b0b07d82 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 @@ -25,6 +25,8 @@ import org.eclipse.osee.ats.api.IAtsServices; import org.eclipse.osee.ats.api.IAtsWorkItem; import org.eclipse.osee.ats.api.agile.IAgileService; import org.eclipse.osee.ats.api.ai.IAtsActionableItem; +import org.eclipse.osee.ats.api.config.JaxActionableItem; +import org.eclipse.osee.ats.api.config.JaxTeamDefinition; import org.eclipse.osee.ats.api.data.AtsArtifactToken; import org.eclipse.osee.ats.api.data.AtsRelationTypes; import org.eclipse.osee.ats.api.notify.AtsNotificationCollector; @@ -60,8 +62,10 @@ import org.eclipse.osee.ats.core.client.util.IArtifactMembersCache; import org.eclipse.osee.ats.core.client.workflow.AbstractWorkflowArtifact; import org.eclipse.osee.ats.core.client.workflow.ChangeTypeUtil; import org.eclipse.osee.ats.core.client.workflow.transition.TransitionListeners; +import org.eclipse.osee.ats.core.config.ActionableItem2; import org.eclipse.osee.ats.core.config.IActionableItemFactory; import org.eclipse.osee.ats.core.config.ITeamDefinitionFactory; +import org.eclipse.osee.ats.core.config.TeamDefinition2; import org.eclipse.osee.ats.core.util.ActionFactory; import org.eclipse.osee.ats.core.util.AtsCoreFactory; import org.eclipse.osee.ats.core.util.AtsCoreServiceImpl; @@ -214,26 +218,34 @@ public class AtsClientImpl extends AtsCoreServiceImpl implements IAtsClient { @Override public void reloadConfigCache(boolean pend) { + final IAtsServices client = this; Runnable reload = new Runnable() { @Override public void run() { try { - List<Integer> ids = new LinkedList<>(); - for (Long id : configProvider.getConfigurations().getAtsConfigIds()) { - ids.add(id.intValue()); - } - List<Artifact> artifacts = ArtifactQuery.getArtifactListFromIds(ids, getAtsBranch()); - for (Artifact artifact : artifacts) { - IAtsConfigObject configObj = configItemFactory.getConfigObject(artifact); - if (configObj != null) { - atsCache.cacheAtsObject(configObj); - } - } + cacheActionableItems(configProvider.getConfigurations().getIdToAi().get( + configProvider.getConfigurations().getTopActionableItem())); + cacheTeamDefinitions(configProvider.getConfigurations().getIdToTeamDef().get( + configProvider.getConfigurations().getTopTeamDefinition())); } catch (Exception ex) { OseeLog.log(Activator.class, Level.SEVERE, ex); } } + + private void cacheTeamDefinitions(JaxTeamDefinition jaxTeamDef) { + atsCache.cacheAtsObject(new TeamDefinition2(getLogger(), client, jaxTeamDef)); + for (Long childId : jaxTeamDef.getChildren()) { + cacheTeamDefinitions(configProvider.getConfigurations().getIdToTeamDef().get(childId)); + } + } + + private void cacheActionableItems(JaxActionableItem jaxAi) { + atsCache.cacheAtsObject(new ActionableItem2(getLogger(), client, jaxAi)); + for (Long child : jaxAi.getChildren()) { + cacheActionableItems(configProvider.getConfigurations().getIdToAi().get(child)); + } + } }; if (pend) { reload.run(); diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsConfigurationsService.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsConfigurationsService.java index d58495c52f1..a071c7bb5f0 100644 --- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsConfigurationsService.java +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsConfigurationsService.java @@ -18,7 +18,6 @@ import org.eclipse.osee.ats.api.config.IAtsConfigurationProvider; import org.eclipse.osee.ats.api.user.IAtsUser; import org.eclipse.osee.ats.api.user.IUserArtLoader; import org.eclipse.osee.ats.api.user.JaxAtsUser; -import org.eclipse.osee.ats.core.util.AtsUtilCore; import org.eclipse.osee.framework.core.data.ArtifactToken; import org.eclipse.osee.framework.core.exception.ArtifactDoesNotExist; import org.eclipse.osee.framework.skynet.core.UserManager; diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/user/AtsUserServiceClientImpl.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/user/AtsUserServiceClientImpl.java index 77674c59314..537451a44ed 100644 --- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/user/AtsUserServiceClientImpl.java +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/user/AtsUserServiceClientImpl.java @@ -27,6 +27,7 @@ import org.eclipse.osee.framework.core.data.ArtifactId; import org.eclipse.osee.framework.core.enums.Active; import org.eclipse.osee.framework.core.enums.CoreArtifactTypes; import org.eclipse.osee.framework.core.enums.CoreAttributeTypes; +import org.eclipse.osee.framework.core.enums.CoreBranches; import org.eclipse.osee.framework.core.exception.ArtifactDoesNotExist; import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; import org.eclipse.osee.framework.skynet.core.User; @@ -205,4 +206,14 @@ public class AtsUserServiceClientImpl extends AbstractAtsUserService implements return user; } + @Override + public List<IAtsUser> getUsersFromDb() { + List<IAtsUser> users = new ArrayList<>(); + for (ArtifactId userArt : ArtifactQuery.getArtifactListFromType(CoreArtifactTypes.User, CoreBranches.COMMON)) { + JaxAtsUser atsUser = createFromArtifact((Artifact) userArt); + users.add(atsUser); + } + return users; + } + } diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/workflow/AtsRelationResolverServiceImpl.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/workflow/AtsRelationResolverServiceImpl.java index 6bdfa965e2e..21e4376b01e 100644 --- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/workflow/AtsRelationResolverServiceImpl.java +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/workflow/AtsRelationResolverServiceImpl.java @@ -203,4 +203,14 @@ public class AtsRelationResolverServiceImpl extends AbstractRelationResolverServ return art.getRelatedArtifactsCount(relationTypeSide); } + @Override + public Collection<Long> getRelatedIds(ArtifactId artifact, RelationTypeSide relationTypeSide) { + List<Long> related = new LinkedList<>(); + Artifact art = getArtifact(artifact); + for (Artifact rel : art.getRelatedArtifacts(relationTypeSide)) { + related.add(rel.getId()); + } + return related; + } + } diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/config/ActionableItem2.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/config/ActionableItem2.java new file mode 100644 index 00000000000..2a546dcdbfb --- /dev/null +++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/config/ActionableItem2.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * Copyright (c) 2017 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.config; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import org.eclipse.osee.ats.api.IAtsServices; +import org.eclipse.osee.ats.api.ai.IAtsActionableItem; +import org.eclipse.osee.ats.api.config.JaxActionableItem; +import org.eclipse.osee.ats.api.data.AtsArtifactTypes; +import org.eclipse.osee.ats.api.data.AtsAttributeTypes; +import org.eclipse.osee.ats.api.team.IAtsTeamDefinition; +import org.eclipse.osee.ats.core.model.impl.AtsConfigObject; +import org.eclipse.osee.framework.core.data.ArtifactToken; +import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; +import org.eclipse.osee.logger.Log; + +/** + * @author Donald G. Dunne + */ +public class ActionableItem2 extends AtsConfigObject implements IAtsActionableItem { + + private final JaxActionableItem jaxAI; + + public ActionableItem2(Log logger, IAtsServices services, JaxActionableItem jaxAI) { + super(logger, services, ArtifactToken.valueOf(jaxAI.getUuid(), jaxAI.getName(), services.getAtsBranch(), + AtsArtifactTypes.ActionableItem)); + this.jaxAI = jaxAI; + } + + @Override + public String getTypeName() { + return "Actionable Item"; + } + + @Override + public Collection<String> getRules() throws OseeCoreException { + Collection<String> rules = new ArrayList<>(); + try { + rules = services.getAttributeResolver().getAttributeValues(artifact, AtsAttributeTypes.RuleDefinition); + } catch (OseeCoreException ex) { + getLogger().error(ex, "Error getting rules"); + } + return rules; + } + + @Override + public boolean hasRule(String rule) throws OseeCoreException { + return getRules().contains(rule); + } + + @Override + public Collection<IAtsActionableItem> getChildrenActionableItems() { + List<IAtsActionableItem> children = new LinkedList<>(); + for (Long childId : jaxAI.getChildren()) { + children.add(new ActionableItem2(logger, services, services.getConfigurations().getIdToAi().get(childId))); + } + return children; + } + + @Override + public IAtsActionableItem getParentActionableItem() { + IAtsActionableItem parent = null; + try { + if (jaxAI.getParentId() != null) { + parent = services.getConfigItemFactory().getActionableItem(services.getArtifact(jaxAI.getParentId())); + } + } catch (OseeCoreException ex) { + getLogger().error(ex, "Error getParentActionableItem"); + } + return parent; + } + + @Override + public IAtsTeamDefinition getTeamDefinition() { + IAtsTeamDefinition teamDef = null; + try { + if (jaxAI.getTeamDefId() != null) { + teamDef = services.getConfigItemFactory().getTeamDef(services.getArtifact(jaxAI.getTeamDefId())); + } + } catch (OseeCoreException ex) { + getLogger().error(ex, "Error getTeamDefinition"); + } + return teamDef; + } + + @Override + public IAtsTeamDefinition getTeamDefinitionInherited() { + return TeamDefinitions.getImpactedTeamDef(this); + } + + @Override + public boolean isAllowUserActionCreation() { + return services.getAttributeResolver().getSoleAttributeValue(artifact, AtsAttributeTypes.AllowUserActionCreation, + true); + } + +} diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/config/TeamDefinition2.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/config/TeamDefinition2.java new file mode 100644 index 00000000000..9aece5add3a --- /dev/null +++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/config/TeamDefinition2.java @@ -0,0 +1,347 @@ +/******************************************************************************* + * Copyright (c) 2013 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.config; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import org.eclipse.osee.ats.api.IAtsServices; +import org.eclipse.osee.ats.api.ai.IAtsActionableItem; +import org.eclipse.osee.ats.api.config.JaxTeamDefinition; +import org.eclipse.osee.ats.api.data.AtsArtifactTypes; +import org.eclipse.osee.ats.api.data.AtsAttributeTypes; +import org.eclipse.osee.ats.api.data.AtsRelationTypes; +import org.eclipse.osee.ats.api.team.IAtsTeamDefinition; +import org.eclipse.osee.ats.api.user.IAtsUser; +import org.eclipse.osee.ats.api.version.IAtsVersion; +import org.eclipse.osee.ats.api.version.VersionLockedType; +import org.eclipse.osee.ats.api.version.VersionReleaseType; +import org.eclipse.osee.ats.core.model.impl.AtsConfigObject; +import org.eclipse.osee.framework.core.data.ArtifactId; +import org.eclipse.osee.framework.core.data.ArtifactToken; +import org.eclipse.osee.framework.core.data.BranchId; +import org.eclipse.osee.framework.core.enums.CoreRelationTypes; +import org.eclipse.osee.framework.core.util.Result; +import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; +import org.eclipse.osee.logger.Log; + +/** + * @author Donald G Dunne + */ +public class TeamDefinition2 extends AtsConfigObject implements IAtsTeamDefinition { + + private final JaxTeamDefinition jaxTeamDef; + + public TeamDefinition2(Log logger, IAtsServices services, JaxTeamDefinition jaxTeamDef) { + super(logger, services, ArtifactToken.valueOf(jaxTeamDef.getUuid(), jaxTeamDef.getName(), services.getAtsBranch(), + AtsArtifactTypes.ActionableItem)); + this.jaxTeamDef = jaxTeamDef; + } + + @Override + public String getTypeName() { + return "Team Definition"; + } + + @Override + public Collection<IAtsActionableItem> getActionableItems() { + List<IAtsActionableItem> children = new LinkedList<>(); + for (Long aiId : jaxTeamDef.getAis()) { + children.add(new ActionableItem2(logger, services, services.getConfigurations().getIdToAi().get(aiId))); + } + return children; + } + + @Override + public IAtsTeamDefinition getParentTeamDef() { + IAtsTeamDefinition parent = null; + try { + Collection<ArtifactToken> related = + services.getRelationResolver().getRelated(artifact, CoreRelationTypes.Default_Hierarchical__Parent); + if (!related.isEmpty()) { + parent = services.getConfigItemFactory().getTeamDef(related.iterator().next()); + } + } catch (OseeCoreException ex) { + getLogger().error(ex, "Error getParentTeamDef"); + } + return parent; + } + + @Override + public Collection<IAtsTeamDefinition> getChildrenTeamDefinitions() { + Set<IAtsTeamDefinition> children = new HashSet<>(); + try { + for (ArtifactId childArt : services.getRelationResolver().getRelated(artifact, + CoreRelationTypes.Default_Hierarchical__Child)) { + IAtsTeamDefinition childTeamDef = services.getConfigItemFactory().getTeamDef(childArt); + if (childTeamDef != null) { + children.add(childTeamDef); + } + } + } catch (OseeCoreException ex) { + getLogger().error(ex, "Error getChildrenTeamDefinitions"); + } + return children; + } + + @Override + public Collection<IAtsUser> getLeads(Collection<IAtsActionableItem> actionableItems) { + Set<IAtsUser> leads = new HashSet<>(); + for (IAtsActionableItem aia : actionableItems) { + if (this.equals(aia.getTeamDefinitionInherited())) { + // If leads are specified for this aia, add them + Collection<IAtsUser> leads2 = aia.getLeads(); + if (leads2.size() > 0) { + leads.addAll(leads2); + } else { + if (aia.getTeamDefinitionInherited() != null) { + Collection<IAtsUser> leads3 = aia.getTeamDefinitionInherited().getLeads(); + leads.addAll(leads3); + } + } + } + } + if (leads.isEmpty()) { + Collection<IAtsUser> leads2 = getLeads(); + leads.addAll(leads2); + } + return leads; + } + + @Override + public Collection<IAtsUser> getMembers() { + return getRelatedUsers(AtsRelationTypes.TeamMember_Member); + } + + @Override + public Collection<IAtsUser> getMembersAndLeads() { + Set<IAtsUser> results = new HashSet<>(); + results.addAll(getLeads()); + results.addAll(getMembers()); + return results; + } + + @Override + public Collection<IAtsUser> getPrivilegedMembers() { + return getRelatedUsers(AtsRelationTypes.PrivilegedMember_Member); + } + + @Override + public boolean isAllowCommitBranch() { + boolean set = false; + try { + set = + services.getAttributeResolver().getSoleAttributeValue(artifact, AtsAttributeTypes.AllowCommitBranch, false); + } catch (OseeCoreException ex) { + getLogger().error(ex, "Error is allow commit branch"); + } + return set; + } + + @Override + public Result isAllowCommitBranchInherited() { + if (!isAllowCommitBranch()) { + return new Result(false, "Team Definition [" + this + "] not configured to allow branch commit."); + } + if (getBaselineBranchId().isInvalid()) { + return new Result(false, "Parent Branch not configured for Team Definition [" + this + "]"); + } + return Result.TrueResult; + } + + @Override + public boolean isAllowCreateBranch() { + boolean set = false; + try { + set = + services.getAttributeResolver().getSoleAttributeValue(artifact, AtsAttributeTypes.AllowCreateBranch, false); + } catch (OseeCoreException ex) { + getLogger().error(ex, "Error get allow create branch"); + } + return set; + } + + @Override + public Result isAllowCreateBranchInherited() { + if (!isAllowCreateBranch()) { + return new Result(false, "Branch creation disabled for Team Definition [" + this + "]"); + } + if (getBaselineBranchId().isInvalid()) { + return new Result(false, "Parent Branch not configured for Team Definition [" + this + "]"); + } + return Result.TrueResult; + } + + @Override + public BranchId getBaselineBranchId() { + return BranchId.valueOf((String) getAttributeValue(AtsAttributeTypes.BaselineBranchUuid, "0")); + } + + @Override + public BranchId getTeamBranchId() { + BranchId branch = getBaselineBranchId(); + if (branch.isValid()) { + return branch; + } else { + IAtsTeamDefinition parentTeamDef = getParentTeamDef(); + if (parentTeamDef instanceof TeamDefinition2) { + return parentTeamDef.getTeamBranchId(); + } + } + return BranchId.SENTINEL; + } + + @Override + public String getCommitFullDisplayName() { + return getName(); + } + + @Override + public boolean isTeamUsesVersions() throws OseeCoreException { + return getTeamDefinitionHoldingVersions() != null; + } + + @Override + public IAtsVersion getNextReleaseVersion() { + IAtsVersion result = null; + for (IAtsVersion version : getVersions()) { + if (version.isNextVersion()) { + result = version; + break; + } + } + return result; + } + + @Override + public IAtsTeamDefinition getTeamDefinitionHoldingVersions() throws OseeCoreException { + IAtsTeamDefinition teamDef = null; + if (getVersions().size() > 0) { + teamDef = this; + } else { + IAtsTeamDefinition parentTda = getParentTeamDef(); + if (parentTda != null) { + teamDef = parentTda.getTeamDefinitionHoldingVersions(); + } + } + return teamDef; + } + + @Override + public IAtsVersion getVersion(String name) { + IAtsVersion result = null; + for (IAtsVersion version : getVersions()) { + if (version.getName().equals(name)) { + result = version; + break; + } + } + return result; + } + + @Override + public Collection<IAtsVersion> getVersions() { + Set<IAtsVersion> results = new HashSet<>(); + try { + for (ArtifactId verArt : services.getRelationResolver().getRelated(artifact, + AtsRelationTypes.TeamDefinitionToVersion_Version)) { + IAtsVersion version = services.getConfigItemFactory().getVersion(verArt); + results.add(version); + } + } catch (OseeCoreException ex) { + getLogger().error(ex, "Error getting versions"); + } + return results; + } + + @Override + public Collection<IAtsVersion> getVersions(VersionReleaseType releaseType, VersionLockedType lockedType) { + return org.eclipse.osee.framework.jdk.core.util.Collections.setIntersection(getVersionsReleased(releaseType), + getVersionsLocked(lockedType)); + } + + @Override + public Collection<IAtsVersion> getVersionsFromTeamDefHoldingVersions(VersionReleaseType releaseType, VersionLockedType lockedType) throws OseeCoreException { + IAtsTeamDefinition teamDef = getTeamDefinitionHoldingVersions(); + if (teamDef == null) { + return new ArrayList<IAtsVersion>(); + } + return teamDef.getVersions(releaseType, lockedType); + } + + @Override + public Collection<IAtsVersion> getVersionsLocked(VersionLockedType lockType) { + ArrayList<IAtsVersion> versions = new ArrayList<>(); + for (IAtsVersion version : getVersions()) { + if (version.isVersionLocked() && (lockType == VersionLockedType.Locked || lockType == VersionLockedType.Both)) { + versions.add(version); + } else if (!version.isVersionLocked() && lockType == VersionLockedType.UnLocked || lockType == VersionLockedType.Both) { + versions.add(version); + } + } + return versions; + } + + @Override + public Collection<IAtsVersion> getVersionsReleased(VersionReleaseType releaseType) { + ArrayList<IAtsVersion> versions = new ArrayList<>(); + for (IAtsVersion version : getVersions()) { + if (version.isReleased() && (releaseType == VersionReleaseType.Released || releaseType == VersionReleaseType.Both)) { + versions.add(version); + } else if (!version.isReleased() && releaseType == VersionReleaseType.UnReleased || releaseType == VersionReleaseType.Both) { + versions.add(version); + } + } + return versions; + } + + @Override + public String getWorkflowDefinition() { + return getAttributeValue(AtsAttributeTypes.WorkflowDefinition, ""); + } + + @Override + public String getRelatedTaskWorkDefinition() { + return getAttributeValue(AtsAttributeTypes.RelatedTaskWorkDefinition, ""); + } + + @Override + public String getRelatedPeerWorkDefinition() { + return getAttributeValue(AtsAttributeTypes.RelatedPeerWorkflowDefinition, ""); + } + + @Override + public Collection<String> getRules() { + Collection<String> rules = new ArrayList<>(); + try { + rules = services.getAttributeResolver().getAttributeValues(artifact, AtsAttributeTypes.RuleDefinition); + } catch (OseeCoreException ex) { + getLogger().error(ex, "Error getting rules"); + } + return rules; + } + + @Override + public boolean hasRule(String rule) { + boolean result = false; + for (String rule2 : getRules()) { + if (rule.equals(rule2)) { + result = true; + break; + } + } + return result; + } + +} diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/users/AbstractAtsUserService.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/users/AbstractAtsUserService.java index 9d2d07c127d..b7d0f3c2f8d 100644 --- a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/users/AbstractAtsUserService.java +++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/users/AbstractAtsUserService.java @@ -135,10 +135,6 @@ public abstract class AbstractAtsUserService implements IAtsUserService { return getUserById(userToken.getUserId()); } - public void releaseUser(IAtsUser newUser) { - currentUser = null; - } - @Override public abstract String getCurrentUserId(); diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/AtsConfigEndpointImpl.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/AtsConfigEndpointImpl.java index 544fe772905..0583957f888 100644 --- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/AtsConfigEndpointImpl.java +++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/AtsConfigEndpointImpl.java @@ -10,15 +10,13 @@ *******************************************************************************/ package org.eclipse.osee.ats.rest.internal.config; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; @@ -31,15 +29,20 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.UriInfo; import org.eclipse.nebula.widgets.xviewer.core.model.SortDataType; +import org.eclipse.osee.ats.api.IAtsServices; import org.eclipse.osee.ats.api.config.AtsAttributeValueColumn; import org.eclipse.osee.ats.api.config.AtsConfigEndpointApi; import org.eclipse.osee.ats.api.config.AtsConfiguration; import org.eclipse.osee.ats.api.config.AtsConfigurations; import org.eclipse.osee.ats.api.config.AtsViews; import org.eclipse.osee.ats.api.config.ColumnAlign; +import org.eclipse.osee.ats.api.config.JaxActionableItem; +import org.eclipse.osee.ats.api.config.JaxTeamDefinition; +import org.eclipse.osee.ats.api.config.JaxVersion; import org.eclipse.osee.ats.api.data.AtsArtifactToken; import org.eclipse.osee.ats.api.data.AtsArtifactTypes; import org.eclipse.osee.ats.api.data.AtsAttributeTypes; +import org.eclipse.osee.ats.api.data.AtsRelationTypes; import org.eclipse.osee.ats.api.user.IAtsUser; import org.eclipse.osee.ats.api.user.JaxAtsUser; import org.eclipse.osee.ats.api.workdef.JaxAtsWorkDef; @@ -72,80 +75,208 @@ import org.eclipse.osee.orcs.transaction.TransactionBuilder; public final class AtsConfigEndpointImpl implements AtsConfigEndpointApi { private final OrcsApi orcsApi; - private final IAtsServer atsServer; + private final IAtsServices services; private final Log logger; + private AtsConfigurations atsConfigurations; - public AtsConfigEndpointImpl(IAtsServer atsServer, OrcsApi orcsApi, Log logger) { - this.atsServer = atsServer; + public AtsConfigEndpointImpl(IAtsServices services, OrcsApi orcsApi, Log logger) { + this.services = services; this.orcsApi = orcsApi; this.logger = logger; + startAtsConfigurationsReloader(); } - private final Supplier<AtsConfigurations> configurationsCache = - Suppliers.memoizeWithExpiration(getConfigurationsSupplier(), 5, TimeUnit.MINUTES); - - private Supplier<AtsConfigurations> getConfigurationsSupplier() { - return new Supplier<AtsConfigurations>() { + private void startAtsConfigurationsReloader() { + Thread thread = new Thread("ATS Configuration Re-Loader") { @Override - public AtsConfigurations get() { - ResultSet<ArtifactReadable> artifacts = - orcsApi.getQueryFactory().fromBranch(CoreBranches.COMMON).andTypeEquals( - AtsArtifactTypes.Configuration).getResults(); - // load ats branch configurations - AtsConfigurations configs = new AtsConfigurations(); - for (ArtifactReadable art : artifacts) { - AtsConfiguration config = new AtsConfiguration(); - configs.getConfigs().add(config); - config.setName(art.getName()); - config.setUuid(art.getId()); - config.setBranchUuid( - Long.valueOf(art.getSoleAttributeValue(AtsAttributeTypes.AtsConfiguredBranch, "0L"))); - config.setIsDefault(art.getSoleAttributeValue(AtsAttributeTypes.Default, false)); - } - UpdateAtsConfiguration update = new UpdateAtsConfiguration(atsServer); - AtsViews views = update.getConfigViews(); - // load views - configs.setViews(views); - // load color column config - configs.setColorColumns(update.getColorColumns()); - // load valid state names - configs.setValidStateNames(update.getValidStateNames()); - // load users - for (IAtsUser user : atsServer.getUserService().getUsers()) { - configs.getUsers().add((JaxAtsUser) user); - } - // load admins - ArtifactReadable atsAdminArt = orcsApi.getQueryFactory().fromBranch(atsServer.getAtsBranch()).andIds( - AtsArtifactToken.AtsAdmin).getResults().getAtMostOneOrNull(); - if (atsAdminArt != null) { - for (ArtifactReadable member : atsAdminArt.getRelated(CoreRelationTypes.Users_User)) { - configs.getAtsAdmins().add(member.getId()); - } - } - // load ats config object ids - for (ArtifactId configArtId : orcsApi.getQueryFactory().fromBranch(atsServer.getAtsBranch()).andIsOfType( - AtsArtifactTypes.TeamDefinition, AtsArtifactTypes.Version, - AtsArtifactTypes.ActionableItem).getResultsAsLocalIds()) { - configs.getAtsConfigIds().add(configArtId.getId()); + public void run() { + AtsConfigurations configs = getAtsConfigurationsFromDb(); + atsConfigurations = configs; + } + }; + thread.start(); + } + + private AtsConfigurations getAtsConfigurationsFromDb() { + ResultSet<ArtifactReadable> artifacts = orcsApi.getQueryFactory().fromBranch(CoreBranches.COMMON).andTypeEquals( + AtsArtifactTypes.Configuration).getResults(); + // load ats branch configurations + AtsConfigurations configs = new AtsConfigurations(); + for (ArtifactReadable art : artifacts) { + AtsConfiguration config = new AtsConfiguration(); + configs.getConfigs().add(config); + config.setName(art.getName()); + config.setUuid(art.getId()); + config.setBranchUuid(Long.valueOf(art.getSoleAttributeValue(AtsAttributeTypes.AtsConfiguredBranch, "0L"))); + config.setIsDefault(art.getSoleAttributeValue(AtsAttributeTypes.Default, false)); + } + UpdateAtsConfiguration update = new UpdateAtsConfiguration((IAtsServer) services); + AtsViews views = update.getConfigViews(); + // load views + configs.setViews(views); + // load color column config + configs.setColorColumns(update.getColorColumns()); + // load valid state names + configs.setValidStateNames(update.getValidStateNames()); + // load users + for (IAtsUser user : services.getUserService().getUsersFromDb()) { + configs.getUsers().add((JaxAtsUser) user); + } + // load admins + ArtifactReadable atsAdminArt = orcsApi.getQueryFactory().fromBranch(services.getAtsBranch()).andIds( + AtsArtifactToken.AtsAdmin).getResults().getAtMostOneOrNull(); + if (atsAdminArt != null) { + for (ArtifactReadable member : atsAdminArt.getRelated(CoreRelationTypes.Users_User)) { + configs.getAtsAdmins().add(member.getId()); + } + } + + Map<Long, ArtifactReadable> idToArtifact = new HashMap<>(); + + @SuppressWarnings("unused") + List<ArtifactReadable> configArts = + orcsApi.getQueryFactory().fromBranch(services.getAtsBranch()).andIsOfType(AtsArtifactTypes.TeamDefinition, + AtsArtifactTypes.Version, AtsArtifactTypes.ActionableItem).getResults().getList(); + + // load ats config objects + for (ArtifactReadable configArtId : orcsApi.getQueryFactory().fromBranch(services.getAtsBranch()).andIsOfType( + AtsArtifactTypes.TeamDefinition, AtsArtifactTypes.Version, AtsArtifactTypes.ActionableItem).getResults()) { + if (services.getStoreService().isOfType(configArtId, AtsArtifactTypes.TeamDefinition)) { + JaxTeamDefinition teamDef = createJaxTeamDefinition(configArtId); + configs.getIdToTeamDef().put(teamDef.getUuid(), teamDef); + } else if (services.getStoreService().isOfType(configArtId, AtsArtifactTypes.ActionableItem)) { + JaxActionableItem ai = createJaxActionableItem(configArtId); + configs.getIdToAi().put(ai.getUuid(), ai); + } else if (services.getStoreService().isOfType(configArtId, AtsArtifactTypes.Version)) { + JaxVersion version = createJaxVersion(configArtId); + configs.getIdToVersion().put(version.getUuid(), version); + } + idToArtifact.put(configArtId.getId(), configArtId); + } + + // load team def tree + JaxTeamDefinition topJaxTeamDef = + addTeamDefinitionChildrenWIthRecurse(AtsArtifactToken.TopTeamDefinition.getId(), idToArtifact, configs); + configs.setTopTeamDefinition(topJaxTeamDef.getUuid()); + + // load actionable items tree + JaxActionableItem topJaxAi = + addActionableItemChildrenWIthRecurse(AtsArtifactToken.TopActionableItem.getId(), idToArtifact, configs); + configs.setTopActionableItem(topJaxAi.getUuid()); + + // load work definitions + for (ArtifactToken workDefArt : orcsApi.getQueryFactory().fromBranch(services.getAtsBranch()).andIsOfType( + AtsArtifactTypes.WorkDefinition).getResults()) { + String workDefStr = + services.getAttributeResolver().getSoleAttributeValueAsString(workDefArt, AtsAttributeTypes.DslSheet, ""); + configs.getWorkDefIdToWorkDef().put(workDefArt.getName(), workDefStr); + } + return configs; + } + + private JaxActionableItem addActionableItemChildrenWIthRecurse(Long aiId, Map<Long, ArtifactReadable> idToArtifact, AtsConfigurations configs) { + ArtifactReadable aiArt = idToArtifact.get(aiId); + if (aiArt != null && aiArt.isOfType(AtsArtifactTypes.ActionableItem)) { + JaxActionableItem jaxAi = configs.getIdToAi().get(aiId); + for (Long childId : aiArt.getChildrentIds()) { + JaxActionableItem child = addActionableItemChildrenWIthRecurse(childId, idToArtifact, configs); + if (child != null) { + child.setParentId(aiId); + jaxAi.getChildren().add(child.getUuid()); } - // load work definitions - for (ArtifactToken workDefArt : orcsApi.getQueryFactory().fromBranch(atsServer.getAtsBranch()).andIsOfType( - AtsArtifactTypes.WorkDefinition).getResults()) { - String workDefStr = atsServer.getAttributeResolver().getSoleAttributeValueAsString(workDefArt, - AtsAttributeTypes.DslSheet, ""); - configs.getWorkDefIdToWorkDef().put(workDefArt.getName(), workDefStr); + } + return jaxAi; + } + return null; + } + + private JaxTeamDefinition addTeamDefinitionChildrenWIthRecurse(Long teamDefId, Map<Long, ArtifactReadable> idToArtifact, AtsConfigurations configs) { + ArtifactReadable teamDef = idToArtifact.get(teamDefId); + if (teamDef != null && teamDef.isOfType(AtsArtifactTypes.TeamDefinition)) { + // System.err.println(teamDef.toStringWithId()); + JaxTeamDefinition jaxTeamDef = configs.getIdToTeamDef().get(teamDefId); + for (Long childId : teamDef.getChildrentIds()) { + JaxTeamDefinition child = addTeamDefinitionChildrenWIthRecurse(childId, idToArtifact, configs); + if (child != null) { + child.setParentId(teamDefId); + jaxTeamDef.getChildren().add(child.getUuid()); } - return configs; } + // add team to version ids + Collection<Long> relatedVersions = + services.getRelationResolver().getRelatedIds(teamDef, AtsRelationTypes.TeamDefinitionToVersion_Version); + jaxTeamDef.getVersions().addAll(relatedVersions); + for (Long verId : relatedVersions) { + JaxVersion version = configs.getIdToVersion().get(verId); + version.setTeamDefId(teamDefId); + } + // add team to ai ids + Collection<Long> relatedAis = + services.getRelationResolver().getRelatedIds(teamDef, AtsRelationTypes.TeamActionableItem_ActionableItem); + jaxTeamDef.getAis().addAll(relatedAis); + for (Long aiId : relatedAis) { + JaxActionableItem jai = configs.getIdToAi().get(aiId); + jai.setTeamDefId(teamDefId); + } + return jaxTeamDef; + } + return null; + } - }; + private JaxVersion createJaxVersion(ArtifactReadable verArt) { + JaxVersion jaxVersion = new JaxVersion(); + jaxVersion.setName(verArt.getName()); + jaxVersion.setUuid(verArt.getId()); + jaxVersion.setActive(verArt.getSoleAttributeValue(AtsAttributeTypes.Active, true)); + return jaxVersion; + } + + private JaxActionableItem createJaxActionableItem(ArtifactReadable artifact) { + JaxActionableItem jaxAi = new JaxActionableItem(); + jaxAi.setName(artifact.getName()); + jaxAi.setUuid(artifact.getId()); + jaxAi.setDescription(artifact.getSoleAttributeValue(AtsAttributeTypes.Description, "")); + jaxAi.setActive(artifact.getSoleAttributeValue(AtsAttributeTypes.Active, true)); + return jaxAi; + } + + private JaxTeamDefinition createJaxTeamDefinition(ArtifactReadable child) { + JaxTeamDefinition jaxChild = new JaxTeamDefinition(); + jaxChild.setName(child.getName()); + jaxChild.setUuid(child.getId()); + jaxChild.setActive(child.getSoleAttributeValue(AtsAttributeTypes.Active, true)); + for (ArtifactToken ai : services.getRelationResolver().getRelated(child, + AtsRelationTypes.TeamActionableItem_ActionableItem)) { + jaxChild.getAis().add(ai.getId()); + } + return jaxChild; + } + + @Override + @GET + @Path("clearcache") + @Produces(MediaType.APPLICATION_JSON) + public AtsConfigurations clearCaches() { + atsConfigurations = null; + return get(); } @GET @Produces(MediaType.APPLICATION_JSON) @Override public AtsConfigurations get() { - return configurationsCache.get(); + if (atsConfigurations == null) { + atsConfigurations = getAtsConfigurationsFromDb(); + } + return atsConfigurations; + } + + @GET + @Path("fromdb") + @Produces(MediaType.APPLICATION_JSON) + @Override + public AtsConfigurations getFromDb() { + return getAtsConfigurationsFromDb(); } @GET @@ -168,7 +299,7 @@ public final class AtsConfigEndpointImpl implements AtsConfigEndpointApi { Conditions.checkNotNullOrEmpty(newBranchName, "newBranchName"); String userId = form.getFirst("userId"); Conditions.checkNotNullOrEmpty(userId, "UserId"); - ArtifactId user = atsServer.getUserService().getUserById(userId).getStoreObject(); + ArtifactId user = services.getUserService().getUserById(userId).getStoreObject(); if (user == null) { logger.error("User by id [%s] does not exist", userId); } @@ -256,7 +387,7 @@ public final class AtsConfigEndpointImpl implements AtsConfigEndpointApi { config.setUuid(((ArtifactReadable) configArt).getId()); tx.createAttribute(configArt, AtsAttributeTypes.AtsConfiguredBranch, String.valueOf(newBranchUuid)); XResultData rd = new XResultData(); - UpdateAtsConfiguration update = new UpdateAtsConfiguration(atsServer); + UpdateAtsConfiguration update = new UpdateAtsConfiguration((IAtsServer) services); // Get or create Configs folder ArtifactId configsFolderArt = update.getOrCreateConfigsFolder(userArt, rd); @@ -273,7 +404,7 @@ public final class AtsConfigEndpointImpl implements AtsConfigEndpointApi { @Override public Response createUpdateConfig() { XResultData resultData = new XResultData(false); - UpdateAtsConfiguration update = new UpdateAtsConfiguration(atsServer); + UpdateAtsConfiguration update = new UpdateAtsConfiguration((IAtsServer) services); update.createUpdateConfig(resultData); if (resultData.isEmpty()) { resultData.log("Nothing to update"); @@ -286,25 +417,27 @@ public final class AtsConfigEndpointImpl implements AtsConfigEndpointApi { @Override public Response storeWorkDef(JaxAtsWorkDef jaxWorkDef) { TransactionBuilder tx = orcsApi.getTransactionFactory().createTransaction(CoreBranches.COMMON, - atsServer.getArtifact(AtsCoreUsers.SYSTEM_USER), "Store Work Definition " + jaxWorkDef.getName()); - ArtifactReadable workDefArt = orcsApi.getQueryFactory().fromBranch(atsServer.getAtsBranch()).andIsOfType( + services.getArtifact(AtsCoreUsers.SYSTEM_USER), "Store Work Definition " + jaxWorkDef.getName()); + ArtifactReadable workDefArt = orcsApi.getQueryFactory().fromBranch(services.getAtsBranch()).andIsOfType( AtsArtifactTypes.WorkDefinition).andNameEquals(jaxWorkDef.getName()).getResults().getAtMostOneOrNull(); if (workDefArt == null) { workDefArt = (ArtifactReadable) tx.createArtifact(AtsArtifactTypes.WorkDefinition, jaxWorkDef.getName()); } tx.setSoleAttributeValue(workDefArt, AtsAttributeTypes.DslSheet, jaxWorkDef.getWorkDefDsl()); if (workDefArt.getParent() == null) { - ArtifactReadable workDefFolder = atsServer.getArtifact(AtsArtifactToken.WorkDefinitionsFolder); + ArtifactReadable workDefFolder = + (ArtifactReadable) services.getArtifact(AtsArtifactToken.WorkDefinitionsFolder); tx.addChildren(workDefFolder, workDefArt); } tx.commit(); - atsServer.getWorkDefAdmin().clearCaches(); + ((IAtsServer) services).getWorkDefAdmin().clearCaches(); return Response.ok().build(); } @Override public List<AtsAttributeValueColumn> generateAttrTypeViews() throws Exception { Map<String, AttributeTypeToken> idToToken = new HashMap<>(); + IAtsServer atsServer = (IAtsServer) services; for (AttributeTypeToken attrType : atsServer.getOrcsApi().getOrcsTypes().getAttributeTypes().getAll()) { idToToken.put(attrType.getName(), attrType); } diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/AtsUserServiceServerImpl.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/AtsUserServiceServerImpl.java index 0f74fdeed44..ce54b0e7efb 100644 --- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/AtsUserServiceServerImpl.java +++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/AtsUserServiceServerImpl.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.osee.ats.rest.internal.config; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -25,8 +27,6 @@ import org.eclipse.osee.framework.core.enums.CoreRelationTypes; import org.eclipse.osee.framework.core.enums.SystemUser; import org.eclipse.osee.orcs.OrcsApi; import org.eclipse.osee.orcs.data.ArtifactReadable; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; /** * @author Donald G. Dunne @@ -54,7 +54,7 @@ public class AtsUserServiceServerImpl extends AbstractAtsUserService { return atsAdminArt.areRelated(CoreRelationTypes.User_Grouping__Members, (ArtifactReadable) user.getStoreObject()); } - private final Supplier<List<IAtsUser>> usersCache = + private Supplier<List<IAtsUser>> usersCache = Suppliers.memoizeWithExpiration(getConfigurationsSupplier(), 5, TimeUnit.MINUTES); private Supplier<List<IAtsUser>> getConfigurationsSupplier() { @@ -62,10 +62,7 @@ public class AtsUserServiceServerImpl extends AbstractAtsUserService { @Override public List<IAtsUser> get() { List<IAtsUser> users = new ArrayList<>(); - for (ArtifactId art : orcsApi.getQueryFactory().fromBranch(CoreBranches.COMMON).andIsOfType( - CoreArtifactTypes.User).getResults()) { - ArtifactReadable userArt = (ArtifactReadable) art; - JaxAtsUser atsUser = createFromArtifact(userArt); + for (IAtsUser atsUser : getUsersFromDb()) { userIdToAtsUser.put(atsUser.getUserId(), atsUser); nameToAtsUser.put(atsUser.getName(), atsUser); users.add(atsUser); @@ -79,8 +76,8 @@ public class AtsUserServiceServerImpl extends AbstractAtsUserService { JaxAtsUser atsUser = new JaxAtsUser(); atsUser.setName(userArt.getName()); atsUser.setStoreObject(userArt); - atsUser.setUserId(userArt.getSoleAttributeValue(CoreAttributeTypes.UserId, "")); - atsUser.setEmail(userArt.getSoleAttributeValue(CoreAttributeTypes.Email, "")); + atsUser.setUserId(userArt.getSoleAttributeAsString(CoreAttributeTypes.UserId, "")); + atsUser.setEmail(userArt.getSoleAttributeAsString(CoreAttributeTypes.Email, "")); atsUser.setActive(userArt.getSoleAttributeValue(CoreAttributeTypes.Active, true)); atsUser.setUuid(userArt.getId()); return atsUser; @@ -92,6 +89,24 @@ public class AtsUserServiceServerImpl extends AbstractAtsUserService { } @Override + public List<IAtsUser> getUsersFromDb() { + List<IAtsUser> users = new ArrayList<>(); + for (ArtifactId art : orcsApi.getQueryFactory().fromBranch(CoreBranches.COMMON).andIsOfType( + CoreArtifactTypes.User).getResults()) { + ArtifactReadable userArt = (ArtifactReadable) art; + JaxAtsUser atsUser = createFromArtifact(userArt); + users.add(atsUser); + } + return users; + } + + @Override + public void reloadCache() { + usersCache = Suppliers.memoizeWithExpiration(getConfigurationsSupplier(), 5, TimeUnit.MINUTES); + super.reloadCache(); + } + + @Override protected IAtsUser loadUserFromDbByUserId(String userId) { ArtifactReadable userArt = orcsApi.getQueryFactory().fromBranch(CoreBranches.COMMON).andIsOfType(CoreArtifactTypes.User).and( diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/UpdateAtsConfiguration.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/UpdateAtsConfiguration.java index a2c9c902ea1..f8bd98df531 100644 --- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/UpdateAtsConfiguration.java +++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/UpdateAtsConfiguration.java @@ -101,10 +101,8 @@ public class UpdateAtsConfiguration { private void createUpdateConfigAttributes(ArtifactReadable configArt, ArtifactReadable userArt, XResultData rd) throws OseeCoreException { try { - int x = 1; AtsViews databaseViews = getConfigViews(); for (String viewsJson : getViewsJsonStrings()) { - String comment = "Create Update Config Attributes - " + x++; AtsViews atsViews = gson.fromJson(viewsJson, AtsViews.class); // merge any new default view items to current database view items List<AtsAttributeValueColumn> toAdd = new LinkedList<>(); diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/util/AtsRelationResolverServiceImpl.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/util/AtsRelationResolverServiceImpl.java index c88cb571769..225f5a16660 100644 --- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/util/AtsRelationResolverServiceImpl.java +++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/util/AtsRelationResolverServiceImpl.java @@ -201,4 +201,13 @@ public class AtsRelationResolverServiceImpl extends AbstractRelationResolverServ return art.getRelatedCount(relationTypeSide); } + @Override + public Collection<Long> getRelatedIds(ArtifactId artifact, RelationTypeSide relationTypeSide) { + List<Long> related = new LinkedList<>(); + ArtifactReadable art = getArtifact(artifact); + for (ArtifactReadable rel : art.getRelated(relationTypeSide)) { + related.add(rel.getId()); + } + return related; + } } diff --git a/plugins/org.eclipse.osee.ats/META-INF/MANIFEST.MF b/plugins/org.eclipse.osee.ats/META-INF/MANIFEST.MF index 92ec16941cf..6b6166efc32 100644 --- a/plugins/org.eclipse.osee.ats/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.osee.ats/META-INF/MANIFEST.MF @@ -226,6 +226,7 @@ Import-Package: com.google.common.cache, org.eclipse.osee.framework.ui.ws, org.eclipse.osee.jaxrs.client, org.eclipse.osee.jdbc, + org.eclipse.osee.logger, org.eclipse.osee.orcs.rest.client, org.eclipse.osee.orcs.rest.model, org.eclipse.osee.orcs.rest.model.search.artifact, diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage1.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage1.java index cdb573a3851..a60f67afc33 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage1.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage1.java @@ -14,6 +14,7 @@ package org.eclipse.osee.ats.actions.wizard; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.logging.Level; @@ -23,9 +24,12 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.osee.ats.api.ai.IAtsActionableItem; +import org.eclipse.osee.ats.api.config.JaxActionableItem; import org.eclipse.osee.ats.api.data.AtsArtifactToken; import org.eclipse.osee.ats.api.data.AtsAttributeTypes; import org.eclipse.osee.ats.api.team.IAtsTeamDefinition; +import org.eclipse.osee.ats.core.client.IAtsClient; +import org.eclipse.osee.ats.core.config.ActionableItem2; import org.eclipse.osee.ats.core.config.ActionableItems; import org.eclipse.osee.ats.core.config.TeamDefinitions; import org.eclipse.osee.ats.help.ui.AtsHelpContext; @@ -149,9 +153,16 @@ public class NewActionPage1 extends WizardPage { treeViewer.getViewer().setLabelProvider(new AtsObjectLabelProvider()); try { if (selectableAis == null) { - List<IAtsActionableItem> topLevelActionableItems = - ActionableItems.getTopLevelActionableItems(Active.Active, AtsClientService.get()); - treeViewer.getViewer().setInput(topLevelActionableItems); + List<IAtsActionableItem> activeActionableItemTree = new LinkedList<>(); + IAtsClient atsClient = AtsClientService.get(); + for (Long aiId : atsClient.getConfigurations().getIdToAi().get( + atsClient.getConfigurations().getTopActionableItem()).getChildren()) { + JaxActionableItem jai = atsClient.getConfigurations().getIdToAi().get(aiId); + if (jai.isActive()) { + activeActionableItemTree.add(new ActionableItem2(atsClient.getLogger(), atsClient, jai)); + } + } + treeViewer.getViewer().setInput(activeActionableItemTree); } else { treeViewer.getViewer().setInput(selectableAis); } @@ -218,8 +229,14 @@ public class NewActionPage1 extends WizardPage { if (checked.isEmpty()) { descriptionLabel.setText(""); } else { - IAtsActionableItem aia = (IAtsActionableItem) checked.iterator().next(); - descriptionLabel.setText(aia.getDescription()); + Object obj = checked.iterator().next(); + if (obj instanceof IAtsActionableItem) { + IAtsActionableItem ai = (IAtsActionableItem) obj; + descriptionLabel.setText(ai.getDescription()); + } else if (obj instanceof JaxActionableItem) { + JaxActionableItem jai = (JaxActionableItem) obj; + descriptionLabel.setText(jai.getDescription()); + } } } } @@ -231,7 +248,12 @@ public class NewActionPage1 extends WizardPage { public Set<IAtsActionableItem> getSelectedIAtsActionableItems() { Set<IAtsActionableItem> selected = new HashSet<>(); for (Object obj : treeViewer.getChecked()) { - selected.add((IAtsActionableItem) obj); + if (obj instanceof IAtsActionableItem) { + selected.add((IAtsActionableItem) obj); + } else if (obj instanceof JaxActionableItem) { + JaxActionableItem jai = (JaxActionableItem) obj; + selected.add(AtsClientService.get().getConfigItem(jai.getUuid())); + } } return selected; } diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AITreeContentProvider.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AITreeContentProvider.java index 8815cf9fd07..24be92f799e 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AITreeContentProvider.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AITreeContentProvider.java @@ -20,9 +20,7 @@ import org.eclipse.osee.ats.api.ai.IAtsActionableItem; import org.eclipse.osee.ats.core.config.ActionableItems; import org.eclipse.osee.ats.internal.Activator; import org.eclipse.osee.framework.core.enums.Active; -import org.eclipse.osee.framework.core.enums.CoreRelationTypes; import org.eclipse.osee.framework.logging.OseeLog; -import org.eclipse.osee.framework.skynet.core.artifact.Artifact; /** * @author Donald G. Dunne @@ -67,9 +65,6 @@ public class AITreeContentProvider implements ITreeContentProvider { @Override public boolean hasChildren(Object element) { - if (element instanceof Artifact) { - return ((Artifact) element).getRelatedArtifactsCount(CoreRelationTypes.Default_Hierarchical__Child) > 0; - } return getChildren(element).length > 0; } diff --git a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/proxy/impl/ArtifactReadOnlyImpl.java b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/proxy/impl/ArtifactReadOnlyImpl.java index e8b5358375e..ddb862273b9 100644 --- a/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/proxy/impl/ArtifactReadOnlyImpl.java +++ b/plugins/org.eclipse.osee.orcs.core/src/org/eclipse/osee/orcs/core/internal/proxy/impl/ArtifactReadOnlyImpl.java @@ -21,11 +21,11 @@ import org.eclipse.osee.framework.core.data.AttributeTypeId; import org.eclipse.osee.framework.core.data.AttributeTypeToken; import org.eclipse.osee.framework.core.data.BranchId; import org.eclipse.osee.framework.core.data.IArtifactType; -import org.eclipse.osee.framework.core.data.AttributeTypeId; import org.eclipse.osee.framework.core.data.IRelationType; import org.eclipse.osee.framework.core.data.RelationTypeId; import org.eclipse.osee.framework.core.data.RelationTypeSide; import org.eclipse.osee.framework.core.data.TransactionId; +import org.eclipse.osee.framework.core.enums.CoreRelationTypes; import org.eclipse.osee.framework.core.enums.DeletionFlag; import org.eclipse.osee.framework.core.enums.ModificationType; import org.eclipse.osee.framework.core.enums.RelationSide; @@ -39,6 +39,7 @@ import org.eclipse.osee.orcs.OrcsSession; import org.eclipse.osee.orcs.core.internal.artifact.Artifact; import org.eclipse.osee.orcs.core.internal.attribute.Attribute; import org.eclipse.osee.orcs.core.internal.proxy.ExternalArtifactManager; +import org.eclipse.osee.orcs.core.internal.relation.Relation; import org.eclipse.osee.orcs.core.internal.relation.RelationManager; import org.eclipse.osee.orcs.core.internal.relation.RelationNode; import org.eclipse.osee.orcs.data.ArtifactReadable; @@ -326,4 +327,24 @@ public class ArtifactReadOnlyImpl extends AbstractProxied<Artifact> implements A return getProxiedObject().getModificationType(); } + @Override + public Collection<Long> getChildrentIds() { + return getRelatedIds(CoreRelationTypes.Default_Hierarchical__Child); + } + + @Override + public Collection<Long> getRelatedIds(RelationTypeSide relationTypeSide) { + List<Long> childIds = new ArrayList<>(); + for (Relation relation : getRelationManager().getRelations(getSession(), getProxiedObject(), + DeletionFlag.EXCLUDE_DELETED)) { + boolean relIsSideA = relationTypeSide.getSide().isSideA(); + boolean thisOnCorrectSide = + (relIsSideA && relation.getArtIdB() == getId().intValue()) || (!relIsSideA && relation.getArtIdA() == getId().intValue()); + if (thisOnCorrectSide && relation.getRelationType().matches(relationTypeSide)) { + childIds.add(Long.valueOf(relation.getArtIdB())); + } + } + return childIds; + } + } diff --git a/plugins/org.eclipse.osee.orcs/src/org/eclipse/osee/orcs/data/ArtifactReadable.java b/plugins/org.eclipse.osee.orcs/src/org/eclipse/osee/orcs/data/ArtifactReadable.java index 8b41cf29d2d..e4c6e991b2e 100644 --- a/plugins/org.eclipse.osee.orcs/src/org/eclipse/osee/orcs/data/ArtifactReadable.java +++ b/plugins/org.eclipse.osee.orcs/src/org/eclipse/osee/orcs/data/ArtifactReadable.java @@ -102,4 +102,8 @@ public interface ArtifactReadable extends ArtifactToken, HasTransaction, OrcsRea ResultSet<RelationReadable> getRelations(RelationTypeSide relationTypeSide); + Collection<Long> getChildrentIds(); + + Collection<Long> getRelatedIds(RelationTypeSide relationTypeSide); + } |