protected void convertSubSystemsAndRoot(
      String rootElement, MontiArcStringBuilder builder, boolean instantiate) {
    String simpleName = matlab.doGetSimpleNameLimiterBased(rootElement);

    if (getDeltaOperationForElement(rootElement) == DeltaOperation.REPLACE) {
      simpleName =
          simpleName.substring(
              simpleName.indexOf(DeltaSimulinkKeyWords.REPLACE_WITH)
                  + DeltaSimulinkKeyWords.REPLACE_WITH.length());
    }
    simpleName = simpleName.trim();
    if (instantiate) {
      builder.startCreateInnerComponent(simpleName, simpleName);
    } else {
      builder.startCreateComponent(simpleName);
    }
    convertPorts(rootElement, builder);

    convertSubSystems(rootElement, builder);

    convertModelReferences(rootElement, builder);

    convertSignals(rootElement, builder);

    builder.endCreateInnerComponent();
  }
  public String convertModel(String path, String modelName) {
    if (matlab.isDisconnected()) {
      matlab.connect();
    }

    MontiArcStringBuilder builder = new MontiArcStringBuilder();

    if (matlab.isConnected()) {
      matlab.loadModel(path, modelName);

      builder.addPackage(MontiArcStringBuilder.EXPORT_PACKAGE);

      builder.startCreateComponent(modelName);

      convertPorts(modelName, builder);

      convertModelReferences(modelName, builder);

      convertSubSystems(modelName, builder);

      convertSignals(modelName, builder);

      builder.endCreateComponent();
    } else {
      // TODO handle
    }

    return builder.getConvertedModel();
  }
  protected void convertSubSystems(String rootElement, MontiArcStringBuilder builder) {
    List<String> qualifiedSubSystems = loadSubSystems(rootElement);

    for (String qualifiedSubSystem : qualifiedSubSystems) {

      String unqualifiedSubSystem = getSimpleName(qualifiedSubSystem);

      builder.startCreateInnerComponent(unqualifiedSubSystem, unqualifiedSubSystem);
      convertPorts(qualifiedSubSystem, builder);

      convertSubSystems(qualifiedSubSystem, builder);

      convertModelReferences(qualifiedSubSystem, builder);

      convertSignals(qualifiedSubSystem, builder);

      builder.endCreateInnerComponent();
    }
  }
  protected void convertSignals(String rootName, MontiArcStringBuilder builder) {
    List<SimulinkSignal> signals = getSignals(rootName);

    for (SimulinkSignal signal : signals) {
      String srcBlockName =
          convertConnectorElement(signal.getSrcSimpleName(), signal.getSrcPortName());
      String targetBlockName =
          convertConnectorElement(signal.getDstSimpleName(), signal.getDstPortName());

      builder.createConnector(srcBlockName, targetBlockName);
    }
  }
  protected void convertModelReferences(String modelName, MontiArcStringBuilder builder) {
    String[] qualifiedModelReferences =
        (String[])
            matlab.returningFeval(
                "find_system",
                modelName,
                "SearchDepth",
                1,
                "BlockType",
                SimulinkBlockType.ModelReference.toString());

    if (qualifiedModelReferences != null) {
      for (int i = 0; i < qualifiedModelReferences.length; i++) {
        String qualifiedModelReference = qualifiedModelReferences[i];
        String unqualifiedModelReference = getSimpleName(qualifiedModelReference);
        String typeOfReferencedModel = getModelType(qualifiedModelReference);

        builder.createComponentReference(typeOfReferencedModel, unqualifiedModelReference);
      }
    }
  }
 protected void convertPorts(String rootElement, MontiArcStringBuilder builder) {
   List<SimulinkPort> inPorts = loadUnqualifiedPorts(rootElement, true);
   List<SimulinkPort> outPorts = loadUnqualifiedPorts(rootElement, false);
   builder.createPorts(inPorts, outPorts);
 }