/* * Copyright 2014 MovingBlocks * * 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 org.terasology.logic.console.commandSystem.adapter; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import org.terasology.entitySystem.prefab.Prefab; import org.terasology.module.sandbox.API; import org.terasology.naming.Name; import org.terasology.world.block.family.BlockFamily; import java.util.Map; /** */ @API public class ParameterAdapterManager { private final Map<Class<?>, ParameterAdapter> adapters = Maps.newHashMap(); /** * @return A manager with basic adapters for wrapped primitives and {@link String} */ @SuppressWarnings("unchecked") public static ParameterAdapterManager createBasic() { ParameterAdapterManager manager = new ParameterAdapterManager(); for (Map.Entry<Class, ParameterAdapter> entry : PrimitiveAdapters.MAP.entrySet()) { manager.registerAdapter(entry.getKey(), entry.getValue()); } return manager; } /** * @return A manager with basic adapters and following classes: * {@link org.terasology.entitySystem.prefab.Prefab} */ public static ParameterAdapterManager createCore() { ParameterAdapterManager manager = createBasic(); manager.registerAdapter(Name.class, new NameAdapter()); manager.registerAdapter(Prefab.class, new PrefabAdapter()); manager.registerAdapter(BlockFamily.class, new BlockFamilyAdapter()); return manager; } /** * @return {@code true}, if the adapter didn't override a previously present adapter */ public <T> boolean registerAdapter(Class<? extends T> clazz, ParameterAdapter<T> adapter) { return adapters.put(clazz, adapter) == null; } public boolean isAdapterRegistered(Class<?> clazz) { return adapters.containsKey(clazz); } /** * @param clazz The type of the returned object * @param raw The string from which to parse * @return The parsed object * @throws ClassCastException If the {@link ParameterAdapter} is linked with an incorrect {@link java.lang.Class}. */ @SuppressWarnings("unchecked") public <T> T parse(Class<T> clazz, String raw) throws ClassCastException { Preconditions.checkNotNull(raw, "The String to parse must not be null"); ParameterAdapter adapter = getAdapter(clazz); Preconditions.checkNotNull(adapter, "No adapter found for " + clazz.getCanonicalName()); return (T) adapter.parse(raw); } /** * @param value The object to convertToString * @param clazz The class pointing to the desired adapter * @return The composed object * @throws ClassCastException If the {@link ParameterAdapter} is linked with an incorrect {@link java.lang.Class}. */ @SuppressWarnings("unchecked") public <T> String convertToString(T value, Class<? super T> clazz) throws ClassCastException { Preconditions.checkNotNull(value, "The Object to convertToString must not be null"); ParameterAdapter adapter = getAdapter(clazz); Preconditions.checkNotNull(adapter, "No adapter found for " + clazz.getCanonicalName()); return adapter.convertToString(value); } /** * @param value The object to convertToString * @return The composed object * @throws ClassCastException If the {@link ParameterAdapter} is linked with an incorrect {@link java.lang.Class}. */ @SuppressWarnings("unchecked") public String convertToString(Object value) throws ClassCastException { Class<?> clazz = value.getClass(); return convertToString(value, (Class<? super Object>) clazz); } public ParameterAdapter getAdapter(Class<?> clazz) { return adapters.get(clazz); } }