| /******************************************************************************* |
| * Copyright (c) 2016, 2018 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.jdt.internal.core; |
| |
| import java.net.URL; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.OperationCanceledException; |
| import org.eclipse.jdt.core.IJavaElement; |
| import org.eclipse.jdt.core.ISourceRange; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; |
| import org.eclipse.jdt.internal.compiler.env.IBinaryModule; |
| import org.eclipse.jdt.internal.compiler.env.IModule; |
| import org.eclipse.jdt.internal.core.JavaModelManager.PerProjectInfo; |
| |
| public class BinaryModule extends BinaryMember implements AbstractModule { |
| |
| private IBinaryModule info; |
| |
| /** For creating a pure handle from its memento. */ |
| public BinaryModule(JavaElement parent, String name) { |
| super(parent, name); |
| } |
| /** For creating a populated handle from a class file. */ |
| public BinaryModule(JavaElement parent, IBinaryModule info) { |
| super(parent, String.valueOf(info.name())); |
| this.info = info; |
| } |
| @Override |
| public IModule getModuleInfo() throws JavaModelException { |
| if (this.info == null) { |
| ModularClassFile classFile = (ModularClassFile) this.parent; |
| this.info = classFile.getBinaryModuleInfo(); |
| } |
| return this.info; |
| } |
| /* |
| * @see IParent#getChildren() |
| */ |
| @Override |
| public IJavaElement[] getChildren() throws JavaModelException { |
| return NO_ELEMENTS; |
| } |
| @Override |
| public boolean isBinary() { |
| return true; |
| } |
| @Override |
| public int getFlags() throws JavaModelException { |
| if (getModuleInfo().isOpen()) |
| return ClassFileConstants.ACC_OPEN; |
| return 0; |
| } |
| @Override |
| public char getHandleMementoDelimiter() { |
| return JavaElement.JEM_MODULE; |
| } |
| @Override |
| public String getKey(boolean forceOpen) throws JavaModelException { |
| return getKey(this, forceOpen); |
| } |
| @Override |
| public ISourceRange getSourceRange() throws JavaModelException { |
| SourceMapper mapper= getSourceMapper(); |
| if (mapper != null) { |
| // ensure the class file's buffer is open so that source ranges are computed |
| ((ModularClassFile)getClassFile()).getBuffer(); |
| |
| return mapper.getSourceRange(this); |
| } else { |
| return SourceMapper.UNKNOWN_RANGE; |
| } |
| } |
| @Override |
| public String getAttachedJavadoc(IProgressMonitor monitor) throws JavaModelException { |
| JavadocContents javadocContents = getJavadocContents(monitor); |
| if (javadocContents == null) return null; |
| return javadocContents.getModuleDoc(); |
| } |
| public JavadocContents getJavadocContents(IProgressMonitor monitor) throws JavaModelException { |
| PerProjectInfo projectInfo = JavaModelManager.getJavaModelManager().getPerProjectInfoCheckExistence(getJavaProject().getProject()); |
| JavadocContents cachedJavadoc = null; |
| synchronized (projectInfo.javadocCache) { |
| cachedJavadoc = (JavadocContents) projectInfo.javadocCache.get(this); |
| } |
| |
| if (cachedJavadoc != null && cachedJavadoc != BinaryType.EMPTY_JAVADOC) { |
| return cachedJavadoc; |
| } |
| URL baseLocation= getJavadocBaseLocation(); |
| if (baseLocation == null) { |
| return null; |
| } |
| StringBuffer pathBuffer = new StringBuffer(baseLocation.toExternalForm()); |
| |
| if (!(pathBuffer.charAt(pathBuffer.length() - 1) == '/')) { |
| pathBuffer.append('/'); |
| } |
| pathBuffer.append(getElementName()).append(JavadocConstants.MODULE_FILE_SUFFIX); |
| if (monitor != null && monitor.isCanceled()) throw new OperationCanceledException(); |
| String contents = getURLContents(baseLocation, String.valueOf(pathBuffer)); |
| JavadocContents javadocContents = new JavadocContents(contents); |
| synchronized (projectInfo.javadocCache) { |
| projectInfo.javadocCache.put(this, javadocContents); |
| } |
| return javadocContents; |
| } |
| @Override |
| public String toString(String lineDelimiter) { |
| StringBuffer buffer = new StringBuffer(); |
| try { |
| toStringContent(buffer, lineDelimiter); |
| } catch (JavaModelException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| return buffer.toString(); |
| } |
| } |