/**********************************************************************
* Copyright (c) 2005-2009 ant4eclipse project team.
*
* 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:
* Nils Hartmann, Daniel Kasmeroglu, Gerd Wuetherich
**********************************************************************/
package org.ant4eclipse.lib.platform.model.resource.workspaceregistry;
import org.ant4eclipse.lib.core.Assure;
import org.ant4eclipse.lib.core.logging.A4ELogging;
import org.ant4eclipse.lib.platform.internal.model.resource.workspaceregistry.LocationFileParser;
import org.ant4eclipse.lib.platform.internal.model.resource.workspaceregistry.ProjectFileParser;
import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/**
* <p>
* Implements a {@link WorkspaceDefinition} for the 'standard' eclipse workspace.
* </p>
*
* @author Gerd Wütherich (gerd@gerd-wuetherich.de)
*/
public class DefaultEclipseWorkspaceDefinition implements WorkspaceDefinition {
/** path to the projects directory in the meta data */
private static final String METADATA_PROJECTS = ".metadata/.plugins/org.eclipse.core.resources/.projects";
/** the workspace directory */
private File _workspaceDirectory;
/** the meta data location directory */
private File _metadataLocationDirectory;
/**
* <p>
* Creates a new instance of type {@link DefaultEclipseWorkspaceDefinition}.
* </p>
*
* @param workspaceDirectory
* the workspace directory
*/
public DefaultEclipseWorkspaceDefinition(File workspaceDirectory) {
Assure.isDirectory("workspaceDirectory", workspaceDirectory);
this._workspaceDirectory = workspaceDirectory;
this._metadataLocationDirectory = new File(workspaceDirectory, METADATA_PROJECTS);
}
/**
* {@inheritDoc}
*/
public File[] getProjectFolders() {
// define the result
List<File> result = new LinkedList<File>();
// read all directories in the workspace directory
File[] directories = this._workspaceDirectory.listFiles(new FileFilter() {
public boolean accept(File file) {
boolean accepted = file.isDirectory() && !".metadata".equals(file.getName()) && isProjectDirectory(file);
String message = String
.format(
"DefaultEclipseWorkspaceDefinition.getProjectFolders(): directory '%s' - accept as project directory: '%s'",
file.getAbsolutePath(), Boolean.valueOf(accepted));
A4ELogging.debug(message);
return accepted;
}
});
// add all project directories to the result
result.addAll(Arrays.asList(directories));
// check the METADATA_PROJECTS directory
if (isDirectory(this._metadataLocationDirectory)) {
// read all directories in the METADATA_PROJECTS directory
directories = this._metadataLocationDirectory.listFiles(new FileFilter() {
public boolean accept(File file) {
boolean accepted = file.isDirectory() && isLocationDirectory(file);
String message = String
.format(
"DefaultEclipseWorkspaceDefinition.getProjectFolders(): directory '%s' - accept as project directory: '%s'",
file.getAbsolutePath(), Boolean.valueOf(accepted));
A4ELogging.debug(message);
return accepted;
}
});
// add the resolved linked directories to the result
for (File directorie : directories) {
File linkedProject = LocationFileParser.getProjectDirectory(new File(directorie, ".location"));
if ((linkedProject != null) && !result.contains(linkedProject)) {
result.add(linkedProject);
}
}
}
// return the result
return result.toArray(new File[0]);
}
/**
* <p>
* Returns <code>true</code>, if the specified directory is an eclipse project directory.
* </p>
*
* @param directory
* the directory
* @return <code>true</code>, if the specified directory is an eclipse project directory.
*/
private boolean isProjectDirectory(File directory) {
return ProjectFileParser.isProjectDirectory(directory);
}
/**
* <p>
* </p>
*
* @param directory
* @return
*/
private boolean isLocationDirectory(File directory) {
return isDirectory(directory) && new File(directory, ".location").exists();
}
/**
* @param directory
* @return
*/
private boolean isDirectory(File directory) {
return (directory != null) && directory.exists();
}
} /* ENDCLASS */