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 list = (List) 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> sublist = new GenericEntity>(list.subList(fromIndex, toIndex) ){}; return Response.ok( sublist ).build(); } catch (CacheException e) { Response.serverError().build(); } return null; } private void setDirectory(List 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 setDirectory(String dir, final boolean withDirectories, final boolean withFiles, int depth, String search) { List list = new ArrayList(); setDirectory( list, (new File(dir)), withDirectories, withFiles, depth, search); return list; } }