/******************************************************************************* * Copyright (c) 2011 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 org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.IAnnotation; import org.eclipse.jdt.core.IField; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMemberValuePair; import org.eclipse.jdt.core.ISourceRange; import org.eclipse.jdt.core.ITypeRoot; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility; import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.ui.texteditor.ITextEditor; import org.jboss.tools.cdi.internal.core.refactoring.CDIMarkerResolutionUtils; import org.jboss.tools.cdi.seam.text.ext.CDISeamExtPlugin; public class CDISeamResourceLoadingHyperlinkDetector extends AbstractHyperlinkDetector{ public static final String RESOURCE_ANNOTATION_30 = "org.jboss.seam.solder.resourceLoader.Resource"; public static final String RESOURCE_ANNOTATION_31 = "org.jboss.solder.resourceLoader.Resource"; public static final String VALUE = "value"; @Override public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { ITextEditor textEditor= (ITextEditor)getAdapter(ITextEditor.class); if (region == null || !(textEditor instanceof JavaEditor)) return null; int offset = region.getOffset(); ITypeRoot input = EditorUtility.getEditorInputJavaElement(textEditor, false); if (input == null) return null; IDocument document= textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); IResource r = input.getResource(); if(!(r instanceof IFile) || !r.exists() || r.getName().endsWith(".jar")) { return null; } IFile file = (IFile)r; try { IJavaElement element = input.getElementAt(offset); if(element != null){ if(element instanceof IField){ IAnnotation annotation = CDIMarkerResolutionUtils.findAnnotation(element, RESOURCE_ANNOTATION_30); if(annotation == null || !annotation.exists()){ annotation = CDIMarkerResolutionUtils.findAnnotation(element, RESOURCE_ANNOTATION_31); } if(annotation != null && annotation.exists()){ IRegion annotationRegion = getAnnotationRegion(document, annotation); String text = getValue(annotation); if(text != null){ return new IHyperlink[]{new CDISeamResourceLoadingHyperlink(file, document, annotationRegion, text)}; } } } } }catch(CoreException ex){ CDISeamExtPlugin.getDefault().logError(ex); }catch(BadLocationException ex){ CDISeamExtPlugin.getDefault().logError(ex); } return null; } private IRegion getAnnotationRegion(IDocument document, IAnnotation annotation) throws BadLocationException, JavaModelException{ ISourceRange sourceRange = annotation.getSourceRange(); String annotationText = document.get(sourceRange.getOffset(), sourceRange.getLength()); int offset = sourceRange.getOffset(); int length = sourceRange.getLength(); int first = annotationText.indexOf("\""); if(first >= 0){ int last = annotationText.lastIndexOf("\""); if(last > 0 && last != first){ offset += first + 1; length = last - first - 1; } } IRegion region = new Region(offset, length); return region; } private String getValue(IAnnotation annotation) throws JavaModelException{ IMemberValuePair[] pairs = annotation.getMemberValuePairs(); for(IMemberValuePair pair : pairs){ if(pair.getMemberName().equals(VALUE) && pair.getValueKind() == IMemberValuePair.K_STRING){ return (String)pair.getValue(); } } return null; } }