StandardStorageFormat.java
/*
* @(#)StandardStorageFormat.java
*
* Project: JHotdraw - a GUI framework for technical drawings
* http://www.jhotdraw.org
* http://jhotdraw.sourceforge.net
* Copyright: © by the original author(s) and all contributors
* License: Lesser GNU Public License (LGPL)
* http://www.opensource.org/licenses/lgpl-license.html
*/
package CH.ifa.draw.util;
import javax.swing.filechooser.FileFilter;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
import CH.ifa.draw.framework.Drawing;
/**
* A StandardStorageFormat is an internal file format to store and restore
* Drawings. It uses its own descriptive syntax ands write classes and attributes
* as plain text in a text file. The StandardStorageFormat has the file extension
* "draw" (e.g. my_picasso.draw).
*
* @author Wolfram Kaiser
* @version <$CURRENT_VERSION$>
*/
public class StandardStorageFormat implements StorageFormat {
/**
* FileFilter for a javax.swing.JFileChooser which recognizes files with the
* extension "draw"
*/
private FileFilter myFileFilter;
/**
* File extension
*/
private String myFileExtension;
/**
* Description of the file type when displaying the FileFilter
*/
private String myFileDescription;
/**
* Create a StandardStorageFormat for storing and restoring Drawings.
*/
public StandardStorageFormat() {
setFileExtension(createFileExtension());
setFileDescription(createFileDescription());
setFileFilter(createFileFilter());
}
/**
* Factory method to create the file extension recognized by the FileFilter for this
* StandardStorageFormat. The StandardStorageFormat has the file extension "draw"
* (e.g. my_picasso.draw).
*
* @return new file extension
*/
protected String createFileExtension() {
return myFileExtension = "draw";
}
/**
* Set the file extension for the storage format
*
* @param file extension
*/
public void setFileExtension(String newFileExtension) {
myFileExtension = newFileExtension;
}
/**
* Return the file extension for the storage format
*
* @return file extension
*/
public String getFileExtension() {
return myFileExtension;
}
/**
* Factory method to create a file description for the file type when displaying the
* associated FileFilter.
*
* @return new file description
*/
public String createFileDescription() {
return "Internal Format (" + getFileExtension() + ")";
}
/**
* Set the file description for the file type of the storage format
*
* @param newFileDescription description of the file type
*/
public void setFileDescription(String newFileDescription) {
myFileDescription = newFileDescription;
}
/**
* Return the file description for the file type of the storage format
*
* @return description of the file type
*/
public String getFileDescription() {
return myFileDescription;
}
/**
* Factory method to create a FileFilter that accepts file with the appropriate
* file exention used by a javax.swing.JFileChooser. Subclasses can override this
* method to provide their own file filters.
*
* @return FileFilter for this StorageFormat
*/
protected FileFilter createFileFilter() {
return new FileFilter() {
public boolean accept(File checkFile) {
// still display directories for navigation
if (checkFile.isDirectory()) {
return true;
}
else {
return checkFile.getName().endsWith("." + myFileExtension);
}
}
public String getDescription() {
return getFileDescription();
}
};
}
/**
* Set the FileFilter used to identify Drawing files with the correct file
* extension for this StorageFormat.
*
* @param newFileFilter FileFilter for this StorageFormat
*/
public void setFileFilter(FileFilter newFileFilter) {
myFileFilter = newFileFilter;
}
/**
* Return the FileFilter used to identify Drawing files with the correct file
* extension for this StorageFormat.
*
* @return FileFilter for this StorageFormat
*/
public FileFilter getFileFilter() {
return myFileFilter;
}
/**
* Store a Drawing under a given name. If the file name does not have the correct
* file extension, then the file extension is added.
*
* @param fileName file name of the Drawing under which it should be stored
* @param saveDrawing drawing to be saved
* @return file name with correct file extension
*/
public String store(String fileName, Drawing saveDrawing) throws IOException {
FileOutputStream stream = new FileOutputStream(adjustFileName(fileName));
StorableOutput output = new StorableOutput(stream);
output.writeStorable(saveDrawing);
output.close();
return adjustFileName(fileName);
}
/**
* Restore a Drawing from a file with a given name.
*
* @param name of the file in which the Drawing has been saved
* @return restored Drawing
*/
public Drawing restore(String fileName) throws IOException {
if (!hasCorrectFileExtension(fileName)) {
return null;
}
else {
FileInputStream stream = new FileInputStream(fileName);
StorableInput input = new StorableInput(stream);
return (Drawing)input.readStorable();
}
}
/**
* Test, whether two StorageFormats are the same. They are the same if they both support the
* same file extension.
*
* @return true, if both StorageFormats have the same file extension, false otherwise
*/
public boolean equals(Object compareObject) {
if (compareObject instanceof StandardStorageFormat) {
return getFileExtension().equals(((StandardStorageFormat)compareObject).getFileExtension());
}
else {
return false;
}
}
/**
* Adjust a file name to have the correct file extension.
*
* @param testFileName file name to be tested for a correct file extension
* @return testFileName + file extension if necessary
*/
protected String adjustFileName(String testFileName) {
if (!hasCorrectFileExtension(testFileName)) {
return testFileName + "." + getFileExtension();
}
else {
return testFileName;
}
}
/**
* Test whether the file name has the correct file extension
*
* @return true, if the file has the correct extension, false otherwise
*/
protected boolean hasCorrectFileExtension(String testFileName) {
return testFileName.endsWith("." + getFileExtension());
}
}