package comeon.ui.add;
import au.com.bytecode.opencsv.CSVParser;
import com.google.common.base.Charsets;
import comeon.core.extmetadata.CsvMetadataSource;
import comeon.core.extmetadata.ExternalMetadataSource;
import comeon.core.extmetadata.KeyTransformer;
import comeon.core.extmetadata.NullMetadataSource;
import comeon.model.Template;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File;
import java.nio.charset.Charset;
import java.nio.file.Path;
public class AddModel {
private final PropertyChangeSupport pcs;
private File[] mediaFiles;
private Template template;
private Boolean useMetadata;
private Path metadataFile;
private String mediaExpression;
private String metadataExpression;
private String mediaRegexp;
private String mediaSubstitution;
private final CSVSettings csvSettings;
public enum Properties {
MEDIA_FILES, TEMPLATE, USE_METADATA, METADATA_FILE, MEDIA_EXPRESSION, METADATA_EXPRESSION, MEDIA_REGEXP, MEDIA_SUBSTITUTION,
CSV_SEPARATOR, CSV_QUOTE, CSV_ESCAPE, CSV_SKIP_LINES, CSV_STRICT_QUOTES, CSV_IGNORE_LEADING_WHITESPACE, CSV_CHARSET
}
public AddModel() {
this.pcs = new PropertyChangeSupport(this);
this.mediaFiles = new File[0];
this.template = null;
this.useMetadata = Boolean.FALSE;
this.metadataFile = null;
this.mediaExpression = null;
this.metadataExpression = null;
this.mediaRegexp = ".*";
this.mediaSubstitution = "${0}";
this.csvSettings = new CSVSettings();
}
public void addPropertyChangeListener(final PropertyChangeListener pcl) {
this.pcs.addPropertyChangeListener(pcl);
}
public ExternalMetadataSource<?> getExternalMetadataSource() {
final ExternalMetadataSource<?> externalMetadataSource;
if (useMetadata && metadataFile != null) {
final KeyTransformer keyTransformer = new KeyTransformer(mediaRegexp, mediaSubstitution);
externalMetadataSource = new CsvMetadataSource(mediaExpression, metadataExpression, metadataFile, csvSettings.separator,
csvSettings.quote, csvSettings.escape, csvSettings.skipLines, csvSettings.strictQuotes, csvSettings.ignoreLeadingWhiteSpace, csvSettings.charset, keyTransformer);
} else {
externalMetadataSource = new NullMetadataSource();
}
return externalMetadataSource;
}
public File[] getMediaFiles() {
return mediaFiles;
}
public void setMediaFiles(final File[] mediaFiles) {
final File[] oldMediaFile = this.mediaFiles;
this.mediaFiles = mediaFiles;
pcs.firePropertyChange(Properties.MEDIA_FILES.name(), oldMediaFile, mediaFiles);
}
public Template getTemplate() {
return template;
}
public void setTemplate(final Template template) {
final Template oldTemplate = this.template;
this.template = template;
pcs.firePropertyChange(Properties.TEMPLATE.name(), oldTemplate, template);
}
public Boolean getUseMetadata() {
return useMetadata;
}
public void setUseMetadata(final Boolean useMetadata) {
final Boolean oldUseMetadata = this.useMetadata;
this.useMetadata = useMetadata;
pcs.firePropertyChange(Properties.USE_METADATA.name(), oldUseMetadata, useMetadata);
}
public Path getMetadataFile() {
return metadataFile;
}
public void setMetadataFile(final Path metadataFile) {
final Path oldMetadataFile = this.metadataFile;
this.metadataFile = metadataFile;
pcs.firePropertyChange(Properties.METADATA_FILE.name(), oldMetadataFile, metadataFile);
}
public String getMediaExpression() {
return mediaExpression;
}
public void setMediaExpression(final String mediaExpression) {
final String oldMediaExpression = this.mediaExpression;
this.mediaExpression = mediaExpression;
pcs.firePropertyChange(Properties.MEDIA_EXPRESSION.name(), oldMediaExpression, mediaExpression);
}
public String getMetadataExpression() {
return metadataExpression;
}
public void setMetadataExpression(final String metadataExpression) {
final String oldMetadataExpression = this.metadataExpression;
this.metadataExpression = metadataExpression;
pcs.firePropertyChange(Properties.METADATA_EXPRESSION.name(), oldMetadataExpression, metadataExpression);
}
public String getMediaRegexp() {
return mediaRegexp;
}
public void setMediaRegexp(final String mediaRegexp) {
final String oldMediaRegexp = this.mediaRegexp;
this.mediaRegexp = mediaRegexp;
pcs.firePropertyChange(Properties.MEDIA_REGEXP.name(), oldMediaRegexp, mediaRegexp);
}
public String getMediaSubstitution() {
return mediaSubstitution;
}
public void setMediaSubstitution(final String mediaSubstitution) {
final String oldMediaSubstitution = this.mediaSubstitution;
this.mediaSubstitution = mediaSubstitution;
pcs.firePropertyChange(Properties.MEDIA_SUBSTITUTION.name(), oldMediaSubstitution, mediaSubstitution);
}
public char getSeparator() {
return csvSettings.separator;
}
public void setSeparator(final char separator) {
final char oldSeparator = csvSettings.separator;
csvSettings.separator = separator;
pcs.firePropertyChange(Properties.CSV_SEPARATOR.name(), oldSeparator, separator);
}
public char getQuote() {
return csvSettings.quote;
}
public void setQuote(final char quote) {
final char oldQuote = csvSettings.quote;
csvSettings.quote = quote;
pcs.firePropertyChange(Properties.CSV_QUOTE.name(), oldQuote, quote);
}
public char getEscape() {
return csvSettings.escape;
}
public void setEscape(final char escape) {
final char oldEscape = csvSettings.escape;
csvSettings.escape = escape;
pcs.firePropertyChange(Properties.CSV_ESCAPE.name(), oldEscape, escape);
}
public int getSkipLines() {
return csvSettings.skipLines;
}
public void setSkipLines(final int skipLines) {
final int oldSkipLines = csvSettings.skipLines;
csvSettings.skipLines = skipLines;
pcs.firePropertyChange(Properties.CSV_SKIP_LINES.name(), oldSkipLines, skipLines);
}
public boolean isStrictQuotes() {
return csvSettings.strictQuotes;
}
public void setStrictQuotes(final boolean strictQuotes) {
final boolean oldStrictQuotes = csvSettings.strictQuotes;
csvSettings.strictQuotes = strictQuotes;
pcs.firePropertyChange(Properties.CSV_STRICT_QUOTES.name(), oldStrictQuotes, strictQuotes);
}
public boolean isIgnoreLeadingWhiteSpace() {
return csvSettings.ignoreLeadingWhiteSpace;
}
public void setIgnoreLeadingWhiteSpace(final boolean ignoreLeadingWhiteSpace) {
final boolean oldIgnoreLeadingWhiteSpace = csvSettings.ignoreLeadingWhiteSpace;
csvSettings.ignoreLeadingWhiteSpace = ignoreLeadingWhiteSpace;
pcs.firePropertyChange(Properties.CSV_IGNORE_LEADING_WHITESPACE.name(), oldIgnoreLeadingWhiteSpace, ignoreLeadingWhiteSpace);
}
public Charset getCharset() {
return csvSettings.charset;
}
public void setCharset(final Charset charset) {
final Charset oldCharset = csvSettings.charset;
csvSettings.charset = charset;
pcs.firePropertyChange(Properties.CSV_CHARSET.name(), oldCharset, charset);
}
public class CSVSettings {
private char separator;
private char quote;
private char escape;
private int skipLines;
private boolean strictQuotes;
private boolean ignoreLeadingWhiteSpace;
private Charset charset;
public CSVSettings() {
this.separator = CSVParser.DEFAULT_SEPARATOR;
this.quote = CSVParser.DEFAULT_QUOTE_CHARACTER;
this.escape = CSVParser.DEFAULT_ESCAPE_CHARACTER;
this.skipLines = 0;
this.strictQuotes = CSVParser.DEFAULT_STRICT_QUOTES;
this.ignoreLeadingWhiteSpace = CSVParser.DEFAULT_IGNORE_LEADING_WHITESPACE;
this.charset = Charsets.UTF_8;
}
}
}