org.eclipse.flux.jdt.services.JavaDocService.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.flux.jdt.services.JavaDocService.java

Source

/*******************************************************************************
 * Copyright (c) 2014 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 *
 * Contributors:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.flux.jdt.services;

import java.io.IOException;

import org.eclipse.flux.client.IMessageHandler;
import org.eclipse.flux.client.MessageConnector;
import org.eclipse.flux.client.MessageHandler;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.JavaModelException;
import org.json.JSONException;
import org.json.JSONObject;

public class JavaDocService {
    private MessageConnector messagingConnector;
    private LiveEditUnits liveEditUnits;
    private IMessageHandler javadocRequestHandler;

    public JavaDocService(MessageConnector messagingConnector, LiveEditUnits liveEditUnits) {
        this.messagingConnector = messagingConnector;
        this.liveEditUnits = liveEditUnits;
        this.javadocRequestHandler = new MessageHandler("javadocrequest") {
            @Override
            public void handle(String messageType, JSONObject message) {
                handleJavadocRequest(message);
            }
        };
        messagingConnector.addMessageHandler(this.javadocRequestHandler);
    }

    protected void handleJavadocRequest(JSONObject message) {
        try {
            String username = message.getString("username");
            String projectName = message.getString("project");
            String resourcePath = message.getString("resource");
            int callbackID = message.getInt("callback_id");
            String liveEditID = projectName + "/" + resourcePath;
            if (liveEditUnits.isLiveEditResource(username, liveEditID)) {
                int offset = message.getInt("offset");
                int length = message.getInt("length");
                String sender = message.getString("requestSenderID");
                JSONObject javadocResult = getJavadoc(username, liveEditID, offset, length);
                if (javadocResult != null) {
                    JSONObject responseMessage = new JSONObject();
                    responseMessage.put("username", username);
                    responseMessage.put("project", projectName);
                    responseMessage.put("resource", resourcePath);
                    responseMessage.put("callback_id", callbackID);
                    responseMessage.put("requestSenderID", sender);
                    responseMessage.put("javadoc", javadocResult);
                    messagingConnector.send("javadocresponse", responseMessage);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public JSONObject getJavadoc(String username, String requestorResourcePath, int offset, int length) {
        try {
            ICompilationUnit liveEditUnit = liveEditUnits.getLiveEditUnit(username, requestorResourcePath);
            if (liveEditUnit != null) {
                IJavaElement[] elements = liveEditUnit.codeSelect(offset, length);
                if (elements != null && elements.length > 0) {
                    JSONObject result = new JSONObject();
                    IJavaElement element = elements[0];
                    String javadoc = null;
                    if (element instanceof IMember && !((IMember) element).isBinary()) {
                        javadoc = getJavadocFromSourceElement((IMember) element);
                    } else {
                        javadoc = element.getAttachedJavadoc(null);
                    }
                    result.put("javadoc", javadoc);
                    return result;
                }
            }
        } catch (JavaModelException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String getJavadocFromSourceElement(IMember member) {
        JavaDocCommentReader reader = null;
        try {
            IBuffer buffer = member.getOpenable().getBuffer();
            if (buffer == null) {
                return null;
            }
            ISourceRange javadocRange = member.getJavadocRange();
            if (javadocRange != null) {
                reader = new JavaDocCommentReader(buffer, javadocRange.getOffset(),
                        javadocRange.getOffset() + javadocRange.getLength() - 1);
                StringBuffer buf = new StringBuffer();
                char[] charBuffer = new char[1024];
                int count;
                try {
                    while ((count = reader.read(charBuffer)) != -1)
                        buf.append(charBuffer, 0, count);
                } catch (IOException e) {
                    return null;
                }
                return buf.toString();
            }
        } catch (JavaModelException e) {
            e.printStackTrace();
        } finally {
            if (reader != null)
                reader.close();
        }
        return null;
    }

    public void dispose() {
        this.messagingConnector.removeMessageHandler(javadocRequestHandler);
    }
}