/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.utils.common.configuration; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IAdapterFactory; import org.eclipse.core.runtime.IAdapterManager; import org.eclipse.core.runtime.Platform; /** * A custom {@IAdapterManager} to facilitate a multi mapping of source to target * classes. * * @author Christian Weiss */ public final class AdapterManager implements IAdapterManager { /** The single instance of this class. */ private static final AdapterManager INSTANCE = new AdapterManager(); /** The Constant mappings. */ private static final Map<Class<?>, List<IAdapterFactory>> MAPPINGS = new HashMap<Class<?>, List<IAdapterFactory>>(); /** * Instantiates a new adapter manager. */ private AdapterManager() { // } /** * Gets the single instance of AdapterManager. * * @return single instance of AdapterManager */ public static AdapterManager getInstance() { return INSTANCE; } /** * Compute adapter types. * * @param adaptableClass the adaptable class * @return the string[] */ @SuppressWarnings("rawtypes") @Override public String[] computeAdapterTypes(final Class adaptableClass) { return Platform.getAdapterManager().computeAdapterTypes(adaptableClass); } /** * Compute class order. * * @param clazz the clazz * @return the class[] */ @SuppressWarnings("rawtypes") @Override public Class[] computeClassOrder(final Class clazz) { return Platform.getAdapterManager().computeClassOrder(clazz); } /** * Gets the adapter. * * @param adaptable the adaptable * @param adapterType the adapter type * @return the adapter */ @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public Object getAdapter(final Object adaptable, final Class adapterType) { Object result = null; if (adaptable == null || adapterType == null) { throw new IllegalArgumentException(); } final Class<?> adaptableType = adaptable.getClass(); if (adapterType.isAssignableFrom(adaptableType)) { result = adaptable; } else { for (final Map.Entry<Class<?>, List<IAdapterFactory>> entry : MAPPINGS .entrySet()) { final Class<?> entryType = entry.getKey(); if (entryType.isAssignableFrom(adaptableType)) { final List<IAdapterFactory> factories = entry.getValue(); for (final IAdapterFactory factory : factories) { for (final Class<?> supportedAdapterType : factory .getAdapterList()) { if (adapterType.isAssignableFrom(supportedAdapterType)) { final Object adapter = factory.getAdapter( adaptable, supportedAdapterType); if (adapter != null) { result = adapter; } } } } } } } if (result == null) { result = Platform.getAdapterManager().getAdapter(adaptableType, adapterType); } return result; } /** * Gets the adapter. * * @param adaptable the adaptable * @param adapterTypeName the adapter type name * @return the adapter */ @SuppressWarnings("rawtypes") @Override public Object getAdapter(final Object adaptable, final String adapterTypeName) { try { final Class adapterType = Class.forName(adapterTypeName); return getAdapter(adaptable, adapterType); } catch (ClassNotFoundException e) { return null; } } /** * Checks for adapter. * * @param adaptable the adaptable * @param adapterTypeName the adapter type name * @return true, if successful */ @Override public boolean hasAdapter(final Object adaptable, final String adapterTypeName) { return getAdapter(adaptable, adapterTypeName) != null; } /** * Query adapter. * * @param adaptable the adaptable * @param adapterTypeName the adapter type name * @return the int */ @Override public int queryAdapter(final Object adaptable, final String adapterTypeName) { if (getAdapter(adaptable, adapterTypeName) != null) { return IAdapterManager.LOADED; } else { return IAdapterManager.NONE; } } /** * Load adapter. * * @param adaptable the adaptable * @param adapterTypeName the adapter type name * @return the object */ @Override public Object loadAdapter(final Object adaptable, final String adapterTypeName) { return null; } /** * Register adapters. * * @param factory the factory * @param adaptable the adaptable */ @SuppressWarnings("rawtypes") @Override public void registerAdapters(final IAdapterFactory factory, final Class adaptable) { if (MAPPINGS.get(adaptable) == null) { MAPPINGS.put(adaptable, new LinkedList<IAdapterFactory>()); } final List<IAdapterFactory> mapping = MAPPINGS.get(adaptable); if (!mapping.contains(factory)) { mapping.add(factory); } } /** * Unregister adapters. * * @param factory the factory */ @Override public void unregisterAdapters(final IAdapterFactory factory) { for (final Map.Entry<Class<?>, List<IAdapterFactory>> entry : MAPPINGS .entrySet()) { entry.getValue().remove(factory); } } /** * Unregister adapters. * * @param factory the factory * @param adaptable the adaptable */ @SuppressWarnings("rawtypes") @Override public void unregisterAdapters(final IAdapterFactory factory, final Class adaptable) { if (MAPPINGS.get(adaptable) == null // || !MAPPINGS.get(adaptable).contains(factory)) { return; } MAPPINGS.get(adaptable).remove(factory); } }