package org.hibernate.eclipse.launch;
import java.io.File;
import java.net.URI;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.variables.IStringVariableManager;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.osgi.util.NLS;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
// TODO: move to internal.
public class PathHelper {
public static String getLocationAsStringPath(String path) {
if(path==null) return null;
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IResource member = PathHelper.findMember(root, path);
if(member==null) {
if (new File(path).exists()){
return path;
} else {
return null;
}
} else {
return PathHelper.getLocation( member ).toOSString();
}
}
public static IResource findMember(IWorkspaceRoot root, String path) {
Path pathOrNull = PathHelper.pathOrNull(path);
if(pathOrNull==null) return null;
IResource findMember = root.findMember(pathOrNull);
if(findMember==null) {
URI uri = null;
File file = pathOrNull.toFile();
if (file != null) {
uri = file.toURI();
}
if (uri != null) {
IContainer[] findContainersForLocation = root.findContainersForLocationURI(pathOrNull.toFile().toURI());
if(findContainersForLocation.length>0) {
findMember = findContainersForLocation[0];
}
}
}
return findMember;
}
public static IPath getLocation(final IResource resource) {
if (resource.getRawLocation() == null) {
return resource.getLocation();
}
else return resource.getRawLocation();
}
static private String resolve(String expression) {
if(expression==null) return null;
IStringVariableManager variableManager = VariablesPlugin.getDefault().getStringVariableManager();
try {
return variableManager.performStringSubstitution(expression, false);
} catch (CoreException e) {
return expression;
}
}
public static Path pathOrNull(String p) {
return pathOrNull(p, false);
}
public static Path pathOrNull(String p, boolean resolveVariables) {
if(resolveVariables && p!=null) {
p = resolve(p);
}
if(p==null || p.trim().length()==0) {
return null;
} else {
return new Path(p);
}
}
/**
* Checks if directory exists.
* Handles variables replacement too.
*
* @param strpath
* @param name
* @param checkFilesystem
* @return
*/
static public String checkDirectory(String strpath, String name, boolean checkFilesystem) {
if(strpath.indexOf("${") >= 0) { //$NON-NLS-1$
IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
try {
manager.validateStringVariables(strpath);
}
catch (CoreException e) {
String out = NLS.bind(HibernateConsoleMessages.PathHelper_has_invalid_variable_references, name, e.getMessage());
return out;
}
}
IPath path = pathOrNull(resolve(strpath));
if (checkFilesystem && path != null) {
File file = new File(path.toOSString());
if (file.exists()) {
if (file.isDirectory()) {
return null;
}
String out = NLS.bind(HibernateConsoleMessages.PathHelper_not_directory, path);
return out;
}
}
IResource res= ResourcesPlugin.getWorkspace().getRoot().findMember(path);
if (res != null) {
int resType= res.getType();
if (resType == IResource.PROJECT || resType == IResource.FOLDER) {
IProject proj= res.getProject();
if (!proj.isOpen() ) {
String out = NLS.bind(HibernateConsoleMessages.PathHelper_project_for_is_closed, name, path);
return out;
}
} else {
String out = NLS.bind(HibernateConsoleMessages.PathHelper_has_to_be_folder_or_project, name, path);
return out;
}
} else {
String out = NLS.bind(HibernateConsoleMessages.PathHelper_does_not_exist, name, path);
return out;
}
return null;
}
/**
* Checks if file exists.
* Handles variables replacement too.
*
* @param strpath
* @param name
* @param checkFilesystem
* @return
*/
static public String checkFile(String strpath, String name, boolean checkFilesystem) {
if(strpath.indexOf("${") >= 0) { //$NON-NLS-1$
IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
try {
manager.validateStringVariables(strpath);
}
catch (CoreException e) {
String out = NLS.bind(HibernateConsoleMessages.PathHelper_has_invalid_variable_references, name, e.getMessage());
return out;
}
}
IPath path = pathOrNull(resolve(strpath));
if (checkFilesystem && path != null) {
File file = new File(path.toOSString());
if (file.exists()) {
if (file.isFile()) {
return null;
}
String out = NLS.bind(HibernateConsoleMessages.PathHelper_not_file, path);
return out;
}
}
IResource res= ResourcesPlugin.getWorkspace().getRoot().findMember(path);
if (res != null) {
int resType= res.getType();
if (resType == IResource.FILE) {
IProject proj= res.getProject();
if (!proj.isOpen() ) {
String out = NLS.bind(HibernateConsoleMessages.PathHelper_project_for_is_closed, name, path);
return out;
}
} else {
String out = NLS.bind(HibernateConsoleMessages.PathHelper_has_to_be_file, name, path);
return out;
}
} else {
String out = NLS.bind(HibernateConsoleMessages.PathHelper_does_not_exist, name, path);
return out;
}
return null;
}
}