A massive organize imports and formatting of the sources using default Eclipse code...
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / obfuscator / export / ObfuscatorExportOperation.java
index f8e50dc..e78ce6a 100644 (file)
@@ -9,7 +9,7 @@
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package net.sourceforge.phpeclipse.obfuscator.export;
+
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -39,602 +39,703 @@ import org.eclipse.jface.operation.ModalContext;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.IOverwriteQuery;
 
 /**
- *     Operation for exporting the contents of a resource to the local file system.
+ * Operation for exporting the contents of a resource to the local file system.
  */
-/*package*/
+/* package */
 class ObfuscatorExportOperation implements IRunnableWithProgress {
-  private IPath fPath;
-  private IProgressMonitor fMonitor;
-  private ObfuscatorPass1Exporter fExporter1 = null;
-  private ObfuscatorPass2Exporter fExporter2 = null;
-  private HashMap fCurrentIdentifierMap = null;
-  private HashMap fProjectMap = null;
-  private String fCurrentProjectName = "";
-
-  private List fResourcesToExport;
-  private IOverwriteQuery fOverwriteCallback;
-  private IResource fResource;
-  private List errorTable = new ArrayList(1);
-
-  //The constants for the overwrite 3 state
-  private static final int OVERWRITE_NOT_SET = 0;
-  private static final int OVERWRITE_NONE = 1;
-  private static final int OVERWRITE_ALL = 2;
-  private int overwriteState = OVERWRITE_NOT_SET;
-
-  //  private boolean createLeadupStructure = true;
-  private boolean createContainerDirectories = true;
-  /**
-   *  Create an instance of this class.  Use this constructor if you wish to
-   *  export specific resources without a common parent resource
-   */
-  //  public ObfuscatorExportOperation(List resources, String destinationPath, IOverwriteQuery overwriteImplementor) {
-  //    super();
-  //
-  //    exporter1 = new ObfuscatorPass1Exporter(new Scanner(false, false), identifierMap);
-  //           exporter2 = new ObfuscatorPass2Exporter(new Scanner(true, true), identifierMap);
-  //           identifierMap = null;
-  //           
-  //    // Eliminate redundancies in list of resources being exported
-  //    Iterator elementsEnum = resources.iterator();
-  //    while (elementsEnum.hasNext()) {
-  //      IResource currentResource = (IResource) elementsEnum.next();
-  //      if (isDescendent(resources, currentResource))
-  //        elementsEnum.remove(); //Remove currentResource
-  //    }
-  //
-  //    resourcesToExport = resources;
-  //    path = new Path(destinationPath);
-  //    overwriteCallback = overwriteImplementor;
-  //  }
-  /**
-   *  Create an instance of this class.  Use this constructor if you wish to
-   *  recursively export a single resource
-   */
-  public ObfuscatorExportOperation(IResource res, String destinationPath, IOverwriteQuery overwriteImplementor) {
-    super();
-
-    fResource = res;
-    fPath = new Path(destinationPath);
-    fOverwriteCallback = overwriteImplementor;
-  }
-  /**
-   *  Create an instance of this class.  Use this constructor if you wish to
-   *  export specific resources with a common parent resource (affects container
-   *  directory creation)
-   */
-  public ObfuscatorExportOperation(IResource res, List resources, String destinationPath, IOverwriteQuery overwriteImplementor) {
-    this(res, destinationPath, overwriteImplementor);
-    fResourcesToExport = resources;
-  }
-  /**
-   * Add a new entry to the error table with the passed information
-   */
-  protected void addError(String message, Throwable e) {
-    errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0, message, e));
-  }
-  /**
-   *  Answer the total number of file resources that exist at or below self in the
-   *  resources hierarchy.
-   *
-   *  @return int
-   *  @param resource org.eclipse.core.resources.IResource
-   */
-  protected int countChildrenOf(IResource resource) throws CoreException {
-    if (resource.getType() == IResource.FILE)
-      return 1;
-
-    int count = 0;
-    if (resource.isAccessible()) {
-      IResource[] children = ((IContainer) resource).members();
-      for (int i = 0; i < children.length; i++)
-        count += countChildrenOf(children[i]);
-    }
-
-    return count;
-  }
-  /**
-   *   Answer a boolean indicating the number of file resources that were
-   *   specified for export
-   *
-   *   @return int
-   */
-  protected int countSelectedResources() throws CoreException {
-    int result = 0;
-    Iterator resources = fResourcesToExport.iterator();
-
-    while (resources.hasNext())
-      result += countChildrenOf((IResource) resources.next());
-
-    return result;
-  }
-  /**
-   *  Create the directories required for exporting the passed resource,
-   *  based upon its container hierarchy
-   *
-   *  @param resource org.eclipse.core.resources.IResource
-   */
-  protected void createLeadupDirectoriesFor(IResource resource) {
-    IPath resourcePath = resource.getFullPath().removeLastSegments(1);
-
-    for (int i = 0; i < resourcePath.segmentCount(); i++) {
-      fPath = fPath.append(resourcePath.segment(i));
-      fExporter2.createFolder(fPath);
-    }
-  }
-  /**
-   *   Recursively export the previously-specified resource
-   */
-  protected void exportAllResources1() throws InterruptedException {
-    if (fResource.getType() == IResource.FILE) {
-      exportFile1((IFile) fResource, fPath);
-    } else {
-      try {
-        setExporters(fResource);
-        exportChildren1(((IContainer) fResource).members(), fPath);
-      } catch (CoreException e) {
-        // not safe to show a dialog
-        // should never happen because the file system export wizard ensures that the
-        // single resource chosen for export is both existent and accessible
-        errorTable.add(e);
-      }
-    }
-  }
-  /**
-   *   Recursively export the previously-specified resource
-   */
-  protected void exportAllResources2() throws InterruptedException {
-    if (fResource.getType() == IResource.FILE) {
-      exportFile2((IFile) fResource, fPath);
-    } else {
-      try {
-        setExporters(fResource);
-        exportChildren2(((IContainer) fResource).members(), fPath);
-      } catch (CoreException e) {
-        // not safe to show a dialog
-        // should never happen because the file system export wizard ensures that the
-        // single resource chosen for export is both existent and accessible
-        errorTable.add(e);
-      }
-    }
-  }
-  /**
-   *   Export all of the resources contained in the passed collection
-   *
-   *   @param children java.util.Enumeration
-   *   @param currentPath IPath
-   */
-  protected void exportChildren1(IResource[] children, IPath currentPath) throws InterruptedException {
-    for (int i = 0; i < children.length; i++) {
-      IResource child = children[i];
-      if (!child.isAccessible())
-        continue;
-
-      if (child.getType() == IResource.FILE)
-        exportFile1((IFile) child, currentPath);
-      else {
-        IPath destination = currentPath.append(child.getName());
-        fExporter1.createFolder(destination);
-        try {
-          exportChildren1(((IContainer) child).members(), destination);
-        } catch (CoreException e) {
-          // not safe to show a dialog
-          // should never happen because:
-          // i. this method is called recursively iterating over the result of #members,
-          //           which only answers existing children
-          // ii. there is an #isAccessible check done before #members is invoked
-          errorTable.add(e.getStatus());
-        }
-      }
-    }
-  }
-
-  /**
-   *   Export all of the resources contained in the passed collection
-   *
-   *   @param children java.util.Enumeration
-   *   @param currentPath IPath
-   */
-  protected void exportChildren2(IResource[] children, IPath currentPath) throws InterruptedException {
-    for (int i = 0; i < children.length; i++) {
-      IResource child = children[i];
-      if (!child.isAccessible())
-        continue;
-
-      if (child.getType() == IResource.FILE)
-        exportFile2((IFile) child, currentPath);
-      else {
-        IPath destination = currentPath.append(child.getName());
-        fExporter2.createFolder(destination);
-        try {
-          exportChildren2(((IContainer) child).members(), destination);
-        } catch (CoreException e) {
-          // not safe to show a dialog
-          // should never happen because:
-          // i. this method is called recursively iterating over the result of #members,
-          //           which only answers existing children
-          // ii. there is an #isAccessible check done before #members is invoked
-          errorTable.add(e.getStatus());
-        }
-      }
-    }
-  }
-
-  protected void exportFile1(IFile file, IPath location) throws InterruptedException {
-    IPath fullPath = location.append(file.getName());
-    fMonitor.subTask(file.getFullPath().toString());
-    String properPathString = fullPath.toOSString();
-    File targetFile = new File(properPathString);
-
-    //    if (targetFile.exists()) {
-    //      if (!targetFile.canWrite()) {
-    //        errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0, ObfuscatorExportMessages.format("ObfuscatorTransfer.cannotOverwrite", //$NON-NLS-1$
-    //        new Object[] { targetFile.getAbsolutePath()}), null));
-    //        monitor.worked(1);
-    //        return;
-    //      }
-    //
-    //      if (overwriteState == OVERWRITE_NONE)
-    //        return;
-    //
-    //      if (overwriteState != OVERWRITE_ALL) {
-    //        String overwriteAnswer = overwriteCallback.queryOverwrite(properPathString);
-    //
-    //        if (overwriteAnswer.equals(IOverwriteQuery.CANCEL))
-    //          throw new InterruptedException();
-    //
-    //        if (overwriteAnswer.equals(IOverwriteQuery.NO)) {
-    //          monitor.worked(1);
-    //          return;
-    //        }
-    //
-    //        if (overwriteAnswer.equals(IOverwriteQuery.NO_ALL)) {
-    //          monitor.worked(1);
-    //          overwriteState = OVERWRITE_NONE;
-    //          return;
-    //        }
-    //
-    //        if (overwriteAnswer.equals(IOverwriteQuery.ALL))
-    //          overwriteState = OVERWRITE_ALL;
-    //      }
-    //    }
-
-    try {
-      setExporters(file);
-      fExporter1.write(file, fullPath);
-    } catch (IOException e) {
-      errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0, ObfuscatorExportMessages.format("ObfuscatorTransfer.errorExporting", //$NON-NLS-1$
-      new Object[] { fullPath, e.getMessage()}), e));
-    } catch (CoreException e) {
-      errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0, ObfuscatorExportMessages.format("ObfuscatorTransfer.errorExporting", //$NON-NLS-1$
-      new Object[] { fullPath, e.getMessage()}), e));
-    }
-
-    fMonitor.worked(1);
-    ModalContext.checkCanceled(fMonitor);
-  }
-  /**
-   *  Export the passed file to the specified location
-   *
-   *  @param file org.eclipse.core.resources.IFile
-   *  @param location org.eclipse.core.runtime.IPath
-   */
-  protected void exportFile2(IFile file, IPath location) throws InterruptedException {
-    IPath fullPath = location.append(file.getName());
-    fMonitor.subTask(file.getFullPath().toString());
-    String properPathString = fullPath.toOSString();
-    File targetFile = new File(properPathString);
-
-    if (targetFile.exists()) {
-      if (!targetFile.canWrite()) {
-        errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0, ObfuscatorExportMessages.format("ObfuscatorTransfer.cannotOverwrite", //$NON-NLS-1$
-        new Object[] { targetFile.getAbsolutePath()}), null));
-        fMonitor.worked(1);
-        return;
-      }
-
-      if (overwriteState == OVERWRITE_NONE)
-        return;
-
-      if (overwriteState != OVERWRITE_ALL) {
-        String overwriteAnswer = fOverwriteCallback.queryOverwrite(properPathString);
-
-        if (overwriteAnswer.equals(IOverwriteQuery.CANCEL))
-          throw new InterruptedException();
-
-        if (overwriteAnswer.equals(IOverwriteQuery.NO)) {
-          fMonitor.worked(1);
-          return;
-        }
-
-        if (overwriteAnswer.equals(IOverwriteQuery.NO_ALL)) {
-          fMonitor.worked(1);
-          overwriteState = OVERWRITE_NONE;
-          return;
-        }
-
-        if (overwriteAnswer.equals(IOverwriteQuery.ALL))
-          overwriteState = OVERWRITE_ALL;
-      }
-    }
-
-    try {
-      setExporters(file);
-      fExporter2.write(file, fullPath);
-    } catch (IOException e) {
-      errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0, ObfuscatorExportMessages.format("ObfuscatorTransfer.errorExporting", //$NON-NLS-1$
-      new Object[] { fullPath, e.getMessage()}), e));
-    } catch (CoreException e) {
-      errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0, ObfuscatorExportMessages.format("ObfuscatorTransfer.errorExporting", //$NON-NLS-1$
-      new Object[] { fullPath, e.getMessage()}), e));
-    }
-
-    fMonitor.worked(1);
-    ModalContext.checkCanceled(fMonitor);
-  }
-
-  protected void exportSpecifiedResources1() throws InterruptedException {
-    Iterator resources = fResourcesToExport.iterator();
-    IPath initPath = (IPath) fPath.clone();
-
-    while (resources.hasNext()) {
-      IResource currentResource = (IResource) resources.next();
-      if (!currentResource.isAccessible())
-        continue;
-      setExporters(currentResource);
-      fPath = initPath;
-
-      if (fResource == null) {
-        // No root resource specified and creation of containment directories
-        // is required.  Create containers from depth 2 onwards (ie.- project's
-        // child inclusive) for each resource being exported.
-        //        if (createLeadupStructure)
-        //          createLeadupDirectoriesFor(currentResource);
-
-      } else {
-        // Root resource specified.  Must create containment directories
-        // from this point onwards for each resource being exported
-        IPath containersToCreate =
-          currentResource.getFullPath().removeFirstSegments(fResource.getFullPath().segmentCount()).removeLastSegments(1);
-
-        for (int i = 0; i < containersToCreate.segmentCount(); i++) {
-          fPath = fPath.append(containersToCreate.segment(i));
-          fExporter1.createFolder(fPath);
-        }
-      }
-
-      if (currentResource.getType() == IResource.FILE)
-        exportFile1((IFile) currentResource, fPath);
-      else {
-        if (createContainerDirectories) {
-          fPath = fPath.append(currentResource.getName());
-          fExporter1.createFolder(fPath);
-        }
-
-        try {
-          exportChildren1(((IContainer) currentResource).members(), fPath);
-        } catch (CoreException e) {
-          // should never happen because #isAccessible is called before #members is invoked,
-          // which implicitly does an existence check
-          errorTable.add(e.getStatus());
-        }
-      }
-    }
-  }
-  /**
-   *   Export the resources contained in the previously-defined
-   *   resourcesToExport collection
-   */
-  protected void exportSpecifiedResources2() throws InterruptedException {
-    Iterator resources = fResourcesToExport.iterator();
-    IPath initPath = (IPath) fPath.clone();
-
-    while (resources.hasNext()) {
-      IResource currentResource = (IResource) resources.next();
-      if (!currentResource.isAccessible())
-        continue;
-      setExporters(currentResource);
-
-      fPath = initPath;
-
-      if (fResource == null) {
-        // No root resource specified and creation of containment directories
-        // is required.  Create containers from depth 2 onwards (ie.- project's
-        // child inclusive) for each resource being exported.
-        //        if (createLeadupStructure)
-        //          createLeadupDirectoriesFor(currentResource);
-
-      } else {
-        // Root resource specified.  Must create containment directories
-        // from this point onwards for each resource being exported
-        IPath containersToCreate =
-          currentResource.getFullPath().removeFirstSegments(fResource.getFullPath().segmentCount()).removeLastSegments(1);
-
-        for (int i = 0; i < containersToCreate.segmentCount(); i++) {
-          fPath = fPath.append(containersToCreate.segment(i));
-          fExporter2.createFolder(fPath);
-        }
-      }
-
-      if (currentResource.getType() == IResource.FILE)
-        exportFile2((IFile) currentResource, fPath);
-      else {
-        if (createContainerDirectories) {
-          fPath = fPath.append(currentResource.getName());
-          fExporter2.createFolder(fPath);
-        }
-
-        try {
-          exportChildren2(((IContainer) currentResource).members(), fPath);
-        } catch (CoreException e) {
-          // should never happen because #isAccessible is called before #members is invoked,
-          // which implicitly does an existence check
-          errorTable.add(e.getStatus());
-        }
-      }
-    }
-  }
-  /**
-   * Returns the status of the export operation.
-   * If there were any errors, the result is a status object containing
-   * individual status objects for each error.
-   * If there were no errors, the result is a status object with error code <code>OK</code>.
-   *
-   * @return the status
-   */
-  public IStatus getStatus() {
-    IStatus[] errors = new IStatus[errorTable.size()];
-    errorTable.toArray(errors);
-    return new MultiStatus(PlatformUI.PLUGIN_ID, IStatus.OK, errors, ObfuscatorExportMessages.getString("ObfuscatorExportOperation.problemsExporting"), //$NON-NLS-1$
-    null);
-  }
-  /**
-   *  Answer a boolean indicating whether the passed child is a descendent
-   *  of one or more members of the passed resources collection
-   *
-   *  @return boolean
-   *  @param resources java.util.List
-   *  @param child org.eclipse.core.resources.IResource
-   */
-  protected boolean isDescendent(List resources, IResource child) {
-    if (child.getType() == IResource.PROJECT)
-      return false;
-
-    IResource parent = child.getParent();
-    if (resources.contains(parent))
-      return true;
-
-    return isDescendent(resources, parent);
-  }
-
-  private void setExporters(IResource resource) {
-    if (fCurrentIdentifierMap == null) {
-      if (fProjectMap == null) {
-        fProjectMap = new HashMap();
-      }
-      createExporters(resource);
-    } else {
-      IProject project = resource.getProject();
-      if (!fCurrentProjectName.equals(project.getName())) {
-        HashMap temp = (HashMap) fProjectMap.get(project.getName());
-        if (temp != null) {
-          fCurrentProjectName = project.getName();
-          fCurrentIdentifierMap = temp;
-          fExporter1 = new ObfuscatorPass1Exporter(new Scanner(false, false), fCurrentIdentifierMap);
-          fExporter2 = new ObfuscatorPass2Exporter(new Scanner(true, true), fCurrentIdentifierMap);
-          return;
-        }
-        createExporters(resource);
-      }
-    }
-  }
-
-  private void createExporters(IResource resource) {
-    IProject project = resource.getProject();
-    IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
-    ObfuscatorIgnores ignore = new ObfuscatorIgnores(project);
-    fCurrentIdentifierMap = ignore.getIdentifierMap();
-    fCurrentProjectName = project.getName();
-    fProjectMap.put(fCurrentProjectName, fCurrentIdentifierMap);
-    fExporter1 = new ObfuscatorPass1Exporter(new Scanner(false, false), fCurrentIdentifierMap);
-    fExporter2 = new ObfuscatorPass2Exporter(new Scanner(true, true), fCurrentIdentifierMap);
-  }
-  /**
-   *   Export the resources that were previously specified for export
-   *   (or if a single resource was specified then export it recursively)
-   */
-  public void run(IProgressMonitor monitor) throws InterruptedException {
-    this.fMonitor = monitor;
-    final IPath tempPath = (IPath) fPath.clone();
-    if (fResource != null) {
-      setExporters(fResource);
-      //      if (createLeadupStructure)
-      //        createLeadupDirectoriesFor(resource);
-
-      if (createContainerDirectories && fResource.getType() != IResource.FILE) {
-        // ensure it's a container
-        fPath = fPath.append(fResource.getName());
-        fExporter2.createFolder(fPath);
-      }
-    }
-
-    try {
-       // reset variables for this run:
-       fCurrentIdentifierMap = null;
-       fProjectMap = null;
-       fCurrentProjectName = "";
-       
-       // count number of files
-      int totalWork = IProgressMonitor.UNKNOWN;
-      try {
-        if (fResourcesToExport == null) {
-          totalWork = countChildrenOf(fResource);
-        } else {
-          totalWork = countSelectedResources();
-        }
-      } catch (CoreException e) {
-        // Should not happen
-        errorTable.add(e.getStatus());
-      }
-      monitor.beginTask(ObfuscatorExportMessages.getString("ObfuscatorTransfer.exportingTitle1"), totalWork); //$NON-NLS-1$
-      if (fResourcesToExport == null) {
-        exportAllResources1();
-      } else {
-        exportSpecifiedResources1();
-      }
-
-      //      try {
-      //        if (resourcesToExport == null)
-      //          totalWork = countChildrenOf(resource);
-      //        else
-      //          totalWork = countSelectedResources();
-      //      } catch (CoreException e) {
-      //        // Should not happen
-      //        errorTable.add(e.getStatus());
-      //      }
-
-      // reset path:
-      fPath = tempPath;
-      monitor.beginTask(ObfuscatorExportMessages.getString("ObfuscatorTransfer.exportingTitle2"), totalWork); //$NON-NLS-1$
-      if (fResourcesToExport == null) {
-        exportAllResources2();
-      } else {
-        exportSpecifiedResources2();
-      }
-    } finally {
-      monitor.done();
-    }
-  }
-  /**
-   *   Set this boolean indicating whether a directory should be created for
-   *   Folder resources that are explicitly passed for export
-   *
-   *   @param value boolean
-   */
-  //  public void setCreateContainerDirectories(boolean value) {
-  //    createContainerDirectories = value;
-  //  }
-  /**
-   *   Set this boolean indicating whether each exported resource's complete path should
-   *   include containment hierarchies as dictated by its parents
-   *
-   *   @param value boolean
-   */
-  //  public void setCreateLeadupStructure(boolean value) {
-  //    createLeadupStructure = value;
-  //  }
-  /**
-   *   Set this boolean indicating whether exported resources should automatically
-   *   overwrite existing files when a conflict occurs. If not
-   *   query the user.
-   *
-   *   @param value boolean
-   */
-  public void setOverwriteFiles(boolean value) {
-    if (value)
-      overwriteState = OVERWRITE_ALL;
-  }
+       private IPath fPath;
+
+       private IProgressMonitor fMonitor;
+
+       private ObfuscatorPass1Exporter fExporter1 = null;
+
+       private ObfuscatorPass2Exporter fExporter2 = null;
+
+       private HashMap fCurrentIdentifierMap = null;
+
+       private HashMap fProjectMap = null;
+
+       private String fCurrentProjectName = "";
+
+       private List fResourcesToExport;
+
+       private IOverwriteQuery fOverwriteCallback;
+
+       private IResource fResource;
+
+       private List errorTable = new ArrayList(1);
+
+       // The constants for the overwrite 3 state
+       private static final int OVERWRITE_NOT_SET = 0;
+
+       private static final int OVERWRITE_NONE = 1;
+
+       private static final int OVERWRITE_ALL = 2;
+
+       private int overwriteState = OVERWRITE_NOT_SET;
+
+       // private boolean createLeadupStructure = true;
+       private boolean createContainerDirectories = true;
+
+       /**
+        * Create an instance of this class. Use this constructor if you wish to
+        * export specific resources without a common parent resource
+        */
+       // public ObfuscatorExportOperation(List resources, String destinationPath,
+       // IOverwriteQuery overwriteImplementor) {
+       // super();
+       //
+       // exporter1 = new ObfuscatorPass1Exporter(new Scanner(false, false),
+       // identifierMap);
+       // exporter2 = new ObfuscatorPass2Exporter(new Scanner(true, true),
+       // identifierMap);
+       // identifierMap = null;
+       //              
+       // // Eliminate redundancies in list of resources being exported
+       // Iterator elementsEnum = resources.iterator();
+       // while (elementsEnum.hasNext()) {
+       // IResource currentResource = (IResource) elementsEnum.next();
+       // if (isDescendent(resources, currentResource))
+       // elementsEnum.remove(); //Remove currentResource
+       // }
+       //
+       // resourcesToExport = resources;
+       // path = new Path(destinationPath);
+       // overwriteCallback = overwriteImplementor;
+       // }
+       /**
+        * Create an instance of this class. Use this constructor if you wish to
+        * recursively export a single resource
+        */
+       public ObfuscatorExportOperation(IResource res, String destinationPath,
+                       IOverwriteQuery overwriteImplementor) {
+               super();
+
+               fResource = res;
+               fPath = new Path(destinationPath);
+               fOverwriteCallback = overwriteImplementor;
+       }
+
+       /**
+        * Create an instance of this class. Use this constructor if you wish to
+        * export specific resources with a common parent resource (affects
+        * container directory creation)
+        */
+       public ObfuscatorExportOperation(IResource res, List resources,
+                       String destinationPath, IOverwriteQuery overwriteImplementor) {
+               this(res, destinationPath, overwriteImplementor);
+               fResourcesToExport = resources;
+       }
+
+       /**
+        * Add a new entry to the error table with the passed information
+        */
+       protected void addError(String message, Throwable e) {
+               errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0,
+                               message, e));
+       }
+
+       /**
+        * Answer the total number of file resources that exist at or below self in
+        * the resources hierarchy.
+        * 
+        * @return int
+        * @param resource
+        *            org.eclipse.core.resources.IResource
+        */
+       protected int countChildrenOf(IResource resource) throws CoreException {
+               if (resource.getType() == IResource.FILE)
+                       return 1;
+
+               int count = 0;
+               if (resource.isAccessible()) {
+                       IResource[] children = ((IContainer) resource).members();
+                       for (int i = 0; i < children.length; i++)
+                               count += countChildrenOf(children[i]);
+               }
+
+               return count;
+       }
+
+       /**
+        * Answer a boolean indicating the number of file resources that were
+        * specified for export
+        * 
+        * @return int
+        */
+       protected int countSelectedResources() throws CoreException {
+               int result = 0;
+               Iterator resources = fResourcesToExport.iterator();
+
+               while (resources.hasNext())
+                       result += countChildrenOf((IResource) resources.next());
+
+               return result;
+       }
+
+       /**
+        * Create the directories required for exporting the passed resource, based
+        * upon its container hierarchy
+        * 
+        * @param resource
+        *            org.eclipse.core.resources.IResource
+        */
+       protected void createLeadupDirectoriesFor(IResource resource) {
+               IPath resourcePath = resource.getFullPath().removeLastSegments(1);
+
+               for (int i = 0; i < resourcePath.segmentCount(); i++) {
+                       fPath = fPath.append(resourcePath.segment(i));
+                       fExporter2.createFolder(fPath);
+               }
+       }
+
+       /**
+        * Recursively export the previously-specified resource
+        */
+       protected void exportAllResources1() throws InterruptedException {
+               if (fResource.getType() == IResource.FILE) {
+                       exportFile1((IFile) fResource, fPath);
+               } else {
+                       try {
+                               setExporters(fResource);
+                               exportChildren1(((IContainer) fResource).members(), fPath);
+                       } catch (CoreException e) {
+                               // not safe to show a dialog
+                               // should never happen because the file system export wizard
+                               // ensures that the
+                               // single resource chosen for export is both existent and
+                               // accessible
+                               errorTable.add(e);
+                       }
+               }
+       }
+
+       /**
+        * Recursively export the previously-specified resource
+        */
+       protected void exportAllResources2() throws InterruptedException {
+               if (fResource.getType() == IResource.FILE) {
+                       exportFile2((IFile) fResource, fPath);
+               } else {
+                       try {
+                               setExporters(fResource);
+                               exportChildren2(((IContainer) fResource).members(), fPath);
+                       } catch (CoreException e) {
+                               // not safe to show a dialog
+                               // should never happen because the file system export wizard
+                               // ensures that the
+                               // single resource chosen for export is both existent and
+                               // accessible
+                               errorTable.add(e);
+                       }
+               }
+       }
+
+       /**
+        * Export all of the resources contained in the passed collection
+        * 
+        * @param children
+        *            java.util.Enumeration
+        * @param currentPath
+        *            IPath
+        */
+       protected void exportChildren1(IResource[] children, IPath currentPath)
+                       throws InterruptedException {
+               for (int i = 0; i < children.length; i++) {
+                       IResource child = children[i];
+                       if (!child.isAccessible())
+                               continue;
+
+                       if (child.getType() == IResource.FILE)
+                               exportFile1((IFile) child, currentPath);
+                       else {
+                               IPath destination = currentPath.append(child.getName());
+                               fExporter1.createFolder(destination);
+                               try {
+                                       exportChildren1(((IContainer) child).members(), destination);
+                               } catch (CoreException e) {
+                                       // not safe to show a dialog
+                                       // should never happen because:
+                                       // i. this method is called recursively iterating over the
+                                       // result of #members,
+                                       // which only answers existing children
+                                       // ii. there is an #isAccessible check done before #members
+                                       // is invoked
+                                       errorTable.add(e.getStatus());
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Export all of the resources contained in the passed collection
+        * 
+        * @param children
+        *            java.util.Enumeration
+        * @param currentPath
+        *            IPath
+        */
+       protected void exportChildren2(IResource[] children, IPath currentPath)
+                       throws InterruptedException {
+               for (int i = 0; i < children.length; i++) {
+                       IResource child = children[i];
+                       if (!child.isAccessible())
+                               continue;
+
+                       if (child.getType() == IResource.FILE)
+                               exportFile2((IFile) child, currentPath);
+                       else {
+                               IPath destination = currentPath.append(child.getName());
+                               fExporter2.createFolder(destination);
+                               try {
+                                       exportChildren2(((IContainer) child).members(), destination);
+                               } catch (CoreException e) {
+                                       // not safe to show a dialog
+                                       // should never happen because:
+                                       // i. this method is called recursively iterating over the
+                                       // result of #members,
+                                       // which only answers existing children
+                                       // ii. there is an #isAccessible check done before #members
+                                       // is invoked
+                                       errorTable.add(e.getStatus());
+                               }
+                       }
+               }
+       }
+
+       protected void exportFile1(IFile file, IPath location)
+                       throws InterruptedException {
+               IPath fullPath = location.append(file.getName());
+               fMonitor.subTask(file.getFullPath().toString());
+               String properPathString = fullPath.toOSString();
+               File targetFile = new File(properPathString);
+
+               // if (targetFile.exists()) {
+               // if (!targetFile.canWrite()) {
+               // errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0,
+               // ObfuscatorExportMessages.format("ObfuscatorTransfer.cannotOverwrite",
+               // //$NON-NLS-1$
+               // new Object[] { targetFile.getAbsolutePath()}), null));
+               // monitor.worked(1);
+               // return;
+               // }
+               //
+               // if (overwriteState == OVERWRITE_NONE)
+               // return;
+               //
+               // if (overwriteState != OVERWRITE_ALL) {
+               // String overwriteAnswer =
+               // overwriteCallback.queryOverwrite(properPathString);
+               //
+               // if (overwriteAnswer.equals(IOverwriteQuery.CANCEL))
+               // throw new InterruptedException();
+               //
+               // if (overwriteAnswer.equals(IOverwriteQuery.NO)) {
+               // monitor.worked(1);
+               // return;
+               // }
+               //
+               // if (overwriteAnswer.equals(IOverwriteQuery.NO_ALL)) {
+               // monitor.worked(1);
+               // overwriteState = OVERWRITE_NONE;
+               // return;
+               // }
+               //
+               // if (overwriteAnswer.equals(IOverwriteQuery.ALL))
+               // overwriteState = OVERWRITE_ALL;
+               // }
+               // }
+
+               try {
+                       setExporters(file);
+                       fExporter1.write(file, fullPath);
+               } catch (IOException e) {
+                       errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0,
+                                       ObfuscatorExportMessages.format(
+                                                       "ObfuscatorTransfer.errorExporting", //$NON-NLS-1$
+                                                       new Object[] { fullPath, e.getMessage() }), e));
+               } catch (CoreException e) {
+                       errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0,
+                                       ObfuscatorExportMessages.format(
+                                                       "ObfuscatorTransfer.errorExporting", //$NON-NLS-1$
+                                                       new Object[] { fullPath, e.getMessage() }), e));
+               }
+
+               fMonitor.worked(1);
+               ModalContext.checkCanceled(fMonitor);
+       }
+
+       /**
+        * Export the passed file to the specified location
+        * 
+        * @param file
+        *            org.eclipse.core.resources.IFile
+        * @param location
+        *            org.eclipse.core.runtime.IPath
+        */
+       protected void exportFile2(IFile file, IPath location)
+                       throws InterruptedException {
+               IPath fullPath = location.append(file.getName());
+               fMonitor.subTask(file.getFullPath().toString());
+               String properPathString = fullPath.toOSString();
+               File targetFile = new File(properPathString);
+
+               if (targetFile.exists()) {
+                       if (!targetFile.canWrite()) {
+                               errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID,
+                                               0, ObfuscatorExportMessages.format(
+                                                               "ObfuscatorTransfer.cannotOverwrite", //$NON-NLS-1$
+                                                               new Object[] { targetFile.getAbsolutePath() }),
+                                               null));
+                               fMonitor.worked(1);
+                               return;
+                       }
+
+                       if (overwriteState == OVERWRITE_NONE)
+                               return;
+
+                       if (overwriteState != OVERWRITE_ALL) {
+                               String overwriteAnswer = fOverwriteCallback
+                                               .queryOverwrite(properPathString);
+
+                               if (overwriteAnswer.equals(IOverwriteQuery.CANCEL))
+                                       throw new InterruptedException();
+
+                               if (overwriteAnswer.equals(IOverwriteQuery.NO)) {
+                                       fMonitor.worked(1);
+                                       return;
+                               }
+
+                               if (overwriteAnswer.equals(IOverwriteQuery.NO_ALL)) {
+                                       fMonitor.worked(1);
+                                       overwriteState = OVERWRITE_NONE;
+                                       return;
+                               }
+
+                               if (overwriteAnswer.equals(IOverwriteQuery.ALL))
+                                       overwriteState = OVERWRITE_ALL;
+                       }
+               }
+
+               try {
+                       setExporters(file);
+                       fExporter2.write(file, fullPath);
+               } catch (IOException e) {
+                       errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0,
+                                       ObfuscatorExportMessages.format(
+                                                       "ObfuscatorTransfer.errorExporting", //$NON-NLS-1$
+                                                       new Object[] { fullPath, e.getMessage() }), e));
+               } catch (CoreException e) {
+                       errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0,
+                                       ObfuscatorExportMessages.format(
+                                                       "ObfuscatorTransfer.errorExporting", //$NON-NLS-1$
+                                                       new Object[] { fullPath, e.getMessage() }), e));
+               }
+
+               fMonitor.worked(1);
+               ModalContext.checkCanceled(fMonitor);
+       }
+
+       protected void exportSpecifiedResources1() throws InterruptedException {
+               Iterator resources = fResourcesToExport.iterator();
+               IPath initPath = (IPath) fPath.clone();
+
+               while (resources.hasNext()) {
+                       IResource currentResource = (IResource) resources.next();
+                       if (!currentResource.isAccessible())
+                               continue;
+                       setExporters(currentResource);
+                       fPath = initPath;
+
+                       if (fResource == null) {
+                               // No root resource specified and creation of containment
+                               // directories
+                               // is required. Create containers from depth 2 onwards (ie.-
+                               // project's
+                               // child inclusive) for each resource being exported.
+                               // if (createLeadupStructure)
+                               // createLeadupDirectoriesFor(currentResource);
+
+                       } else {
+                               // Root resource specified. Must create containment directories
+                               // from this point onwards for each resource being exported
+                               IPath containersToCreate = currentResource.getFullPath()
+                                               .removeFirstSegments(
+                                                               fResource.getFullPath().segmentCount())
+                                               .removeLastSegments(1);
+
+                               for (int i = 0; i < containersToCreate.segmentCount(); i++) {
+                                       fPath = fPath.append(containersToCreate.segment(i));
+                                       fExporter1.createFolder(fPath);
+                               }
+                       }
+
+                       if (currentResource.getType() == IResource.FILE)
+                               exportFile1((IFile) currentResource, fPath);
+                       else {
+                               if (createContainerDirectories) {
+                                       fPath = fPath.append(currentResource.getName());
+                                       fExporter1.createFolder(fPath);
+                               }
+
+                               try {
+                                       exportChildren1(((IContainer) currentResource).members(),
+                                                       fPath);
+                               } catch (CoreException e) {
+                                       // should never happen because #isAccessible is called
+                                       // before #members is invoked,
+                                       // which implicitly does an existence check
+                                       errorTable.add(e.getStatus());
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Export the resources contained in the previously-defined
+        * resourcesToExport collection
+        */
+       protected void exportSpecifiedResources2() throws InterruptedException {
+               Iterator resources = fResourcesToExport.iterator();
+               IPath initPath = (IPath) fPath.clone();
+
+               while (resources.hasNext()) {
+                       IResource currentResource = (IResource) resources.next();
+                       if (!currentResource.isAccessible())
+                               continue;
+                       setExporters(currentResource);
+
+                       fPath = initPath;
+
+                       if (fResource == null) {
+                               // No root resource specified and creation of containment
+                               // directories
+                               // is required. Create containers from depth 2 onwards (ie.-
+                               // project's
+                               // child inclusive) for each resource being exported.
+                               // if (createLeadupStructure)
+                               // createLeadupDirectoriesFor(currentResource);
+
+                       } else {
+                               // Root resource specified. Must create containment directories
+                               // from this point onwards for each resource being exported
+                               IPath containersToCreate = currentResource.getFullPath()
+                                               .removeFirstSegments(
+                                                               fResource.getFullPath().segmentCount())
+                                               .removeLastSegments(1);
+
+                               for (int i = 0; i < containersToCreate.segmentCount(); i++) {
+                                       fPath = fPath.append(containersToCreate.segment(i));
+                                       fExporter2.createFolder(fPath);
+                               }
+                       }
+
+                       if (currentResource.getType() == IResource.FILE)
+                               exportFile2((IFile) currentResource, fPath);
+                       else {
+                               if (createContainerDirectories) {
+                                       fPath = fPath.append(currentResource.getName());
+                                       fExporter2.createFolder(fPath);
+                               }
+
+                               try {
+                                       exportChildren2(((IContainer) currentResource).members(),
+                                                       fPath);
+                               } catch (CoreException e) {
+                                       // should never happen because #isAccessible is called
+                                       // before #members is invoked,
+                                       // which implicitly does an existence check
+                                       errorTable.add(e.getStatus());
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Returns the status of the export operation. If there were any errors, the
+        * result is a status object containing individual status objects for each
+        * error. If there were no errors, the result is a status object with error
+        * code <code>OK</code>.
+        * 
+        * @return the status
+        */
+       public IStatus getStatus() {
+               IStatus[] errors = new IStatus[errorTable.size()];
+               errorTable.toArray(errors);
+               return new MultiStatus(
+                               PlatformUI.PLUGIN_ID,
+                               IStatus.OK,
+                               errors,
+                               ObfuscatorExportMessages
+                                               .getString("ObfuscatorExportOperation.problemsExporting"), //$NON-NLS-1$
+                               null);
+       }
+
+       /**
+        * Answer a boolean indicating whether the passed child is a descendent of
+        * one or more members of the passed resources collection
+        * 
+        * @return boolean
+        * @param resources
+        *            java.util.List
+        * @param child
+        *            org.eclipse.core.resources.IResource
+        */
+       protected boolean isDescendent(List resources, IResource child) {
+               if (child.getType() == IResource.PROJECT)
+                       return false;
+
+               IResource parent = child.getParent();
+               if (resources.contains(parent))
+                       return true;
+
+               return isDescendent(resources, parent);
+       }
+
+       private void setExporters(IResource resource) {
+               if (fCurrentIdentifierMap == null) {
+                       if (fProjectMap == null) {
+                               fProjectMap = new HashMap();
+                       }
+                       createExporters(resource);
+               } else {
+                       IProject project = resource.getProject();
+                       if (!fCurrentProjectName.equals(project.getName())) {
+                               HashMap temp = (HashMap) fProjectMap.get(project.getName());
+                               if (temp != null) {
+                                       fCurrentProjectName = project.getName();
+                                       fCurrentIdentifierMap = temp;
+                                       fExporter1 = new ObfuscatorPass1Exporter(new Scanner(false,
+                                                       false), fCurrentIdentifierMap);
+                                       fExporter2 = new ObfuscatorPass2Exporter(new Scanner(true,
+                                                       true), fCurrentIdentifierMap);
+                                       return;
+                               }
+                               createExporters(resource);
+                       }
+               }
+       }
+
+       private void createExporters(IResource resource) {
+               IProject project = resource.getProject();
+               IPreferenceStore store = PHPeclipsePlugin.getDefault()
+                               .getPreferenceStore();
+               ObfuscatorIgnores ignore = new ObfuscatorIgnores(project);
+               fCurrentIdentifierMap = ignore.getIdentifierMap();
+               fCurrentProjectName = project.getName();
+               fProjectMap.put(fCurrentProjectName, fCurrentIdentifierMap);
+               fExporter1 = new ObfuscatorPass1Exporter(new Scanner(false, false),
+                               fCurrentIdentifierMap);
+               fExporter2 = new ObfuscatorPass2Exporter(new Scanner(true, true),
+                               fCurrentIdentifierMap);
+       }
+
+       /**
+        * Export the resources that were previously specified for export (or if a
+        * single resource was specified then export it recursively)
+        */
+       public void run(IProgressMonitor monitor) throws InterruptedException {
+               this.fMonitor = monitor;
+               final IPath tempPath = (IPath) fPath.clone();
+               if (fResource != null) {
+                       setExporters(fResource);
+                       // if (createLeadupStructure)
+                       // createLeadupDirectoriesFor(resource);
+
+                       if (createContainerDirectories
+                                       && fResource.getType() != IResource.FILE) {
+                               // ensure it's a container
+                               fPath = fPath.append(fResource.getName());
+                               fExporter2.createFolder(fPath);
+                       }
+               }
+
+               try {
+                       // reset variables for this run:
+                       fCurrentIdentifierMap = null;
+                       fProjectMap = null;
+                       fCurrentProjectName = "";
+
+                       // count number of files
+                       int totalWork = IProgressMonitor.UNKNOWN;
+                       try {
+                               if (fResourcesToExport == null) {
+                                       totalWork = countChildrenOf(fResource);
+                               } else {
+                                       totalWork = countSelectedResources();
+                               }
+                       } catch (CoreException e) {
+                               // Should not happen
+                               errorTable.add(e.getStatus());
+                       }
+                       monitor
+                                       .beginTask(
+                                                       ObfuscatorExportMessages
+                                                                       .getString("ObfuscatorTransfer.exportingTitle1"), totalWork); //$NON-NLS-1$
+                       if (fResourcesToExport == null) {
+                               exportAllResources1();
+                       } else {
+                               exportSpecifiedResources1();
+                       }
+
+                       // try {
+                       // if (resourcesToExport == null)
+                       // totalWork = countChildrenOf(resource);
+                       // else
+                       // totalWork = countSelectedResources();
+                       // } catch (CoreException e) {
+                       // // Should not happen
+                       // errorTable.add(e.getStatus());
+                       // }
+
+                       // reset path:
+                       fPath = tempPath;
+                       monitor
+                                       .beginTask(
+                                                       ObfuscatorExportMessages
+                                                                       .getString("ObfuscatorTransfer.exportingTitle2"), totalWork); //$NON-NLS-1$
+                       if (fResourcesToExport == null) {
+                               exportAllResources2();
+                       } else {
+                               exportSpecifiedResources2();
+                       }
+               } finally {
+                       monitor.done();
+               }
+       }
+
+       /**
+        * Set this boolean indicating whether a directory should be created for
+        * Folder resources that are explicitly passed for export
+        * 
+        * @param value
+        *            boolean
+        */
+       // public void setCreateContainerDirectories(boolean value) {
+       // createContainerDirectories = value;
+       // }
+       /**
+        * Set this boolean indicating whether each exported resource's complete
+        * path should include containment hierarchies as dictated by its parents
+        * 
+        * @param value
+        *            boolean
+        */
+       // public void setCreateLeadupStructure(boolean value) {
+       // createLeadupStructure = value;
+       // }
+       /**
+        * Set this boolean indicating whether exported resources should
+        * automatically overwrite existing files when a conflict occurs. If not
+        * query the user.
+        * 
+        * @param value
+        *            boolean
+        */
+       public void setOverwriteFiles(boolean value) {
+               if (value)
+                       overwriteState = OVERWRITE_ALL;
+       }
 }