/* * 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.motorolamobility.preflighting.core.internal.utils; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Set; import com.motorolamobility.preflighting.core.source.model.PermissionGroups; public final class MethodPermissionCSVReader { private static final String ANDROID_PERMISSION_PREFIX = "android.permission."; /** * For tests * @param args */ public static void main(String[] args) { File f = new File( "C:\\motodev\\motodev\\android\\src\\plugins\\preflighting.core\\files\\method_permission_list_4.0.csv"); try { readMapMethodToPermission(new InputStreamReader(new FileInputStream(f))); } catch (IOException e) { e.printStackTrace(); } } /** * Reads files\method_permission_list.csv and creates a map with * key - classPackagePath.methodName * value - permission name (without android.permission) (it can use || to indicate conditions that are optional, that is interchangeable) * Case there is more than one line for a permission it indicates that it is a && condition * * E.g.: If the file have the following declarations * android.accounts.AccountManager.method1,PERMISSION1 * android.accounts.AccountManager.method1,PERMISSION2||PERMISSION3 * * It will return the following: * PERMISSION1 = required * PERMISSION2, PERMISSION3 = optional (one of them is required) * * @param csv * @return * @throws IOException */ public static Map<String, PermissionGroups> readMapMethodToPermission( InputStreamReader csvStream) throws IOException { Map<String, PermissionGroups> methodToPermission = new HashMap<String, PermissionGroups>(); BufferedReader reader = null; try { reader = new BufferedReader(csvStream); String line = reader.readLine(); while (line != null) { String[] splitAux = line.split(","); if (splitAux.length >= 2) { String classAndMethod = splitAux[0]; String permissionGroupAux = splitAux[1]; PermissionGroups permissionGroups = methodToPermission.get(classAndMethod); if (permissionGroups == null) { //method not included yet - add new entry on map permissionGroups = new PermissionGroups(); methodToPermission.put(classAndMethod, permissionGroups); } if ((permissionGroupAux != null) && permissionGroupAux.contains("||")) { //optional permissions - permissions should not contain spaces String[] optionalPermissions = permissionGroupAux.split("\\|\\|"); for (int i = 0; i < optionalPermissions.length; i++) { String optionalPermission = optionalPermissions[i]; optionalPermissions[i] = ANDROID_PERMISSION_PREFIX + optionalPermission; } permissionGroups.getOptionalPermissions().addAll( Arrays.asList(optionalPermissions)); } else { //required permission permissionGroups.getRequiredPermissions().add( ANDROID_PERMISSION_PREFIX + permissionGroupAux); } } line = reader.readLine(); } } finally { if (reader != null) { try { reader.close(); } catch (Exception e) { //Do Nothing. } } } return methodToPermission; } /** * Method that prints the mapping into a file. * Used to check if the mapping is being properly constructed. * @param methodToPermission */ @SuppressWarnings("unused") private static void saveToFile(Map<String, PermissionGroups> methodToPermission) { File f = new File("C:\\methodToPermission.csv"); OutputStreamWriter writer = null; try { writer = new OutputStreamWriter(new FileOutputStream(f)); Set<String> classes = methodToPermission.keySet(); for (String cls : classes) { PermissionGroups permissions = methodToPermission.get(cls); for (String permission : permissions.getRequiredPermissions()) { writer.append(cls + "," + permission.substring(permission.lastIndexOf('.') + 1) + "\n"); } if (!permissions.getOptionalPermissions().isEmpty()) { writer.append(cls + ","); boolean first = true; for (String permission : permissions.getOptionalPermissions()) { writer.append(first ? permission.substring(permission.lastIndexOf('.') + 1) : "||" + permission.substring(permission.lastIndexOf('.') + 1)); first = false; } writer.append('\n'); } } writer.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { //Do Nothing. } } } } }