diff options
author | Xavier Ducrohet <xav@android.com> | 2012-10-10 14:08:50 -0700 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2012-10-10 14:08:51 -0700 |
commit | 3da3b6f8255e5ef9cae9f6e64d54fa8f15b2553f (patch) | |
tree | f8b06eddaa942945a7f4fa01163dafb1a9e5eb41 /eclipse | |
parent | fd0378d1cf71da55a49a50097ac522e0c84060af (diff) | |
parent | 0072bac9da2f60fec9c7f48b17aafd1705094505 (diff) | |
download | sdk-3da3b6f8255e5ef9cae9f6e64d54fa8f15b2553f.zip sdk-3da3b6f8255e5ef9cae9f6e64d54fa8f15b2553f.tar.gz sdk-3da3b6f8255e5ef9cae9f6e64d54fa8f15b2553f.tar.bz2 |
Merge "Lazy loading (and reloading) of project resources."
Diffstat (limited to 'eclipse')
7 files changed, 80 insertions, 79 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java index 5183658..73d183c 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java @@ -323,17 +323,22 @@ public class PreCompilerBuilder extends BaseBuilder { // Notify the ResourceManager: ResourceManager resManager = ResourceManager.getInstance(); - ProjectResources projectResources = resManager.getProjectResources(project); if (ResourceManager.isAutoBuilding()) { + ProjectResources projectResources = resManager.getProjectResources(project); + IdeScanningContext context = new IdeScanningContext(projectResources, project, true); - resManager.processDelta(delta, context); + boolean wasCleared = projectResources.ensureInitialized(); + + if (!wasCleared) { + resManager.processDelta(delta, context); + } // Check whether this project or its dependencies (libraries) have // resources that need compilation - if (context.needsFullAapt()) { + if (wasCleared || context.needsFullAapt()) { mMustCompileResources = true; // Must also call markAaptRequested on the project to not just @@ -735,6 +740,10 @@ public class PreCompilerBuilder extends BaseBuilder { // Also clean up lint EclipseLintClient.clearMarkers(project); + + // clean the project repo + ProjectResources res = ResourceManager.getInstance().getProjectResources(project); + res.clear(); } @Override diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ProjectResources.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ProjectResources.java index ccd1666..68c2257 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ProjectResources.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ProjectResources.java @@ -16,6 +16,7 @@ package com.android.ide.eclipse.adt.internal.resources.manager; +import com.android.SdkConstants; import com.android.annotations.NonNull; import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.resources.IntArrayWrapper; @@ -26,6 +27,7 @@ import com.android.ide.common.resources.configuration.FolderConfiguration; import com.android.ide.eclipse.adt.internal.sdk.ProjectState; import com.android.ide.eclipse.adt.internal.sdk.Sdk; import com.android.ide.eclipse.adt.io.IFolderWrapper; +import com.android.io.IAbstractFolder; import com.android.resources.ResourceType; import com.android.util.Pair; @@ -48,6 +50,7 @@ import java.util.Map.Entry; * on the fly.</li> *</ul> */ +@SuppressWarnings("deprecation") public class ProjectResources extends ResourceRepository { // project resources are defined as 0x7FXX#### where XX is the resource type (layout, drawable, // etc...). Using FF as the type allows for 255 resource types before we get a collision @@ -65,12 +68,18 @@ public class ProjectResources extends ResourceRepository { private final IProject mProject; + public static ProjectResources create(IProject project) { + IFolder resFolder = project.getFolder(SdkConstants.FD_RESOURCES); + + return new ProjectResources(project, new IFolderWrapper(resFolder)); + } + /** * Makes a ProjectResources for a given <var>project</var>. * @param project the project. */ - public ProjectResources(IProject project) { - super(false /*isFrameworkRepository*/); + private ProjectResources(IProject project, IAbstractFolder resFolder) { + super(resFolder, false /*isFrameworkRepository*/); mProject = project; } @@ -85,6 +94,7 @@ public class ProjectResources extends ResourceRepository { @NonNull public Map<ResourceType, Map<String, ResourceValue>> getConfiguredResources( @NonNull FolderConfiguration referenceConfig) { + ensureInitialized(); Map<ResourceType, Map<String, ResourceValue>> resultMap = new EnumMap<ResourceType, Map<String, ResourceValue>>(ResourceType.class); diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ResourceManager.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ResourceManager.java index 1e12861..e407b6a 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ResourceManager.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ResourceManager.java @@ -49,7 +49,6 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.QualifiedName; -import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -151,14 +150,14 @@ public final class ResourceManager { /** * Returns the resources of a project. * @param project The project - * @return a ProjectResources object or null if none was found. + * @return a ProjectResources object */ public ProjectResources getProjectResources(IProject project) { synchronized (mMap) { ProjectResources resources = mMap.get(project); if (resources == null) { - resources = new ProjectResources(project); + resources = ProjectResources.create(project); mMap.put(project, resources); } @@ -253,7 +252,7 @@ public final class ResourceManager { // if it doesn't exist, we create it. if (resources == null) { - resources = new ProjectResources(project); + resources = ProjectResources.create(project); mMap.put(project, resources); } } @@ -491,16 +490,11 @@ public final class ResourceManager { FolderWrapper frameworkRes = new FolderWrapper(osResourcesPath); if (frameworkRes.exists()) { - FrameworkResources resources = new FrameworkResources(); - - try { - resources.loadResources(frameworkRes); - resources.loadPublicResources(frameworkRes, AdtPlugin.getDefault()); - return resources; - } catch (IOException e) { - // since we test that folders are folders, and files are files, this shouldn't - // happen. We can ignore it. - } + FrameworkResources resources = new FrameworkResources(frameworkRes); + + resources.loadResources(); + resources.loadPublicResources(AdtPlugin.getDefault()); + return resources; } return null; @@ -512,62 +506,13 @@ public final class ResourceManager { */ private void createProject(IProject project) { if (project.isOpen()) { - try { - if (project.hasNature(AdtConstants.NATURE_DEFAULT) == false) { - return; - } - } catch (CoreException e1) { - // can't check the nature of the project? ignore it. - return; - } - - IFolder resourceFolder = project.getFolder(SdkConstants.FD_RESOURCES); - - ProjectResources projectResources; synchronized (mMap) { - projectResources = mMap.get(project); + ProjectResources projectResources = mMap.get(project); if (projectResources == null) { - projectResources = new ProjectResources(project); + projectResources = ProjectResources.create(project); mMap.put(project, projectResources); } } - IdeScanningContext context = new IdeScanningContext(projectResources, project, true); - - if (resourceFolder != null && resourceFolder.exists()) { - try { - IResource[] resources = resourceFolder.members(); - - for (IResource res : resources) { - if (res.getType() == IResource.FOLDER) { - IFolder folder = (IFolder)res; - ResourceFolder resFolder = projectResources.processFolder( - new IFolderWrapper(folder)); - - if (resFolder != null) { - // now we process the content of the folder - IResource[] files = folder.members(); - - for (IResource fileRes : files) { - if (fileRes.getType() == IResource.FILE) { - IFile file = (IFile)fileRes; - - context.startScanning(file); - - resFolder.processFile(new IFileWrapper(file), - ResourceHelper.getResourceDeltaKind( - IResourceDelta.ADDED), context); - - context.finishScanning(file); - } - } - } - } - } - } catch (CoreException e) { - // This happens if the project is closed or if the folder doesn't exist. - // Since we already test for that, we can ignore this exception. - } - } } } diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/layoutRendering/ApiDemosRenderingTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/layoutRendering/ApiDemosRenderingTest.java index 5cb5647..30f23de 100644 --- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/layoutRendering/ApiDemosRenderingTest.java +++ b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/layoutRendering/ApiDemosRenderingTest.java @@ -26,6 +26,7 @@ import com.android.ide.common.rendering.api.ResourceReference; import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.rendering.api.SessionParams; import com.android.ide.common.rendering.api.SessionParams.RenderingMode; +import com.android.ide.common.resources.ResourceItem; import com.android.ide.common.resources.ResourceRepository; import com.android.ide.common.resources.ResourceResolver; import com.android.ide.common.resources.configuration.DensityQualifier; @@ -43,7 +44,6 @@ import com.android.ide.common.resources.configuration.SmallestScreenWidthQualifi import com.android.ide.common.resources.configuration.TextInputMethodQualifier; import com.android.ide.common.resources.configuration.TouchScreenQualifier; import com.android.ide.common.sdk.LoadStatus; -import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources; import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager; import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData; import com.android.ide.eclipse.tests.SdkTestCase; @@ -215,8 +215,13 @@ public class ApiDemosRenderingTest extends SdkTestCase { ResourceRepository framework = ResourceManager.getInstance().loadFrameworkResources(target); // now load the project resources - ProjectResources project = new ProjectResources(null /*project*/); - project.loadResources(resFolder); + ResourceRepository project = new ResourceRepository(resFolder, false) { + @Override + protected ResourceItem createResourceItem(String name) { + return new ResourceItem(name); + } + + }; // Create a folder configuration that will be used for the rendering: FolderConfiguration config = getConfiguration(); diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttributeInfoTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttributeInfoTest.java index 7ae96a8..cde12e5 100644 --- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttributeInfoTest.java +++ b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttributeInfoTest.java @@ -18,11 +18,15 @@ package com.android.ide.common.resources.platform; import static com.android.SdkConstants.ANDROID_URI; import static com.android.SdkConstants.DOT_XML; +import com.android.SdkConstants; import com.android.annotations.NonNull; import com.android.ide.common.api.IAttributeInfo.Format; import com.android.ide.common.resources.ResourceItem; import com.android.ide.common.resources.ResourceRepository; import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities; +import com.android.ide.eclipse.mock.Mocks; +import com.android.io.IAbstractFolder; +import com.android.io.IAbstractResource; import com.android.resources.ResourceType; import com.android.utils.StdLogger; import com.google.common.base.Charsets; @@ -219,11 +223,14 @@ public class AttributeInfoTest extends TestCase { } public void testResourcesExist() throws Exception { + IAbstractFolder folder = Mocks.createAbstractFolder( + SdkConstants.FD_RESOURCES, new IAbstractResource[0]); + AttributeInfo info = new AttributeInfo("test", Format.REFERENCE_SET); - TestResourceRepository projectResources = new TestResourceRepository(false); + TestResourceRepository projectResources = new TestResourceRepository(folder,false); projectResources.addResource(ResourceType.STRING, "mystring"); projectResources.addResource(ResourceType.DIMEN, "mydimen"); - TestResourceRepository frameworkResources = new TestResourceRepository(true); + TestResourceRepository frameworkResources = new TestResourceRepository(folder, true); frameworkResources.addResource(ResourceType.LAYOUT, "mylayout"); assertTrue(info.isValid("@string/mystring", null, null)); @@ -247,8 +254,8 @@ public class AttributeInfoTest extends TestCase { private class TestResourceRepository extends ResourceRepository { private Multimap<ResourceType, String> mResources = ArrayListMultimap.create(); - protected TestResourceRepository(boolean isFrameworkRepository) { - super(isFrameworkRepository); + protected TestResourceRepository(IAbstractFolder resFolder, boolean isFrameworkRepository) { + super(resFolder, isFrameworkRepository); } void addResource(ResourceType type, String name) { diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/resources/manager/ConfigMatchTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/resources/manager/ConfigMatchTest.java index b45242b..a6da135 100644 --- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/resources/manager/ConfigMatchTest.java +++ b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/resources/manager/ConfigMatchTest.java @@ -16,8 +16,10 @@ package com.android.ide.eclipse.adt.internal.editors.resources.manager; +import com.android.SdkConstants; import com.android.ide.common.resources.ResourceFile; import com.android.ide.common.resources.ResourceFolder; +import com.android.ide.common.resources.ResourceItem; import com.android.ide.common.resources.ResourceRepository; import com.android.ide.common.resources.SingleResourceFile; import com.android.ide.common.resources.configuration.FolderConfiguration; @@ -25,6 +27,8 @@ import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources; import com.android.ide.eclipse.adt.io.IFileWrapper; import com.android.ide.eclipse.adt.io.IFolderWrapper; import com.android.ide.eclipse.mock.Mocks; +import com.android.io.IAbstractFolder; +import com.android.io.IAbstractResource; import com.android.resources.Keyboard; import com.android.resources.KeyboardState; import com.android.resources.Navigation; @@ -46,7 +50,7 @@ public class ConfigMatchTest extends TestCase { private static final String MISC2_FILENAME = "bar.xml"; //$NON-NLS-1$ private FolderConfiguration mDefaultConfig; - private ProjectResources mResources; + private ResourceRepository mResources; private FolderConfiguration config4; private FolderConfiguration config3; private FolderConfiguration config2; @@ -60,8 +64,16 @@ public class ConfigMatchTest extends TestCase { mDefaultConfig = new FolderConfiguration(); mDefaultConfig.createDefault(); + IAbstractFolder folder = Mocks.createAbstractFolder( + SdkConstants.FD_RESOURCES, new IAbstractResource[0]); + // create the project resources. - mResources = new ProjectResources(null /*project*/); + mResources = new ResourceRepository(folder, false) { + @Override + protected ResourceItem createResourceItem(String name) { + return new ResourceItem(name); + } + }; // create 2 arrays of IResource. one with the filename being looked up, and one without. // Since the required API uses IResource, we can use MockFolder for them. diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/mock/Mocks.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/mock/Mocks.java index b57f3da..65e2144 100644 --- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/mock/Mocks.java +++ b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/mock/Mocks.java @@ -25,6 +25,9 @@ import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.isA; import static org.easymock.EasyMock.replay; +import com.android.io.IAbstractFolder; +import com.android.io.IAbstractResource; + import org.easymock.Capture; import org.easymock.EasyMock; import org.easymock.IAnswer; @@ -145,6 +148,16 @@ public class Mocks { return file; } + public static IAbstractFolder createAbstractFolder(String name, IAbstractResource[] members) { + IAbstractFolder folder = createNiceMock(IAbstractFolder.class); + expect(folder.getName()).andReturn(name).anyTimes(); + // expect(file.getLocation()).andReturn(new Path(name)).anyTimes(); + expect(folder.listMembers()).andReturn(members).anyTimes(); + replay(folder); + + return folder; + } + /** * Mock implementation of {@link IProject}. * <p/> |