/******************************************************************* * Copyright (c) 2006-2013, Cloudsmith Inc. * The code, documentation and other materials contained herein * are the sole and exclusive property of Cloudsmith Inc. and may * not be disclosed, used, modified, copied or distributed without * prior written consent or license from Cloudsmith Inc. ******************************************************************/ package org.eclipse.buckminster.ui.adapters; import org.eclipse.buckminster.core.cspec.model.CSpec; import org.eclipse.buckminster.core.metadata.WorkspaceInfo; import org.eclipse.buckminster.core.metadata.model.Resolution; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdapterFactory; /** * Adapter Factory that converts: IResource to CSpec, CSpecDataNode, Resolution, * and ResolutionDataNode * * @author Henrik Lindberg * */ public class ResourceAdapterFactory implements IAdapterFactory { private static Class<?>[] adapterList = { CSpec.class, CSpecDataNode.class, Resolution.class, ResolutionDataNode.class }; @Override @SuppressWarnings({ "rawtypes", "unchecked" }) public Object getAdapter(Object adaptableObject, Class adapterType) { if (adaptableObject instanceof IResource) { // All adaptions require a cspec for the resource CSpec cspec = getCSpecFromResource((IResource) adaptableObject); if (cspec == null) return null; if (adapterType.isAssignableFrom(CSpec.class)) return cspec; if (adapterType.isAssignableFrom(CSpecDataNode.class)) return new CSpecDataNode(cspec); // Remaining adaptions need a Resolution Resolution r = null; try { r = WorkspaceInfo.getResolution(cspec.getComponentIdentifier()); } catch (CoreException e) { return null; } if (r == null) return null; if (adapterType.isAssignableFrom(Resolution.class)) return r; if (adapterType.isAssignableFrom(ResolutionDataNode.class)) return new ResolutionDataNode(r); } // give up return null; } @Override public Class<?>[] getAdapterList() { return adapterList; } public CSpec getCSpecFromResource(IResource resource) { while (resource != null) { try { CSpec cspec = WorkspaceInfo.getCSpec(resource); if (cspec != null) { return cspec; } resource = resource.getParent(); } catch (CoreException e) { // ignore } } return null; } }