Subversion Repositories XServices

Rev

Rev 92 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

package net.brutex.xservices.ws.rs;

import java.io.File;
import java.io.FileFilter;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;

import org.apache.jcs.JCS;
import org.apache.jcs.access.exception.CacheException;

import net.brutex.xservices.security.StandardSecurityManager;
import net.brutex.xservices.security.UserIdentity;
import net.brutex.xservices.types.FileInfoType;

/**
 * @author Brian Rosenberger
 *
 */
public class FileInfoImpl implements FileInfo {

        public Response getFiles(HttpHeaders h, String dir, boolean withDir,
                        boolean withFiles, int level, String search, int count, int page) {
                
                StandardSecurityManager sec = new StandardSecurityManager();
                UserIdentity id = new UserIdentity();

                
                if( ! sec.canExecute(Thread.currentThread().getStackTrace()[1].getMethodName(), id)) {
                        return null;
                }

                
                System.out.println("Listing directory: " + dir);
                if(level <= 0) level = 1;
                if(level > 3) level = 3;
                if(!withDir && !withFiles) withFiles = true;
                String cachekey = level +"||"+ withFiles +"||"+ withDir +"||" + search + "||" + dir;
                try {
                        JCS jcs = JCS.getInstance("FileCache");
                
                List<FileInfoType> list = (List<FileInfoType>) jcs.get(cachekey);
                if(list == null) { 
                        list = setDirectory(dir, withDir, withFiles, level, search);
                        jcs.put(cachekey, list);
                        System.out.println("Stored in Cache: " + list.toString());
                } else {
                        System.out.println("Got from Cache: " + list.toString());
                }

                
                int fromIndex = 0;
                int toIndex = 0;
                fromIndex = (page-1) * count;
                toIndex = (page*count);
                if(toIndex>list.size()) toIndex = list.size();
                if(fromIndex>toIndex) fromIndex=toIndex;
                GenericEntity<List<FileInfoType>> sublist = new GenericEntity<List<FileInfoType>>(list.subList(fromIndex, toIndex) ){};
                return Response.ok( sublist ).build();
                } catch (CacheException e) {
                        Response.serverError().build();
                }
                return null;
        }       


        
        private void setDirectory(List<FileInfoType> list, File dir, final boolean withDirectories, final boolean withFiles, final int depth, final String search) {
                if(depth <=0) return;
                
                File[] files = dir.listFiles(new FileFilter() {
                        
                        public boolean accept(File pathname) {
                                if(pathname.isDirectory() && depth > 1) return true;
                                if(search == null || search.equals("")) return true;
                                if(!pathname.getAbsolutePath().contains(search)) return false;
                                return true;
                        }
                });
                if(dir.getParentFile() != null && withDirectories==true)        list.add(new FileInfoType(dir.getParentFile()));
                if(files==null) return;
                
                for( File e : files) {
                        if(e.isDirectory()) setDirectory(list, e, withDirectories, withFiles, depth-1, search);
                        if( (withDirectories && e.isDirectory())
                                        || (withFiles && e.isFile()) ) {
                                list.add(new FileInfoType(e));
                        }       
                }
        }
        
        private List<FileInfoType> setDirectory(String dir, final boolean withDirectories, final boolean withFiles, int depth, String search) {
                List<FileInfoType> list = new ArrayList<FileInfoType>();
                setDirectory( list, (new File(dir)), withDirectories, withFiles, depth, search);
                return list;
        }
        
        
        
}