private void deployOnNodes(
      InstanceSpecification mainInstance,
      Model existingModel,
      Model tmpModel,
      InstanceSpecification newRootIS)
      throws TransformationException, InterruptedException {

    // not deploy on each node
    DepCreation.initAutoValues(newRootIS);

    EList<InstanceSpecification> nodes = AllocUtils.getAllNodes(newRootIS);
    if (nodes.size() > 0) {
      InstanceConfigurator.onNodeModel = true;
      for (int nodeIndex = 0; nodeIndex < nodes.size(); nodeIndex++) {
        InstanceSpecification node = nodes.get(nodeIndex);

        deployNode(mainInstance, existingModel, tmpModel, newRootIS, nodes, nodeIndex, node);
      }
    } else {
      throw new TransformationException(Messages.InstantiateDepPlan_InfoNoneAllocated);
    }
  }
  protected void executeTransformation() throws Exception {
    modelIsObjectOriented = true;
    ModelManagement intermediateModelManagement = null;

    InstanceSpecification mainInstance = DepUtils.getMainInstance(srcModelComponentDeploymentPlan);
    EList<InstanceSpecification> nodes = AllocUtils.getAllNodes(mainInstance);

    initiateProgressMonitor(generateCode, nodes);

    // --------------------------------------------------------------------
    checkProgressStatus();
    // --------------------------------------------------------------------

    // 1a: create a new model (and applies same profiles / imports)
    Model existingModel = srcModelComponentDeploymentPlan.getModel();
    TransformationContext.sourceRoot = existingModel;

    intermediateModelManagement = createTargetModel(existingModel, existingModel.getName(), true);

    // Declare that the new model is a derivedElement (kind of hack,
    // since the source element (attribute of derive element) remains
    // undefined). This is used to deactivate automatic transformations
    // that should not be applied to the generated model.

    // --------------------------------------------------------------------
    checkProgressStatus();
    // --------------------------------------------------------------------

    // get the temporary model
    Model intermediateModel = intermediateModelManagement.getModel();

    // create a package for global enumerations that are used by Acceleo code
    EnumService.createEnumPackage(intermediateModel);

    // create a lazy copier towards the intermediate model
    LazyCopier intermediateModelCopier =
        new LazyCopier(existingModel, intermediateModel, false, true);
    // add pre-copy and post-copy listeners to the copier
    intermediateModelCopier.preCopyListeners.add(FilterTemplate.getInstance());

    // 1b: reify the connectors "into" the new model
    monitor.subTask(Messages.InstantiateDepPlan_InfoExpandingConnectors);

    // obtain the component deployment plan in target model
    Package intermediateModelComponentDeploymentPlan =
        (Package) intermediateModelCopier.shallowCopy(srcModelComponentDeploymentPlan);
    intermediateModelCopier.createShallowContainer(srcModelComponentDeploymentPlan);

    AbstractContainerTrafo.init();
    InstanceConfigurator.onNodeModel = false;
    MainModelTrafo mainModelTrafo =
        new MainModelTrafo(intermediateModelCopier, intermediateModelComponentDeploymentPlan);
    InstanceSpecification newMainInstance = mainModelTrafo.transformInstance(mainInstance, null);

    // --------------------------------------------------------------------
    checkProgressStatus();
    // --------------------------------------------------------------------

    TransformationUtil.applyInstanceConfigurators(newMainInstance);

    FlattenInteractionComponents.getInstance().flattenAssembly(newMainInstance, null);

    TransformationUtil.propagateAllocation(newMainInstance);

    intermediateModelManagement.saveModel(project, TEMP_MODEL_FOLDER, TEMP_MODEL_POSTFIX);

    // --------------------------------------------------------------------
    checkProgressStatus();
    // --------------------------------------------------------------------

    if (!generateCACOnly) {
      deployOnNodes(mainInstance, existingModel, intermediateModel, newMainInstance);
    }

    intermediateModelManagement.dispose();

    if (AcceleoDriver.hasErrors()) {
      throw new AcceleoException();
    }
  }