Project: ant4eclipse
/**********************************************************************
 * 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 ([email protected]
 */
 
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 */