ResourceManagerBuilder.java revision 96ab96b1964cd20588834a8d81e74db7b3f3a5d8
155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/*
255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Licensed under the Eclipse Public License, Version 1.0 (the "License");
555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * you may not use this file except in compliance with the License.
655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * You may obtain a copy of the License at
755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *      http://www.eclipse.org/org/documents/epl-v10.php
955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
1055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * See the License for the specific language governing permissions and
1455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * limitations under the License.
1555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
1655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1785211cd176c655f245e46b753926089adaf2a6fdXavier Ducrohetpackage com.android.ide.eclipse.adt.internal.build;
1855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ide.eclipse.adt.AdtPlugin;
2085211cd176c655f245e46b753926089adaf2a6fdXavier Ducrohetimport com.android.ide.eclipse.adt.AndroidConstants;
21b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohetimport com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
22b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohetimport com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
23f2880494706ad8dfd43e21471096216be4ca7c69Xavier Ducrohetimport com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
2499b9ad2143e5e9e626879309ecc6f883403bdcaeXavier Ducrohetimport com.android.ide.eclipse.adt.internal.project.ProjectHelper;
25f2880494706ad8dfd43e21471096216be4ca7c69Xavier Ducrohetimport com.android.ide.eclipse.adt.internal.sdk.Sdk;
2655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.sdklib.IAndroidTarget;
2767dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Projectimport com.android.sdklib.SdkConstants;
2855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
2955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.resources.IFolder;
3055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.resources.IMarker;
3155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.resources.IProject;
3255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.resources.IResource;
3367dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Projectimport org.eclipse.core.resources.IWorkspaceRoot;
3467dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Projectimport org.eclipse.core.resources.ResourcesPlugin;
3555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.runtime.CoreException;
3667dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Projectimport org.eclipse.core.runtime.IPath;
3755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.runtime.IProgressMonitor;
3867dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Projectimport org.eclipse.core.runtime.SubProgressMonitor;
3967dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Projectimport org.eclipse.jdt.core.IClasspathEntry;
4067dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Projectimport org.eclipse.jdt.core.IJavaProject;
4167dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Projectimport org.eclipse.jdt.core.JavaCore;
4255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
4367dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Projectimport java.util.ArrayList;
4455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.util.Map;
4555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
4655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/**
4755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Resource manager builder whose only purpose is to refresh the resource folder
4855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * so that the other builder use an up to date version.
4955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
5055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectpublic class ResourceManagerBuilder extends BaseBuilder {
5155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
5255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final String ID = "com.android.ide.eclipse.adt.ResourceManagerBuilder"; //$NON-NLS-1$
5355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
5455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public ResourceManagerBuilder() {
5555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        super();
5655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
5755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
589a68767a27170689fd647276cb0b082d192448fdXavier Ducrohet    @Override
599a68767a27170689fd647276cb0b082d192448fdXavier Ducrohet    protected void clean(IProgressMonitor monitor) throws CoreException {
609a68767a27170689fd647276cb0b082d192448fdXavier Ducrohet        super.clean(monitor);
619a68767a27170689fd647276cb0b082d192448fdXavier Ducrohet
629a68767a27170689fd647276cb0b082d192448fdXavier Ducrohet        // Get the project.
639a68767a27170689fd647276cb0b082d192448fdXavier Ducrohet        IProject project = getProject();
649a68767a27170689fd647276cb0b082d192448fdXavier Ducrohet
659a68767a27170689fd647276cb0b082d192448fdXavier Ducrohet        // Clear the project of the generic markers
669a68767a27170689fd647276cb0b082d192448fdXavier Ducrohet        removeMarkersFromProject(project, AndroidConstants.MARKER_ADT);
679a68767a27170689fd647276cb0b082d192448fdXavier Ducrohet    }
689a68767a27170689fd647276cb0b082d192448fdXavier Ducrohet
6955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    // build() returns a list of project from which this project depends for future compilation.
700cae8d05fb387d895254779475fe15d39fe322abRicky Ng-Adam    @SuppressWarnings("unchecked")
7155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @Override
7255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    protected IProject[] build(int kind, Map args, IProgressMonitor monitor)
7355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            throws CoreException {
7455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // Get the project.
7555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        IProject project = getProject();
769e2ff90642669592f832d9f1cb56cc6871d5aaabXavier Ducrohet        IJavaProject javaProject = JavaCore.create(project);
7755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
7855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // Clear the project of the generic markers
79b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet        removeMarkersFromProject(project, AndroidConstants.MARKER_ADT);
802fb27a8d7f3c4636c775377cd09fa6b00c077440Xavier Ducrohet
8167dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        // check for existing target marker, in which case we abort.
8267dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        // (this means: no SDK, no target, or unresolvable target.)
839e2ff90642669592f832d9f1cb56cc6871d5aaabXavier Ducrohet        abortOnBadSetup(javaProject);
8455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
8555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // Check the compiler compliance level, displaying the error message
8655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // since this is the first builder.
8755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        int res = ProjectHelper.checkCompilerCompliance(project);
8855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        String errorMessage = null;
8955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        switch (res) {
9055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            case ProjectHelper.COMPILER_COMPLIANCE_LEVEL:
9155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                errorMessage = Messages.Requires_Compiler_Compliance_5;
9255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            case ProjectHelper.COMPILER_COMPLIANCE_SOURCE:
9355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                errorMessage = Messages.Requires_Source_Compatibility_5;
9455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            case ProjectHelper.COMPILER_COMPLIANCE_CODEGEN_TARGET:
9555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                errorMessage = Messages.Requires_Class_Compatibility_5;
9655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
9755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
9855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (errorMessage != null) {
99b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet            markProject(AndroidConstants.MARKER_ADT, errorMessage, IMarker.SEVERITY_ERROR);
10055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            AdtPlugin.printErrorToConsole(project, errorMessage);
1012fb27a8d7f3c4636c775377cd09fa6b00c077440Xavier Ducrohet
10255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // interrupt the build. The next builders will not run.
10355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            stopBuild(errorMessage);
10455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
10555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
10655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // Check that the SDK directory has been setup.
10755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        String osSdkFolder = AdtPlugin.getOsSdkFolder();
10855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
10955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (osSdkFolder == null || osSdkFolder.length() == 0) {
11067dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            AdtPlugin.printErrorToConsole(project, Messages.No_SDK_Setup_Error);
111b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet            markProject(AndroidConstants.MARKER_ADT, Messages.No_SDK_Setup_Error,
11255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    IMarker.SEVERITY_ERROR);
11355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
11455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // This interrupts the build. The next builders will not run.
11555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            stopBuild(Messages.No_SDK_Setup_Error);
11655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
11755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
11855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // check the project has a target
11955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        IAndroidTarget projectTarget = Sdk.getCurrent().getTarget(project);
12055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (projectTarget == null) {
12155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // no target. marker has been set by the container initializer: exit silently.
12255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // This interrupts the build. The next builders will not run.
12355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            stopBuild("Project has no target");
12455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
1252fb27a8d7f3c4636c775377cd09fa6b00c077440Xavier Ducrohet
12667dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        // check the 'gen' source folder is present
12767dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        boolean hasGenSrcFolder = false; // whether the project has a 'gen' source folder setup
1282fb27a8d7f3c4636c775377cd09fa6b00c077440Xavier Ducrohet
12967dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        IClasspathEntry[] classpaths = javaProject.readRawClasspath();
13067dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        if (classpaths != null) {
13167dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            for (IClasspathEntry e : classpaths) {
13267dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                if (e.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
13367dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                    IPath path = e.getPath();
13467dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                    if (path.segmentCount() == 2 &&
13567dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                            path.segment(1).equals(SdkConstants.FD_GEN_SOURCES)) {
13667dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                        hasGenSrcFolder = true;
13767dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                        break;
13867dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                    }
13967dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                }
14067dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            }
14167dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        }
14267dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project
14367dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        boolean genFolderPresent = false; // whether the gen folder actually exists
14467dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        IResource resource = project.findMember(SdkConstants.FD_GEN_SOURCES);
14567dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        genFolderPresent = resource != null && resource.exists();
1462fb27a8d7f3c4636c775377cd09fa6b00c077440Xavier Ducrohet
14767dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        if (hasGenSrcFolder == false && genFolderPresent) {
14867dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            // No source folder setup for 'gen' in the project, but there's already a
14967dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            // 'gen' resource (file or folder).
15067dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            String message;
15167dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            if (resource.getType() == IResource.FOLDER) {
15267dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                // folder exists already! This is an error. If the folder had been created
15367dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                // by the NewProjectWizard, it'd be a source folder.
15467dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                message = String.format("%1$s already exists but is not a source folder. Convert to a source folder or rename it.",
15567dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                        resource.getFullPath().toString());
15667dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            } else {
15767dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                // resource exists but is not a folder.
15867dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                message = String.format(
15967dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                        "Resource %1$s is in the way. ADT needs a source folder called 'gen' to work. Rename or delete resource.",
16067dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                        resource.getFullPath().toString());
16167dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            }
16267dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project
16367dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            AdtPlugin.printErrorToConsole(project, message);
164b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet            markProject(AndroidConstants.MARKER_ADT, message, IMarker.SEVERITY_ERROR);
16567dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project
16667dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            // This interrupts the build. The next builders will not run.
16767dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            stopBuild(message);
16867dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        } else if (hasGenSrcFolder == false || genFolderPresent == false) {
16967dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            // either there is no 'gen' source folder in the project (older SDK),
17067dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            // or the folder does not exist (was deleted, or was a fresh svn checkout maybe.)
17167dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project
17267dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            // In case we are migrating from an older SDK, we go through the current source
17367dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            // folders and delete the generated Java files.
17467dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            ArrayList<IPath> sourceFolders = BaseProjectHelper.getSourceClasspaths(javaProject);
17567dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
17667dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            for (IPath path : sourceFolders) {
17767dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                IResource member = root.findMember(path);
17867dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                if (member != null) {
17967dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                    removeDerivedResources(member, monitor);
18067dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                }
18167dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            }
18267dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project
18367dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            // create the new source folder, if needed
18467dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            IFolder genFolder = project.getFolder(SdkConstants.FD_GEN_SOURCES);
18567dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            if (genFolderPresent == false) {
186b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
18767dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                        "Creating 'gen' source folder for generated Java files");
18867dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                genFolder.create(true /* force */, true /* local */,
18967dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                        new SubProgressMonitor(monitor, 10));
19045aacc49a96e083eb68cda88ed0f7e262b7254d1The Android Open Source Project                genFolder.setDerived(true);
19167dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            }
1922fb27a8d7f3c4636c775377cd09fa6b00c077440Xavier Ducrohet
19367dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            // add it to the source folder list, if needed only (or it will throw)
19467dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            if (hasGenSrcFolder == false) {
19567dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                IClasspathEntry[] entries = javaProject.getRawClasspath();
19667dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                entries = ProjectHelper.addEntryToClasspath(entries,
19767dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                        JavaCore.newSourceEntry(genFolder.getFullPath()));
19867dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project                javaProject.setRawClasspath(entries, new SubProgressMonitor(monitor, 10));
19967dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            }
2002fb27a8d7f3c4636c775377cd09fa6b00c077440Xavier Ducrohet
20196ab96b1964cd20588834a8d81e74db7b3f3a5d8Raphael            // refresh sepcifcally the gen folder first, as it may break the build
20296ab96b1964cd20588834a8d81e74db7b3f3a5d8Raphael            // if it doesn't arrive in time then refresh the whole project as usual.
20396ab96b1964cd20588834a8d81e74db7b3f3a5d8Raphael            genFolder.refreshLocal(IResource.DEPTH_ZERO, new SubProgressMonitor(monitor, 10));
20467dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project            project.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 10));
20567dc23a61d888ba1b39fe6ed23d9f4d1a3df80eeThe Android Open Source Project        }
20655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
20755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // Check the preference to be sure we are supposed to refresh
20855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // the folders.
209b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet        if (AdtPrefs.getPrefs().getBuildForceResResfresh()) {
210b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet            AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project, Messages.Refreshing_Res);
21155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
21255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // refresh the res folder.
213b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet            IFolder resFolder = project.getFolder(AndroidConstants.WS_RESOURCES);
21455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            resFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor);
21555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
21655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // Also refresh the assets folder to make sure the ApkBuilder
21755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // will now it's changed and will force a new resource packaging.
218b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet            IFolder assetsFolder = project.getFolder(AndroidConstants.WS_ASSETS);
21955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            assetsFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor);
22055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
22155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
22255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return null;
22355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
22455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project}
225