src/core/net/sf/basedb/util/bfs/AbstractDataWriterFactory.java

Code
Comments
Other
Rev Date Author Line
5198 15 Dec 09 nicklas 1 /**
5198 15 Dec 09 nicklas 2   $Id$
5198 15 Dec 09 nicklas 3
5198 15 Dec 09 nicklas 4   Copyright (C) 2009 Nicklas Nordborg
5198 15 Dec 09 nicklas 5
5198 15 Dec 09 nicklas 6   This file is part of BASE - BioArray Software Environment.
5198 15 Dec 09 nicklas 7   Available at http://base.thep.lu.se/
5198 15 Dec 09 nicklas 8
5198 15 Dec 09 nicklas 9   BASE is free software; you can redistribute it and/or
5198 15 Dec 09 nicklas 10   modify it under the terms of the GNU General Public License
5198 15 Dec 09 nicklas 11   as published by the Free Software Foundation; either version 3
5198 15 Dec 09 nicklas 12   of the License, or (at your option) any later version.
5198 15 Dec 09 nicklas 13
5198 15 Dec 09 nicklas 14   BASE is distributed in the hope that it will be useful,
5198 15 Dec 09 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
5198 15 Dec 09 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5198 15 Dec 09 nicklas 17   GNU General Public License for more details.
5198 15 Dec 09 nicklas 18
5198 15 Dec 09 nicklas 19   You should have received a copy of the GNU General Public License
5198 15 Dec 09 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
5198 15 Dec 09 nicklas 21 */
5198 15 Dec 09 nicklas 22 package net.sf.basedb.util.bfs;
5198 15 Dec 09 nicklas 23
5198 15 Dec 09 nicklas 24 import java.io.IOException;
5198 15 Dec 09 nicklas 25 import java.io.OutputStream;
5198 15 Dec 09 nicklas 26 import java.io.OutputStreamWriter;
7714 21 May 19 nicklas 27 import java.nio.charset.StandardCharsets;
5212 12 Jan 10 nicklas 28 import java.util.HashSet;
5212 12 Jan 10 nicklas 29 import java.util.Set;
5198 15 Dec 09 nicklas 30
5212 12 Jan 10 nicklas 31 import net.sf.basedb.core.ItemAlreadyExistsException;
5212 12 Jan 10 nicklas 32
5198 15 Dec 09 nicklas 33 /**
5198 15 Dec 09 nicklas 34   Abstract implementation of a data writer factory. This class contains
5198 15 Dec 09 nicklas 35   a filename generation algorithm that simply generates a sequence of
5198 15 Dec 09 nicklas 36   filenames using a numeric counter and prefix/suffix strings.
5198 15 Dec 09 nicklas 37   <p>
5198 15 Dec 09 nicklas 38   
5198 15 Dec 09 nicklas 39   Subclasses may override the filename generation. Subclasses
5198 15 Dec 09 nicklas 40   must also provide an implementation that, given a filename, creates
5198 15 Dec 09 nicklas 41   an output stream for it.
5198 15 Dec 09 nicklas 42
5198 15 Dec 09 nicklas 43   @author Nicklas
5198 15 Dec 09 nicklas 44   @version 2.15
5198 15 Dec 09 nicklas 45   @base.modified $Date$
5198 15 Dec 09 nicklas 46 */
5198 15 Dec 09 nicklas 47 public abstract class AbstractDataWriterFactory<T>
5198 15 Dec 09 nicklas 48   implements DataWriterFactory<T>
5198 15 Dec 09 nicklas 49 {
5198 15 Dec 09 nicklas 50
5212 12 Jan 10 nicklas 51   private Set<String> usedFiles;
5212 12 Jan 10 nicklas 52   private FilenameGenerator<T> filenameGenerator;
5198 15 Dec 09 nicklas 53   
5198 15 Dec 09 nicklas 54   /**
5212 12 Jan 10 nicklas 55     Create a new factory that uses the given file name generator.
5198 15 Dec 09 nicklas 56   */
5212 12 Jan 10 nicklas 57   protected AbstractDataWriterFactory(FilenameGenerator<T> filenameGenerator)
5198 15 Dec 09 nicklas 58   {
5212 12 Jan 10 nicklas 59     this.filenameGenerator = filenameGenerator;
5212 12 Jan 10 nicklas 60     this.usedFiles = new HashSet<String>();
5198 15 Dec 09 nicklas 61   }
5198 15 Dec 09 nicklas 62   
5198 15 Dec 09 nicklas 63   /*
5198 15 Dec 09 nicklas 64     From the DataWriterFactory interface
5198 15 Dec 09 nicklas 65     ------------------------------------
5198 15 Dec 09 nicklas 66   */
5198 15 Dec 09 nicklas 67   @Override
5198 15 Dec 09 nicklas 68   public DataWriter createDataWriter(T owner, String suggestedFilename)
5198 15 Dec 09 nicklas 69     throws IOException
5198 15 Dec 09 nicklas 70   {
5212 12 Jan 10 nicklas 71     String filename = filenameGenerator.getNextFilename(owner, suggestedFilename);
5212 12 Jan 10 nicklas 72     if (!isUnique(filename))
5212 12 Jan 10 nicklas 73     {
5212 12 Jan 10 nicklas 74       throw new ItemAlreadyExistsException("File '" + filename + "'");
5212 12 Jan 10 nicklas 75     }
5212 12 Jan 10 nicklas 76     usedFiles.add(filename);
5198 15 Dec 09 nicklas 77     OutputStream out = getOutputStream(filename);
7714 21 May 19 nicklas 78     DataWriter writer = new DataWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8));
5198 15 Dec 09 nicklas 79     writer.setFilename(filename);
5198 15 Dec 09 nicklas 80     return writer;
5198 15 Dec 09 nicklas 81   }
5198 15 Dec 09 nicklas 82   // ---------------------------------------
5198 15 Dec 09 nicklas 83
5198 15 Dec 09 nicklas 84   /**
5198 15 Dec 09 nicklas 85     Create an output stream for writing to a file with the given
5198 15 Dec 09 nicklas 86     filename. The returned output stream will be wrapped in a 
5198 15 Dec 09 nicklas 87     writer that uses the UTF-8 character set.
5198 15 Dec 09 nicklas 88     @throws IOException If there is a problem creating the file
5198 15 Dec 09 nicklas 89   */
5198 15 Dec 09 nicklas 90   protected abstract OutputStream getOutputStream(String filename)
5198 15 Dec 09 nicklas 91     throws IOException;
5198 15 Dec 09 nicklas 92   
5198 15 Dec 09 nicklas 93   /**
5212 12 Jan 10 nicklas 94     Checks if the suggested file name has already been used
5212 12 Jan 10 nicklas 95     by this data writer factory or not.
5212 12 Jan 10 nicklas 96     @param filename The filename to check
5212 12 Jan 10 nicklas 97     @return TRUE if the name is unique or FALSE if it has already been used
5198 15 Dec 09 nicklas 98   */
5212 12 Jan 10 nicklas 99   protected boolean isUnique(String filename)
5198 15 Dec 09 nicklas 100   {
5212 12 Jan 10 nicklas 101     return !usedFiles.contains(filename);
5198 15 Dec 09 nicklas 102   }
5212 12 Jan 10 nicklas 103     
5198 15 Dec 09 nicklas 104   
5198 15 Dec 09 nicklas 105 }