/*
* This file is part of the OSMembrane project.
* More informations under www.osmembrane.de
*
* The project is licensed under the GNU GENERAL PUBLIC LICENSE 3.0.
* for more details about the license see http://www.osmembrane.de/license/
*
* Source: $HeadURL$ ($Revision$)
* Last changed: $Date$
*/
package de.osmembrane.model.persistence;
import java.io.File;
import javax.swing.filechooser.FileFilter;
import de.osmembrane.model.parser.BashParser;
import de.osmembrane.model.parser.CmdParser;
import de.osmembrane.model.parser.ExecutionParser;
import de.osmembrane.model.parser.IParser;
import de.osmembrane.model.pipeline.AbstractPipeline;
import de.osmembrane.tools.I18N;
/**
* Represents the different FileTypes.
*
* @author jakob_jarosch
*/
public enum FileType {
/**
* Bash normally used under UNIX systems.
*/
BASH(new String[] { ".sh" }, BashPersistence.class, BashParser.class),
/**
* CMD normally used under Windows systems.
*/
CMD(new String[] { ".bat", ".cmd" }, CmdPersistence.class, CmdParser.class),
/**
* OSMembrane filetype.
*/
OSMEMBRANE(new String[] { ".osmembrane" }, OSMembranePersistence.class,
null),
/**
* All filetypes together.
*/
ALLTYPES(new String[] { ".osmembrane", ".bat", ".cmd", ".sh" }, null, null),
/**
* Only used to generate a pipeline compatible with the execution library.
*/
EXECUTION_FILETYPE(null, null, ExecutionParser.class);
private static final FileType[] autoselectableFileTypes = { BASH, CMD,
OSMEMBRANE };
/**
* {@link FileType} as a string.
*/
private String[] extensions;
/**
* Matching persistence for the {@link FileType}.
*/
private Class<? extends AbstractPersistence> persistenceClass;
/**
* Matching parser for the {@link FileType}.
*/
private Class<? extends IParser> parserClass;
private FileType(String[] extensions,
Class<? extends AbstractPersistence> persistenceClass,
Class<? extends IParser> parserClass) {
this.extensions = extensions;
this.persistenceClass = persistenceClass;
this.parserClass = parserClass;
}
/**
* Returns the default extension as a String.
*
* @return extension as a String
*/
public String getExtension() {
return extensions[0];
}
/**
* Returns all possible extensions for a filetype as an array of strings.
*
* @return all possible extensions for a filetype as an array of strings.
*/
public String[] getAllExtensions() {
return extensions;
}
/**
* Returns the FileFilter for the filetype.
*
* @return FileFilter of the filetype.
*/
public FileFilter getFileFilter() {
return new FileFilter() {
@Override
public boolean accept(File f) {
if (getAllExtensions() == null) {
return false;
}
for (String extension : getAllExtensions()) {
if (f.getName().toLowerCase().endsWith(extension)
|| f.isDirectory()) {
return true;
}
}
return false;
}
@Override
public String getDescription() {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < getAllExtensions().length; i++) {
builder.append("*");
builder.append(getAllExtensions()[i]);
if (i + 1 < getAllExtensions().length) {
builder.append(", ");
}
}
return getName() + " (" + builder.toString() + ")";
}
};
}
/**
* Returns the matching {@link AbstractPersistence} class for load and save.
*
* @return matching {@link AbstractPersistence} class.
*/
public Class<? extends AbstractPersistence> getPersistenceClass() {
return persistenceClass;
}
/**
* Returns the matching {@link IParser} class for parsing a
* {@link AbstractPipeline}.
*
* @return matching {@link IParser} class
*/
public Class<? extends IParser> getParserClass() {
return parserClass;
}
/**
* Returns the internationalized name as String.
*
* @return the internationalized name as String
*/
public String getName() {
return I18N.getInstance().getString(
"Controller.Actions.FileType." + this.toString() + ".Name");
}
/**
* Returns the a corresponding filetype for a given filename.
*
* @param file
* filename for which the filetype is needed.
*
* @return filetype if a matching one is found, otherwise NULL
*/
public static FileType fileTypeFor(File file) {
for (FileType fileType : autoselectableFileTypes) {
if (fileType.getFileFilter().accept((file)) && fileType != ALLTYPES) {
return fileType;
}
}
return null;
}
}