1 /** 2 * Copyright (c) 2011, Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.mail.providers; 18 19 import com.google.common.collect.ImmutableSet; 20 21 import java.lang.IllegalArgumentException; 22 import java.lang.String; 23 import java.util.Arrays; 24 import java.util.Set; 25 26 27 /** 28 * A helper class to validate projections for the UIProvider queries. 29 * 30 * TODO(pwestbro): Consider creating an abstract ContentProvider that contains this 31 * functionionality. 32 */ 33 public class UIProviderValidator { 34 /** 35 * Validates and returns the projection that can be used for an account query. 36 */ validateAccountProjection(String[] projection)37 public static String[] validateAccountProjection(String[] projection) { 38 return getValidProjection(projection, UIProvider.ACCOUNTS_PROJECTION); 39 } 40 41 /** 42 * Validates and returns the projection that can be used for a folder query. 43 */ validateFolderProjection(String[] projection)44 public static String[] validateFolderProjection(String[] projection) { 45 return getValidProjection(projection, UIProvider.FOLDERS_PROJECTION); 46 } 47 48 /** 49 * Validates and returns the projection that can be used for a account cookie query. 50 */ validateAccountCookieProjection(String[] projection)51 public static String[] validateAccountCookieProjection(String[] projection) { 52 return getValidProjection(projection, UIProvider.ACCOUNT_COOKIE_PROJECTION); 53 } 54 55 /** 56 * Validates and returns the projection that can be used for a conversation query. 57 */ validateConversationProjection(String[] projection)58 public static String[] validateConversationProjection(String[] projection) { 59 return getValidProjection(projection, UIProvider.CONVERSATION_PROJECTION); 60 } 61 62 /** 63 * Validates and returns the projection that can be used for a message query. 64 */ validateMessageProjection(String[] projection)65 public static String[] validateMessageProjection(String[] projection) { 66 return getValidProjection(projection, UIProvider.MESSAGE_PROJECTION); 67 } 68 69 /** 70 * Validates and returns the projection that can be used for a attachment query. 71 */ validateAttachmentProjection(String[] projection)72 public static String[] validateAttachmentProjection(String[] projection) { 73 return getValidProjection(projection, UIProvider.ATTACHMENT_PROJECTION); 74 } 75 76 getValidProjection(String[] requestedProjection, String[] allColumnProjection)77 private static String[] getValidProjection(String[] requestedProjection, 78 String[] allColumnProjection) { 79 final String[] resultProjection; 80 if (requestedProjection != null) { 81 if (isValidProjection(requestedProjection, ImmutableSet.copyOf(allColumnProjection))) { 82 // The requested projection is valid, use it. 83 resultProjection = requestedProjection; 84 } else { 85 throw new IllegalArgumentException( 86 "Invalid projection: " + Arrays.toString(requestedProjection)); 87 } 88 } else { 89 // If the caller specified a null projection, they want all columns 90 resultProjection = allColumnProjection; 91 } 92 return resultProjection; 93 } 94 isValidProjection(String[] projection, Set<String> validColumns)95 private static boolean isValidProjection(String[] projection, Set<String> validColumns) { 96 for (String column : projection) { 97 if (!validColumns.contains(column)) { 98 return false; 99 } 100 } 101 return true; 102 } 103 }