| /******************************************************************************* |
| * Copyright (c) 2013, 2014 Obeo and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Obeo - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.emf.compare.ide.ui.internal.util; |
| |
| import org.eclipse.compare.IResourceProvider; |
| import org.eclipse.compare.ITypedElement; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.core.runtime.Platform; |
| |
| /** |
| * This provides access to commonly used functions for platform elements, such as adaptation or file lookup. |
| * |
| * @author <a href="mailto:laurent.goubet@obeo.fr">Laurent Goubet</a> |
| */ |
| public class PlatformElementUtil { |
| /** |
| * Try and determine the resource of the given element. |
| * |
| * @param element |
| * The element for which we need an {@link IResource}. |
| * @return The resource corresponding to the given {@code element} if we could find it, <code>null</code> |
| * otherwise. |
| */ |
| public static IFile findFile(ITypedElement element) { |
| if (element == null) { |
| return null; |
| } |
| |
| // Can we adapt it directly? |
| IResource resource = adaptAs(element, IResource.class); |
| if (resource == null) { |
| // We know about some types ... |
| if (element instanceof IResourceProvider) { |
| resource = ((IResourceProvider)element).getResource(); |
| } |
| } |
| |
| if (resource instanceof IFile) { |
| return (IFile)resource; |
| } |
| // Try with IFile in case adapter only checked for class equality |
| return adaptAs(element, IFile.class); |
| } |
| |
| /** |
| * Tries and adapt the given <em>object</em> to an instance of the given class. |
| * |
| * @param <T> |
| * Type to which we need to adapt <em>object</em>. |
| * @param object |
| * The object we need to coerce to a given {@link Class}. |
| * @param clazz |
| * Class to which we are to adapt <em>object</em>. |
| * @return <em>object</em> cast to type <em>T</em> if possible, <code>null</code> if not. |
| */ |
| public static <T> T adaptAs(Object object, Class<T> clazz) { |
| if (object == null) { |
| return null; |
| } |
| |
| T result = null; |
| if (clazz.isInstance(object)) { |
| result = clazz.cast(object); |
| } else if (object instanceof IAdaptable) { |
| result = clazz.cast(((IAdaptable)object).getAdapter(clazz)); |
| } |
| |
| if (result == null) { |
| result = clazz.cast(Platform.getAdapterManager().loadAdapter(object, clazz.getName())); |
| } |
| |
| return result; |
| } |
| } |