/**
* Copyright (C) 2014 cherimojava (http://github.com/cherimojava/orchidae) Licensed under the Apache License, Version
* 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the
* License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the specific language governing permissions and limitations
* under the License.
*/
package com.github.cherimojava.orchidae.util;
import java.io.File;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
public class FileUtil
{
@Value( "${storage.folderdepth:2}" )
int subfolders;
private final int foldernameSize = 2;
// TODO consolidate the storage of those properties
@Value( "${picture.path:./pictures}" )
String storagePath;
private static char[] hex =
new char[] { 'a', 'b', 'c', 'd', 'e', 'f', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' };
private LoadingCache<String, File> files =
CacheBuilder.newBuilder().maximumSize( 2000 ).build( new CacheLoader<String, File>()
{
@Override
public File load( String key )
throws Exception
{
File filePath = new File( storagePath );
for ( int i = 0; i < subfolders; i++ )
{
filePath = new File( filePath,
StringUtils.substring( key, i * foldernameSize, i * foldernameSize + foldernameSize ) );
}
filePath.mkdirs();
return filePath;
}
} );
public File getFileHandle( String id )
{
String substring = StringUtils.substring( id, 0, subfolders * foldernameSize );
return new File( files.getUnchecked( substring ), StringUtils.substring( id, subfolders * foldernameSize ) );
}
/**
* generates a hex id of the length 16
*
* @return
*/
public static String generateId()
{
return RandomStringUtils.random( 16, hex );
}
/**
* checks if the given id is 16 chars long and is based upon hex chars
*
* @param id
* @return
*/
public static boolean validateId( String id )
{
return id != null && id.length() == 16 && StringUtils.containsOnly( id, hex );
}
}