| /******************************************************************************* |
| * Copyright (c) 2010, 2012 Oracle. 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: |
| * Oracle - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jpt.common.core.internal.resource; |
| |
| import org.eclipse.core.resources.IContainer; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.jpt.common.core.JptCommonCorePlugin; |
| import org.eclipse.jpt.common.core.internal.utility.PlatformTools; |
| import org.eclipse.pde.core.project.IBundleProjectService; |
| import org.osgi.framework.BundleContext; |
| import org.osgi.framework.ServiceReference; |
| |
| public class PluginResourceLocator |
| extends SimpleJavaResourceLocator |
| { |
| @Override |
| public IContainer getDefaultResourceLocation(IProject project) { |
| IContainer bundleRoot = this.getBundleRoot(project); |
| return (bundleRoot != null) ? |
| bundleRoot.getFolder(META_INF_PATH) : |
| super.getDefaultResourceLocation(project); |
| } |
| |
| @Override |
| public IPath getResourcePath(IProject project, IPath runtimePath) { |
| IContainer bundleRoot = this.getBundleRoot(project); |
| if (bundleRoot != null) { |
| IPath resourcePath = bundleRoot.getFullPath().append(runtimePath); |
| if (project.getWorkspace().getRoot().getFile(resourcePath).exists()) { |
| return resourcePath; |
| } |
| } |
| return super.getResourcePath(project, runtimePath); |
| } |
| |
| @Override |
| public IPath getRuntimePath(IProject project, IPath resourcePath) { |
| IContainer bundleRoot = this.getBundleRoot(project); |
| if (bundleRoot != null) { |
| IFile file = PlatformTools.getFile(resourcePath); |
| if (bundleRoot.contains(file)) { |
| return resourcePath.makeRelativeTo(bundleRoot.getFullPath()); |
| } |
| } |
| return super.getRuntimePath(project, resourcePath); |
| } |
| |
| protected IContainer getBundleRoot(IProject project) { |
| try { |
| return this.getBundleRoot_(project); |
| } catch (CoreException ex) { |
| // problem creating description on an existing project |
| JptCommonCorePlugin.log(ex); |
| return null; |
| } |
| } |
| |
| protected IContainer getBundleRoot_(IProject project) throws CoreException { |
| BundleContext bundleContext = JptCommonCorePlugin.instance().getBundle().getBundleContext(); |
| if (bundleContext == null) { |
| return project; |
| } |
| ServiceReference<IBundleProjectService> serviceRef = bundleContext.getServiceReference(IBundleProjectService.class); |
| if (serviceRef == null) { |
| return project; |
| } |
| IBundleProjectService service = bundleContext.getService(serviceRef); |
| if (service == null) { |
| bundleContext.ungetService(serviceRef); |
| return project; |
| } |
| IPath bundleRoot = service.getDescription(project).getBundleRoot(); |
| bundleContext.ungetService(serviceRef); |
| return (bundleRoot == null) ? project : project.getFolder(bundleRoot); |
| } |
| |
| protected IBundleProjectService getBundleProjectService() { |
| BundleContext context = JptCommonCorePlugin.instance().getBundle().getBundleContext(); |
| ServiceReference<IBundleProjectService> reference = context.getServiceReference(IBundleProjectService.class); |
| if (reference == null) { |
| return null; |
| } |
| IBundleProjectService service = context.getService(reference); |
| if (service != null) { |
| context.ungetService(reference); |
| } |
| return service; |
| } |
| } |