@Override
  public void doRun(
      IStructuredSelection selection, Event event, UIInstrumentationBuilder instrumentation) {

    instrumentation.metric("command", command);

    if (!selection.isEmpty() && selection.getFirstElement() instanceof IResource) {
      Object object = selection.getFirstElement();
      if (object instanceof IFile) {
        object = ((IFile) object).getParent();
      }
      while (object != null
          && ((IContainer) object).findMember(DartCore.PUBSPEC_FILE_NAME) == null) {
        object = ((IContainer) object).getParent();
      }
      if (object instanceof IContainer) {
        IContainer container = (IContainer) object;
        instrumentation.data("name", container.getName());
        savePubspecFile(container);
        runPubJob(container);
        return;
      } else {
        instrumentation.metric("Problem", "Object was null").log();
      }
    }

    instrumentation.metric("Problem", "pubspec.yaml file not selected, showing dialog");

    MessageDialog.openError(
        getShell(), ActionMessages.RunPubAction_fail, ActionMessages.RunPubAction_fileNotFound);

    instrumentation.log();
  }
  // Assert that the two containers have equal contents
  protected void assertEquals(IContainer container1, IContainer container2) throws CoreException {
    assertEquals(container1.getName(), container2.getName());
    List members1 = new ArrayList();
    members1.addAll(Arrays.asList(container1.members()));

    List members2 = new ArrayList();
    members2.addAll(Arrays.asList(container2.members()));

    assertTrue(members1.size() == members2.size());
    for (int i = 0; i < members1.size(); i++) {
      IResource member1 = (IResource) members1.get(i);
      IResource member2 = container2.findMember(member1.getName());
      assertNotNull(member2);
      assertEquals(member1, member2);
    }
  }
  /**
   * handler when the relationships Model name field changes. This updates the status label under
   * the modelName entry field
   */
  void handleSetModelName() {

    // get the text from the Text field
    String nameText = txtModelName.getText();

    // validate it
    if (isValidModelName(nameText)) {
      newModelName = nameText;

      if (getOkButton() != null) {
        getOkButton().addSelectionListener(getOKSelectionListener());

        getOkButton().setEnabled(true);
      }
      String message = getModelNameStatus(nameText);
      updateDialogMessage(message, false);
    } else {
      if (getOkButton() != null) {
        getOkButton().removeSelectionListener(getOKSelectionListener());

        getOkButton().setEnabled(false);
      }

      // if the name has zero length, reapply the 'create' message
      if (nameText.trim().length() == 0) {
        if (newModelParent != null) {
          String msg =
              getString(
                  "modelCreateInstruction.message", //$NON-NLS-1$
                  newModelInfo.getModelTypeDisplayName(),
                  newModelParent.getName());
          updateDialogMessage(msg, true);
        }
      } else {
        // use the message from the character validation
        String message = getModelNameStatus(nameText);
        updateDialogMessage(message, true);
      }
    }
  }
  public void Reverse_Engineering(URI fileURI)
      throws IOException, CoreException, BackingStoreException {
    // Create Modular Project
    XMI_File filemodel = new XMI_File(fileURI, true);
    WTComponents root = (WTComponents) filemodel.Get_Root();
    WTComponentsProjectFeatures feat =
        new WTComponentsProjectFeatures(root.getId(), root.getAuthor());
    WTComponentsNewProjectInfo project = new WTComponentsNewProjectInfo(feat);
    project.Create_Project();

    // Folders & Files
    TreeIterator<EObject> model_tree = filemodel.getFile_res().getAllContents();

    String path = "";
    URI path_uri = null;
    URI parent_uri = null;
    IFolder fol = null;
    IContainer parent = null;
    XMI_File xmi_file = null;
    XMI_File xmi_parent = null;
    EObject eObject = null;
    EObject eObject_root = null;
    String name_folder = null;
    boolean isFile = false;

    model_tree.next(); // The first element(Root) was added already

    while (model_tree.hasNext()) {

      eObject = (EObject) model_tree.next();

      // Parent path
      path = GetObjectPath(eObject);

      // Folders
      name_folder = IsFolder(eObject);
      if (name_folder != null) {
        // Create Folder
        fol = project.Create_Folder(path);
        parent = fol.getParent();
        // Path to Create XMI File
        path = path.concat("/").concat(name_folder.concat(".xmi"));
        // Create File for Folder
        path_uri = URI.createFileURI(project.getProject().getFullPath().toString().concat(path));
        name_folder = null;
      } else {
        // Files
        parent = project.Create_Folder(path);
        if (eObject instanceof ComponentImpl)
          path = path.concat(((ComponentImpl) eObject).getName().toString());
        if (eObject instanceof StateMachineImpl)
          path = path.concat(((StateMachineImpl) eObject).getName().toString());
        // Create File
        path_uri = URI.createFileURI(project.getProject().getFullPath().toString().concat(path));
        isFile = true;
      }

      // Object to add
      if (isFile) {
        Copier copier = new Copier();
        eObject_root = copier.copy(eObject);
        copier.copyReferences();
        model_tree.prune();
      } else eObject_root = GetObjectRoot(eObject);

      // Create XMI File
      xmi_file = XMI_File.Get_Create_XMI(path_uri, eObject_root);
      // Include Parent
      parent_uri =
          URI.createURI(
              parent.getFullPath().toString().concat("/" + parent.getName().concat(".xmi")));
      xmi_parent = new XMI_File(parent_uri, xmi_file.getFile_reset());
      ((EList<EObject>) xmi_parent.Get_Root().eGet(eObject.eContainingFeature()))
          .add(xmi_file.Get_Root());
      xmi_parent.Save_XMI();

      path = "";
      path_uri = null;
      fol = null;
      isFile = false;
    }
    System.out.println("Reverse_Engineering_Create_Project_Complete");
  }