/* * Copyright (C) 2006-2008 Alfresco Software Limited. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * As a special exception to the terms and conditions of version 2.0 of * the GPL, you may redistribute this Program in connection with Free/Libre * and Open Source Software ("FLOSS") applications as described in Alfresco's * FLOSS exception. You should have recieved a copy of the text describing * the FLOSS exception, and it is also available here: * http://www.alfresco.com/legal/licensing" */ package org.alfresco.jlan.server.filesys.pseudo; import org.alfresco.jlan.server.filesys.FileInfo; import org.alfresco.jlan.server.filesys.SearchContext; /** * Pseudo File Search Context Class * * <p> * Search context implementation that blends a list of pseudo files/folders into a folder search. * * @author gkspencer */ public abstract class PseudoSearchContext extends SearchContext { // Index of current file being returned protected int m_index; // Pseudo file list blended into a wildcard folder search private PseudoFileList m_pseudoList; private boolean m_donePseudoFiles = false; // Resume id private int m_resumeId; // Relative path being searched private String m_relPath; /** * Class constructor * * @param relPath String */ public PseudoSearchContext( String relPath) { m_relPath = relPath; } /** * Check if there are pseudo files to be blended into the search results * * @return boolean */ public final boolean hasPseudoFiles() { if ( m_pseudoList != null && m_pseudoList.numberOfFiles() > 0) return true; return false; } /** * Set the pseudo file list for the search * * @param pseudoList PseudoFileList */ public final void setPseudoFileList( PseudoFileList pseudoList) { m_pseudoList = pseudoList; } /** * Return the resume id for the current file/directory in the search. * * @return int */ public int getResumeId() { return m_resumeId; } /** * Determine if there are more files for the active search. * * @return boolean */ public boolean hasMorePseudoFiles() { // Pseudo files are returned first if (m_donePseudoFiles == false && m_pseudoList != null && m_index < (m_pseudoList.numberOfFiles() - 1)) return true; return false; } /** * Return file information for the next pseudo file in the active search. Returns false if there are no * more pseudo files/folders to be returned * * @param info FileInfo to return the file information. * @return true if the file information is valid, else false */ public boolean nextPseudoFileInfo(FileInfo info) { // Check if there is anything else to return if ( hasMorePseudoFiles() == false) return false; // Increment the index and resume id m_index++; m_resumeId++; // If the pseudo file list is valid return the pseudo files first if (m_donePseudoFiles == false && m_pseudoList != null) { if (m_index < m_pseudoList.numberOfFiles()) { PseudoFile pfile = m_pseudoList.getFileAt( m_index); if (pfile != null) { // Get the file information for the pseudo file FileInfo pinfo = pfile.getFileInfo(); // Copy the file information to the callers file info info.copyFrom(pinfo); // Generate a file id for the current file if (info != null && info.getFileId() == -1) { StringBuilder pathStr = new StringBuilder(m_relPath); pathStr.append(info.getFileName()); info.setFileId(pathStr.toString().hashCode()); } // Check if we have finished with the pseudo file list, switch to the normal file list if ( m_index == (m_pseudoList.numberOfFiles() - 1)) { // Switch to the main file list m_donePseudoFiles = true; m_index = -1; } // Indicate that the file information is valid return true; } } } // File information is not valid, end of pseudo file list return false; } /** * Return the file name of the next pseudo file in the active search. Returns null is there are no * more pseudo file names to return * * @return String */ public String nextPseudoFileName() { // Check if there is anything else to return if ( hasMorePseudoFiles() == false) return null; // Increment the index and resume id m_index++; m_resumeId++; // If the pseudo file list is valid return the pseudo files first if (m_donePseudoFiles == false && m_pseudoList != null) { if (m_index < m_pseudoList.numberOfFiles()) { PseudoFile pfile = m_pseudoList.getFileAt( m_index); if (pfile != null) { // Get the file information for the pseudo file FileInfo pinfo = pfile.getFileInfo(); // Copy the file information to the callers file info return pinfo.getFileName(); } } else { // Switch to the main file list m_donePseudoFiles = true; m_index = -1; } } // No more pseudo files return null; } /** * Restart a search at the specified pseudo file resume point. * * @param info FileInfo * @return true if the search can be restarted, else false. */ public boolean restartAtPseudoFile(FileInfo info) { // Check if the resume point is in the pseudo file list int resId = 0; if (m_pseudoList != null) { while (resId < m_pseudoList.numberOfFiles()) { // Check if the current pseudo file matches the resume file name PseudoFile pfile = m_pseudoList.getFileAt(resId); if (pfile.getFileName().equals(info.getFileName())) { // Found the restart point m_donePseudoFiles = false; m_index = resId - 1; return true; } else resId++; } } // Failed to find resume file return false; } /** * Restart the current search at the specified pseudo file. * * @param resumeId int * @return true if the search can be restarted, else false. */ public boolean restartAtPseudoFile(int resumeId) { // Check if the resume point is in the pseudo file list if (m_pseudoList != null) { if (resumeId < m_pseudoList.numberOfFiles()) { // Resume at a pseudo file m_index = resumeId; m_donePseudoFiles = false; return true; } } // Invalid pseudo file resume point return false; } }