93 lines
2.9 KiB
Java
93 lines
2.9 KiB
Java
|
package net.brutex.xservices.ws.rs;
|
||
|
|
||
|
import java.io.File;
|
||
|
import java.io.FileFilter;
|
||
|
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.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) {
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
}
|