com.github.cherimojava.orchidae.util.FileUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.github.cherimojava.orchidae.util.FileUtil.java

Source

/**
 * 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);
    }
}