diff options
Diffstat (limited to 'plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/AtsConfigEndpointImpl.java')
-rw-r--r-- | plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/config/AtsConfigEndpointImpl.java | 291 |
1 files changed, 225 insertions, 66 deletions
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..6a7b6886b46 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,234 @@ 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; + private final Collection<Long> teamDefIds = new LinkedList<>(); + private final Collection<Long> aiIds = new LinkedList<>(); - 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()); + public void run() { + AtsConfigurations configs = getAtsConfigurationsFromDb(); + atsConfigurations = configs; + } + }; + thread.start(); + } + + private AtsConfigurations getAtsConfigurationsFromDb() { + teamDefIds.clear(); + aiIds.clear(); + 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.addTeamDef(teamDef); + } else if (services.getStoreService().isOfType(configArtId, AtsArtifactTypes.ActionableItem)) { + JaxActionableItem ai = createJaxActionableItem(configArtId); + configs.addAi(ai); + } else if (services.getStoreService().isOfType(configArtId, AtsArtifactTypes.Version)) { + JaxVersion version = createJaxVersion(configArtId); + configs.addVersion(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.addWorkDefinition(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()) { + if (isActionableItemId(childId)) { + JaxActionableItem child = addActionableItemChildrenWIthRecurse(childId, idToArtifact, configs); + if (child != null) { + child.setParentId(aiId); + jaxAi.addChild(child); } } - // 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()); - } - // 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)) { + JaxTeamDefinition jaxTeamDef = configs.getIdToTeamDef().get(teamDefId); + for (Long childId : teamDef.getChildrentIds()) { + if (isTeamDefinitionId(childId)) { + JaxTeamDefinition child = addTeamDefinitionChildrenWIthRecurse(childId, idToArtifact, configs); + if (child != null) { + child.setParentId(teamDefId); + jaxTeamDef.addChild(child); + } } - return configs; } + // add team to version ids + for (Long versionId : services.getRelationResolver().getRelatedIds(teamDef, + AtsRelationTypes.TeamDefinitionToVersion_Version)) { + jaxTeamDef.addVersion(versionId); + JaxVersion version = configs.getIdToVersion().get(versionId); + version.setTeamDefId(teamDefId); + } + // add team to ai ids + for (Long aiId : services.getRelationResolver().getRelatedIds(teamDef, + AtsRelationTypes.TeamActionableItem_ActionableItem)) { + jaxTeamDef.addAi(aiId); + JaxActionableItem jai = configs.getIdToAi().get(aiId); + jai.setTeamDefId(teamDefId); + } + return jaxTeamDef; + } + return null; + } - }; + private boolean isTeamDefinitionId(Long childId) { + if (teamDefIds.isEmpty()) { + for (ArtifactId art : services.getQueryService().createQuery(AtsArtifactTypes.TeamDefinition).getItemIds()) { + teamDefIds.add(art.getId()); + } + } + return teamDefIds.contains(childId); + } + + private boolean isActionableItemId(Long childId) { + if (aiIds.isEmpty()) { + for (ArtifactId art : services.getQueryService().createQuery(AtsArtifactTypes.ActionableItem).getItemIds()) { + aiIds.add(art.getId()); + } + } + return aiIds.contains(childId); + } + + private JaxVersion createJaxVersion(ArtifactReadable verArt) { + JaxVersion jaxVersion = new JaxVersion(); + jaxVersion.setName(verArt.getName()); + jaxVersion.setUuid(verArt.getId()); + jaxVersion.setGuid(verArt.getGuid()); + jaxVersion.setActive(verArt.getSoleAttributeValue(AtsAttributeTypes.Active, true)); + return jaxVersion; + } + + private JaxActionableItem createJaxActionableItem(ArtifactReadable aiArt) { + JaxActionableItem jaxAi = new JaxActionableItem(); + jaxAi.setName(aiArt.getName()); + jaxAi.setUuid(aiArt.getId()); + jaxAi.setGuid(aiArt.getGuid()); + jaxAi.setDescription(aiArt.getSoleAttributeValue(AtsAttributeTypes.Description, "")); + jaxAi.setActive(aiArt.getSoleAttributeValue(AtsAttributeTypes.Active, true)); + return jaxAi; + } + + private JaxTeamDefinition createJaxTeamDefinition(ArtifactReadable teamDefArt) { + JaxTeamDefinition jaxTeamDef = new JaxTeamDefinition(); + jaxTeamDef.setName(teamDefArt.getName()); + jaxTeamDef.setUuid(teamDefArt.getId()); + jaxTeamDef.setGuid(teamDefArt.getGuid()); + jaxTeamDef.setActive(teamDefArt.getSoleAttributeValue(AtsAttributeTypes.Active, true)); + for (ArtifactToken ai : services.getRelationResolver().getRelated(teamDefArt, + AtsRelationTypes.TeamActionableItem_ActionableItem)) { + jaxTeamDef.getAis().add(ai.getId()); + } + return jaxTeamDef; + } + + @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 +325,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 +413,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 +430,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 +443,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); } |