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    }