diff options
Diffstat (limited to 'src/plugins/common/src/com/motorola/studio/android/model/manifest/parser/AndroidManifestNodeParser.java')
-rw-r--r-- | src/plugins/common/src/com/motorola/studio/android/model/manifest/parser/AndroidManifestNodeParser.java | 1099 |
1 files changed, 1099 insertions, 0 deletions
diff --git a/src/plugins/common/src/com/motorola/studio/android/model/manifest/parser/AndroidManifestNodeParser.java b/src/plugins/common/src/com/motorola/studio/android/model/manifest/parser/AndroidManifestNodeParser.java new file mode 100644 index 0000000..0cd1e25 --- /dev/null +++ b/src/plugins/common/src/com/motorola/studio/android/model/manifest/parser/AndroidManifestNodeParser.java @@ -0,0 +1,1099 @@ +/* +* 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); + } + } + } +} |