* IBM Corporation - initial API and implementation
*******************************************************************************/
package net.sourceforge.phpeclipse.obfuscator.export;
-
+
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
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;
+ }
}