use of org.finos.waltz.model.datatype.DataType in project waltz by khartec.
the class DataTypeServiceTest method findSuggestedBySourceEntityRef.
@Test
public void findSuggestedBySourceEntityRef() {
dataTypeHelper.clearAllDataTypes();
EntityReference a = appHelper.createNewApp("a", ouIds.a);
EntityReference b = appHelper.createNewApp("b", ouIds.a1);
EntityReference c = appHelper.createNewApp("b", ouIds.b);
Collection<DataType> noDecoratorsOnFlow = dtSvc.findSuggestedBySourceEntityRef(a);
assertEquals(emptyList(), noDecoratorsOnFlow, "if source app has no logical flows returns empty list");
LogicalFlow ab = lfHelper.createLogicalFlow(a, b);
assertEquals(emptyList(), noDecoratorsOnFlow, "if source app has no flow decorators returns empty list");
dataTypeHelper.createDataType(1L, "dt1", "DT1");
lfHelper.createLogicalFlowDecorators(ab.entityReference(), asSet(1L));
Set<Long> suggestedDtIds = map(dtSvc.findSuggestedBySourceEntityRef(a), dtd -> dtd.entityReference().id());
assertEquals(asSet(1L), suggestedDtIds, "returns data type associated to the source application");
LogicalFlow bc = lfHelper.createLogicalFlow(b, c);
dataTypeHelper.createDataType(2L, "dt2", "DT2");
lfHelper.createLogicalFlowDecorators(bc.entityReference(), asSet(2L));
Set<Long> onlySourceDts = map(dtSvc.findSuggestedBySourceEntityRef(a), dtd -> dtd.entityReference().id());
assertEquals(asSet(1L), onlySourceDts, "does not return dts associated to only the target app");
lfHelper.createLogicalFlowDecorators(ab.entityReference(), asSet(2L));
Set<Long> allSourceDts = map(dtSvc.findSuggestedBySourceEntityRef(a), dtd -> dtd.entityReference().id());
assertEquals(asSet(1L, 2L), allSourceDts, "returns all dts associated to source app");
LogicalFlow ac = lfHelper.createLogicalFlow(a, c);
lfHelper.createLogicalFlowDecorators(ac.entityReference(), asSet(2L));
Set<Long> setOfDts = map(dtSvc.findSuggestedBySourceEntityRef(a), dtd -> dtd.entityReference().id());
assertEquals(asSet(1L, 2L), setOfDts, "returns all dts associated to source app");
}
use of org.finos.waltz.model.datatype.DataType in project waltz by khartec.
the class LogicalFlowDecoratorRatingsCalculator method calculate.
public Collection<DataTypeDecorator> calculate(Collection<DataTypeDecorator> decorators) {
List<LogicalFlow> appToAppFlows = filter(IS_APP_TO_APP_FLOW, loadFlows(decorators));
if (isEmpty(appToAppFlows))
return Collections.emptyList();
List<Application> targetApps = loadTargetApplications(appToAppFlows);
List<DataType> dataTypes = dataTypeDao.findAll();
Set<FlowClassification> flowClassifications = flowClassificationDao.findAll();
Map<Long, DataType> typesById = indexById(dataTypes);
Map<Long, LogicalFlow> flowsById = indexById(appToAppFlows);
Map<Long, Application> targetAppsById = indexById(targetApps);
FlowClassificationRuleResolver resolver = createResolver(targetApps);
return decorators.stream().filter(d -> flowsById.containsKey(d.dataFlowId())).map(decorator -> {
try {
if (decorator.decoratorEntity().kind() != EntityKind.DATA_TYPE) {
return decorator;
} else {
AuthoritativenessRatingValue rating = lookupRating(flowsById, targetAppsById, resolver, decorator);
Optional<Long> ruleId = lookupFlowClassificationRule(typesById, flowsById, targetAppsById, resolver, decorator);
return ImmutableDataTypeDecorator.copyOf(decorator).withRating(rating).withFlowClassificationRuleId(ruleId);
}
} catch (Exception e) {
LOG.warn("Failed to calculate rating for decorator: {}, reason: {}", decorator, e.getMessage());
return null;
}
}).filter(Objects::nonNull).collect(Collectors.toSet());
}
use of org.finos.waltz.model.datatype.DataType in project waltz by khartec.
the class FlowClassificationRuleService method logUpdate.
private void logUpdate(FlowClassificationRuleUpdateCommand command, String username) {
FlowClassificationRule rule = getById(command.id().get());
if (rule == null) {
return;
}
String parentName = getParentEntityName(rule.parentReference());
DataType dataType = dataTypeDao.getById(rule.dataTypeId());
Application app = applicationDao.getById(rule.applicationReference().id());
FlowClassification classification = flowClassificationDao.getById(command.classificationId());
if (app != null && dataType != null && parentName != null) {
String msg = format("Updated flow classification rule: %s as the source application with rating: %s, for type: %s, for %s: %s", app.name(), classification.name(), dataType.name(), rule.parentReference().kind().prettyName(), parentName);
multiLog(username, rule.id().get(), rule.parentReference(), dataType, app, msg, Operation.UPDATE);
}
}
use of org.finos.waltz.model.datatype.DataType in project waltz by khartec.
the class LogicalFlowService method getFlowInfoByDirection.
/**
* @param ref app or actor ref
* @param startingDataTypeId optional id of the data type to use (i.e. restrict to flows below that data type)
* @return
*/
public LogicalFlowGraphSummary getFlowInfoByDirection(EntityReference ref, Long startingDataTypeId) {
ImmutableLogicalFlowGraphSummary.Builder result = ImmutableLogicalFlowGraphSummary.builder().flowInfoByDirection(logicalFlowStatsDao.getFlowInfoByDirection(ref, startingDataTypeId));
if (startingDataTypeId != null) {
DataType startingDataType = dataTypeService.getDataTypeById(startingDataTypeId);
result.startingDataType(startingDataType);
result.parentDataType(startingDataType.parentId().map(dataTypeService::getDataTypeById).orElse(null));
}
return result.build();
}
use of org.finos.waltz.model.datatype.DataType in project waltz by khartec.
the class FlowClassificationCalculator method update.
private int[] update(DataType dataType, EntityReference vantageRef) {
LOG.debug("Updating ratings for flow classification rule - dataType name: {}, id: {}, vantage point: {}", dataType.name(), dataType.id().get(), vantageRef);
IdSelectionOptions selectorOptions = mkOpts(vantageRef);
Select<Record1<Long>> selector = appIdSelectorFactory.apply(selectorOptions);
Set<Long> dataTypeDescendents = entityHierarchyDao.findDesendents(dataType.entityReference()).stream().map(d -> d.id().get()).collect(Collectors.toSet());
Collection<DataTypeDecorator> impactedDecorators = logicalFlowDecoratorDao.findByEntityIdSelector(selector, Optional.of(EntityKind.APPLICATION)).stream().filter(decorator -> dataTypeDescendents.contains(decorator.decoratorEntity().id())).collect(toList());
Collection<DataTypeDecorator> reRatedDecorators = ratingsCalculator.calculate(impactedDecorators);
Set<DataTypeDecorator> modifiedDecorators = SetUtilities.minus(fromCollection(reRatedDecorators), fromCollection(impactedDecorators));
LOG.debug("Need to update {} ratings due to auth source change - dataType name: {}, id: {}, parent: {}", modifiedDecorators.size(), dataType.name(), dataType.id().get(), vantageRef);
return updateDecorators(modifiedDecorators);
}
Aggregations