| /******************************************************************************* |
| * Copyright (c) 2011 IBM Corporation. |
| * 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: |
| * IBM - Initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.remote.internal.core; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IAdapterFactory; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtension; |
| import org.eclipse.core.runtime.IExtensionPoint; |
| import org.eclipse.core.runtime.IExtensionRegistry; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.remote.core.IRemoteResource; |
| import org.eclipse.remote.internal.core.services.local.LocalResource; |
| |
| public class RemoteResourceAdapterFactory implements IAdapterFactory { |
| public static final String EXTENSION_POINT_ID = "remoteResources"; //$NON-NLS-1$ |
| |
| public static final String ATTR_NATURE = "nature"; //$NON-NLS-1$ |
| public static final String ATTR_CLASS = "class"; //$NON-NLS-1$ |
| |
| private Map<String, RemoteResourceFactory> fResourceFactory; |
| |
| public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) { |
| if (adapterType == IRemoteResource.class) { |
| if (adaptableObject instanceof IResource) { |
| loadExtensions(); |
| IResource resource = (IResource) adaptableObject; |
| for (String nature : fResourceFactory.keySet()) { |
| try { |
| if (resource.getProject().hasNature(nature)) { |
| RemoteResourceFactory factory = fResourceFactory.get(nature); |
| if (factory != null) { |
| return adapterType.cast(factory.getRemoteResource(resource)); |
| } |
| } |
| } catch (CoreException e) { |
| // Treat as failure |
| } |
| } |
| return adapterType.cast(new LocalResource(resource)); |
| } |
| } |
| return null; |
| } |
| |
| public Class<?>[] getAdapterList() { |
| return new Class[] { IRemoteResource.class }; |
| } |
| |
| private synchronized void loadExtensions() { |
| if (fResourceFactory == null) { |
| fResourceFactory = new HashMap<String, RemoteResourceFactory>(); |
| |
| IExtensionRegistry registry = Platform.getExtensionRegistry(); |
| IExtensionPoint extensionPoint = registry.getExtensionPoint(RemoteCorePlugin.getUniqueIdentifier(), |
| EXTENSION_POINT_ID); |
| |
| for (IExtension ext : extensionPoint.getExtensions()) { |
| final IConfigurationElement[] elements = ext.getConfigurationElements(); |
| |
| for (IConfigurationElement ce : elements) { |
| String nature = ce.getAttribute(ATTR_NATURE); |
| RemoteResourceFactory factory = new RemoteResourceFactory(ce); |
| fResourceFactory.put(nature, factory); |
| } |
| } |
| } |
| } |
| |
| } |