blob: a489f8936ee2f5dca7f536d4d6ffbd34f46a4e33 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 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.launching.sourcelookup;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.jdt.internal.launching.LaunchingMessages;
import org.eclipse.jdt.internal.launching.LaunchingPlugin;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.osgi.util.NLS;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* Locates source elements in a directory in the local
* file system. Returns instances of <code>LocalFileStorage</code>.
* <p>
* This class may be instantiated.
* </p>
* @see IJavaSourceLocation
* @since 2.0
* @deprecated In 3.0, the debug platform provides source lookup facilities that
* should be used in place of the Java source lookup support provided in 2.0.
* The new facilities provide a source lookup director that coordinates source
* lookup among a set of participants, searching a set of source containers.
* See the following packages: <code>org.eclipse.debug.core.sourcelookup</code>
* and <code>org.eclipse.debug.core.sourcelookup.containers</code>. This class
* has been replaced by
* <code>org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer</code>.
* @noextend This class is not intended to be subclassed by clients.
*/
@Deprecated
public class DirectorySourceLocation extends PlatformObject implements IJavaSourceLocation {
/**
* The directory associated with this source location
*/
private File fDirectory;
/**
* Constructs a new empty source location to be initialized from
* a memento.
*/
public DirectorySourceLocation() {
}
/**
* Constructs a new source location that will retrieve source
* elements from the given directory.
*
* @param directory a directory
*/
public DirectorySourceLocation(File directory) {
setDirectory(directory);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.launching.sourcelookup.IJavaSourceLocation#findSourceElement(java.lang.String)
*/
@Override
public Object findSourceElement(String name) throws CoreException {
if (getDirectory() == null) {
return null;
}
String pathStr= name.replace('.', '/');
int lastSlash = pathStr.lastIndexOf('/');
try {
IPath root = new Path(getDirectory().getCanonicalPath());
boolean possibleInnerType = false;
String typeName = pathStr;
do {
IPath filePath = root.append(new Path(typeName + ".java")); //$NON-NLS-1$
File file = filePath.toFile();
if (file.exists()) {
return new LocalFileStorage(file);
}
int index = typeName.lastIndexOf('$');
if (index > lastSlash) {
typeName = typeName.substring(0, index);
possibleInnerType = true;
} else {
possibleInnerType = false;
}
} while (possibleInnerType);
} catch (IOException e) {
throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), e.getMessage(), e));
}
return null;
}
/**
* Sets the directory in which source elements will
* be searched for.
*
* @param directory a directory
*/
private void setDirectory(File directory) {
fDirectory = directory;
}
/**
* Returns the directory associated with this source
* location.
*
* @return directory
*/
public File getDirectory() {
return fDirectory;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object object) {
return object instanceof DirectorySourceLocation &&
getDirectory().equals(((DirectorySourceLocation)object).getDirectory());
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return getDirectory().hashCode();
}
/* (non-Javadoc)
* @see org.eclipse.jdt.launching.sourcelookup.IJavaSourceLocation#getMemento()
*/
@Override
public String getMemento() throws CoreException {
Document doc = DebugPlugin.newDocument();
Element node = doc.createElement("directorySourceLocation"); //$NON-NLS-1$
doc.appendChild(node);
node.setAttribute("path", getDirectory().getAbsolutePath()); //$NON-NLS-1$
return DebugPlugin.serializeDocument(doc);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.launching.sourcelookup.IJavaSourceLocation#initializeFrom(java.lang.String)
*/
@Override
public void initializeFrom(String memento) throws CoreException {
Exception ex = null;
try {
Element root = null;
DocumentBuilder parser =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
parser.setErrorHandler(new DefaultHandler());
StringReader reader = new StringReader(memento);
InputSource source = new InputSource(reader);
root = parser.parse(source).getDocumentElement();
String path = root.getAttribute("path"); //$NON-NLS-1$
if (isEmpty(path)) {
abort(LaunchingMessages.DirectorySourceLocation_Unable_to_initialize_source_location___missing_directory_path_3, null);
} else {
File dir = new File(path);
if (dir.exists() && dir.isDirectory()) {
setDirectory(dir);
} else {
abort(NLS.bind(LaunchingMessages.DirectorySourceLocation_Unable_to_initialize_source_location___directory_does_not_exist___0__4, new String[] {path}), null);
}
}
return;
} catch (ParserConfigurationException e) {
ex = e;
} catch (SAXException e) {
ex = e;
} catch (IOException e) {
ex = e;
}
abort(LaunchingMessages.DirectorySourceLocation_Exception_occurred_initializing_source_location__5, ex);
}
private boolean isEmpty(String string) {
return string == null || string.length() == 0;
}
/*
* Throws an internal error exception
*/
private void abort(String message, Throwable e) throws CoreException {
IStatus s = new Status(IStatus.ERROR, LaunchingPlugin.getUniqueIdentifier(), IJavaLaunchConfigurationConstants.ERR_INTERNAL_ERROR, message, e);
throw new CoreException(s);
}
}