/******************************************************************************* * Copyright (c) 2010 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.deltaspike.text.ext; import java.util.ArrayList; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; 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.jdt.internal.ui.text.JavaWordFinder; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; 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.core.CDICoreNature; import org.jboss.tools.cdi.core.CDIUtil; import org.jboss.tools.cdi.core.ICDIProject; import org.jboss.tools.cdi.deltaspike.core.DeltaspikeAuthorityMethod; import org.jboss.tools.cdi.deltaspike.core.DeltaspikeCorePlugin; import org.jboss.tools.cdi.deltaspike.core.DeltaspikeSecurityBindingConfiguration; import org.jboss.tools.cdi.deltaspike.core.DeltaspikeSecurityDefinitionContext; import org.jboss.tools.cdi.deltaspike.core.DeltaspikeSecurityExtension; import org.jboss.tools.cdi.deltaspike.core.SecurityBindingDeclaration; import org.jboss.tools.cdi.internal.core.impl.definition.AbstractMemberDefinition; import org.jboss.tools.common.java.IAnnotationDeclaration; public class AuthorizerHyperlinkDetector extends AbstractHyperlinkDetector{ protected IRegion region; protected IDocument document; protected ITextViewer viewer; public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { this.region = region; this.viewer = textViewer; ITextEditor textEditor= (ITextEditor)getAdapter(ITextEditor.class); if (region == null || !canShowMultipleHyperlinks || !(textEditor instanceof JavaEditor)) return null; int offset= region.getOffset(); ITypeRoot input = EditorUtility.getEditorInputJavaElement(textEditor, false); if (input == null) return null; document= textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); IRegion wordRegion= JavaWordFinder.findWord(document, offset); if (wordRegion == null) return null; IProject project = null; project = input.getJavaProject().getProject(); if(project == null) return null; CDICoreNature cdiNature = CDIUtil.getCDINatureWithProgress(project); if(cdiNature == null) return null; IJavaElement[] elements = null; IType annotationType = null; try { elements = input.codeSelect(wordRegion.getOffset(), wordRegion.getLength()); if (elements == null) return null; if(elements.length != 1) return null; ArrayList<IHyperlink> hyperlinks = new ArrayList<IHyperlink>(); int position = 0; if(elements[0] instanceof IType){ annotationType = (IType)elements[0]; if(!annotationType.isAnnotation()) { annotationType = null; } elements[0] = input.getElementAt(wordRegion.getOffset()); if(elements[0] == null) return null; if(elements[0] instanceof IMethod){ position = offset; } } findAuthorizerMethods(cdiNature, elements[0], annotationType, position, input.getPath(), hyperlinks); if (hyperlinks != null && !hyperlinks.isEmpty()) { return (IHyperlink[])hyperlinks.toArray(new IHyperlink[hyperlinks.size()]); } } catch (JavaModelException jme) { DeltaspikeCorePlugin.getDefault().logError(jme); } return null; } protected void findAuthorizerMethods(CDICoreNature nature, IJavaElement element, IType annotationType, int offset, IPath path, ArrayList<IHyperlink> hyperlinks){ ICDIProject cdiProject = nature.getDelegate(); if(cdiProject == null) { return; } DeltaspikeSecurityExtension extension = DeltaspikeSecurityExtension.getExtension(nature); if(extension == null) return; Set<DeltaspikeSecurityExtension> parents = DeltaspikeSecurityExtension.getParents(nature); DeltaspikeSecurityDefinitionContext context = (DeltaspikeSecurityDefinitionContext)extension.getContext(); Map<String, DeltaspikeSecurityBindingConfiguration> cs = context.getConfigurations(); for (DeltaspikeSecurityBindingConfiguration c: cs.values()) { Map<AbstractMemberDefinition, SecurityBindingDeclaration> ms = c.getBoundMembers(); Set<DeltaspikeAuthorityMethod> as = DeltaspikeSecurityExtension.collectAuthorizerMethods(parents, c.getSecurityBindingTypeName()); as.addAll(c.getAuthorizerMembers()); Set<String> authorityMethods = new HashSet<String>(); for (AbstractMemberDefinition m: ms.keySet()) { if(element.equals(m.getMember())) { for (DeltaspikeAuthorityMethod a: as) { try { IAnnotationDeclaration b = ms.get(m).getBinding(); IAnnotationDeclaration d = ms.get(m).getDeclaration(); if(annotationType != null && !annotationType.getFullyQualifiedName().equals(d.getTypeName())) { continue; } if(a.isMatching(b)) { IMethod method = a.getMethod().getMethod(); String k = "" + method.getElementName() + method.getSignature(); if(authorityMethods.contains(k)) { continue; } authorityMethods.add(k); JavaElementHyperlink h = new JavaElementHyperlink(region, method, document); hyperlinks.add(h); } } catch (CoreException e) { DeltaspikeCorePlugin.getDefault().logError(e); } } } } } } }