in dmServer/src/main/java/com/intellij/dmserver/artifacts/DMPlanArtifactType.java [157:255]
private void doUpdateModuleSupport(@NotNull Module module,
@NotNull DMCompositeFacet facet,
@NotNull ModuleRootModel rootModel,
@NotNull DMCompositeFacetConfiguration facetConfiguration) {
PlanFileManager planManager = facet.getPlanFileManager();
PlanFileManager.PlanFileCreator planCreator = planManager.createPlan(rootModel);
PlanRootElement rootElement = planCreator.getRootElement();
if (!LOG.assertTrue(rootElement != null)) {
return;
}
rootElement.getName().setValue(facetConfiguration.getName(module));
rootElement.getVersion().setValue(facetConfiguration.getVersion());
rootElement.getScoped().setValue(facetConfiguration.getScoped());
rootElement.getAtomic().setValue(facetConfiguration.getAtomic());
List<NestedUnitIdentity> newUnitIdentities = new ArrayList<>();
List<DMUnitDescriptor> newUnitDescriptors = new ArrayList<>();
for (NestedUnitIdentity unitIdentity : facetConfiguration.getNestedBundles()) {
Module artifactModule = unitIdentity.getModule();
if (artifactModule == null) {
continue;
}
DMUnitDescriptor unitDescriptor = DMUnitDescriptorProvider.getInstance().processModule(artifactModule);
if (unitDescriptor == null) {
continue;
}
newUnitIdentities.add(unitIdentity);
newUnitDescriptors.add(unitDescriptor);
}
Iterator<DMUnitDescriptor> itNewUnitDescriptor = newUnitDescriptors.iterator();
DMUnitDescriptor nextNewUnitDescriptor = itNewUnitDescriptor.hasNext() ? itNewUnitDescriptor.next() : null;
Map<String, PlanArtifactElement> name2newElements = new HashMap<>();
List<PlanArtifactElement> elements2undefine = new ArrayList<>();
List<PlanArtifactElement> oldArtifactElements = rootElement.getArtifacts();
for (PlanArtifactElement oldArtifactElement : oldArtifactElements.toArray(new PlanArtifactElement[0])) {
if (nextNewUnitDescriptor != null) {
String oldArtifactElementName = oldArtifactElement.getName().getValue();
name2newElements.put(oldArtifactElementName, oldArtifactElement);
if (nextNewUnitDescriptor.getSymbolicName().equals(oldArtifactElementName)) {
// element is in place
nextNewUnitDescriptor = itNewUnitDescriptor.hasNext() ? itNewUnitDescriptor.next() : null;
}
else {
// element either moved or deleted
elements2undefine.add(oldArtifactElement);
}
}
else {
// element is deleted
elements2undefine.add(oldArtifactElement);
}
}
while (nextNewUnitDescriptor != null) {
// element is added or moved
PlanArtifactElement newArtifactElement = rootElement.addArtifact();
String newElementName = nextNewUnitDescriptor.getSymbolicName();
PlanArtifactElement movedArtifactElement = name2newElements.get(newElementName);
if (movedArtifactElement != null) {
XmlElement newXmlElement = newArtifactElement.getXmlElement();
XmlElement movedXmlElement = movedArtifactElement.getXmlElement();
if (LOG.assertTrue(newXmlElement != null)
&& LOG.assertTrue(movedXmlElement != null)) {
newXmlElement.replace(movedXmlElement.copy());
}
}
name2newElements.put(newElementName, newArtifactElement);
nextNewUnitDescriptor = itNewUnitDescriptor.hasNext() ? itNewUnitDescriptor.next() : null;
}
for (PlanArtifactElement element2undefine : elements2undefine) {
element2undefine.undefine();
}
itNewUnitDescriptor = newUnitDescriptors.iterator();
Iterator<NestedUnitIdentity> itNewUnitIdentity = newUnitIdentities.iterator();
for (PlanArtifactElement newArtifactElement : rootElement.getArtifacts()) {
DMUnitDescriptor newUnitDescriptor = itNewUnitDescriptor.next();
NestedUnitIdentity newNestedUnitIdentity = itNewUnitIdentity.next();
newArtifactElement.getType().setValue(getElementType4UnitType(newUnitDescriptor.getType()));
newArtifactElement.getName().setValue(newUnitDescriptor.getSymbolicName());
newArtifactElement.getVersion().setValue(new VersionRange(newNestedUnitIdentity.getVersionRange()));
}
planCreator.save();
}