/******************************************************************************* * Copyright (c) 2011-2012 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.cdi.seam.text.ext.hyperlink; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.IEditorPart; import org.jboss.tools.cdi.seam.text.ext.CDISeamExtMessages; import org.jboss.tools.common.model.util.EclipseResourceUtil; import org.jboss.tools.common.text.ext.hyperlink.AbstractHyperlink; import org.jboss.tools.common.text.ext.util.Utils; public class CDISeamResourceLoadingHyperlink extends AbstractHyperlink{ private final static String PROPERTIES = ".properties"; private String path; private IFile file; public CDISeamResourceLoadingHyperlink(IFile file, IDocument document, IRegion region, String path){ super(); this.file = file; setRegion(region); this.path = path; setDocument(document); } protected IFile getFile(){ return file; } @Override public IFile getReadyToOpenFile(){ String fileName = path; IFile result = searchFile(fileName); if(result != null && result.exists()) return result; fileName = replaceDots(fileName); result = searchFile(fileName); if(result != null && result.exists()) return result; fileName = path; fileName += PROPERTIES; fileName = replaceDots(fileName); return searchFile(fileName); } private String replaceDots(String name){ String fileName = name; int propIndex = fileName.lastIndexOf("."); if(propIndex < 0) return fileName; String extension = fileName.substring(propIndex); fileName = fileName.substring(0, propIndex); fileName = fileName.replace(".", "/"); fileName += extension; return fileName; } public IFile searchFile(String fileName){ IFile result = getFileFromProject(fileName); if(result != null && result.exists()) return result; if(file == null || !file.isAccessible()) return null; fileName = findAndReplaceElVariable(fileName); IProject project = file.getProject(); String name = Utils.trimFilePath(fileName); IPath currentPath = file.getLocation().removeLastSegments(1); IResource member = null; if (name.startsWith("/")) { //$NON-NLS-1$ member = findByAbsolutePath(project, name); } else { member = findByRelativePath(project, currentPath, name); if (member == null && name.length() > 0) { member = findByAbsolutePath(project, "/" + name); //$NON-NLS-1$ } } if (member != null && (member instanceof IFile)) { if (((IFile) member).exists()) return (IFile) member; } return null; } private IFile findByRelativePath(IProject project, IPath basePath, String path) { if (path == null || path.trim().length() == 0) return null; path = findAndReplaceElVariable(path); IFile member = null; Set<IFolder> sources = EclipseResourceUtil.getSourceFolders(file.getProject()); for (IFolder source : sources) { IPath webRootPath = source.getProjectRelativePath(); IPath relativePath = Utils.getRelativePath(webRootPath, basePath); IPath filePath = relativePath.append(path); member = project.getFolder(webRootPath).getFile(filePath); if (member.exists()) { return member; } } return null; } private IFile findByAbsolutePath(IProject project, String path) { path = findAndReplaceElVariable(path); IFile member = null; Set<IFolder> sources = EclipseResourceUtil.getSourceFolders(file.getProject()); for (IFolder source : sources) { IPath sourcePath = source.getProjectRelativePath(); member = project.getFolder(sourcePath).getFile(path); if(member.exists()) { return member; } } return null; } @Override protected void doHyperlink(IRegion region) { IFile file = getReadyToOpenFile(); IEditorPart part = openFileInEditor(file); if(part == null) openFileFailed(); } @Override public String getHyperlinkText() { return NLS.bind(CDISeamExtMessages.CDI_SEAM_RESOURCE_LOADING_HYPERLINK, path); } }