aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidTargetParser.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidTargetParser.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidTargetParser.java605
1 files changed, 0 insertions, 605 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidTargetParser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidTargetParser.java
deleted file mode 100644
index 9a1fd3dc9..000000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidTargetParser.java
+++ /dev/null
@@ -1,605 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Eclipse Public License, Version 1.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.eclipse.org/org/documents/epl-v10.php
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ide.eclipse.adt.internal.sdk;
-
-import com.android.SdkConstants;
-import com.android.ide.common.rendering.LayoutLibrary;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.platform.AttrsXmlParser;
-import com.android.ide.common.resources.platform.DeclareStyleableInfo;
-import com.android.ide.common.resources.platform.ViewClassInfo;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.animator.AnimDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.animator.AnimatorDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.color.ColorDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.drawable.DrawableDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.LayoutDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.menu.descriptors.MenuDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.otherxml.descriptors.OtherXmlDescriptors;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubMonitor;
-
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.management.InvalidAttributeValueException;
-
-/**
- * Parser for the platform data in an SDK.
- * <p/>
- * This gather the following information:
- * <ul>
- * <li>Resource ID from <code>android.R</code></li>
- * <li>The list of permissions values from <code>android.Manifest$permission</code></li>
- * <li></li>
- * </ul>
- */
-public final class AndroidTargetParser {
-
- private static final String TAG = "Framework Resource Parser";
- private final IAndroidTarget mAndroidTarget;
-
- /**
- * Creates a platform data parser.
- */
- public AndroidTargetParser(IAndroidTarget platformTarget) {
- mAndroidTarget = platformTarget;
- }
-
- /**
- * Parses the framework, collects all interesting information and stores them in the
- * {@link IAndroidTarget} given to the constructor.
- *
- * @param monitor A progress monitor. Can be null. Caller is responsible for calling done.
- * @return True if the SDK path was valid and parsing has been attempted.
- */
- public IStatus run(IProgressMonitor monitor) {
- try {
- SubMonitor progress = SubMonitor.convert(monitor,
- String.format("Parsing SDK %1$s", mAndroidTarget.getName()),
- 16);
-
- AndroidTargetData targetData = new AndroidTargetData(mAndroidTarget);
-
- // parse the rest of the data.
-
- AndroidJarLoader classLoader =
- new AndroidJarLoader(mAndroidTarget.getPath(IAndroidTarget.ANDROID_JAR));
-
- preload(classLoader, progress.newChild(40, SubMonitor.SUPPRESS_NONE));
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- // get the permissions
- progress.subTask("Permissions");
- String[] permissionValues = collectPermissions(classLoader);
- progress.worked(1);
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- // get the action and category values for the Intents.
- progress.subTask("Intents");
- ArrayList<String> activity_actions = new ArrayList<String>();
- ArrayList<String> broadcast_actions = new ArrayList<String>();
- ArrayList<String> service_actions = new ArrayList<String>();
- ArrayList<String> categories = new ArrayList<String>();
- collectIntentFilterActionsAndCategories(activity_actions, broadcast_actions,
- service_actions, categories);
- progress.worked(1);
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- // gather the attribute definition
- progress.subTask("Attributes definitions");
- AttrsXmlParser attrsXmlParser = new AttrsXmlParser(
- mAndroidTarget.getPath(IAndroidTarget.ATTRIBUTES),
- AdtPlugin.getDefault(),
- 1000);
- attrsXmlParser.preload();
-
- progress.worked(1);
-
- progress.subTask("Manifest definitions");
- AttrsXmlParser attrsManifestXmlParser = new AttrsXmlParser(
- mAndroidTarget.getPath(IAndroidTarget.MANIFEST_ATTRIBUTES),
- attrsXmlParser,
- AdtPlugin.getDefault(), 1100);
- attrsManifestXmlParser.preload();
- progress.worked(1);
-
- Collection<ViewClassInfo> mainList = new ArrayList<ViewClassInfo>();
- Collection<ViewClassInfo> groupList = new ArrayList<ViewClassInfo>();
-
- // collect the layout/widgets classes
- progress.subTask("Widgets and layouts");
- collectLayoutClasses(classLoader, attrsXmlParser, mainList, groupList,
- progress.newChild(1));
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- ViewClassInfo[] layoutViewsInfo = mainList.toArray(
- new ViewClassInfo[mainList.size()]);
- ViewClassInfo[] layoutGroupsInfo = groupList.toArray(
- new ViewClassInfo[groupList.size()]);
- mainList.clear();
- groupList.clear();
-
- // collect the preferences classes.
- collectPreferenceClasses(classLoader, attrsXmlParser, mainList, groupList,
- progress.newChild(1));
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- ViewClassInfo[] preferencesInfo = mainList.toArray(new ViewClassInfo[mainList.size()]);
- ViewClassInfo[] preferenceGroupsInfo = groupList.toArray(
- new ViewClassInfo[groupList.size()]);
-
- Map<String, DeclareStyleableInfo> xmlMenuMap = collectMenuDefinitions(attrsXmlParser);
- Map<String, DeclareStyleableInfo> xmlSearchableMap = collectSearchableDefinitions(
- attrsXmlParser);
- Map<String, DeclareStyleableInfo> manifestMap = collectManifestDefinitions(
- attrsManifestXmlParser);
- Map<String, Map<String, Integer>> enumValueMap = attrsXmlParser.getEnumFlagValues();
-
- Map<String, DeclareStyleableInfo> xmlAppWidgetMap = null;
- if (mAndroidTarget.getVersion().getApiLevel() >= 3) {
- xmlAppWidgetMap = collectAppWidgetDefinitions(attrsXmlParser);
- }
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- // From the information that was collected, create the pieces that will be put in
- // the PlatformData object.
- AndroidManifestDescriptors manifestDescriptors = new AndroidManifestDescriptors();
- manifestDescriptors.updateDescriptors(manifestMap);
- progress.worked(1);
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- LayoutDescriptors layoutDescriptors = new LayoutDescriptors();
- layoutDescriptors.updateDescriptors(layoutViewsInfo, layoutGroupsInfo,
- attrsXmlParser.getDeclareStyleableList(), mAndroidTarget);
- progress.worked(1);
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- MenuDescriptors menuDescriptors = new MenuDescriptors();
- menuDescriptors.updateDescriptors(xmlMenuMap);
- progress.worked(1);
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- OtherXmlDescriptors otherXmlDescriptors = new OtherXmlDescriptors();
- otherXmlDescriptors.updateDescriptors(
- xmlSearchableMap,
- xmlAppWidgetMap,
- preferencesInfo,
- preferenceGroupsInfo);
- progress.worked(1);
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- DrawableDescriptors drawableDescriptors = new DrawableDescriptors();
- Map<String, DeclareStyleableInfo> map = attrsXmlParser.getDeclareStyleableList();
- drawableDescriptors.updateDescriptors(map);
- progress.worked(1);
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- AnimatorDescriptors animatorDescriptors = new AnimatorDescriptors();
- animatorDescriptors.updateDescriptors(map);
- progress.worked(1);
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- AnimDescriptors animDescriptors = new AnimDescriptors();
- animDescriptors.updateDescriptors(map);
- progress.worked(1);
-
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
-
- ColorDescriptors colorDescriptors = new ColorDescriptors();
- colorDescriptors.updateDescriptors(map);
- progress.worked(1);
-
- // load the framework resources.
- ResourceRepository frameworkResources =
- ResourceManager.getInstance().loadFrameworkResources(mAndroidTarget);
- progress.worked(1);
-
- // now load the layout lib bridge
- LayoutLibrary layoutBridge = LayoutLibrary.load(
- mAndroidTarget.getPath(IAndroidTarget.LAYOUT_LIB),
- AdtPlugin.getDefault(),
- "ADT plug-in");
-
- progress.worked(1);
-
- // and finally create the PlatformData with all that we loaded.
- targetData.setExtraData(
- manifestDescriptors,
- layoutDescriptors,
- menuDescriptors,
- otherXmlDescriptors,
- drawableDescriptors,
- animatorDescriptors,
- animDescriptors,
- colorDescriptors,
- enumValueMap,
- permissionValues,
- activity_actions.toArray(new String[activity_actions.size()]),
- broadcast_actions.toArray(new String[broadcast_actions.size()]),
- service_actions.toArray(new String[service_actions.size()]),
- categories.toArray(new String[categories.size()]),
- mAndroidTarget.getPlatformLibraries(),
- mAndroidTarget.getOptionalLibraries(),
- frameworkResources,
- layoutBridge);
-
- targetData.setAttributeMap(attrsXmlParser.getAttributeMap());
-
- Sdk.getCurrent().setTargetData(mAndroidTarget, targetData);
-
- return Status.OK_STATUS;
- } catch (Exception e) {
- AdtPlugin.logAndPrintError(e, TAG, "SDK parser failed"); //$NON-NLS-1$
- AdtPlugin.printToConsole("SDK parser failed", e.getMessage());
- return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, "SDK parser failed", e);
- }
- }
-
- /**
- * Preloads all "interesting" classes from the framework SDK jar.
- * <p/>
- * Currently this preloads all classes from the framework jar
- *
- * @param classLoader The framework SDK jar classloader
- * @param monitor A progress monitor. Can be null. Caller is responsible for calling done.
- */
- private void preload(AndroidJarLoader classLoader, IProgressMonitor monitor) {
- try {
- classLoader.preLoadClasses("" /* all classes */, //$NON-NLS-1$
- mAndroidTarget.getName(), // monitor task label
- monitor);
- } catch (InvalidAttributeValueException e) {
- AdtPlugin.log(e, "Problem preloading classes"); //$NON-NLS-1$
- } catch (IOException e) {
- AdtPlugin.log(e, "Problem preloading classes"); //$NON-NLS-1$
- }
- }
-
- /**
- * Loads, collects and returns the list of default permissions from the framework.
- *
- * @param classLoader The framework SDK jar classloader
- * @return a non null (but possibly empty) array containing the permission values.
- */
- private String[] collectPermissions(AndroidJarLoader classLoader) {
- try {
- Class<?> permissionClass =
- classLoader.loadClass(SdkConstants.CLASS_MANIFEST_PERMISSION);
-
- if (permissionClass != null) {
- ArrayList<String> list = new ArrayList<String>();
-
- Field[] fields = permissionClass.getFields();
-
- for (Field f : fields) {
- int modifiers = f.getModifiers();
- if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers) &&
- Modifier.isPublic(modifiers)) {
- try {
- Object value = f.get(null);
- if (value instanceof String) {
- list.add((String)value);
- }
- } catch (IllegalArgumentException e) {
- // since we provide null this should not happen
- } catch (IllegalAccessException e) {
- // if the field is inaccessible we ignore it.
- } catch (NullPointerException npe) {
- // looks like this is not a static field. we can ignore.
- } catch (ExceptionInInitializerError eiie) {
- // lets just ignore the field again
- }
- }
- }
-
- return list.toArray(new String[list.size()]);
- }
- } catch (ClassNotFoundException e) {
- AdtPlugin.logAndPrintError(e, TAG,
- "Collect permissions failed, class %1$s not found in %2$s", //$NON-NLS-1$
- SdkConstants.CLASS_MANIFEST_PERMISSION,
- mAndroidTarget.getPath(IAndroidTarget.ANDROID_JAR));
- }
-
- return new String[0];
- }
-
- /**
- * Loads and collects the action and category default values from the framework.
- * The values are added to the <code>actions</code> and <code>categories</code> lists.
- *
- * @param activityActions the list which will receive the activity action values.
- * @param broadcastActions the list which will receive the broadcast action values.
- * @param serviceActions the list which will receive the service action values.
- * @param categories the list which will receive the category values.
- */
- private void collectIntentFilterActionsAndCategories(ArrayList<String> activityActions,
- ArrayList<String> broadcastActions,
- ArrayList<String> serviceActions, ArrayList<String> categories) {
- collectValues(mAndroidTarget.getPath(IAndroidTarget.ACTIONS_ACTIVITY),
- activityActions);
- collectValues(mAndroidTarget.getPath(IAndroidTarget.ACTIONS_BROADCAST),
- broadcastActions);
- collectValues(mAndroidTarget.getPath(IAndroidTarget.ACTIONS_SERVICE),
- serviceActions);
- collectValues(mAndroidTarget.getPath(IAndroidTarget.CATEGORIES),
- categories);
- }
-
- /**
- * Collects values from a text file located in the SDK
- * @param osFilePath The path to the text file.
- * @param values the {@link ArrayList} to fill with the values.
- */
- private void collectValues(String osFilePath, ArrayList<String> values) {
- FileReader fr = null;
- BufferedReader reader = null;
- try {
- fr = new FileReader(osFilePath);
- reader = new BufferedReader(fr);
-
- String line;
- while ((line = reader.readLine()) != null) {
- line = line.trim();
- if (line.length() > 0 && line.startsWith("#") == false) { //$NON-NLS-1$
- values.add(line);
- }
- }
- } catch (IOException e) {
- AdtPlugin.log(e, "Failed to read SDK values"); //$NON-NLS-1$
- } finally {
- try {
- if (reader != null) {
- reader.close();
- }
- } catch (IOException e) {
- AdtPlugin.log(e, "Failed to read SDK values"); //$NON-NLS-1$
- }
-
- try {
- if (fr != null) {
- fr.close();
- }
- } catch (IOException e) {
- AdtPlugin.log(e, "Failed to read SDK values"); //$NON-NLS-1$
- }
- }
- }
-
- /**
- * Collects all layout classes information from the class loader and the
- * attrs.xml and sets the corresponding structures in the resource manager.
- *
- * @param classLoader The framework SDK jar classloader in case we cannot get the widget from
- * the platform directly
- * @param attrsXmlParser The parser of the attrs.xml file
- * @param mainList the Collection to receive the main list of {@link ViewClassInfo}.
- * @param groupList the Collection to receive the group list of {@link ViewClassInfo}.
- * @param monitor A progress monitor. Can be null. Caller is responsible for calling done.
- */
- private void collectLayoutClasses(AndroidJarLoader classLoader,
- AttrsXmlParser attrsXmlParser,
- Collection<ViewClassInfo> mainList,
- Collection<ViewClassInfo> groupList,
- IProgressMonitor monitor) {
- LayoutParamsParser ldp = null;
- try {
- WidgetClassLoader loader = new WidgetClassLoader(
- mAndroidTarget.getPath(IAndroidTarget.WIDGETS));
- if (loader.parseWidgetList(monitor)) {
- ldp = new LayoutParamsParser(loader, attrsXmlParser);
- }
- // if the parsing failed, we'll use the old loader below.
- } catch (FileNotFoundException e) {
- AdtPlugin.log(e, "Android Framework Parser"); //$NON-NLS-1$
- // the file does not exist, we'll use the old loader below.
- }
-
- if (ldp == null) {
- ldp = new LayoutParamsParser(classLoader, attrsXmlParser);
- }
- ldp.parseLayoutClasses(monitor);
-
- List<ViewClassInfo> views = ldp.getViews();
- List<ViewClassInfo> groups = ldp.getGroups();
-
- if (views != null && groups != null) {
- mainList.addAll(views);
- groupList.addAll(groups);
- }
- }
-
- /**
- * Collects all preferences definition information from the attrs.xml and
- * sets the corresponding structures in the resource manager.
- *
- * @param classLoader The framework SDK jar classloader
- * @param attrsXmlParser The parser of the attrs.xml file
- * @param mainList the Collection to receive the main list of {@link ViewClassInfo}.
- * @param groupList the Collection to receive the group list of {@link ViewClassInfo}.
- * @param monitor A progress monitor. Can be null. Caller is responsible for calling done.
- */
- private void collectPreferenceClasses(AndroidJarLoader classLoader,
- AttrsXmlParser attrsXmlParser, Collection<ViewClassInfo> mainList,
- Collection<ViewClassInfo> groupList, IProgressMonitor monitor) {
- LayoutParamsParser ldp = new LayoutParamsParser(classLoader, attrsXmlParser);
-
- try {
- ldp.parsePreferencesClasses(monitor);
-
- List<ViewClassInfo> prefs = ldp.getViews();
- List<ViewClassInfo> groups = ldp.getGroups();
-
- if (prefs != null && groups != null) {
- mainList.addAll(prefs);
- groupList.addAll(groups);
- }
- } catch (NoClassDefFoundError e) {
- AdtPlugin.logAndPrintError(e, TAG,
- "Collect preferences failed, class %1$s not found in %2$s",
- e.getMessage(),
- classLoader.getSource());
- } catch (Throwable e) {
- AdtPlugin.log(e, "Android Framework Parser: failed to collect preference classes"); //$NON-NLS-1$
- AdtPlugin.printErrorToConsole("Android Framework Parser",
- "failed to collect preference classes");
- }
- }
-
- /**
- * Collects all menu definition information from the attrs.xml and returns it.
- *
- * @param attrsXmlParser The parser of the attrs.xml file
- */
- private Map<String, DeclareStyleableInfo> collectMenuDefinitions(
- AttrsXmlParser attrsXmlParser) {
- Map<String, DeclareStyleableInfo> map = attrsXmlParser.getDeclareStyleableList();
- Map<String, DeclareStyleableInfo> map2 = new HashMap<String, DeclareStyleableInfo>();
- for (String key : new String[] { "Menu", //$NON-NLS-1$
- "MenuItem", //$NON-NLS-1$
- "MenuGroup" }) { //$NON-NLS-1$
- if (map.containsKey(key)) {
- map2.put(key, map.get(key));
- } else {
- AdtPlugin.log(IStatus.WARNING,
- "Menu declare-styleable %1$s not found in file %2$s", //$NON-NLS-1$
- key, attrsXmlParser.getOsAttrsXmlPath());
- AdtPlugin.printErrorToConsole("Android Framework Parser",
- String.format("Menu declare-styleable %1$s not found in file %2$s", //$NON-NLS-1$
- key, attrsXmlParser.getOsAttrsXmlPath()));
- }
- }
-
- return Collections.unmodifiableMap(map2);
- }
-
- /**
- * Collects all searchable definition information from the attrs.xml and returns it.
- *
- * @param attrsXmlParser The parser of the attrs.xml file
- */
- private Map<String, DeclareStyleableInfo> collectSearchableDefinitions(
- AttrsXmlParser attrsXmlParser) {
- Map<String, DeclareStyleableInfo> map = attrsXmlParser.getDeclareStyleableList();
- Map<String, DeclareStyleableInfo> map2 = new HashMap<String, DeclareStyleableInfo>();
- for (String key : new String[] { "Searchable", //$NON-NLS-1$
- "SearchableActionKey" }) { //$NON-NLS-1$
- if (map.containsKey(key)) {
- map2.put(key, map.get(key));
- } else {
- AdtPlugin.log(IStatus.WARNING,
- "Searchable declare-styleable %1$s not found in file %2$s", //$NON-NLS-1$
- key, attrsXmlParser.getOsAttrsXmlPath());
- AdtPlugin.printErrorToConsole("Android Framework Parser",
- String.format("Searchable declare-styleable %1$s not found in file %2$s", //$NON-NLS-1$
- key, attrsXmlParser.getOsAttrsXmlPath()));
- }
- }
-
- return Collections.unmodifiableMap(map2);
- }
-
- /**
- * Collects all appWidgetProviderInfo definition information from the attrs.xml and returns it.
- *
- * @param attrsXmlParser The parser of the attrs.xml file
- */
- private Map<String, DeclareStyleableInfo> collectAppWidgetDefinitions(
- AttrsXmlParser attrsXmlParser) {
- Map<String, DeclareStyleableInfo> map = attrsXmlParser.getDeclareStyleableList();
- Map<String, DeclareStyleableInfo> map2 = new HashMap<String, DeclareStyleableInfo>();
- for (String key : new String[] { "AppWidgetProviderInfo" }) { //$NON-NLS-1$
- if (map.containsKey(key)) {
- map2.put(key, map.get(key));
- } else {
- AdtPlugin.log(IStatus.WARNING,
- "AppWidget declare-styleable %1$s not found in file %2$s", //$NON-NLS-1$
- key, attrsXmlParser.getOsAttrsXmlPath());
- AdtPlugin.printErrorToConsole("Android Framework Parser",
- String.format("AppWidget declare-styleable %1$s not found in file %2$s", //$NON-NLS-1$
- key, attrsXmlParser.getOsAttrsXmlPath()));
- }
- }
-
- return Collections.unmodifiableMap(map2);
- }
-
- /**
- * Collects all manifest definition information from the attrs_manifest.xml and returns it.
- */
- private Map<String, DeclareStyleableInfo> collectManifestDefinitions(
- AttrsXmlParser attrsXmlParser) {
-
- return attrsXmlParser.getDeclareStyleableList();
- }
-
-}