|
|
|
|
@@ -2,7 +2,7 @@
|
|
|
|
|
* ~~~~~~licensing~~~~~~
|
|
|
|
|
* application-management
|
|
|
|
|
* ==========
|
|
|
|
|
* Copyright (C) 2020 - 2025 EmDev LLC
|
|
|
|
|
* Copyright (C) 2020 - 2026 EmDev LLC
|
|
|
|
|
* ==========
|
|
|
|
|
* You may not use this file except in accordance with the License Terms of the Copyright
|
|
|
|
|
* Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
|
|
|
|
|
@@ -28,12 +28,7 @@ package ru.entaxy.platform.integration.applications.management.impl;
|
|
|
|
|
import java.io.ByteArrayOutputStream;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
import java.util.Base64;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
import javax.management.DynamicMBean;
|
|
|
|
|
@@ -54,6 +49,7 @@ import ru.entaxy.esb.resources.EntaxyResourceService;
|
|
|
|
|
import ru.entaxy.platform.base.objects.EntaxyObject;
|
|
|
|
|
import ru.entaxy.platform.base.support.CommonUtils;
|
|
|
|
|
import ru.entaxy.platform.base.support.JSONUtils;
|
|
|
|
|
import ru.entaxy.platform.config.runtime.ObjectConfig;
|
|
|
|
|
import ru.entaxy.platform.core.artifact.service.ArtifactService;
|
|
|
|
|
import ru.entaxy.platform.integration.applications.ApplicationManager;
|
|
|
|
|
import ru.entaxy.platform.integration.applications.ApplicationProjectItem;
|
|
|
|
|
@@ -63,6 +59,7 @@ import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersi
|
|
|
|
|
import ru.entaxy.platform.integration.applications.descriptor.ApplicationRequirement;
|
|
|
|
|
import ru.entaxy.platform.integration.applications.impl.ServiceHelper;
|
|
|
|
|
import ru.entaxy.platform.integration.applications.impl.project.ApplicationProjectItemImpl;
|
|
|
|
|
import ru.entaxy.platform.integration.applications.impl.project.item.ObjectItemImpl;
|
|
|
|
|
import ru.entaxy.platform.integration.applications.item.project.EntaxyObjectItem;
|
|
|
|
|
import ru.entaxy.platform.integration.applications.management.ProjectsMBean;
|
|
|
|
|
import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
|
|
|
|
|
@@ -303,65 +300,79 @@ public class ProjectsMBeanImpl extends AnnotatedMBean<ProjectsMBean> implements
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Map<String, List<String>> removeItems(String storage, String projectName, String projectVersion, List<String> itemIds)
|
|
|
|
|
public void removeItems(String storage, String projectName, String projectVersion, List<String> itemIds)
|
|
|
|
|
throws Exception {
|
|
|
|
|
EntaxyApplicationProjectVersion version = getProjectVersion(storage, projectName, projectVersion);
|
|
|
|
|
|
|
|
|
|
List<ApplicationProjectItem> items = version.getItems().stream()
|
|
|
|
|
List<ApplicationProjectItem> itemsToRemove = version.getItems().stream()
|
|
|
|
|
.filter(item -> itemIds.contains(item.getId())).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
List<ApplicationProjectItem> itemsToRemove = new ArrayList<>();
|
|
|
|
|
Map<ApplicationProjectItem, List<ApplicationProjectItem>> itemsImpossibleToRemove = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
for (ApplicationProjectItem item : items) {
|
|
|
|
|
List<ApplicationProjectItem> requiredBy = item.getRequiredBy();
|
|
|
|
|
if (requiredBy.isEmpty()) {
|
|
|
|
|
itemsToRemove.add(item);
|
|
|
|
|
} else {
|
|
|
|
|
List<ApplicationProjectItem> requiredLeft = requiredBy.stream()
|
|
|
|
|
.filter(requiredByItem -> !itemIds.contains(requiredByItem.getId()))
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
if (requiredLeft.isEmpty()) {
|
|
|
|
|
itemsToRemove.add(item);
|
|
|
|
|
} else {
|
|
|
|
|
itemsImpossibleToRemove.put(item, requiredLeft);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<String> itemIdsToRemove = itemsToRemove.stream()
|
|
|
|
|
.map(itemToRemove -> itemToRemove.getId()).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
for (ApplicationProjectItem itemToRemove : itemsToRemove) {
|
|
|
|
|
version.removeItem(itemToRemove);
|
|
|
|
|
}
|
|
|
|
|
itemsToRemove = version.getItems().stream()
|
|
|
|
|
.filter(item -> itemIdsToRemove.contains(item.getId())).collect(Collectors.toList());
|
|
|
|
|
.filter(item -> itemIds.contains(item.getId())).collect(Collectors.toList());
|
|
|
|
|
} while (itemsToRemove.size() > 0);
|
|
|
|
|
|
|
|
|
|
if (itemsImpossibleToRemove.size() > 0) {
|
|
|
|
|
Map<String, List<String>> result = new HashMap<>();
|
|
|
|
|
for (ApplicationProjectItem itemToRemove : itemsImpossibleToRemove.keySet()) {
|
|
|
|
|
if (itemIds.contains(itemToRemove.getId())) {
|
|
|
|
|
version.removeItem(itemToRemove);
|
|
|
|
|
}
|
|
|
|
|
result.put(getIdOrDisplayName(itemToRemove),
|
|
|
|
|
itemsImpossibleToRemove.get(itemToRemove).stream()
|
|
|
|
|
.map(item -> getIdOrDisplayName(item)).collect(Collectors.toList()));
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new HashMap<>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String getIdOrDisplayName(ApplicationProjectItem item) {
|
|
|
|
|
String displayName = "";
|
|
|
|
|
if (EntaxyApplication.ITEM_TYPE.OBJECT.equals(item.getType())) {
|
|
|
|
|
displayName = ((EntaxyObjectItem) item).getObject().getDisplayName();
|
|
|
|
|
@Override
|
|
|
|
|
public List<Map<String, List<Map<String, String>>>> getRequiredForRemoval(String storage,
|
|
|
|
|
String projectName,
|
|
|
|
|
String projectVersion,
|
|
|
|
|
List<String> itemIds) throws Exception {
|
|
|
|
|
EntaxyApplicationProjectVersion version = getProjectVersion(storage, projectName, projectVersion);
|
|
|
|
|
|
|
|
|
|
return getRequiredForRemovalRecursive(version, itemIds);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<Map<String, List<Map<String, String>>>> getRequiredForRemovalRecursive(
|
|
|
|
|
EntaxyApplicationProjectVersion version, List<String> itemIds) throws Exception {
|
|
|
|
|
List<ApplicationProjectItem> items = version.getItems().stream()
|
|
|
|
|
.filter(item -> itemIds.contains(item.getId())).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
List<Map<String, List<Map<String, String>>>> requiredForRemoval = new ArrayList<>();
|
|
|
|
|
Set<String> extraIdsToRemoval = new HashSet<>();
|
|
|
|
|
|
|
|
|
|
for (ApplicationProjectItem item : items) {
|
|
|
|
|
|
|
|
|
|
List<EntaxyRuntimeObject> requiredForRemovalUnfiltered = item.getRequiredBy().stream()
|
|
|
|
|
.map(requiredByItem -> ((ObjectItemImpl) requiredByItem).getObject())
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
if (item instanceof ObjectItemImpl) {
|
|
|
|
|
requiredForRemovalUnfiltered.addAll(((ObjectItemImpl) item).getObject().getColocatedObjects());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!requiredForRemovalUnfiltered.isEmpty()) {
|
|
|
|
|
List<EntaxyRuntimeObject> requiredForRemovalFiltered = requiredForRemovalUnfiltered.stream()
|
|
|
|
|
.distinct()
|
|
|
|
|
.filter(collocatedObject -> !itemIds.contains(collocatedObject.getObjectFullId()))
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
extraIdsToRemoval.addAll(requiredForRemovalFiltered.stream()
|
|
|
|
|
.map(requiredForRemovalObject -> requiredForRemovalObject.getObjectFullId())
|
|
|
|
|
.collect(Collectors.toSet()));
|
|
|
|
|
|
|
|
|
|
if (!requiredForRemovalFiltered.isEmpty()) {
|
|
|
|
|
Map<String, List<Map<String, String>>> element = new HashMap<>();
|
|
|
|
|
element.put(item.getId(), requiredForRemovalFiltered.stream()
|
|
|
|
|
.map(requiredForRemovalObject -> objectIntoMap(requiredForRemovalObject))
|
|
|
|
|
.collect(Collectors.toList()));
|
|
|
|
|
requiredForRemoval.add(element);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return CommonUtils.isValid(displayName) ? displayName : item.getId();
|
|
|
|
|
|
|
|
|
|
if (extraIdsToRemoval.size() > 0) {
|
|
|
|
|
List<String> itemIdsToRemovalWithExtra = new ArrayList<>(itemIds);
|
|
|
|
|
itemIdsToRemovalWithExtra.addAll(extraIdsToRemoval.stream().collect(Collectors.toList()));
|
|
|
|
|
List<Map<String, List<Map<String, String>>>> requiredForRemovalExtra =
|
|
|
|
|
getRequiredForRemovalRecursive(version, itemIdsToRemovalWithExtra);
|
|
|
|
|
requiredForRemoval.addAll(requiredForRemovalExtra);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return requiredForRemoval;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|