content: /*******************************************************************************
   * Copyright (c) 2000, 2010 IBM Corporation and others.
   * 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:
   *     IBM Corporation - initial API and implementation
   *******************************************************************************/
  package org.eclipse.wst.jsdt.internal.ui.text.java;
  
  
  import java.io.IOException;
  import java.io.Reader;
  import java.io.StringReader;
  
  import org.eclipse.core.runtime.IProgressMonitor;
  import org.eclipse.wst.jsdt.core.IJavaScriptElement;
  import org.eclipse.wst.jsdt.core.IMember;
  import org.eclipse.wst.jsdt.core.JavaScriptModelException;
  import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
  import org.eclipse.wst.jsdt.internal.ui.text.javadoc.JavaDoc2HTMLTextReader;
  import org.eclipse.wst.jsdt.ui.JSdocContentAccess;
  
  
  public class ProposalInfo {
  
  	private boolean fJavadocResolved= false;
  	private String fJavadoc= null;
  
  	protected IJavaScriptElement fElement;
  
  	public ProposalInfo(IMember member) {
  		fElement= member;
  	}
  	
  	protected ProposalInfo() {
  		fElement= null;
  	}
  
  	public IJavaScriptElement getJavaElement() throws JavaScriptModelException {
  		return fElement;
  	}
  
  	/**
  	 * Gets the text for this proposal info formatted as HTML, or
  	 * <code>null</code> if no text is available.
  	 *
  	 * @param monitor a progress monitor
  	 * @return the additional info text
  	 */
  	public final String getInfo(IProgressMonitor monitor) {
  		if (!fJavadocResolved) {
  			fJavadocResolved= true;
  			fJavadoc= computeInfo(monitor);
  		}
  		return fJavadoc;
  	}
  
  	/**
  	 * Gets the text for this proposal info formatted as HTML, or
  	 * <code>null</code> if no text is available.
  	 *
  	 * @param monitor a progress monitor
  	 * @return the additional info text
  	 */
  	private String computeInfo(IProgressMonitor monitor) {
  		try {
  			final IJavaScriptElement javaElement= getJavaElement();
  			return extractJavadoc(javaElement, monitor);
  		} catch (JavaScriptModelException e) {
  			JavaScriptPlugin.log(e);
  		} catch (IOException e) {
  			JavaScriptPlugin.log(e);
  		}
  		return null;
  	}
  
  	/**
  	 * Extracts the javadoc for the given <code>IMember</code> and returns it
  	 * as HTML.
  	 *
  	 * @param element the member to get the documentation for
  	 * @param monitor a progress monitor
  	 * @return the javadoc for <code>member</code> or <code>null</code> if
  	 *         it is not available
  	 * @throws JavaScriptModelException if accessing the javadoc fails
  	 * @throws IOException if reading the javadoc fails
  	 */
  	private String extractJavadoc(IJavaScriptElement element, IProgressMonitor monitor) throws JavaScriptModelException, IOException {
  		if (element != null) {
  			Reader reader =  getHTMLContentReader(element, monitor);
  			if (reader != null)
  				return getString(reader);
  		}
  		return null;
  	}
  
  	private Reader getHTMLContentReader(IJavaScriptElement element, IProgressMonitor monitor) throws JavaScriptModelException {
  		Reader contentReader= JSdocContentAccess.getHTMLContentReader(element, true, true);
          if (contentReader != null) {
          	return contentReader;
          }
  
          contentReader= JSdocContentAccess.getContentReader(element, true);
          if (contentReader != null) {
          	return new JavaDoc2HTMLTextReader(contentReader);
          }
  	        
          if (element.getOpenable().getBuffer() == null) { // only if no source available
          	String s= element.getAttachedJavadoc(monitor);
          	if (s != null)
          		return new StringReader(s);
          }
          return null;
      }
  	
  	/**
  	 * Gets the reader content as a String
  	 */
  	private static String getString(Reader reader) {
  		StringBuffer buf= new StringBuffer();
  		char[] buffer= new char[1024];
  		int count;
  		try {
  			while ((count= reader.read(buffer)) != -1)
  				buf.append(buffer, 0, count);
  		} catch (IOException e) {
  			return null;
  		}
  		return buf.toString();
  	}
  }
  