| /* |
| * Sun Public License Notice |
| * |
| * The contents of this file are subject to the Sun Public License |
| * Version 1.0 (the "License"). You may not use this file except in |
| * compliance with the License. A copy of the License is available at |
| * http://www.sun.com/ |
| * |
| * The Original Code is NetBeans. The Initial Developer of the Original |
| * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun |
| * Microsystems, Inc. All Rights Reserved. |
| */ |
| package org.netbeans.lib.cvsclient.command; |
| |
| import org.netbeans.lib.cvsclient.IClientEnvironment; |
| import org.netbeans.lib.cvsclient.admin.Entry; |
| import org.netbeans.lib.cvsclient.file.AbstractFileObject; |
| import org.netbeans.lib.cvsclient.file.DirectoryObject; |
| import org.netbeans.lib.cvsclient.file.FileObject; |
| import org.netbeans.lib.cvsclient.util.BugLog; |
| |
| import java.io.IOException; |
| import java.util.*; |
| |
| /** |
| * @author Thomas Singer |
| */ |
| final class FileSystemScanner { |
| |
| // Fields ================================================================= |
| |
| private final IClientEnvironment clientEnvironment; |
| private final boolean recursive; |
| |
| // Setup ================================================================== |
| |
| public FileSystemScanner(IClientEnvironment clientEnvironment, boolean recursive) { |
| BugLog.getInstance().assertNotNull(clientEnvironment); |
| |
| this.clientEnvironment = clientEnvironment; |
| this.recursive = recursive; |
| } |
| |
| // Actions ================================================================ |
| |
| public void scan(List<AbstractFileObject> abstractFileObjects, CvsFiles cvsFiles) throws IOException { |
| cvsFiles.clear(); |
| |
| if (abstractFileObjects.size() == 0) { |
| // if no arguments have been specified, then specify the |
| // local directory - the "top level" for this command |
| scanDirectories(DirectoryObject.getRoot(), cvsFiles); |
| } |
| else { |
| for (final AbstractFileObject fileOrDirectory : abstractFileObjects) { |
| if (fileOrDirectory instanceof DirectoryObject) { |
| final DirectoryObject directoryObject = (DirectoryObject)fileOrDirectory; |
| scanDirectories(directoryObject, cvsFiles); |
| } |
| else if (fileOrDirectory instanceof FileObject) { |
| final FileObject fileObject = (FileObject)fileOrDirectory; |
| addRequestsForFile(fileObject, cvsFiles); |
| } |
| } |
| } |
| } |
| |
| // Utils ================================================================== |
| |
| private void scanDirectories(DirectoryObject rootDirectoryObject, CvsFiles cvsFiles) throws IOException { |
| final List<DirectoryObject> directories = new LinkedList<DirectoryObject>(); |
| directories.add(rootDirectoryObject); |
| while (directories.size() > 0) { |
| final DirectoryObject directoryObject = directories.remove(0); |
| |
| final List<DirectoryObject> subDirectories = scanDirectory(directoryObject, cvsFiles); |
| if (recursive) { |
| directories.addAll(subDirectories); |
| } |
| } |
| } |
| |
| private List<DirectoryObject> scanDirectory(DirectoryObject directoryObject, CvsFiles cvsFiles) throws IOException { |
| if (!clientEnvironment.getLocalFileReader().exists(directoryObject, clientEnvironment.getCvsFileSystem())) { |
| return Collections.emptyList(); |
| } |
| |
| cvsFiles.add(CvsFile.createCvsDirectory(directoryObject)); |
| |
| final Set<String> subDirectoryNames = new HashSet<String>(); |
| final LocalFiles localFiles = new LocalFiles(directoryObject, clientEnvironment); |
| |
| // get all the entries we know about, and process them |
| final Collection<Entry> entries = clientEnvironment.getAdminReader().getEntries(directoryObject, clientEnvironment.getCvsFileSystem()); |
| for (final Entry entry : entries) { |
| if (entry.isDirectory()) { |
| subDirectoryNames.add(entry.getFileName()); |
| } |
| else { |
| final FileObject fileObject = FileObject.createInstance(directoryObject, entry.getFileName()); |
| final boolean fileExists = clientEnvironment.getLocalFileReader().exists(fileObject, clientEnvironment.getCvsFileSystem()); |
| |
| cvsFiles.add(CvsFile.createCvsFileForEntry(fileObject, entry, fileExists)); |
| |
| localFiles.removeFile(entry.getFileName()); |
| } |
| } |
| |
| for (final String fileName : localFiles.getFileNames()) { |
| cvsFiles.add(CvsFile.createCvsFileForExistingFile(FileObject.createInstance(directoryObject, fileName))); |
| } |
| |
| final List<DirectoryObject> subDirectories = new ArrayList<DirectoryObject>(subDirectoryNames.size()); |
| for (final String directoryName : subDirectoryNames) { |
| subDirectories.add(DirectoryObject.createInstance(directoryObject, directoryName)); |
| } |
| return subDirectories; |
| } |
| |
| private void addRequestsForFile(FileObject fileObject, CvsFiles cvsFiles) throws IOException { |
| cvsFiles.add(CvsFile.createCvsDirectory(fileObject.getParent())); |
| |
| final Entry entry = clientEnvironment.getAdminReader().getEntry(fileObject, clientEnvironment.getCvsFileSystem()); |
| // a non-null entry means the file does exist in the |
| // Entries file for this directory |
| if (entry != null) { |
| final boolean exists = clientEnvironment.getLocalFileReader().exists(fileObject, clientEnvironment.getCvsFileSystem()); |
| cvsFiles.add(CvsFile.createCvsFileForEntry(fileObject, entry, exists)); |
| } |
| } |
| } |