OSDN Git Service

Fix issues related to the new output folder for ADT and JDT.
authorXavier Ducrohet <xav@android.com>
Thu, 18 Aug 2011 02:07:53 +0000 (19:07 -0700)
committerXavier Ducrohet <xav@android.com>
Thu, 18 Aug 2011 02:30:25 +0000 (19:30 -0700)
The android output folder is hard-coded to bin/ for now
The Java output folder is hard-coded to bin/classes.

Projects that are opened and that don't have that exact setup
are converted.

Also make sure bin/res is created when the builders are run.

Change-Id: Id5de887710ed951b53218a73e5962a9b079cb176

eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ResourceManagerBuilder.java
eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/BaseProjectHelper.java
eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java

index 856d3fc..630a83b 100644 (file)
@@ -211,6 +211,15 @@ public class ResourceManagerBuilder extends BaseBuilder {
             project.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 10));
         }
 
+        // check that we have bin/res/
+        IFolder androidOutput = BaseProjectHelper.getAndroidOutputFolder(project);
+        IFolder binResFolder = androidOutput.getFolder(SdkConstants.FD_RESOURCES);
+        if (binResFolder.exists() == false) {
+            binResFolder.create(true /* force */, true /* local */,
+                    new SubProgressMonitor(monitor, 10));
+            project.refreshLocal(IResource.DEPTH_ONE, new SubProgressMonitor(monitor, 10));
+        }
+
         // Check the preference to be sure we are supposed to refresh
         // the folders.
         if (AdtPrefs.getPrefs().getBuildForceResResfresh()) {
index f2242e0..b1a4725 100644 (file)
@@ -18,6 +18,7 @@ package com.android.ide.eclipse.adt.internal.project;
 
 import com.android.ide.eclipse.adt.AdtConstants;
 import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.sdklib.SdkConstants;
 
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IMarker;
@@ -497,23 +498,7 @@ public final class BaseProjectHelper {
     public final static IFolder getAndroidOutputFolder(IProject project) {
         try {
             if (project.isOpen() && project.hasNature(JavaCore.NATURE_ID)) {
-                // get a java project from the normal project object
-                IJavaProject javaProject = JavaCore.create(project);
-
-                IPath path = javaProject.getOutputLocation();
-                IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-                IResource outputResource = wsRoot.findMember(path);
-
-                if (outputResource != null) { // really shouldn't happen
-                    // if the output folder is directly a child of the project,
-                    // then use it directly.
-                    if (outputResource.getParent().equals(project)) {
-                        return (IFolder) outputResource;
-                    }
-
-                    // otherwise returns the parent folder of the java output folder.
-                    return (IFolder) outputResource.getParent();
-                }
+                return project.getFolder(SdkConstants.FD_OUTPUT);
             }
         } catch (JavaModelException e) {
             // Let's do nothing and return null
index 6d476d9..d7c7099 100644 (file)
@@ -862,35 +862,41 @@ public final class Sdk  {
 
             // convert older projects which use bin as the eclipse output folder into projects
             // using bin/classes
-            IFolder javaOutput = BaseProjectHelper.getJavaOutputFolder(openedProject);
-            IFolder androidOutput = BaseProjectHelper.getAndroidOutputFolder(openedProject);
-            if (javaOutput.equals(androidOutput)) {
-                final IFolder newJavaOutput = javaOutput.getFolder(SdkConstants.FD_CLASSES_OUTPUT);
-                if (newJavaOutput.exists() == false) {
-                    Job job = new Job("Project bin convertion") {
-                        @Override
-                        protected IStatus run(IProgressMonitor monitor) {
-                            try {
-                                newJavaOutput.create(true /*force*/, true /*local*/,
-                                        monitor);
-
-                                // set the java output to this project.
-                                IJavaProject javaProject = JavaCore.create(openedProject);
-                                javaProject.setOutputLocation(newJavaOutput.getFullPath(),
-                                        monitor);
-
-                                openedProject.build(IncrementalProjectBuilder.CLEAN_BUILD, monitor);
-                            } catch (CoreException e) {
-                                return e.getStatus();
+            final IFolder androidOutput = BaseProjectHelper.getAndroidOutputFolder(openedProject);
+            final IFolder javaOutput = BaseProjectHelper.getJavaOutputFolder(openedProject);
+            if (androidOutput.exists() == false ||
+                    javaOutput.getParent().equals(androidOutput) == false) {
+                // get what we want as the new java output.
+                final IFolder newJavaOutput = androidOutput.getFolder(
+                        SdkConstants.FD_CLASSES_OUTPUT);
+
+                // start a job to do resource change (which can't be done in that callback.)
+                Job job = new Job("Project bin convertion") {
+                    @Override
+                    protected IStatus run(IProgressMonitor monitor) {
+                        try {
+                            if (androidOutput.exists() == false) {
+                                androidOutput.create(true /*force*/, true /*local*/, monitor);
+                            }
+
+                            if (newJavaOutput.exists() == false) {
+                                newJavaOutput.create(true /*force*/, true /*local*/, monitor);
                             }
 
-                            return Status.OK_STATUS;
+                            // set the java output to this project.
+                            IJavaProject javaProject = JavaCore.create(openedProject);
+                            javaProject.setOutputLocation(newJavaOutput.getFullPath(), monitor);
+
+                            openedProject.build(IncrementalProjectBuilder.CLEAN_BUILD, monitor);
+                        } catch (CoreException e) {
+                            return e.getStatus();
                         }
-                    };
-                    job.setPriority(Job.BUILD); // build jobs are run after other interactive jobs
-                    job.schedule();
 
-                }
+                        return Status.OK_STATUS;
+                    }
+                };
+                job.setPriority(Job.BUILD); // build jobs are run after other interactive jobs
+                job.schedule();
             }