blob: 2f0ae41d7e0b2284e9fc5eeba1322d1e5e06801c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.ote.container;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.core.JavaProject;
import org.eclipse.osee.framework.ui.workspacebundleloader.JarChangeResourceListener;
import org.eclipse.osee.ote.core.BundleInfo;
import org.eclipse.osee.ote.core.OteBundleLocator;
import org.eclipse.osee.ote.runtimemanager.OteUserLibsNature;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
/**
* @author Andrew M. Finkbeiner
*/
public class OteClasspathContainer implements IClasspathContainer, IUserLibListener {
public final static Path ID = new Path("OTE Classpath Container from the extension point");
private Collection<ClassPathDescription> classPaths;
private List<BundleInfo> betterPaths;
private ServiceTracker tracker;
private OteBundleLocator locator;
private final JavaProject javaProject;
private LibraryChangeProvider<OteUserLibsNature> userLibListener;
private JarChangeResourceListener<OteUserLibsNature> userLibResourceListener;
public OteClasspathContainer(IPath path, IJavaProject javaProject) throws CoreException {
this.javaProject = (JavaProject) javaProject;
try {
BundleContext context = OteContainerActivator.getDefault().getContext();
tracker = new ServiceTracker(context, OteBundleLocator.class.getName(), null);
tracker.open(true);
Object obj = tracker.waitForService(10000);
locator = (OteBundleLocator) obj;
OteContainerActivator.getDefault().getLibraryChangeProvider().addListener(this);
} catch (Exception ex) {
ex.printStackTrace();
}
}
private String findProjectRoot(String path) {
File fileForPath = new File(path);
File projectFile = recursivelyFindProjectFile(fileForPath);
return projectFile.getAbsolutePath();
}
private File recursivelyFindProjectFile(File file) {
if (file == null) {
return file;
}
if (fileIsDirectoryWithBin(file)) {
return file;
} else {
return recursivelyFindProjectFile(file.getParentFile());
}
}
private boolean fileIsDirectoryWithBin(File file) {
if (file.isDirectory()) {
File binChildFile = new File(file.getAbsoluteFile() + "/bin");
if (binChildFile.exists()) {
return true;
}
}
return false;
}
private String getWorkspaceRelativePath(String absolutePath) {
return absolutePath;
}
@Override
public IClasspathEntry[] getClasspathEntries() {
List<IClasspathEntry> entries = new ArrayList<>();
Collection<BundleInfo> runtimeLibUrls;
try {
runtimeLibUrls = locator.getRuntimeLibs();
classPaths = new ArrayList<>();
betterPaths = new ArrayList<>();
for (BundleInfo info : runtimeLibUrls) {
String binaryFilePath = info.getSystemLocation().getFile();
if (info.isSystemLibrary()) {
entries.add(JavaCore.newLibraryEntry(new Path(binaryFilePath), new Path(binaryFilePath), new Path("/")));
} else {
File projectFilePath = recursivelyFindProjectFile(new File(binaryFilePath));
binaryFilePath = "/" + projectFilePath.getName();
entries.add(JavaCore.newProjectEntry(new Path(binaryFilePath)));
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
IClasspathEntry[] retVal = new IClasspathEntry[entries.size()];
return entries.toArray(retVal);
}
@Override
public String getDescription() {
return "OTE Classpath Container";
}
@Override
public int getKind() {
return IClasspathContainer.K_APPLICATION;
}
@Override
public IPath getPath() {
return ID;
}
private class ClassPathDescription {
private final String sourcePath, binaryPath;
public ClassPathDescription(String binaryPath, String sourcePath) {
super();
this.sourcePath = sourcePath;
this.binaryPath = binaryPath;
}
/**
* @return the sourcePath
*/
public String getSourcePath() {
return sourcePath;
}
/**
* @return the binaryPath
*/
public String getBinaryPath() {
return binaryPath;
}
}
@Override
public void libraryChanged() {
}
}