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; |