/**
   * Create rename refactoring session.
   *
   * @param settings rename settings
   * @return the rename refactoring session
   * @throws CoreException when RenameSupport can't be created
   * @throws RefactoringException when Java element was not found
   */
  @POST
  @Path("rename/create")
  @Produces("application/json")
  @Consumes("application/json")
  public RenameRefactoringSession createRenameRefactoring(CreateRenameRefactoring settings)
      throws CoreException, RefactoringException {
    IJavaProject javaProject = model.getJavaProject(settings.getProjectPath());
    IJavaElement elementToRename;
    ICompilationUnit cu = null;
    switch (settings.getType()) {
      case COMPILATION_UNIT:
        elementToRename = javaProject.findType(settings.getPath()).getCompilationUnit();
        break;
      case PACKAGE:
        elementToRename =
            javaProject.findPackageFragment(new org.eclipse.core.runtime.Path(settings.getPath()));
        break;
      case JAVA_ELEMENT:
        cu = javaProject.findType(settings.getPath()).getCompilationUnit();
        elementToRename = getSelectionElement(cu, settings.getOffset());
        break;
      default:
        elementToRename = null;
    }
    if (elementToRename == null) {
      throw new RefactoringException("Can't find java element to rename.");
    }

    return manager.createRenameRefactoring(
        elementToRename, cu, settings.getOffset(), settings.isRefactorLightweight());
  }
  @Test
  public void test0d() {

    try {
      IWorkspace workspace = ResourcesPlugin.getWorkspace();
      IWorkspaceRoot root = workspace.getRoot();
      IProject project = root.getProject("TestProject");
      IJavaProject javaProject = JavaCore.create(project);

      IPackageFragment mypackage =
          javaProject.findPackageFragment(new Path("/TestProject/src/be/ac/ua/test/pack"));
      if (mypackage.getKind() == IPackageFragmentRoot.K_SOURCE) {
        ICompilationUnit cu = mypackage.getCompilationUnits()[0];
        IType[] types = cu.getAllTypes();
        ClassRecorder recorder = new ClassRecorder(types[0]);

        Field uniqueNameField = ClassRecorder.class.getDeclaredField("uniqueName");
        uniqueNameField.setAccessible(true);
        String fieldValue = (String) uniqueNameField.get(recorder);
        assertEquals(fieldValue, packname + "." + classname);

        /*Field parentField = ClassRecorder.class.getDeclaredField("parent");
        parentField.setAccessible(true);
        FamixEntity fieldValue2 = (FamixEntity)parentField.get(recorder);
        assertEquals(packname, fieldValue2.getUniqueName());*/
      }
    } catch (JavaModelException e) {
      e.printStackTrace();
      fail("Unexpected exception");
    } catch (SecurityException e) {
      e.printStackTrace();
      fail("Unexpected exception");
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
      fail("Unexpected exception");
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
      fail("Unexpected exception");
    } catch (IllegalAccessException e) {
      e.printStackTrace();
      fail("Unexpected exception");
    }
  }
  public IPackageFragment getBasePackageFragment() {

    IPackageFragment packageFragment = null;
    if (!projectText.equals("")) { // $NON-NLS-1$

      try {
        IJavaProject project = JavaCore.create(Util.getProject(projectText));
        IPath moduleXmlPath = new Path(moduleText);
        IPath packageFragmentPath =
            new Path("/")
                .append(projectText)
                .append(moduleXmlPath.removeLastSegments(1)); // $NON-NLS-1$
        packageFragment = project.findPackageFragment(packageFragmentPath);
      } catch (JavaModelException e) {
        Activator.logException(e);
      }
    }

    return packageFragment;
  }
  /**
   * Create move refactoring session.
   *
   * @param cmr move settings, contains resource paths to move.
   * @return refactoring session id.
   * @throws JavaModelException when JavaModel has a failure
   * @throws RefactoringException when impossible to create move refactoring session
   */
  @POST
  @Path("move/create")
  @Consumes("application/json")
  @Produces("text/plain")
  public String createMoveRefactoring(CreateMoveRefactoring cmr)
      throws JavaModelException, RefactoringException {
    IJavaProject javaProject = model.getJavaProject(cmr.getProjectPath());
    IJavaElement[] javaElements;
    try {
      Function<ElementToMove, IJavaElement> map =
          javaElement -> {
            try {
              if (javaElement.isPack()) {
                return javaProject.findPackageFragment(
                    new org.eclipse.core.runtime.Path(javaElement.getPath()));
              } else {
                return javaProject.findType(javaElement.getPath()).getCompilationUnit();
              }
            } catch (JavaModelException e) {
              throw new IllegalArgumentException(e);
            }
          };
      javaElements = cmr.getElements().stream().map(map).toArray(IJavaElement[]::new);

    } catch (IllegalArgumentException e) {
      if (e.getCause() instanceof JavaModelException) {
        throw (JavaModelException) e.getCause();
      } else {
        throw e;
      }
    }
    if (RefactoringAvailabilityTester.isMoveAvailable(new IResource[0], javaElements)) {
      return manager.createMoveRefactoringSession(javaElements);
    }

    throw new RefactoringException("Can't create move refactoring.");
  }