]> git.uio.no Git - ifi-stolz-refaktor.git/blobdiff - case-study/jdt-after/core refactoring/org/eclipse/jdt/internal/corext/refactoring/reorg/OverwriteHelper.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-after / core refactoring / org / eclipse / jdt / internal / corext / refactoring / reorg / OverwriteHelper.java
diff --git a/case-study/jdt-after/core refactoring/org/eclipse/jdt/internal/corext/refactoring/reorg/OverwriteHelper.java b/case-study/jdt-after/core refactoring/org/eclipse/jdt/internal/corext/refactoring/reorg/OverwriteHelper.java
new file mode 100644 (file)
index 0000000..bd2505d
--- /dev/null
@@ -0,0 +1,282 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.internal.corext.refactoring.reorg;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+
+import org.eclipse.jdt.internal.corext.refactoring.RefactoringCoreMessages;
+import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgPolicyFactory.FilesFoldersAndCusReorgPolicy;
+import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgPolicyFactory.PackageFragmentRootsReorgPolicy;
+import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgPolicyFactory.PackagesReorgPolicy;
+import org.eclipse.jdt.internal.corext.refactoring.util.ResourceUtil;
+import org.eclipse.jdt.internal.corext.util.Messages;
+
+import org.eclipse.jdt.ui.JavaElementLabels;
+
+import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
+
+class OverwriteHelper {
+       private Object fDestination;
+       private IFile[] fFiles= new IFile[0];
+       private IFolder[] fFolders= new IFolder[0];
+       private ICompilationUnit[] fCus= new ICompilationUnit[0];
+       private IPackageFragmentRoot[] fRoots= new IPackageFragmentRoot[0];
+       private IPackageFragment[] fPackageFragments= new IPackageFragment[0];
+
+       public void setFiles(IFile[] files) {
+               Assert.isNotNull(files);
+               fFiles= files;
+       }
+
+       public void setFolders(IFolder[] folders) {
+               Assert.isNotNull(folders);
+               fFolders= folders;
+       }
+
+       public void setCus(ICompilationUnit[] cus) {
+               Assert.isNotNull(cus);
+               fCus= cus;
+       }
+
+       public void setPackageFragmentRoots(IPackageFragmentRoot[] roots) {
+               Assert.isNotNull(roots);
+               fRoots= roots;
+       }
+
+       public void setPackages(IPackageFragment[] fragments) {
+               Assert.isNotNull(fragments);
+               fPackageFragments= fragments;
+       }
+
+       public IFile[] getFilesWithoutUnconfirmedOnes() {
+               return fFiles;
+       }
+
+       public IFolder[] getFoldersWithoutUnconfirmedOnes() {
+               return fFolders;
+       }
+
+       public ICompilationUnit[] getCusWithoutUnconfirmedOnes() {
+               return fCus;
+       }
+
+       public IPackageFragmentRoot[] getPackageFragmentRootsWithoutUnconfirmedOnes() {
+               return fRoots;
+       }
+
+       public IPackageFragment[] getPackagesWithoutUnconfirmedOnes() {
+               return fPackageFragments;
+       }
+
+       public void confirmOverwriting(IReorgQueries reorgQueries, Object destination) {
+               Assert.isNotNull(destination);
+               Assert.isNotNull(reorgQueries);
+               fDestination= destination;
+               confirmOverwritting(reorgQueries);
+       }
+
+       private void confirmOverwritting(IReorgQueries reorgQueries) {
+               IConfirmQuery overwriteQuery= reorgQueries.createYesYesToAllNoNoToAllQuery(RefactoringCoreMessages.OverwriteHelper_0, true, IReorgQueries.CONFIRM_OVERWRITING);
+               IConfirmQuery skipQuery= reorgQueries.createSkipQuery(RefactoringCoreMessages.OverwriteHelper_2, IReorgQueries.CONFIRM_SKIPPING);
+               confirmFileOverwritting(overwriteQuery, skipQuery);
+               confirmFolderOverwritting(skipQuery);
+               confirmCuOverwritting(overwriteQuery);
+               confirmPackageFragmentRootOverwritting(skipQuery, overwriteQuery);
+               confirmPackageOverwritting(overwriteQuery);
+       }
+
+       private void confirmPackageFragmentRootOverwritting(IConfirmQuery skipQuery, IConfirmQuery overwriteQuery) {
+               List<IPackageFragmentRoot> toNotOverwrite= new ArrayList<IPackageFragmentRoot>(1);
+               for (int i= 0; i < fRoots.length; i++) {
+                       IPackageFragmentRoot root= fRoots[i];
+                       if (canOverwrite(root)) {
+                               if (root.getResource() instanceof IContainer) {
+                                       if (!skip(JavaElementLabels.getElementLabel(root, JavaElementLabels.ALL_DEFAULT), skipQuery))
+                                               toNotOverwrite.add(root);
+                               } else {
+                                       if (!overwrite(root.getResource(), overwriteQuery))
+                                               toNotOverwrite.add(root);
+                               }
+                       }
+               }
+               IPackageFragmentRoot[] roots= toNotOverwrite.toArray(new IPackageFragmentRoot[toNotOverwrite.size()]);
+               fRoots= ArrayTypeConverter.toPackageFragmentRootArray(ReorgUtils.setMinus(fRoots, roots));
+       }
+
+       private void confirmCuOverwritting(IConfirmQuery overwriteQuery) {
+               List<ICompilationUnit> cusToNotOverwrite= new ArrayList<ICompilationUnit>(1);
+               for (int i= 0; i < fCus.length; i++) {
+                       ICompilationUnit cu= fCus[i];
+                       if (canOverwrite(cu) && ! overwrite(cu, overwriteQuery))
+                               cusToNotOverwrite.add(cu);
+               }
+               ICompilationUnit[] cus= cusToNotOverwrite.toArray(new ICompilationUnit[cusToNotOverwrite.size()]);
+               fCus= ArrayTypeConverter.toCuArray(ReorgUtils.setMinus(fCus, cus));
+       }
+
+       private void confirmFolderOverwritting(IConfirmQuery overwriteQuery) {
+               List<IFolder> foldersToNotOverwrite= new ArrayList<IFolder>(1);
+               for (int i= 0; i < fFolders.length; i++) {
+                       IFolder folder= fFolders[i];
+                       if (willOverwrite(folder) && ! skip(BasicElementLabels.getResourceName(folder), overwriteQuery))
+                               foldersToNotOverwrite.add(folder);
+               }
+               IFolder[] folders= foldersToNotOverwrite.toArray(new IFolder[foldersToNotOverwrite.size()]);
+               fFolders= ArrayTypeConverter.toFolderArray(ReorgUtils.setMinus(fFolders, folders));
+       }
+
+       private void confirmFileOverwritting(IConfirmQuery overwriteQuery, IConfirmQuery skipQuery) {
+               List<IFile> filesToNotOverwrite= new ArrayList<IFile>(1);
+               for (int i= 0; i < fFiles.length; i++) {
+                       IFile file= fFiles[i];
+                       if (willOverwrite(file)) {
+                               IContainer destination= (IContainer) ResourceUtil.getResource(fDestination);
+                               if (ParentChecker.isDescendantOf(file, destination.findMember(file.getName()))) {
+                                       if (!skip(BasicElementLabels.getResourceName(file), skipQuery)) {
+                                               filesToNotOverwrite.add(file);
+                                       }
+                               } else if (!overwrite(file, overwriteQuery)) {
+                                       filesToNotOverwrite.add(file);
+                               }
+                       }
+               }
+               IFile[] files= filesToNotOverwrite.toArray(new IFile[filesToNotOverwrite.size()]);
+               fFiles= ArrayTypeConverter.toFileArray(ReorgUtils.setMinus(fFiles, files));
+       }
+
+       private void confirmPackageOverwritting(IConfirmQuery overwriteQuery){
+               List<IPackageFragment> toNotOverwrite= new ArrayList<IPackageFragment>(1);
+               for (int i= 0; i < fPackageFragments.length; i++) {
+                       IPackageFragment pack= fPackageFragments[i];
+                       if (canOverwrite(pack) && ! overwrite(pack, overwriteQuery))
+                               toNotOverwrite.add(pack);
+               }
+               IPackageFragment[] packages= toNotOverwrite.toArray(new IPackageFragment[toNotOverwrite.size()]);
+               fPackageFragments= ArrayTypeConverter.toPackageArray(ReorgUtils.setMinus(fPackageFragments, packages));
+       }
+
+       private boolean canOverwrite(IPackageFragment pack) {
+               if (fDestination instanceof IPackageFragmentRoot) {
+                       IPackageFragmentRoot destination= (IPackageFragmentRoot)fDestination;
+                       return ! destination.equals(pack.getParent()) && destination.getPackageFragment(pack.getElementName()).exists();
+               } else {
+                       return willOverwrite(pack.getResource());
+               }
+       }
+
+       /*
+        * Will resource override a member of destination?
+        */
+       private boolean willOverwrite(IResource resource) {
+               if (resource == null)
+                       return false;
+
+               IResource destinationResource= ResourceUtil.getResource(fDestination);
+               if (destinationResource.equals(resource.getParent()))
+                       return false;
+
+               if (destinationResource instanceof IContainer) {
+                       IContainer container= (IContainer)destinationResource;
+                       IResource member=  container.findMember(resource.getName());
+                       if (member == null || !member.exists())
+                               return false;
+
+                       return true;
+               }
+               return false;
+       }
+
+       private boolean canOverwrite(IPackageFragmentRoot root) {
+               if (fDestination instanceof IJavaProject) {
+                       IJavaProject destination= (IJavaProject)fDestination;
+                       IFolder conflict= destination.getProject().getFolder(root.getElementName());
+                       try {
+                               return !destination.equals(root.getParent()) && conflict.exists() &&  conflict.members().length > 0;
+                       } catch (CoreException e) {
+                               return true;
+                       }
+               } else {
+                       return willOverwrite(root.getResource());
+               }
+       }
+
+       private boolean canOverwrite(ICompilationUnit cu) {
+               if (fDestination instanceof IPackageFragment){
+                       IPackageFragment destination= (IPackageFragment)fDestination;
+                       return ! destination.equals(cu.getParent()) && destination.getCompilationUnit(cu.getElementName()).exists();
+               } else {
+                       return willOverwrite(ReorgUtils.getResource(cu));
+               }
+       }
+
+       public void generated_4364438186751348778(IReorgQueries reorgQueries, FilesFoldersAndCusReorgPolicy filesfoldersandcusreorgpolicy, IPackageFragment destPack) {
+               if (destPack != null) {
+                       confirmOverwriting(reorgQueries, destPack);
+               } else {
+                       IContainer destinationAsContainer= filesfoldersandcusreorgpolicy.getDestinationAsContainer();
+                       if (destinationAsContainer != null)
+                               confirmOverwriting(reorgQueries, destinationAsContainer);
+               }
+               filesfoldersandcusreorgpolicy.fFiles= getFilesWithoutUnconfirmedOnes();
+               filesfoldersandcusreorgpolicy.fFolders= getFoldersWithoutUnconfirmedOnes();
+               filesfoldersandcusreorgpolicy.fCus= getCusWithoutUnconfirmedOnes();
+       }
+
+       public void generated_3734182692170917825(IReorgQueries reorgQueries, PackageFragmentRootsReorgPolicy packagefragmentrootsreorgpolicy, IJavaProject javaProject) {
+               if (javaProject == null) {
+                       confirmOverwriting(reorgQueries, packagefragmentrootsreorgpolicy.getResourceDestination());
+               } else {
+                       confirmOverwriting(reorgQueries, javaProject);
+               }
+               packagefragmentrootsreorgpolicy.fPackageFragmentRoots= getPackageFragmentRootsWithoutUnconfirmedOnes();
+       }
+
+       public void generated_8988467481945251798(IReorgQueries reorgQueries, PackagesReorgPolicy packagesreorgpolicy, IPackageFragmentRoot destRoot) {
+               if (destRoot == null) {
+                       confirmOverwriting(reorgQueries, packagesreorgpolicy.getResourceDestination());
+               } else {
+                       confirmOverwriting(reorgQueries, destRoot);
+               }
+               packagesreorgpolicy.fPackageFragments= getPackagesWithoutUnconfirmedOnes();
+       }
+
+       private static boolean overwrite(IResource resource, IConfirmQuery overwriteQuery){
+               return overwrite(BasicElementLabels.getResourceName(resource), overwriteQuery);
+       }
+
+       private static boolean overwrite(IJavaElement element, IConfirmQuery overwriteQuery){
+               return overwrite(JavaElementLabels.getElementLabel(element, JavaElementLabels.ALL_DEFAULT), overwriteQuery);
+       }
+
+       private static boolean overwrite(String name, IConfirmQuery overwriteQuery){
+               String question= Messages.format(RefactoringCoreMessages.OverwriteHelper_1, BasicElementLabels.getJavaElementName(name));
+               return overwriteQuery.confirm(question);
+       }
+       private static boolean skip(String name, IConfirmQuery overwriteQuery){
+               String question= Messages.format(RefactoringCoreMessages.OverwriteHelper_3, BasicElementLabels.getJavaElementName(name));
+               return overwriteQuery.confirm(question);
+       }
+}