@Override
 public void replayRefactoring(RefactoringDescriptor refactoringDescriptor) throws CoreException {
   try {
     // FIXME: This is a temporary hack. It is required to overcome the problem that sometimes
     // Eclipse does not finish updating
     // program's structure yet, and thus, the refactoring can not be properly initialized (i.e.
     // the refactored element is not found).
     // Find a better solution, e.g. listen for some Eclipse "refreshing" process to complete.
     Thread.sleep(1500);
   } catch (InterruptedException e) {
     // do nothing
   }
   RefactoringStatus initializationStatus = new RefactoringStatus();
   Refactoring refactoring = refactoringDescriptor.createRefactoring(initializationStatus);
   if (!initializationStatus.isOK()) {
     Debugger.debugWarning(
         "Failed to initialize a refactoring from its descriptor: " + refactoringDescriptor);
     unperformedRefactorings.add(getTime());
     return;
   }
   // This remove is needed to ensure that multiple replays in the same run do not overlap
   unperformedRefactorings.remove(getTime());
   PerformRefactoringOperation performRefactoringOperation =
       new PerformRefactoringOperation(refactoring, CheckConditionsOperation.ALL_CONDITIONS);
   performRefactoringOperation.run(null);
   if (performRefactoringOperation.getConditionStatus().hasFatalError()) {
     throw new RuntimeException(
         "Failed to check preconditions of refactoring: " + refactoring.getName());
   }
   if (performRefactoringOperation.getValidationStatus().hasFatalError()) {
     throw new RuntimeException("Failed to validate refactoring: " + refactoring.getName());
   }
 }
 @Override
 protected TextChange createTextChange() throws CoreException {
   init(fRefactoring);
   fRefactoringStatus = fRefactoring.checkFinalConditions(new NullProgressMonitor());
   if (fRefactoringStatus.hasFatalError()) {
     TextFileChange dummyChange =
         new TextFileChange(
             "fatal error", (IFile) getCompilationUnit().getResource()); // $NON-NLS-1$
     dummyChange.setEdit(new InsertEdit(0, "")); // $NON-NLS-1$
     return dummyChange;
   }
   return (TextChange) fRefactoring.createChange(new NullProgressMonitor());
 }
 private void updateForcePreview() {
   boolean forcePreview = false;
   Refactoring refactoring = getRefactoring();
   ITextUpdating tu = (ITextUpdating) refactoring.getAdapter(ITextUpdating.class);
   IQualifiedNameUpdating qu =
       (IQualifiedNameUpdating) refactoring.getAdapter(IQualifiedNameUpdating.class);
   if (tu != null) {
     forcePreview = tu.getUpdateTextualMatches();
   }
   if (qu != null) {
     forcePreview |= qu.getUpdateQualifiedNames();
   }
   getRefactoringWizard().setForcePreviewReview(forcePreview);
 }
 public UserInterfaceStarter getStarter(Refactoring refactoring) {
   RefactoringProcessor processor =
       (RefactoringProcessor) refactoring.getAdapter(RefactoringProcessor.class);
   if (processor == null) return null;
   Tuple tuple = fMap.get(processor.getClass());
   if (tuple == null) return null;
   try {
     UserInterfaceStarter starter = tuple.starter.newInstance();
     Class<? extends RefactoringWizard> wizardClass = tuple.wizard;
     Constructor<? extends RefactoringWizard> constructor =
         wizardClass.getConstructor(new Class[] {Refactoring.class});
     RefactoringWizard wizard = constructor.newInstance(new Object[] {refactoring});
     starter.initialize(wizard);
     return starter;
   } catch (NoSuchMethodException e) {
     return null;
   } catch (IllegalAccessException e) {
     return null;
   } catch (InstantiationException e) {
     return null;
   } catch (IllegalArgumentException e) {
     return null;
   } catch (InvocationTargetException e) {
     return null;
   }
 }
 protected final Change performChange(Refactoring refactoring, boolean storeUndo)
     throws Exception {
   CreateChangeOperation create = new CreateChangeOperation(refactoring);
   PerformChangeOperation perform = new PerformChangeOperation(create);
   if (storeUndo) {
     perform.setUndoManager(getUndoManager(), refactoring.getName());
   }
   ResourcesPlugin.getWorkspace().run(perform, new NullProgressMonitor());
   assertTrue("Change wasn't executed", perform.changeExecuted());
   return perform.getUndoChange();
 }
  private void helper1(
      String[] methodNames,
      String[][] signatures,
      boolean deleteAllInSourceType,
      boolean deleteAllMatchingMethods,
      boolean replaceOccurences)
      throws Exception {
    ICompilationUnit cu = createCUfromTestFile(getPackageP(), "A");
    IType type = getType(cu, "B");
    IMethod[] methods = getMethods(type, methodNames, signatures);

    ExtractSupertypeProcessor processor = createRefactoringProcessor(methods);
    Refactoring refactoring = processor.getRefactoring();
    processor.setMembersToMove(methods);

    assertTrue("activation", refactoring.checkInitialConditions(new NullProgressMonitor()).isOK());

    processor.setTypesToExtract(new IType[] {type});
    processor.setTypeName("Z");
    processor.setCreateMethodStubs(true);
    processor.setInstanceOf(false);
    processor.setReplace(replaceOccurences);
    if (deleteAllInSourceType) processor.setDeletedMethods(methods);
    if (deleteAllMatchingMethods)
      processor.setDeletedMethods(
          getMethods(processor.getMatchingElements(new NullProgressMonitor(), false)));

    RefactoringStatus status = refactoring.checkFinalConditions(new NullProgressMonitor());
    assertTrue("precondition was supposed to pass", !status.hasError());
    performChange(refactoring, false);

    String expected = getFileContents(getOutputTestFileName("A"));
    String actual = cu.getSource();
    assertEqualLines(expected, actual);

    expected = getFileContents(getOutputTestFileName("Z"));
    ICompilationUnit unit = getPackageP().getCompilationUnit("Z.java");
    if (!unit.exists()) assertTrue("extracted compilation unit does not exist", false);
    actual = unit.getBuffer().getContents();
    assertEqualLines(expected, actual);
  }
 protected final RefactoringStatus performRefactoring(Refactoring ref, boolean providesUndo)
     throws Exception {
   performDummySearch();
   IUndoManager undoManager = getUndoManager();
   if (DESCRIPTOR_TEST) {
     final CreateChangeOperation create =
         new CreateChangeOperation(
             new CheckConditionsOperation(ref, CheckConditionsOperation.ALL_CONDITIONS),
             RefactoringStatus.FATAL);
     create.run(new NullProgressMonitor());
     RefactoringStatus checkingStatus = create.getConditionCheckingStatus();
     if (!checkingStatus.isOK()) return checkingStatus;
     Change change = create.getChange();
     ChangeDescriptor descriptor = change.getDescriptor();
     if (descriptor instanceof RefactoringChangeDescriptor) {
       RefactoringChangeDescriptor rcd = (RefactoringChangeDescriptor) descriptor;
       RefactoringDescriptor refactoringDescriptor = rcd.getRefactoringDescriptor();
       if (refactoringDescriptor instanceof JavaRefactoringDescriptor) {
         JavaRefactoringDescriptor jrd = (JavaRefactoringDescriptor) refactoringDescriptor;
         RefactoringStatus validation = jrd.validateDescriptor();
         if (!validation.isOK()) return validation;
         RefactoringStatus refactoringStatus = new RefactoringStatus();
         Class expected = jrd.getClass();
         RefactoringContribution contribution =
             RefactoringCore.getRefactoringContribution(jrd.getID());
         jrd =
             (JavaRefactoringDescriptor)
                 contribution.createDescriptor(
                     jrd.getID(),
                     jrd.getProject(),
                     jrd.getDescription(),
                     jrd.getComment(),
                     contribution.retrieveArgumentMap(jrd),
                     jrd.getFlags());
         assertEquals(expected, jrd.getClass());
         ref = jrd.createRefactoring(refactoringStatus);
         if (!refactoringStatus.isOK()) return refactoringStatus;
         TestRenameParticipantSingle.reset();
         TestCreateParticipantSingle.reset();
         TestMoveParticipantSingle.reset();
         TestDeleteParticipantSingle.reset();
       }
     }
   }
   final CreateChangeOperation create =
       new CreateChangeOperation(
           new CheckConditionsOperation(ref, CheckConditionsOperation.ALL_CONDITIONS),
           RefactoringStatus.FATAL);
   final PerformChangeOperation perform = new PerformChangeOperation(create);
   perform.setUndoManager(undoManager, ref.getName());
   IWorkspace workspace = ResourcesPlugin.getWorkspace();
   if (fIsPreDeltaTest) {
     IResourceChangeListener listener =
         new IResourceChangeListener() {
           public void resourceChanged(IResourceChangeEvent event) {
             if (create.getConditionCheckingStatus().isOK() && perform.changeExecuted()) {
               TestModelProvider.assertTrue(event.getDelta());
             }
           }
         };
     try {
       TestModelProvider.clearDelta();
       workspace.checkpoint(false);
       workspace.addResourceChangeListener(listener);
       executePerformOperation(perform, workspace);
     } finally {
       workspace.removeResourceChangeListener(listener);
     }
   } else {
     executePerformOperation(perform, workspace);
   }
   RefactoringStatus status = create.getConditionCheckingStatus();
   if (!status.isOK()) return status;
   assertTrue("Change wasn't executed", perform.changeExecuted());
   Change undo = perform.getUndoChange();
   if (providesUndo) {
     assertNotNull("Undo doesn't exist", undo);
     assertTrue("Undo manager is empty", undoManager.anythingToUndo());
   } else {
     assertNull("Undo manager contains undo but shouldn't", undo);
   }
   return null;
 }