// Copyright 2015 The Project Buendia Authors
//
// 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 distrib-
// uted 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
// specific language governing permissions and limitations under the License.
package org.projectbuendia.client.resolvables;
import android.content.res.Resources;
import org.projectbuendia.client.utils.Logger;
import java.util.HashMap;
import java.util.Map;
/** Resolves resource-backed enumerations against an instance of {@link Resources}. */
class Resolver {
private static final Logger LOG = Logger.create();
private static Resources sResources;
private static Map<Resolvable, Object> sResolvablesToResolveds = new HashMap<>();
@SuppressWarnings("unchecked") // Checked at runtime.
public static synchronized <T> T resolve(
Resolvable resolvable, Resources resources, Class<T> clazz) {
if (sResources == null) {
sResources = resources;
} else if (sResources != resources) {
LOG.w(
"Setting Resources instance to a different value than the one already set. "
+ "All cached Resolvables are being discarded.");
sResources = resources;
sResolvablesToResolveds.clear();
}
Object resolved = sResolvablesToResolveds.get(resolvable);
if (resolved == null) {
if (ResStatus.Resolved.class.equals(clazz)) {
resolved = new ResStatus.Resolved((ResStatus) resolvable, resources);
} else if (ResTemperatureRange.Resolved.class.equals(clazz)) {
resolved = new ResTemperatureRange.Resolved(
(ResTemperatureRange) resolvable, resources);
} else if (ResVital.Resolved.class.equals(clazz)) {
resolved = new ResVital.Resolved((ResVital) resolvable, resources);
} else if (ResZone.Resolved.class.equals(clazz)) {
resolved = new ResZone.Resolved((ResZone) resolvable, resources);
} else {
throw new IllegalArgumentException("Unknown Resolvable class type.");
}
sResolvablesToResolveds.put(resolvable, resolved);
}
return (T) resolved;
}
private Resolver() {
}
}