/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 * * 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.motorola.studio.android.model.manifest.parser; import java.util.LinkedList; import java.util.List; import org.eclipse.osgi.util.NLS; import org.w3c.dom.Comment; import org.w3c.dom.NamedNodeMap; import com.motorola.studio.android.common.log.StudioLogger; import com.motorola.studio.android.common.utilities.i18n.UtilitiesNLS; import com.motorola.studio.android.model.manifest.dom.AbstractBuildingBlockNode; import com.motorola.studio.android.model.manifest.dom.AbstractIconLabelNameNode; import com.motorola.studio.android.model.manifest.dom.AbstractSimpleNameNode; import com.motorola.studio.android.model.manifest.dom.ActionNode; import com.motorola.studio.android.model.manifest.dom.ActivityAliasNode; import com.motorola.studio.android.model.manifest.dom.ActivityNode; import com.motorola.studio.android.model.manifest.dom.ApplicationNode; import com.motorola.studio.android.model.manifest.dom.CategoryNode; import com.motorola.studio.android.model.manifest.dom.CommentNode; import com.motorola.studio.android.model.manifest.dom.DataNode; import com.motorola.studio.android.model.manifest.dom.GrantUriPermissionNode; import com.motorola.studio.android.model.manifest.dom.IAndroidManifestProperties; import com.motorola.studio.android.model.manifest.dom.InstrumentationNode; import com.motorola.studio.android.model.manifest.dom.IntentFilterNode; import com.motorola.studio.android.model.manifest.dom.ManifestNode; import com.motorola.studio.android.model.manifest.dom.MetadataNode; import com.motorola.studio.android.model.manifest.dom.PermissionGroupNode; import com.motorola.studio.android.model.manifest.dom.PermissionNode; import com.motorola.studio.android.model.manifest.dom.PermissionTreeNode; import com.motorola.studio.android.model.manifest.dom.ProviderNode; import com.motorola.studio.android.model.manifest.dom.ReceiverNode; import com.motorola.studio.android.model.manifest.dom.ServiceNode; import com.motorola.studio.android.model.manifest.dom.UnknownNode; import com.motorola.studio.android.model.manifest.dom.UsesFeatureNode; import com.motorola.studio.android.model.manifest.dom.UsesLibraryNode; import com.motorola.studio.android.model.manifest.dom.UsesPermissionNode; import com.motorola.studio.android.model.manifest.dom.UsesSDKNode; /** * Abstract class that contains methods to parse the AndroidManifest.xml file nodes */ abstract class AndroidManifestNodeParser implements IAndroidManifestProperties { /** * Errors when parsing */ protected final List<String> parseErrors; /** * Default constructor */ public AndroidManifestNodeParser() { parseErrors = new LinkedList<String>(); } /** * Parses a <manifest> node * * @param attributes The node attributes * @return a ManifestNode object corresponding to the node */ protected ManifestNode parseManifestNode(NamedNodeMap attributes) { ManifestNode manifestNode = new ManifestNode(""); String attrName, attrValue; for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_PACKAGE)) { manifestNode.setPackage(attrValue); } else if (attrName.equalsIgnoreCase(PROP_SHAREDUSERID)) { manifestNode.setSharedUserId(attrValue); } else if (attrName.equalsIgnoreCase(PROP_VERSIONCODE)) { Integer versionCode; try { versionCode = Integer.parseInt(attrValue); } catch (NumberFormatException nfe) { versionCode = 1; String errMsg = NLS.bind( UtilitiesNLS.ERR_AndroidManifestNodeParser_ErrorParsingVersionCode, attrValue, versionCode.toString()); parseErrors.add(errMsg); StudioLogger.error(AndroidManifestNodeParser.class, errMsg, nfe); } manifestNode.setVersionCode(versionCode); } else if (attrName.equalsIgnoreCase(PROP_VERSIONNAME)) { manifestNode.setVersionName(attrValue); } else if (!attrName.equalsIgnoreCase(PROP_XMLNS)) { manifestNode.addUnknownProperty(attrName, attrValue); } } return manifestNode; } /** * Parses an <uses-permission> node * * @param attributes The node attributes * @return a UsesPermissionNode object corresponding to the node */ protected UsesPermissionNode parseUsesPermissionNode(NamedNodeMap attributes) { UsesPermissionNode usesPermissionNode = new UsesPermissionNode(""); String attrName, attrValue; for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_NAME)) { usesPermissionNode.setName(attrValue); } else { usesPermissionNode.addUnknownProperty(attrName, attrValue); } } return usesPermissionNode; } /** * Parses a <permission> node * * @param attributes The node attributes * @return a PermissionNode object corresponding to the node */ protected PermissionNode parsePermissionNode(NamedNodeMap attributes) { PermissionNode permissionNode = new PermissionNode(""); String attrName, attrValue; parseAbstractIconLabelNameNode(attributes, permissionNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_DESCRIPTION)) { permissionNode.setDescription(attrValue); } else if (attrName.equalsIgnoreCase(PROP_PERMISSIONGROUP)) { permissionNode.setPermissionGroup(attrValue); } else if (attrName.equalsIgnoreCase(PROP_PROTECTIONLEVEL)) { permissionNode.setProtectionLevel(PermissionNode.getProtectionLevel(attrValue)); } else { permissionNode.addUnknownProperty(attrName, attrValue); } } return permissionNode; } /** * Parses a <permission-tree> node * * @param attributes The node attributes * @return a PermissionTreeNode object corresponding to the node */ protected PermissionTreeNode parsePermissionTreeNode(NamedNodeMap attributes) { PermissionTreeNode permissionTreeNode = new PermissionTreeNode(""); String attrName, attrValue; parseAbstractIconLabelNameNode(attributes, permissionTreeNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); permissionTreeNode.addUnknownProperty(attrName, attrValue); } return permissionTreeNode; } /** * Parses a <permission-group> node * * @param attributes The node attributes * @return a PermissionGroupNode object corresponding to the node */ protected PermissionGroupNode parsePermissionGroupNode(NamedNodeMap attributes) { PermissionGroupNode permissionGroupNode = new PermissionGroupNode(""); String attrName, attrValue; parseAbstractIconLabelNameNode(attributes, permissionGroupNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_DESCRIPTION)) { permissionGroupNode.setDescription(attrValue); } else { permissionGroupNode.addUnknownProperty(attrName, attrValue); } } return permissionGroupNode; } /** * Parses an <instrumentation> node * * @param attributes The node attributes * @return an InstrumentationNode object corresponding to the node */ protected InstrumentationNode parseInstrumentationNode(NamedNodeMap attributes) { InstrumentationNode instrumentationNode = new InstrumentationNode(""); String attrName, attrValue; parseAbstractIconLabelNameNode(attributes, instrumentationNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_FUNCTIONALTEST)) { Boolean functionalTest = Boolean.parseBoolean(attrValue); instrumentationNode.setFunctionalTest(functionalTest); } else if (attrName.equalsIgnoreCase(PROP_HANDLEPROFILING)) { Boolean handleProfiling = Boolean.parseBoolean(attrValue); instrumentationNode.setHandleProfiling(handleProfiling); } else if (attrName.equalsIgnoreCase(PROP_TARGETPACKAGE)) { instrumentationNode.setTargetPackage(attrValue); } else { instrumentationNode.addUnknownProperty(attrName, attrValue); } } return instrumentationNode; } /** * Parses an <uses-sdk> node * * @param attributes The node attributes * @return an UsesNode object corresponding to the node */ protected UsesSDKNode parseUsesSdkNode(NamedNodeMap attributes) { UsesSDKNode usesSDKNode = new UsesSDKNode(); String attrName, attrValue; String minSdkVersion; for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_MINSDKVERSION)) { minSdkVersion = attrValue; usesSDKNode.setMinSdkVersion(minSdkVersion); } else if (attrName.equalsIgnoreCase(PROP_MAXSDKVERSION)) { usesSDKNode.setPropMaxSdkVersion(attrValue); } else if (attrName.equalsIgnoreCase(PROP_TARGETSDKVERSION)) { usesSDKNode.setPropTargetSdkVersion(attrValue); } else { usesSDKNode.addUnknownProperty(attrName, attrValue); } } return usesSDKNode; } /** * Parses an <application> node * * @param attributes The node attributes * @return an ApplicationNode object corresponding to the node */ protected ApplicationNode parseApplicationNode(NamedNodeMap attributes) { ApplicationNode applicationNode = new ApplicationNode(""); String attrName, attrValue; parseAbstractIconLabelNameNode(attributes, applicationNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_ALLOWCLEARUSERDATA)) { Boolean allowClearUserData = Boolean.parseBoolean(attrValue); applicationNode.setAllowClearUserData(allowClearUserData); } else if (attrName.equalsIgnoreCase(PROP_ALLOWTASKREPARENTING)) { Boolean allowTaskReparentig = Boolean.parseBoolean(attrValue); applicationNode.setAllowTaskReparenting(allowTaskReparentig); } else if (attrName.equalsIgnoreCase(PROP_DEBUGGABLE)) { Boolean debbugable = Boolean.parseBoolean(attrValue); applicationNode.setDebuggable(debbugable); } else if (attrName.equalsIgnoreCase(PROP_DESCRIPTION)) { applicationNode.setDescription(attrValue); } else if (attrName.equalsIgnoreCase(PROP_ENABLED)) { Boolean enabled = Boolean.parseBoolean(attrValue); applicationNode.setEnabled(enabled); } else if (attrName.equalsIgnoreCase(PROP_HASCODE)) { Boolean hasCode = Boolean.parseBoolean(attrValue); applicationNode.setHasCode(hasCode); } else if (attrName.equalsIgnoreCase(PROP_MANAGESPACEACTIVITY)) { applicationNode.setManageSpaceActivity(attrValue); } else if (attrName.equalsIgnoreCase(PROP_PERMISSION)) { applicationNode.setPermission(attrValue); } else if (attrName.equalsIgnoreCase(PROP_PERSISTENT)) { Boolean persistent = Boolean.parseBoolean(attrValue); applicationNode.setPersistent(persistent); } else if (attrName.equalsIgnoreCase(PROP_PROCESS)) { applicationNode.setProcess(attrValue); } else if (attrName.equalsIgnoreCase(PROP_TASKAFFINITY)) { applicationNode.setTaskAffinity(attrValue); } else if (attrName.equalsIgnoreCase(PROP_THEME)) { applicationNode.setTheme(attrValue); } else { applicationNode.addUnknownProperty(attrName, attrValue); } } return applicationNode; } /** * Parses an <activity> node * * @param attributes The node attributes * @return an ActivityNode object corresponding to the node */ protected ActivityNode parseActivityNode(NamedNodeMap attributes) { ActivityNode activityNode = new ActivityNode(""); String attrName, attrValue; parseAbstractBuildingBlockNode(attributes, activityNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_ALLOWTASKREPARENTING)) { Boolean allowTaskReparentig = Boolean.parseBoolean(attrValue); activityNode.setAllowTaskReparenting(allowTaskReparentig); } else if (attrName.equalsIgnoreCase(PROP_ALWAYSRETAINTASKSTATE)) { Boolean alwaysRetainTaskState = Boolean.parseBoolean(attrValue); activityNode.setAlwaysRetainTaskState(alwaysRetainTaskState); } else if (attrName.equalsIgnoreCase(PROP_CLEARTASKONLAUNCH)) { Boolean clearTaskOnLaunch = Boolean.parseBoolean(attrValue); activityNode.setClearTaskOnLaunch(clearTaskOnLaunch); } else if (attrName.equalsIgnoreCase(PROP_CONFIGCHANGES)) { String configChanges[] = attrValue.split("\\|"); for (String configChange : configChanges) { activityNode.addConfigChanges(ActivityNode .getConfigChangeFromName(configChange)); } } else if (attrName.equalsIgnoreCase(PROP_EXCLUDEFROMRECENTS)) { Boolean excludeFromRecents = Boolean.parseBoolean(attrValue); activityNode.setExcludeFromRecents(excludeFromRecents); } else if (attrName.equalsIgnoreCase(PROP_FINISHONTASKLAUNCH)) { Boolean finishOnTaskLaunch = Boolean.parseBoolean(attrValue); activityNode.setFinishOnTaskLaunch(finishOnTaskLaunch); } else if (attrName.equalsIgnoreCase(PROP_LAUNCHMODE)) { activityNode.setLaunchMode(ActivityNode.getLaunchModeFromName(attrValue)); } else if (attrName.equalsIgnoreCase(PROP_MULTIPROCESS)) { Boolean multiprocess = Boolean.parseBoolean(attrValue); activityNode.setMultiprocess(multiprocess); } else if (attrName.equalsIgnoreCase(PROP_SCREENORIENTATION)) { activityNode.setScreenOrientation(ActivityNode .getScreenOrientationFromName(attrValue)); } else if (attrName.equalsIgnoreCase(PROP_STATENOTNEEDED)) { Boolean stateNotNeeded = Boolean.parseBoolean(attrValue); activityNode.setStateNotNeeded(stateNotNeeded); } else if (attrName.equalsIgnoreCase(PROP_TASKAFFINITY)) { activityNode.setTaskAffinity(attrValue); } else if (attrName.equalsIgnoreCase(PROP_THEME)) { activityNode.setTheme(attrValue); } else { activityNode.addUnknownProperty(attrName, attrValue); } } return activityNode; } /** * Parses an <intent-filter> node * * @param attributes The node attributes * @return an IntentFilterNode object corresponding to the node */ protected IntentFilterNode parseIntentFilterNode(NamedNodeMap attributes) { IntentFilterNode intentFilterNode = new IntentFilterNode(); String attrName, attrValue; for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_ICON)) { intentFilterNode.setIcon(attrValue); } else if (attrName.equalsIgnoreCase(PROP_LABEL)) { intentFilterNode.setLabel(attrValue); } else if (attrName.equalsIgnoreCase(PROP_PRIORITY)) { try { Integer priority = Integer.parseInt(attrValue); intentFilterNode.setPriority(priority); } catch (NumberFormatException nfe) { String errMsg = NLS.bind( UtilitiesNLS.ERR_AndroidManifestNodeParser_ErrorParsingPriority, attrValue); parseErrors.add(errMsg); StudioLogger.error(AndroidManifestNodeParser.class, errMsg, nfe); } } else { intentFilterNode.addUnknownProperty(attrName, attrValue); } } return intentFilterNode; } /** * Parses an <action> node * * @param attributes The node attributes * @return an ActionNode object corresponding to the node */ protected ActionNode parseActionNode(NamedNodeMap attributes) { ActionNode actionNode = new ActionNode(""); String attrName, attrValue; parseAbstractSimpleNameNode(attributes, actionNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); actionNode.addUnknownProperty(attrName, attrValue); } return actionNode; } /** * Parses a <category> node * * @param attributes The node attributes * @return a CategoryNode object corresponding to the node */ protected CategoryNode parseCategoryNode(NamedNodeMap attributes) { CategoryNode categoryNode = new CategoryNode(""); String attrName, attrValue; parseAbstractSimpleNameNode(attributes, categoryNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); categoryNode.addUnknownProperty(attrName, attrValue); } return categoryNode; } /** * Parses a <data> node * * @param attributes The node attributes * @return a DataNode object corresponding to the node */ protected DataNode parseDataNode(NamedNodeMap attributes) { DataNode dataNode = new DataNode(); String attrName, attrValue; for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_HOST)) { dataNode.setHost(attrValue); } else if (attrName.equalsIgnoreCase(PROP_MIMETYPE)) { dataNode.setMimeType(attrValue); } else if (attrName.equalsIgnoreCase(PROP_PATH)) { dataNode.setPath(attrValue); } else if (attrName.equalsIgnoreCase(PROP_PATHPATTERN)) { dataNode.setPathPattern(attrValue); } else if (attrName.equalsIgnoreCase(PROP_PATHPREFIX)) { dataNode.setPathPrefix(attrValue); } else if (attrName.equalsIgnoreCase(PROP_PORT)) { dataNode.setPort(attrValue); } else if (attrName.equalsIgnoreCase(PROP_SCHEME)) { dataNode.setScheme(attrValue); } else { dataNode.addUnknownProperty(attrName, attrValue); } } return dataNode; } /** * Parses a <metadata> node * * @param attributes The node attributes * @return a MetadataNode object corresponding to the node */ protected MetadataNode parseMetadataNode(NamedNodeMap attributes) { MetadataNode metadataNode = new MetadataNode(""); String attrName, attrValue; for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_NAME)) { metadataNode.setName(attrValue); } else if (attrName.equalsIgnoreCase(PROP_RESOURCE)) { metadataNode.setResource(attrValue); } else if (attrName.equals(PROP_VALUE)) { metadataNode.setValue(attrValue); } else { metadataNode.addUnknownProperty(attrName, attrValue); } } return metadataNode; } /** * Parses an <activity-alias> node * * @param attributes The node attributes * @return an ActivityNode object corresponding to the node */ protected ActivityAliasNode parseActivityAliasNode(NamedNodeMap attributes) { ActivityAliasNode activityAliasNode = new ActivityAliasNode("", ""); String attrName, attrValue; parseAbstractIconLabelNameNode(attributes, activityAliasNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_ENABLED)) { Boolean enabled = Boolean.parseBoolean(attrValue); activityAliasNode.setEnabled(enabled); } else if (attrName.equalsIgnoreCase(PROP_EXPORTED)) { Boolean exported = Boolean.parseBoolean(attrValue); activityAliasNode.setExported(exported); } else if (attrName.equalsIgnoreCase(PROP_PERMISSION)) { activityAliasNode.setPermission(attrValue); } else if (attrName.equalsIgnoreCase(PROP_TARGETACTIVITY)) { activityAliasNode.setTargetActivity(attrValue); } else { activityAliasNode.addUnknownProperty(attrName, attrValue); } } return activityAliasNode; } /** * Parses a <service> node * * @param attributes The node attributes * @return a ServiceNode object corresponding to the node */ protected ServiceNode parseServiceNode(NamedNodeMap attributes) { ServiceNode serviceNode = new ServiceNode(""); String attrName, attrValue; parseAbstractBuildingBlockNode(attributes, serviceNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); serviceNode.addUnknownProperty(attrName, attrValue); } return serviceNode; } /** * Parses a <receiver> node * * @param attributes The node attributes * @return a ReceiverNode object corresponding to the node */ protected ReceiverNode parseReceiverNode(NamedNodeMap attributes) { ReceiverNode receiverNode = new ReceiverNode(""); String attrName, attrValue; parseAbstractBuildingBlockNode(attributes, receiverNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); receiverNode.addUnknownProperty(attrName, attrValue); } return receiverNode; } /** * Parses a <provider> node * * @param attributes The node attributes * @return a ProviderNode object corresponding to the node */ protected ProviderNode parseProviderNode(NamedNodeMap attributes) { ProviderNode providerNode = new ProviderNode("", ""); String attrName, attrValue; parseAbstractBuildingBlockNode(attributes, providerNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_AUTHORITIES)) { String[] authorities = attrValue.split(";"); for (String authority : authorities) { providerNode.addAuthority(authority); } providerNode.removeAuthority(""); } else if (attrName.equalsIgnoreCase(PROP_GRANTURIPERMISSIONS)) { Boolean grantUriPermissions = Boolean.parseBoolean(attrValue); providerNode.setGrantUriPermissions(grantUriPermissions); } else if (attrName.equalsIgnoreCase(PROP_INITORDER)) { try { Integer initOrder = Integer.parseInt(attrValue); providerNode.setInitOrder(initOrder); } catch (NumberFormatException nfe) { String errMsg = NLS.bind( UtilitiesNLS.ERR_AndroidManifestNodeParser_ErrorParsingInitOrder, attrValue); parseErrors.add(errMsg); StudioLogger.error(AndroidManifestNodeParser.class, errMsg, nfe); } } else if (attrName.equalsIgnoreCase(PROP_MULTIPROCESS)) { Boolean multiprocess = Boolean.parseBoolean(attrValue); providerNode.setMultiprocess(multiprocess); } else if (attrName.equalsIgnoreCase(PROP_READPERMISSION)) { providerNode.setReadPermission(attrValue); } else if (attrName.equalsIgnoreCase(PROP_SYNCABLE)) { Boolean syncable = Boolean.parseBoolean(attrValue); providerNode.setSyncable(syncable); } else if (attrName.equalsIgnoreCase(PROP_WRITEPERMISSION)) { providerNode.setWritePermission(attrValue); } else { providerNode.addUnknownProperty(attrName, attrValue); } } return providerNode; } /** * Parses a <grant-uri-permission> node * * @param attributes The node attributes * @return a GrantUriPermissionNode object corresponding to the node */ protected GrantUriPermissionNode parseGrantUriPermissionNode(NamedNodeMap attributes) { GrantUriPermissionNode grantUriPermissionNode = new GrantUriPermissionNode(); String attrName, attrValue; for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_PATH)) { grantUriPermissionNode.setPath(attrValue); } else if (attrName.equalsIgnoreCase(PROP_PATHPATTERN)) { grantUriPermissionNode.setPathPattern(attrValue); } else if (attrName.equalsIgnoreCase(PROP_PATHPREFIX)) { grantUriPermissionNode.setPathPrefix(attrValue); } else { grantUriPermissionNode.addUnknownProperty(attrName, attrValue); } } return grantUriPermissionNode; } /** * Parses an <uses-library> node * * @param attributes The node attributes * @return an UsesLibraryNode object corresponding to the node */ protected UsesLibraryNode parseUsesLibraryNode(NamedNodeMap attributes) { UsesLibraryNode usesLibraryNode = new UsesLibraryNode(""); String attrName, attrValue; for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_NAME)) { usesLibraryNode.setName(attrValue); } else if (attrName.equalsIgnoreCase(PROP_REQUIRED)) { usesLibraryNode.setRequired(Boolean.parseBoolean(attrValue)); } else { usesLibraryNode.addUnknownProperty(attrName, attrValue); } } return usesLibraryNode; } /** * Parses an <uses-feature> node * * @param attributes The node attributes * @return an UsesFeatureNode object corresponding to the node */ protected UsesFeatureNode parseUsesFeatureNode(NamedNodeMap attributes) { UsesFeatureNode usesFeatureNode = new UsesFeatureNode(""); String attrName, attrValue; for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_NAME)) { usesFeatureNode.setName(attrValue); } else if (attrName.equalsIgnoreCase(PROP_REQUIRED)) { usesFeatureNode.setRequired(Boolean.parseBoolean(attrValue)); } else { usesFeatureNode.addUnknownProperty(attrName, attrValue); } } return usesFeatureNode; } /** * Parses a comment node (<!-- This is a comment -->) * * @param comment The xml comment node * * @return a CommentNode object representing the xml comment node */ protected CommentNode parseCommentNode(Comment comment) { CommentNode commentNode = new CommentNode(); commentNode.setComment(comment.getTextContent()); return commentNode; } /** * Creates an unknown node based on its attributes. An node is classified as * unknown when it is not specified by the AndroidManifest.xml file specification * or when it is under another node that could not contain it. * * @param attributes The node attributes * @return a UnknownNode object corresponding to the node */ protected UnknownNode parseUnknownNode(String nodeName, NamedNodeMap attributes) { UnknownNode unknownNode = new UnknownNode(nodeName); String attrName, attrValue; for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); unknownNode.addUnknownProperty(attrName, attrValue); } return unknownNode; } /** * Sets all attributes relative to an AbstractIconLabelNameNode from an * attributes list * * @param attributes The node attributes * @param amNode The AbstractIconLabelNameNode where the attributes must be in */ private void parseAbstractIconLabelNameNode(NamedNodeMap attributes, AbstractIconLabelNameNode amNode) { String attrName, attrValue; for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_ICON)) { amNode.setIcon(attrValue); } else if (attrName.equalsIgnoreCase(PROP_LABEL)) { amNode.setLabel(attrValue); } else if (attrName.equalsIgnoreCase(PROP_NAME)) { amNode.setName(attrValue); } } } /** * Sets all attributes relative to an AbstractBuildingBlockNode from an * attributes list * * @param attributes The node attributes * @param amNode The AbstractBuildingBlockNode where the attributes must be in */ private void parseAbstractBuildingBlockNode(NamedNodeMap attributes, AbstractBuildingBlockNode amNode) { String attrName, attrValue; Boolean boolValue; parseAbstractIconLabelNameNode(attributes, amNode); for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_ENABLED)) { boolValue = Boolean.parseBoolean(attrValue); amNode.setEnabled(boolValue); } else if (attrName.equalsIgnoreCase(PROP_EXPORTED)) { boolValue = Boolean.parseBoolean(attrValue); amNode.setExported(boolValue); } else if (attrName.equalsIgnoreCase(PROP_PERMISSION)) { amNode.setPermission(attrValue); } else if (attrName.equalsIgnoreCase(PROP_PROCESS)) { amNode.setProcess(attrValue); } } } /** * Sets all attributes relative to an AbstractSimpleNameNode from an * attributes list * * @param attributes The node attributes * @param amNode The AbstractSimpleNameNode where the attributes must be in */ private void parseAbstractSimpleNameNode(NamedNodeMap attributes, AbstractSimpleNameNode amNode) { String attrName, attrValue; for (int i = 0; i < attributes.getLength(); i++) { attrName = attributes.item(i).getNodeName().trim(); attrValue = attributes.item(i).getNodeValue(); if (attrName.equalsIgnoreCase(PROP_NAME)) { amNode.setName(attrValue); } } } }