package de.gaalop.gui;
import de.gaalop.*;
import de.gaalop.gui.util.PluginIconUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.Preferences;
import org.apache.commons.beanutils.BeanUtils;
/**
* This command object performs a compilation run.
*/
public class CompileAction extends AbstractAction {
private static final long serialVersionUID = 2110643735874314468L;
private Log log = LogFactory.getLog(CompileAction.class);
private final SourceFilePanel sourcePanel;
private final StatusBar statusBar;
private PanelPluginSelection panelPluginSelection;
public CompileAction(SourceFilePanel sourcePanel, StatusBar statusBar, PanelPluginSelection panelPluginSelection) {
super("To " + panelPluginSelection.getCodeGeneratorPlugin().getName(), PluginIconUtil.getSmallIcon(panelPluginSelection.getCodeGeneratorPlugin()));
this.panelPluginSelection = panelPluginSelection;
this.sourcePanel = sourcePanel;
this.statusBar = statusBar;
}
@Override
public void actionPerformed(ActionEvent e) {
AlgebraChooserItem algebraToUse = panelPluginSelection.getAlgebraToUse();
PanelPluginSelection.lastUsedAlgebra = algebraToUse.algebraName;
PanelPluginSelection.lastUsedAlgebraRessource = algebraToUse.ressource;
statusBar.reset();
GlobalSettingsStrategyPlugin globalSettingsPlugin = panelPluginSelection.getGlobalSettingsStrategyPlugin();
if (globalSettingsPlugin == null) {
JOptionPane.showMessageDialog(null, "No GlobalSettings strategy is available. Please install " +
"an appropiate plugin.", "No GlobalSettings Strategy Available", JOptionPane.ERROR_MESSAGE);
return;
}
VisualCodeInserterStrategyPlugin visualizerPlugin = panelPluginSelection.getVisualizerStrategyPlugin();
if (visualizerPlugin == null) {
JOptionPane.showMessageDialog(null, "No visualizer strategy is available. Please install " +
"an appropiate plugin.", "No Visualizer Strategy Available", JOptionPane.ERROR_MESSAGE);
return;
}
AlgebraStrategyPlugin algebraPlugin = panelPluginSelection.getAlgebraStrategyPlugin();
if (algebraPlugin == null) {
JOptionPane.showMessageDialog(null, "No algebra strategy is available. Please install " +
"an appropiate plugin.", "No Algebra Strategy Available", JOptionPane.ERROR_MESSAGE);
return;
}
OptimizationStrategyPlugin optimizationPlugin = panelPluginSelection.getOptimizationStrategyPlugin();
if (optimizationPlugin == null) {
JOptionPane.showMessageDialog(null, "No optimization strategy is available. Please install " +
"an appropiate plugin.", "No Optimization Strategy Available", JOptionPane.ERROR_MESSAGE);
return;
}
CodeParserPlugin parserPlugin = sourcePanel.getParserPlugin();
AlgebraStrategyPlugin algebra = Plugins.getAlgebraStrategyPlugins().iterator().next();
String algebraBaseDirectory = "";
try {
Field field = algebra.getClass().getField("additionalBaseDirectory");
algebraBaseDirectory = BeanUtils.getProperty(algebra, field.getName()).trim();
} catch (IllegalAccessException ex) {
Logger.getLogger(PanelPluginSelection.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(PanelPluginSelection.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchMethodException ex) {
Logger.getLogger(PanelPluginSelection.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchFieldException ex) {
Logger.getLogger(PanelPluginSelection.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(PanelPluginSelection.class.getName()).log(Level.SEVERE, null, ex);
}
final CompilerFacade facade = new CompilerFacade(parserPlugin.createCodeParser(),
globalSettingsPlugin.createGlobalSettingsStrategy(),
visualizerPlugin.createVisualCodeInserterStrategy(),
algebraPlugin.createAlgebraStrategy(),
optimizationPlugin.createOptimizationStrategy(),
panelPluginSelection.getCodeGeneratorPlugin().createCodeGenerator(),
algebraToUse.algebraName,algebraToUse.ressource,algebraBaseDirectory
);
facade.addObserver(statusBar);
// start new thread in order to see status changes in main thread (GUI)
Thread compiler = new Thread(new Runnable() {
@Override
public void run() {
try {
Set<OutputFile> output;
output = facade.compile(sourcePanel.getInputFile());
if (!output.isEmpty())
displayOutput(output);
} catch (CompilationException ex) {
log.error("Compilation exception", ex);
statusBar.displayError(ex);
ex.printStackTrace();
ErrorDialog.show(ex);
}
}
});
compiler.start();
}
private void displayOutput(Set<OutputFile> output) {
ResultForm resultForm = new ResultForm(output);
JFrame outputFrame = new JFrame("Compilation Result");
outputFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
outputFrame.setContentPane(resultForm.getContentPane());
outputFrame.setPreferredSize(new Dimension(640, 480));
outputFrame.setIconImage(getIcon());
outputFrame.pack();
outputFrame.setLocationRelativeTo(null);
outputFrame.setVisible(true);
}
public Image getIcon() {
URL iconUrl = getClass().getResource("icon.png");
if (iconUrl == null) {
log.warn("Couldn't find application icon.");
return null;
}
try {
return ImageIO.read(iconUrl);
} catch (IOException e) {
log.error("Unable to load application icon.", e);
return null;
}
}
}