/* * Copyright (C) 2014 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.android.build.gradle.internal.api; import com.android.annotations.NonNull; import com.android.annotations.Nullable; import com.android.builder.model.BuildType; import com.android.builder.model.ProductFlavor; import com.android.builder.model.SigningConfig; import com.google.common.collect.Maps; import java.util.Map; /** * Provides read-only versions of BuildType, ProductFlavor and SigningConfig instances * so that they can safely be exposed through the variant API. * * The class creates them on the fly so that they are only created when a * Gradle script/plugin queries for them, and caches them so that we reuse them as needed. */ public class ReadOnlyObjectProvider { private ReadOnlyProductFlavor readOnlyDefaultConfig; /** * Map of read-only build-types. This maps the normal build type to the read-only version. */ @NonNull private final Map<BuildType, BuildType> readOnlyBuildTypes = Maps.newIdentityHashMap(); /** * Map of read-only ProductFlavor. This maps the normal flavor to the read-only version. */ @NonNull private final Map<ProductFlavor, ProductFlavor> readOnlyFlavors = Maps.newIdentityHashMap(); /** * Map of read-only SigningConfig. This maps the normal config to the read-only version. */ @NonNull private final Map<SigningConfig, SigningConfig> readOnlySigningConfig = Maps.newIdentityHashMap(); /** * Returns an read-only version of the default config. * @param defaultConfig the default config. * @return an read-only version. */ @NonNull ProductFlavor getDefaultConfig(@NonNull ProductFlavor defaultConfig) { if (readOnlyDefaultConfig != null) { if (readOnlyDefaultConfig.productFlavor != defaultConfig) { throw new IllegalStateException("Different DefaultConfigs passed to ApiObjectProvider"); } } else { readOnlyDefaultConfig = new ReadOnlyProductFlavor(defaultConfig, this); } return readOnlyDefaultConfig; } /** * Returns an read-only version of a build type. * @param buildType the build type. * @return an read-only version. */ @NonNull public BuildType getBuildType(@NonNull BuildType buildType) { BuildType readOnlyBuildType = readOnlyBuildTypes.get(buildType); if (readOnlyBuildType == null) { readOnlyBuildTypes.put(buildType, readOnlyBuildType = new ReadOnlyBuildType(buildType, this)); } return readOnlyBuildType; } /** * Retuens an read-only version of a groupable product flavor. * @param productFlavor the product flavor. * @return an read-only version. */ @NonNull public ProductFlavor getProductFlavor(@NonNull ProductFlavor productFlavor) { ProductFlavor readOnlyProductFlavor = readOnlyFlavors.get(productFlavor); if (readOnlyProductFlavor == null) { readOnlyFlavors.put(productFlavor, readOnlyProductFlavor = new ReadOnlyProductFlavor( productFlavor, this)); } return readOnlyProductFlavor; } /** * Returns an read-only version of a signing config. * @param signingConfig the signing config. * @return an read-only version. */ @Nullable public SigningConfig getSigningConfig(@Nullable SigningConfig signingConfig) { if (signingConfig == null) { return null; } SigningConfig readOnlySigningConfig = this.readOnlySigningConfig.get(signingConfig); if (readOnlySigningConfig == null) { this.readOnlySigningConfig.put(signingConfig, readOnlySigningConfig = new ReadOnlySigningConfig(signingConfig)); } return readOnlySigningConfig; } }