/*******************************************************************************
* Copyright (c) 2007-2009 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.text.ext.hyperlink.xml;
import java.util.zip.ZipEntry;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.core.JarEntryDirectory;
import org.eclipse.jdt.internal.core.JarEntryFile;
import org.eclipse.jdt.internal.core.JarEntryResource;
import org.eclipse.jdt.internal.core.JarPackageFragmentRoot;
import org.eclipse.jdt.internal.ui.javaeditor.JarEntryEditorInput;
import org.eclipse.jface.text.IRegion;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.jboss.tools.common.text.ext.ExtensionsPlugin;
import org.jboss.tools.common.text.ext.hyperlink.LinkHyperlink;
/**
* @author mareshkau
*
*/
public class FaceletSourceTagHyperlink extends LinkHyperlink{
@Override
protected void doHyperlink(IRegion region) {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart editorPart = page.getActiveEditor();
// if we open taglib definition in jar file
JarEntryFile current = null;
try {
if(editorPart.getEditorInput() instanceof IStorageEditorInput &&
((IStorageEditorInput)editorPart.getEditorInput()).getStorage() instanceof JarEntryFile) {
current = (JarEntryFile)((IStorageEditorInput)editorPart.getEditorInput()).getStorage();
}
} catch (CoreException e) {
ExtensionsPlugin.getDefault().logError(e);
}
if(current != null) {
String fileToOpenName =getFilePath(region);
if(fileToOpenName!=null) {
//remove whitespaces and first '/'
fileToOpenName = fileToOpenName.trim();
if(fileToOpenName.indexOf('/')==0) {
fileToOpenName=fileToOpenName.substring(1);
}
int ii = fileToOpenName.lastIndexOf('/');
String folder = ii < 0 ? "" : fileToOpenName.substring(0, ii);
fileToOpenName = fileToOpenName.substring(ii + 1);
JarEntryFile fileToOpen = new JarEntryFile(fileToOpenName);
if(folder.length() > 0) {
if(folder.startsWith("META-INF")) {
JarEntryResource r = null;
while (folder.length() > 0) {
int iii = folder.indexOf('/');
String name = iii < 0 ? folder : folder.substring(
0, iii);
folder = iii < 0 ? "" : folder.substring(iii + 1);
fileToOpenName = fileToOpenName
.substring(fileToOpenName.indexOf('/') + 1);
JarEntryResource r1 = new JarEntryDirectory(name);
r1.setParent(r != null ? r : current
.getPackageFragmentRoot());
r = r1;
}
fileToOpen.setParent(r);
} else {
IPackageFragment pf = current.getPackageFragmentRoot().getPackageFragment(folder.replace('/', '.'));
fileToOpen.setParent(pf);
}
} else {
fileToOpen.setParent(current.getPackageFragmentRoot());
}
JarEntryEditorInput editorInputToOpenEditor= new JarEntryEditorInput(fileToOpen);
IEditorPart openedEditor = openFileInEditor(editorInputToOpenEditor,
fileToOpen.getName());
if(openedEditor==null) {
openFileFailed();
}
}
return;
}
else if(editorPart.getEditorInput() instanceof IStorageEditorInput) {
IStorageEditorInput modelObjectStorageEditorInput =
(IStorageEditorInput) editorPart.getEditorInput();
try {
IStorage storage = modelObjectStorageEditorInput.getStorage();
if(storage!=null && getFilePath(region)!=null) {
if(openOnFromModelEditorIntup(storage.getFullPath(), getFilePath(region))){
return;
}
}
} catch (CoreException e) {
ExtensionsPlugin.getDefault().logError(e);
}
}
super.doHyperlink(region);
}
/**
*
* @param xmodelPaht it's path to file in jar archive on which we are trying to make open on
* Example 'JBIDE3247/FileSystems/lib-mydomain.jar/META-INF/custom.taglib.xml'
* @param fileToOpen jar archive relative name for which we are trying to make open on
* Example '/inputCurrency.xhtml's
*/
private boolean openOnFromModelEditorIntup(IPath xmodelPath, String fileToOpen) {
if(xmodelPath==null || fileToOpen==null) {
return false;
}
String projectName = xmodelPath.segment(0);
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
JarEntryEditorInput editorInputToOpenEditor=seachResourceInClassPath(project,new Path(fileToOpen.substring(1)),xmodelPath);
if(editorInputToOpenEditor==null) {
return false;
}
IEditorPart openedEditor = openFileInEditor(editorInputToOpenEditor,
editorInputToOpenEditor.getName());
if(openedEditor==null) {
openFileFailed();
return false;
}
return true;
}
/**
*
* @param project project from which we are going to open File
* @param classPathResource resource relativy to class path
* @param xmodelPath xmodel path to file
* @return
*/
private static JarEntryEditorInput seachResourceInClassPath(IProject project, IPath classPathResource, IPath xmodelPath) {
IJavaProject javaProject = JavaCore.create(project);
try {
for (IPackageFragmentRoot fragmentRoot : javaProject.getAllPackageFragmentRoots()) {
if(fragmentRoot instanceof JarPackageFragmentRoot) {
JarPackageFragmentRoot jarPackageFragmentRoot = (JarPackageFragmentRoot) fragmentRoot;
ZipEntry zipEntry = jarPackageFragmentRoot.getJar().getEntry(classPathResource.toString());
//the name of jar file shoul be in xmodel path
//for now if model have following
if(zipEntry!=null&&xmodelPath.toString().contains(fragmentRoot.getElementName())){
JarEntryFile fileInJar = new JarEntryFile(classPathResource.lastSegment());
Object parent = null;
String parentName =classPathResource.removeLastSegments(1).toString();
if(parentName.length()==0) {
parent = jarPackageFragmentRoot;
}else{
parent = jarPackageFragmentRoot.getPackageFragment(classPathResource.removeLastSegments(1).toString());
}
fileInJar.setParent(parent);
JarEntryEditorInput jarEditorInput = new JarEntryEditorInput(fileInJar);
return jarEditorInput;
}
}
}
} catch (JavaModelException e) {
ExtensionsPlugin.getDefault().logError(e);
} catch (CoreException e) {
ExtensionsPlugin.getDefault().logError(e);
}
return null;
}
}