001    package ca.uhn.hl7v2.conf.store;
002    
003    import java.io.BufferedReader;
004    import java.io.BufferedWriter;
005    import java.io.File;
006    import java.io.FileReader;
007    import java.io.FileWriter;
008    import java.io.IOException;
009    
010    import org.slf4j.Logger;
011    import org.slf4j.LoggerFactory;
012    
013    /**
014     * Stores profiles in a local directory.  Profiles are stored as text
015     * in files named ID.xml (where ID is the profile ID).
016     * @author Bryan Tripp
017     */
018    public class FileProfileStore implements ProfileStore {
019        
020        private File root;
021        private static final Logger log = LoggerFactory.getLogger(FileProfileStore.class);
022        
023        /** Creates a new instance of FileProfileStore */
024        public FileProfileStore(String file) {
025            root = new File(file);
026            if (!root.isDirectory())
027                if (!root.mkdirs()) 
028                    throw new IllegalArgumentException(file + " is not a directory");
029        }
030        
031        /**
032         * Retrieves profile from persistent storage (by ID).  Returns null
033         * if the profile isn't found.
034         */
035        public String getProfile(String ID) throws IOException {
036            String profile = null;
037            
038            File source = new File(getFileName(ID));
039            if (source.isFile()) {
040                BufferedReader in = new BufferedReader(new FileReader(source));
041                char[] buf = new char[(int) source.length()];
042                int check = in.read(buf, 0, buf.length);
043                in.close();
044                if (check != buf.length)
045                    throw new IOException("Only read " + check + " of " + buf.length
046                    + " bytes of file " + source.getAbsolutePath());
047                profile = new String(buf);
048            }
049            log.info("Got profile {}: \r\n {}", ID, profile);
050            return profile;
051        }
052        
053        /**
054         * Stores profile in persistent storage with given ID.
055         */
056        public void persistProfile(String ID, String profile) throws IOException {
057            File dest = new File(getFileName(ID));
058            BufferedWriter out = new BufferedWriter(new FileWriter(dest));
059            out.write(profile);
060            out.flush();
061            out.close();
062        }
063        
064        private String getFileName(String ID) {
065            return root.getAbsolutePath() + "/" + ID + ".xml";
066        }
067    }