@Override @SuppressWarnings("unchecked") public void internal_fixDuplicateObjects(Map<String, Data> idToDataMap) { List<T> fixedList = new ArrayList<>(); for (T entity : this.list) { fixedList.add((T)idToDataMap.get(entity.getId())); } this.list.clear(); this.list.addAll(fixedList); }
private Map<String,Data> collectChildDataMap() { List<Data> dataList = collectChildrenDeep(); HashMap<String, Data> result = Maps.newHashMapWithExpectedSize(dataList.size()); for (Data factory: dataList){ result.put(factory.getId(),factory); } return result; }
@Override @SuppressWarnings("unchecked") public void internal_merge(Attribute<?,?> newValue) { Map<String,T> previousMap=new HashMap(); for (T item : this.list) { previousMap.put(item.getId(),item); } this.list.clear(); List<T> newList = (List<T>) newValue.get(); for (T newItem : newList) { T oldItem = previousMap.get(newItem.getId()); if (oldItem!=null){ this.list.add(oldItem); } else { this.list.add(newItem); } } afterModify(); }
@Override @SuppressWarnings("unchecked") public void internal_fixDuplicateObjects(Map<String, Data> idToDataMap) { Data currentReferenceContent = get(); if (currentReferenceContent != null) { T value = (T) idToDataMap.get(currentReferenceContent.getId()); if (get()!=value){ set(value); } } }
private Set<Data> getChangedFactories(R previousFactoryCopyRoot){ //one might think that the merger could do the change detection but that don't work for views and separation of concern is better anyway final HashSet<Data> result = new HashSet<>(); final HashMap<String, FactoryBase<?, ?,?>> previousFactories = previousFactoryCopyRoot.internalFactory().collectChildFactoriesDeepMapFromRoot(); for (Data data: currentFactoryRoot.collectChildFactories()){ final FactoryBase<?, ?,?> previousFactory = previousFactories.get(data.getId()); if (previousFactory!=null){ data.internal().visitAttributesDualFlat(previousFactory, (name, currentAttribute, previousAttribute) -> { if (!(currentAttribute instanceof DataViewReferenceAttribute) && !(currentAttribute instanceof DataViewListReferenceAttribute)){//Data views have no function no need to check if (!currentAttribute.internal_mergeMatch(previousAttribute)){ result.add(data); } } }); } } return result; }
@SuppressWarnings("unchecked") private void merge(Data originalValue, Data newValue, MergeResult mergeResult, Function<String,Boolean> permissionChecker) { this.visitAttributesTripleFlat(originalValue, newValue, (attributeName, currentAttribute, originalAttribute, newAttribute) -> { if (!currentAttribute.internal_ignoreForMerging()){ if (currentAttribute.internal_hasMergeConflict(originalAttribute, newAttribute)) { mergeResult.addConflictInfo(new AttributeDiffInfo(Data.this.getId(), attributeName)); } else { if (currentAttribute.internal_isMergeable(originalAttribute, newAttribute)) { final AttributeDiffInfo attributeDiffInfo = new AttributeDiffInfo(attributeName,Data.this.getId()); if (currentAttribute.internal_hasWritePermission(permissionChecker)){ mergeResult.addMergeInfo(attributeDiffInfo); mergeResult.addMergeExecutions(() -> currentAttribute.internal_merge(newAttribute)); } else { mergeResult.addPermissionViolationInfo(attributeDiffInfo); } } } } }); }
@SuppressWarnings("unchecked") public MergeResult<R> createMergeResult(Function<String,Boolean> permissionChecker) { MergeResult mergeResult = new MergeResult(currentData); Map<String, Data> currentMap = currentData.internal().collectChildDataMap(); Map<String, Data> originalMap = commonData.internal().collectChildDataMap(); Map<String, Data> newMap = newData.internal().collectChildDataMap(); for (Data newData : newMap.values()) {//avoid mixup with iteration countern newData.internal().resetIterationCounterFlat(); } for (Map.Entry<String, Data> entry : currentMap.entrySet()) { Data originalValue = getOriginalValue(originalMap, entry); Data newValue = getNewValue(newMap, entry); if (newValue==null && originalValue!=null){ //check for conflict for removed object entry.getValue().internal().visitAttributesDualFlat(originalValue, (name, currentAttribute, originalAttribute) -> { if (!currentAttribute.internal_ignoreForMerging()){ if (!currentAttribute.internal_mergeMatch(originalAttribute)){ mergeResult.addConflictInfo(new AttributeDiffInfo(name,entry.getValue().getId())); } } }); } if (originalValue!=null && newValue!=null){ entry.getValue().internal().merge(originalValue, newValue, mergeResult, permissionChecker); } } return mergeResult; }