/** * Copyright (c) 2011, Google Inc. * * 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.android.mail.providers; import com.google.common.collect.ImmutableSet; import java.lang.IllegalArgumentException; import java.lang.String; import java.util.Arrays; import java.util.Set; /** * A helper class to validate projections for the UIProvider queries. * * TODO(pwestbro): Consider creating an abstract ContentProvider that contains this * functionionality. */ public class UIProviderValidator { /** * Validates and returns the projection that can be used for an account query. */ public static String[] validateAccountProjection(String[] projection) { return getValidProjection(projection, UIProvider.ACCOUNTS_PROJECTION); } /** * Validates and returns the projection that can be used for a folder query. */ public static String[] validateFolderProjection(String[] projection) { return getValidProjection(projection, UIProvider.FOLDERS_PROJECTION); } /** * Validates and returns the projection that can be used for a account cookie query. */ public static String[] validateAccountCookieProjection(String[] projection) { return getValidProjection(projection, UIProvider.ACCOUNT_COOKIE_PROJECTION); } /** * Validates and returns the projection that can be used for a conversation query. */ public static String[] validateConversationProjection(String[] projection) { return getValidProjection(projection, UIProvider.CONVERSATION_PROJECTION); } /** * Validates and returns the projection that can be used for a message query. */ public static String[] validateMessageProjection(String[] projection) { return getValidProjection(projection, UIProvider.MESSAGE_PROJECTION); } /** * Validates and returns the projection that can be used for a attachment query. */ public static String[] validateAttachmentProjection(String[] projection) { return getValidProjection(projection, UIProvider.ATTACHMENT_PROJECTION); } private static String[] getValidProjection(String[] requestedProjection, String[] allColumnProjection) { final String[] resultProjection; if (requestedProjection != null) { if (isValidProjection(requestedProjection, ImmutableSet.copyOf(allColumnProjection))) { // The requested projection is valid, use it. resultProjection = requestedProjection; } else { throw new IllegalArgumentException( "Invalid projection: " + Arrays.toString(requestedProjection)); } } else { // If the caller specified a null projection, they want all columns resultProjection = allColumnProjection; } return resultProjection; } private static boolean isValidProjection(String[] projection, Set validColumns) { for (String column : projection) { if (!validColumns.contains(column)) { return false; } } return true; } }