* refactoring of ExpressionFormat and related classes

This commit is contained in:
Reinhard Pointner 2009-04-25 07:59:08 +00:00
parent 09a1e0b731
commit 54bf7c2ca3
5 changed files with 86 additions and 141 deletions

View File

@ -1,41 +0,0 @@
package net.sourceforge.filebot.format;
import java.io.File;
import javax.script.Bindings;
import javax.script.ScriptException;
import net.sourceforge.filebot.similarity.Match;
import net.sourceforge.filebot.web.Episode;
public class EpisodeExpressionFormat extends ExpressionFormat {
public EpisodeExpressionFormat(String format) throws ScriptException {
super(format);
}
@Override
public Bindings getBindings(Object value) {
@SuppressWarnings("unchecked")
Match<Episode, File> match = (Match<Episode, File>) value;
return new ExpressionBindings(new EpisodeFormatBindingBean(match.getValue(), match.getCandidate()));
}
@Override
protected void dispose(Bindings bindings) {
// dispose binding bean
getBindingBean(bindings).dispose();
}
private EpisodeFormatBindingBean getBindingBean(Bindings bindings) {
return (EpisodeFormatBindingBean) ((ExpressionBindings) bindings).getBindingBean();
}
}

View File

@ -8,6 +8,7 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import java.util.zip.CRC32;
import net.sf.ehcache.Cache;
@ -17,7 +18,6 @@ import net.sourceforge.filebot.FileBotUtilities;
import net.sourceforge.filebot.mediainfo.MediaInfo;
import net.sourceforge.filebot.mediainfo.MediaInfo.StreamKind;
import net.sourceforge.filebot.web.Episode;
import net.sourceforge.tuned.FileUtilities;
public class EpisodeFormatBindingBean {
@ -91,6 +91,15 @@ public class EpisodeFormatBindingBean {
}
@Define("ext")
public String getContainerExtension() {
String extensions = getMediaInfo(StreamKind.General, 0, "Codec/Extensions");
// get first token
return new Scanner(extensions).next();
}
@Define("resolution")
public String getVideoResolution() {
String width = getMediaInfo(StreamKind.Video, 0, "Width");
@ -122,16 +131,6 @@ public class EpisodeFormatBindingBean {
}
@Define("ext")
public String getExtension() {
if (mediaFile != null) {
return FileUtilities.getExtension(mediaFile);
}
return null;
}
@Define("general")
public Object getGeneralMediaInfo() {
return new AssociativeScriptObject(getMediaInfo().snapshot(StreamKind.General, 0));
@ -162,6 +161,16 @@ public class EpisodeFormatBindingBean {
}
public Episode getEpisode() {
return episode;
}
public File getMediaFile() {
return mediaFile;
}
public synchronized MediaInfo getMediaInfo() {
if (mediaFile == null) {
throw new NullPointerException("Media file is null");
@ -179,16 +188,6 @@ public class EpisodeFormatBindingBean {
}
public synchronized void dispose() {
if (mediaInfo != null) {
mediaInfo.close();
mediaInfo.dispose();
}
mediaInfo = null;
}
private String getMediaInfo(StreamKind streamKind, int streamNumber, String... keys) {
for (String key : keys) {
String value = getMediaInfo().get(streamKind, streamNumber, key);

View File

@ -84,45 +84,40 @@ public class ExpressionFormat extends Format {
}
protected Bindings getBindings(Object value) {
// no bindings by default
return null;
public Bindings getBindings(Object value) {
return new ExpressionBindings(value);
}
@Override
public StringBuffer format(Object object, StringBuffer sb, FieldPosition pos) {
Bindings bindings = getBindings(object);
ScriptContext context = new SimpleScriptContext();
context.setBindings(bindings, ScriptContext.GLOBAL_SCOPE);
try {
for (Object snipped : expressions) {
if (snipped instanceof CompiledScript) {
try {
Object value = ((CompiledScript) snipped).eval(context);
if (value != null) {
sb.append(value);
}
} catch (ScriptException e) {
lastException = e;
}
} else {
sb.append(snipped);
}
}
} finally {
dispose(bindings);
}
return sb;
return format(getBindings(object), sb);
}
protected void dispose(Bindings bindings) {
public StringBuffer format(Bindings bindings, StringBuffer sb) {
ScriptContext context = new SimpleScriptContext();
context.setBindings(bindings, ScriptContext.GLOBAL_SCOPE);
for (Object snipped : expressions) {
if (snipped instanceof CompiledScript) {
try {
Object value = ((CompiledScript) snipped).eval(context);
if (value != null) {
sb.append(value);
}
} catch (ScriptException e) {
lastException = e;
} catch (Exception e) {
lastException = new ScriptException(e);
}
} else {
sb.append(snipped);
}
}
return sb;
}

View File

@ -18,6 +18,7 @@ import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.text.Format;
import java.text.ParseException;
import java.util.Arrays;
import java.util.ResourceBundle;
import java.util.concurrent.ArrayBlockingQueue;
@ -50,8 +51,8 @@ import javax.swing.filechooser.FileNameExtensionFilter;
import net.miginfocom.swing.MigLayout;
import net.sourceforge.filebot.ResourceManager;
import net.sourceforge.filebot.Settings;
import net.sourceforge.filebot.format.EpisodeExpressionFormat;
import net.sourceforge.filebot.similarity.Match;
import net.sourceforge.filebot.format.EpisodeFormatBindingBean;
import net.sourceforge.filebot.format.ExpressionFormat;
import net.sourceforge.filebot.web.Episode;
import net.sourceforge.filebot.web.Episode.EpisodeFormat;
import net.sourceforge.tuned.ExceptionUtilities;
@ -72,8 +73,7 @@ public class EpisodeFormatDialog extends JDialog {
private JLabel warningMessage = new JLabel(ResourceManager.getIcon("status.warning"));
private JLabel errorMessage = new JLabel(ResourceManager.getIcon("status.error"));
private Episode previewSampleEpisode = getPreviewSampleEpisode();
private File previewSampleMediaFile = getPreviewSampleMediaFile();
private EpisodeFormatBindingBean previewSample = new EpisodeFormatBindingBean(getPreviewSampleEpisode(), getPreviewSampleMediaFile());
private ExecutorService previewExecutor = createPreviewExecutor();
@ -138,9 +138,6 @@ public class EpisodeFormatDialog extends JDialog {
setLocation(TunedUtilities.getPreferredLocation(this));
// update preview to current format
checkFormatInBackground();
// update format on change
editor.getDocument().addDocumentListener(new LazyDocumentAdapter() {
@ -166,6 +163,9 @@ public class EpisodeFormatDialog extends JDialog {
editor.requestFocusInWindow();
}
});
// update preview to current format
firePreviewSampleChanged();
}
@ -176,16 +176,18 @@ public class EpisodeFormatDialog extends JDialog {
@Override
public void actionPerformed(ActionEvent evt) {
String episode = JOptionPane.showInputDialog(EpisodeFormatDialog.this, null, previewSampleEpisode);
String episodeString = JOptionPane.showInputDialog(EpisodeFormatDialog.this, null, EpisodeFormat.getInstance().format(previewSample.getEpisode()));
if (episode != null) {
if (episodeString != null) {
try {
previewSampleEpisode = EpisodeFormat.getInstance().parseObject(episode);
Settings.userRoot().put("dialog.sample.episode", episode);
Episode episode = EpisodeFormat.getInstance().parseObject(episodeString);
EpisodeFormatDialog.this.firePropertyChange("previewSample", null, previewSample());
} catch (Exception e) {
Logger.getLogger("ui").warning(String.format("Cannot parse %s", episode));
// change episode
previewSample = new EpisodeFormatBindingBean(episode, previewSample.getMediaFile());
Settings.userRoot().put("dialog.sample.episode", episodeString);
firePreviewSampleChanged();
} catch (ParseException e) {
Logger.getLogger("ui").warning(String.format("Cannot parse %s", episodeString));
}
}
}
@ -196,15 +198,14 @@ public class EpisodeFormatDialog extends JDialog {
@Override
public void actionPerformed(ActionEvent evt) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setSelectedFile(previewSampleMediaFile);
fileChooser.setSelectedFile(previewSample.getMediaFile());
fileChooser.setFileFilter(new FileNameExtensionFilter("Media files", "avi", "mkv", "mp4", "ogm"));
if (fileChooser.showOpenDialog(EpisodeFormatDialog.this) == JFileChooser.APPROVE_OPTION) {
previewSampleMediaFile = fileChooser.getSelectedFile();
Settings.userRoot().put("dialog.sample.file", previewSampleMediaFile.getAbsolutePath());
File mediaFile = fileChooser.getSelectedFile();
try {
MediaInfoComponent.showMessageDialog(EpisodeFormatDialog.this, previewSampleMediaFile);
MediaInfoComponent.showMessageDialog(EpisodeFormatDialog.this, mediaFile);
} catch (LinkageError e) {
// MediaInfo native library is missing -> notify user
Logger.getLogger("ui").log(Level.SEVERE, e.getMessage(), e);
@ -213,7 +214,10 @@ public class EpisodeFormatDialog extends JDialog {
throw e;
}
EpisodeFormatDialog.this.firePropertyChange("previewSample", null, previewSample());
// change media file
previewSample = new EpisodeFormatBindingBean(previewSample.getEpisode(), mediaFile);
Settings.userRoot().put("dialog.sample.file", mediaFile.getAbsolutePath());
firePreviewSampleChanged();
}
}
});
@ -265,11 +269,6 @@ public class EpisodeFormatDialog extends JDialog {
}
private Match<Episode, File> previewSample() {
return new Match<Episode, File>(previewSampleEpisode, previewSampleMediaFile);
}
private Episode getPreviewSampleEpisode() {
String sample = Settings.userRoot().get("dialog.sample.episode");
@ -328,9 +327,9 @@ public class EpisodeFormatDialog extends JDialog {
@Override
protected String doInBackground() throws Exception {
EpisodeExpressionFormat format = new EpisodeExpressionFormat(editor.getText().trim());
ExpressionFormat format = new ExpressionFormat(editor.getText().trim());
String text = format.format(previewSample());
String text = format.format(previewSample);
warning = format.scriptException();
// check if format produces empty strings
@ -344,7 +343,6 @@ public class EpisodeFormatDialog extends JDialog {
@Override
protected void done() {
Exception error = null;
try {
@ -405,7 +403,7 @@ public class EpisodeFormatDialog extends JDialog {
@Override
public void actionPerformed(ActionEvent evt) {
try {
finish(new EpisodeExpressionFormat(editor.getText()));
finish(new ExpressionFormat(editor.getText()));
Settings.userRoot().put("dialog.format", editor.getText());
} catch (ScriptException e) {
Logger.getLogger("ui").log(Level.WARNING, ExceptionUtilities.getRootCauseMessage(e), e);
@ -414,6 +412,11 @@ public class EpisodeFormatDialog extends JDialog {
};
protected void firePreviewSampleChanged() {
firePropertyChange("previewSample", null, previewSample);
}
public static Format showDialog(Component parent) {
EpisodeFormatDialog dialog = new EpisodeFormatDialog(TunedUtilities.getWindow(parent));
@ -439,35 +442,23 @@ public class EpisodeFormatDialog extends JDialog {
protected class ExampleFormatLabel extends JLabel {
private final String format;
public ExampleFormatLabel(String format) {
this.format = format;
// initialize text
updateText(previewSample());
public ExampleFormatLabel(final String format) {
// bind text to preview
EpisodeFormatDialog.this.addPropertyChangeListener("previewSample", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
updateText(evt.getNewValue());
try {
setText(new ExpressionFormat(format).format(previewSample));
setForeground(defaultColor);
} catch (Exception e) {
setText(ExceptionUtilities.getRootCauseMessage(e));
setForeground(errorColor);
}
}
});
}
public void updateText(Object episode) {
try {
setText(new EpisodeExpressionFormat(format).format(episode));
setForeground(defaultColor);
} catch (Exception e) {
setText(ExceptionUtilities.getRootCauseMessage(e));
setForeground(errorColor);
}
}
}

View File

@ -57,13 +57,14 @@ public class ExpressionFormatTest {
@Override
protected Bindings getBindings(Object value) {
public Bindings getBindings(Object value) {
Bindings bindings = new SimpleBindings();
bindings.put("value", value);
return bindings;
}
}
}