Subversion Repositories XServices

Compare Revisions

Ignore whitespace Rev 198 → Rev 199

/xservices/trunk/src/main/java/net/brutex/xservices/ws/rs/FileInfoImpl.java
47,6 → 47,7
import javax.ws.rs.core.StreamingOutput;
import javax.ws.rs.core.UriInfo;
 
import lombok.extern.slf4j.Slf4j;
import net.brutex.xservices.security.DirectoryPermission;
import net.brutex.xservices.types.FileInfoType;
import net.brutex.xservices.util.FileWalker;
54,8 → 55,6
import org.apache.commons.jcs.JCS;
import org.apache.commons.jcs.access.CacheAccess;
import org.apache.commons.jcs.access.exception.CacheException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.UnauthorizedException;
 
64,11 → 63,11
*
* @author Brian Rosenberger, bru(at)brutex.de
*/
@Slf4j
public class FileInfoImpl implements FileInfo {
 
Logger logger = LogManager.getLogger();
 
/* (non-Javadoc)
* @see net.brutex.xservices.ws.rs.FileInfo#getFiles(javax.ws.rs.core.HttpHeaders, java.lang.String, boolean, boolean, int, java.lang.String, int, int)
77,19 → 76,19
{
if(dir==null) {
dir = "c:/";
logger.warn("No directory specified. Default is 'c:/'.");
log.warn("No directory specified. Default is 'c:/'.");
}
isPermitted(dir);
URI baseuri = URI.create(uriInfo.getBaseUri()+FileInfo.BASE_PATH+"getFile?file=");
logger.info(String.format("Listing directory '%s'.", dir));
log.info(String.format("Listing directory '%s'.", dir));
if (level <= 0) level = 1;
 
if ((!withDir) && (!withFiles)) withFiles = true;
String cachekey = level + "||" + withFiles + "||" + withDir + "||" + search + "||" + dir;
try {
logger.debug(String.format("Hitting cache with cachekey '%s'", cachekey));
log.debug(String.format("Hitting cache with cachekey '%s'", cachekey));
CacheAccess<Object, Object> jcs = JCS.getInstance("FileCache");
 
/*Try to retrieve the file list from the cache*/
98,9 → 97,9
if (list == null || !useCache) {
list = setDirectory(baseuri, dir, withDir, withFiles, level, search);
jcs.put(cachekey, list);
logger.debug("Stored in Cache: " + list.toString());
log.debug("Stored in Cache: " + list.toString());
} else {
logger.debug("Got from Cache: " + list.toString());
log.debug("Got from Cache: " + list.toString());
}
 
int fromIndex = 0;
110,7 → 109,7
if (toIndex > list.size()) toIndex = list.size();
if (fromIndex > toIndex) fromIndex = toIndex;
GenericEntity<List<FileInfoType>> sublist = new GenericEntity<List<FileInfoType>>(list.subList(fromIndex, toIndex)) {};
logger.info(String.format("Returning items %s to %s from total of %s items in the list.", fromIndex, toIndex, list.size()));
log.info(String.format("Returning items %s to %s from total of %s items in the list.", fromIndex, toIndex, list.size()));
return Response.ok(sublist).build();
} catch (CacheException e) {
return Response.serverError().build();
133,13 → 132,13
if(search==null || search.equals("") ) {
search = "*";
logger.info("No search pattern supplied, using default '*'.");
log.info("No search pattern supplied, using default '*'.");
}
FileWalker finder = new FileWalker(search);
try {
Files.walkFileTree(dir.toPath(), EnumSet.of(FileVisitOption.FOLLOW_LINKS), depth, finder);
logger.info("FileWalker returned '"+finder.getCount()+"' hits. '" + finder.getTotal() + "' files have been scanned.");
log.info("FileWalker returned '"+finder.getCount()+"' hits. '" + finder.getTotal() + "' files have been scanned.");
List<Path> result = finder.getResult();
for(Path f : result) {
if(! withDirectories) {
151,7 → 150,7
list.add(new FileInfoType(f, baseuri));
}
} catch (IOException e2) {
logger.error(e2.getMessage(), e2);;
log.error(e2.getMessage(), e2);;
}
}
196,7 → 195,7
//In case we can not find the media type for some reason
//the default assignment is taken, so we can
//ignore this error.
logger.debug(String.format("Could not probe media type for file '%s'. Default is '%s'", path.toString(), mime.getType()), e);
log.debug(String.format("Could not probe media type for file '%s'. Default is '%s'", path.toString(), mime.getType()), e);
}
Response r = Response.ok(path.toFile(), mime).build();
String fileName = path.getFileName().toString();
204,7 → 203,7
return r;
} catch (IOException e1) {
// TODO Auto-generated catch block
logger.error(e1.getMessage(), e1);
log.error(e1.getMessage(), e1);
return Response.serverError().build();
}
}
252,7 → 251,7
 
private boolean isPermitted(String dir) {
if(! SecurityUtils.getSubject().isPermitted( new DirectoryPermission(dir))) {
logger.warn(String.format("User '%s' does not have permission to access '%s'.",SecurityUtils.getSubject().getPrincipal(), dir ));
log.warn(String.format("User '%s' does not have permission to access '%s'.",SecurityUtils.getSubject().getPrincipal(), dir ));
throw new NotAuthorizedException(new UnauthorizedException("User does not have permission to access "+ dir));
}
return true;