blob: 458a401c7f38c274fd5717ca84f0d484b28d3a9a [file] [log] [blame]
/*******************************************************************************
* 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.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IModuleDescription;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.internal.compiler.env.IModule;
import org.eclipse.jdt.internal.compiler.env.IModulePathEntry;
public class ModuleSourcePathManager {
private Map<String, IModulePathEntry> knownModules = new HashMap<String, IModulePathEntry>(11);
private IModulePathEntry getModuleRoot0(String name) {
return this.knownModules.get(name);
}
public IModulePathEntry getModuleRoot(String name) {
IModulePathEntry root = getModuleRoot0(name);
if (root == null) {
try {
seekModule(name.toCharArray(),false, new JavaElementRequestor());
} catch (JavaModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
root = this.knownModules.get(name);
return root;
}
public void addEntry(IModuleDescription module, JavaProject project) throws JavaModelException {
String moduleName = new String(module.getElementName().toCharArray());
IModulePathEntry entry = getModuleRoot0(moduleName);
if (entry != null) {
// TODO : Should we signal error via JavaModelException
return;
}
this.knownModules.put(moduleName, new ProjectEntry(project));
}
public void removeEntry(JavaProject javaProject) {
Entry<String, IModulePathEntry> entry = this.knownModules.entrySet().stream()
.filter(e -> e.getValue().equalsProject(javaProject))
.findFirst()
.orElse(null);
String key = entry != null ? entry.getKey() : null;
if (key != null) {
this.knownModules.remove(key);
}
}
interface IPrefixMatcherCharArray {
boolean matches(char[] prefix, char[] name);
}
public void seekModule(char[] name, boolean prefixMatch, IJavaElementRequestor requestor) throws JavaModelException {
if (name == null)
return;
IPrefixMatcherCharArray prefixMatcher = prefixMatch ? CharOperation.equals(name, CharOperation.ALL_PREFIX) ?
(x, y) -> true : CharOperation::prefixEquals : CharOperation :: equals;
IJavaProject[] projects = JavaModelManager.getJavaModelManager().getJavaModel().getJavaProjects();
for (int i = 0; i < projects.length; i++) {
IJavaProject project = projects[i];
if (!project.getProject().isAccessible())
continue;
if (project instanceof JavaProject) {
IModuleDescription module = ((JavaProject) project).getModuleDescription();
if (module != null) {
if (prefixMatcher.matches(name, module.getElementName().toCharArray())) {
//addEntry(module, (JavaProject) project);
requestor.acceptModule(module);
}
}
}
}
}
public IModule getModule(char[] name) {
IModulePathEntry root = getModuleRoot0(CharOperation.charToString(name));
if (root != null)
try {
return root.getModule();
} catch (Exception e1) {
//
return null;
}
JavaElementRequestor requestor = new JavaElementRequestor();
try {
seekModule(name, false, requestor);
} catch (JavaModelException e) {
//
}
IModuleDescription[] modules = requestor.getModules();
if (modules.length > 0) {
IModuleDescription module = modules[0];
try {
return (IModule) ((JavaElement) module).getElementInfo();
} catch (JavaModelException e) {
e.printStackTrace();
}
}
return null;
}
// public IModuleDeclaration[] getModules() {
// if (this.knownModules.size() == 0) {
// return new IModuleDeclaration[0];
// }
// List<IModuleDeclaration> modules = new ArrayList<IModuleDeclaration>();
// for (IModulePathEntry val : this.knownModules.values()) {
// try {
// modules.add(val.getModule());
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// return modules.toArray(new IModuleDeclaration[modules.size()]);
// }
}