private void doUpdateModuleSupport()

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();
  }