Copyright (c) 2016, 2018 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: IBM Corporation - initial API and implementation
/******************************************************************************* * Copyright (c) 2016, 2018 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * 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.IAnnotation; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IPackageFragmentRoot; 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.IBinaryAnnotation; import org.eclipse.jdt.internal.compiler.env.IBinaryModule; import org.eclipse.jdt.internal.compiler.env.IModule; import org.eclipse.jdt.internal.compiler.lookup.TagBits; 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.
/** 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.
/** 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; } @Override public IAnnotation[] getAnnotations() throws JavaModelException { IBinaryModule moduleInfo = (IBinaryModule) getModuleInfo(); IBinaryAnnotation[] binaryAnnotations = moduleInfo.getAnnotations(); long tagBits = moduleInfo.getTagBits() & ~TagBits.AnnotationDeprecated; // TODO: kludge to avoid duplication of real annotation and tagBit induced standard annotation return getAnnotations(binaryAnnotations, tagBits); } @Override public IJavaElement[] getChildren() throws JavaModelException { return NO_ELEMENTS; } @Override public boolean isBinary() { return true; } @Override public boolean isSystemModule() { IPackageFragmentRoot pfr = (IPackageFragmentRoot) getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); return pfr instanceof JrtPackageFragmentRoot; } @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(); } }