    001    /*
    002     * Licensed to the Apache Software Foundation (ASF) under one or more
    003     * contributor license agreements.  See the NOTICE file distributed with
    004     * this work for additional information regarding copyright ownership.
    005     * The ASF licenses this file to You under the Apache License, Version 2.0
    006     * (the "License"); you may not use this file except in compliance with
    007     * the License.  You may obtain a copy of the License at
    008     *
    009     *      http://www.apache.org/licenses/LICENSE-2.0
    010     *
    011     * Unless required by applicable law or agreed to in writing, software
    012     * distributed under the License is distributed on an "AS IS" BASIS,
    013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014     * See the License for the specific language governing permissions and
    015     * limitations under the License.
    016     */
    017
    018    package org.apache.commons.jci.stores;
    019
    020    import java.io.File;
    021    import java.io.FileInputStream;
    022    import java.io.FileOutputStream;
    023    import java.io.IOException;
    024    import java.io.InputStream;
    025    import java.io.OutputStream;
    026    import java.util.ArrayList;
    027    import java.util.List;
    028
    029    import org.apache.commons.io.IOUtils;
    030
    031
    032    /**
    033     * Stores the results on disk
    034     *
    035     * @author tcurdt
    036     */
    037    public final class FileResourceStore implements ResourceStore {
    038
    039        private final File root;
    040
    041        public FileResourceStore( final File pFile ) {
    042            root = pFile;
    043        }
    044
    045        public byte[] read( final String pResourceName ) {
    046            InputStream is = null;
    047            try {
    048                is = new FileInputStream(getFile(pResourceName));
    049                final byte[] data = IOUtils.toByteArray(is);
    050                return data;
    051            } catch (Exception e) {
    052                return null;
    053            } finally {
    054                IOUtils.closeQuietly(is);
    055            }
    056        }
    057
    058        public void write( final String pResourceName, final byte[] pData ) {
    059            OutputStream os = null;
    060            try {
    061                final File file = getFile(pResourceName);
    062                final File parent = file.getParentFile();
    063                if (!parent.mkdirs() && !parent.isDirectory()) {
    064                        throw new IOException("could not create" + parent);
    065                }
    066                os = new FileOutputStream(file);
    067                os.write(pData);
    068            } catch (Exception e) {
    069                // FIXME: now what?
    070            } finally {
    071                IOUtils.closeQuietly(os);
    072            }
    073        }
    074
    075        public void remove( final String pResourceName ) {
    076            getFile(pResourceName).delete();
    077        }
    078
    079        private File getFile( final String pResourceName ) {
    080            final String fileName = pResourceName.replace('/', File.separatorChar);
    081            return new File(root, fileName);
    082        }
    083
    084        /**
    085         * @deprecated
    086         */
    087        @Deprecated
    088        public String[] list() {
    089            final List<String> files = new ArrayList<String>();
    090            list(root, files);
    091            return files.toArray(new String[files.size()]);
    092        }
    093
    094        /**
    095         * @deprecated
    096         */
    097        @Deprecated
    098        private void list(final File pFile, final List<String> pFiles) {
    099            if (pFile.isDirectory()) {
    100                final File[] directoryFiles = pFile.listFiles();
    101                for (int i=0; i < directoryFiles.length; i++) {
    102                    list(directoryFiles[i], pFiles);
    103                }
    104            } else {
    105                pFiles.add(pFile.getAbsolutePath().substring(root.getAbsolutePath().length()+1));
    106            }
    107        }
    108
    109        @Override
    110        public String toString() {
    111            return this.getClass().getName() + root.toString();
    112        }
    113
    114    }