net.harawata.mybatipse.mybatis.JavaHyperlinkDetector.java Source code

Java tutorial

Introduction

Here is the source code for net.harawata.mybatipse.mybatis.JavaHyperlinkDetector.java

Source

/*-******************************************************************************
 * Copyright (c) 2014 Iwao AVE!.
 * 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:
 *    Iwao AVE! - initial API and implementation and/or initial documentation
 *******************************************************************************/

package net.harawata.mybatipse.mybatis;

import net.harawata.mybatipse.Activator;
import net.harawata.mybatipse.hyperlink.ToXmlHyperlink;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeRoot;
import org.eclipse.jdt.core.JavaModelException;
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.IEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;

/**
 * @author Iwao AVE!
 */
@SuppressWarnings("restriction")
public class JavaHyperlinkDetector extends AbstractHyperlinkDetector {
    @Override
    public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region,
            boolean canShowMultipleHyperlinks) {
        IHyperlink[] links = null;
        ITextEditor editor = (ITextEditor) getAdapter(ITextEditor.class);
        IEditorInput input = editor.getEditorInput();
        IJavaElement element = (IJavaElement) input.getAdapter(IJavaElement.class);
        ITypeRoot typeRoot = (ITypeRoot) element.getAdapter(ITypeRoot.class);
        try {
            IJavaElement[] srcElements = typeRoot.codeSelect(region.getOffset(), region.getLength());
            if (srcElements.length == 1) {
                IJavaElement srcElement = srcElements[0];
                switch (srcElement.getElementType()) {
                case IJavaElement.METHOD:
                    links = getLinks(typeRoot, null, "//*[@id='" + srcElement.getElementName() + "']", region);
                    break;
                case IJavaElement.TYPE:
                    links = getLinks(typeRoot, null, "//mapper", region);
                    break;
                default:
                    break;
                }
            }
        } catch (JavaModelException e) {
            Activator.log(Status.ERROR, e.getMessage(), e);
        }
        return links;
    }

    private IHyperlink[] getLinks(ITypeRoot typeRoot, IType triggerType, String expression, IRegion srcRegion)
            throws JavaModelException {
        IType primaryType = typeRoot.findPrimaryType();
        if (primaryType.isInterface() && (triggerType == null || primaryType.equals(triggerType))) {
            IJavaProject project = primaryType.getJavaProject();
            if (project != null) {
                IFile mapperFile = MapperNamespaceCache.getInstance().get(project,
                        primaryType.getFullyQualifiedName(), null);
                if (mapperFile != null) {
                    IDOMNode domNode = MybatipseXmlUtil.getNodeByXpath(mapperFile, expression);
                    if (domNode != null) {
                        Region destRegion = new Region(domNode.getStartOffset(),
                                domNode.getEndOffset() - domNode.getStartOffset());
                        String label = "Open <" + domNode.getNodeName() + "/> in XML mapper.";
                        return new IHyperlink[] { new ToXmlHyperlink(mapperFile, srcRegion, label, destRegion) };
                    }
                }
            }
        }
        return null;
    }
}