aboutsummaryrefslogtreecommitdiffstats
path: root/eclipse
diff options
context:
space:
mode:
authorXavier Ducrohet <xav@android.com>2012-10-10 14:08:50 -0700
committerGerrit Code Review <noreply-gerritcodereview@google.com>2012-10-10 14:08:51 -0700
commit3da3b6f8255e5ef9cae9f6e64d54fa8f15b2553f (patch)
treef8b06eddaa942945a7f4fa01163dafb1a9e5eb41 /eclipse
parentfd0378d1cf71da55a49a50097ac522e0c84060af (diff)
parent0072bac9da2f60fec9c7f48b17aafd1705094505 (diff)
downloadsdk-3da3b6f8255e5ef9cae9f6e64d54fa8f15b2553f.zip
sdk-3da3b6f8255e5ef9cae9f6e64d54fa8f15b2553f.tar.gz
sdk-3da3b6f8255e5ef9cae9f6e64d54fa8f15b2553f.tar.bz2
Merge "Lazy loading (and reloading) of project resources."
Diffstat (limited to 'eclipse')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java15
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ProjectResources.java14
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ResourceManager.java75
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/layoutRendering/ApiDemosRenderingTest.java11
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttributeInfoTest.java15
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/resources/manager/ConfigMatchTest.java16
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/mock/Mocks.java13
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/>