/* * Copyright (C) 2012 Timo Vesalainen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.vesalainen.parsers.sql.dsql.ui.action; import com.google.appengine.api.datastore.Entity; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.LinkedHashMap; import java.util.Map; import javax.swing.Action; import javax.swing.JFrame; import javax.swing.KeyStroke; import javax.swing.ProgressMonitor; import javax.swing.SwingWorker; import org.vesalainen.parsers.sql.FetchResult; import org.vesalainen.parsers.sql.FetchResultComboBoxModel; import org.vesalainen.parsers.sql.Placeholder; import org.vesalainen.parsers.sql.SelectStatement; import org.vesalainen.parsers.sql.Statement; import org.vesalainen.parsers.sql.dsql.GObjectHelper; import org.vesalainen.parsers.sql.dsql.ui.I18n; import org.vesalainen.parsers.sql.dsql.ui.InputDialog; /** * @author Timo Vesalainen */ public class ExecuteAction extends AbstractAutoAction implements PropertyChangeListener { public static final String PropertyName = "fetchResult"; public static final String OptionsProperty = "optionsProperty"; protected JFrame frame; protected Statement statement; public ExecuteAction(JFrame frame) { super(I18n.get("EXECUTE")); putValue(Action.SHORT_DESCRIPTION, I18n.get("EXECUTE THE STATEMENT")); this.frame = frame; putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.ALT_DOWN_MASK)); setEnabled(false); } @Override public void actionPerformed(ActionEvent e) { if (enterPlaceHolders(statement)) { final ExecuteAction act = this; SwingWorker<Void, Void> task = new SwingWorker<Void, Void>() { private FetchResult fetchResult; @Override protected Void doInBackground() throws Exception { ProgressMonitor mon = new ProgressMonitor(frame, I18n.get("WAIT"), "", 0, 100); mon.setNote(""); statement.getEngine().createProgressMonitor(mon); fetchResult = statement.execute(); mon.close(); return null; } @Override protected void done() { act.firePropertyChange(PropertyName, null, fetchResult); } }; task.execute(); } } @Override public void propertyChange(PropertyChangeEvent evt) { if (DSqlParseAction.PropertyName.equals(evt.getPropertyName())) { statement = (Statement) evt.getNewValue(); if (statement != null) { setEnabled(true); if (statement instanceof SelectStatement) { putValue(NAME, I18n.get("SELECT")); } else { putValue(NAME, I18n.get("EXECUTE")); } } else { setEnabled(false); } } } protected boolean enterPlaceHolders(Statement<Entity,Object> statement) { LinkedHashMap<String,Placeholder<Entity,Object>> placeholderMap = statement.getPlaceholderMap(); if (!placeholderMap.isEmpty()) { InputDialog inputDialog = new InputDialog(frame, I18n.get("ENTER PLACEHOLDER VALUES")); for (Map.Entry<String,Placeholder<Entity,Object>> entry : placeholderMap.entrySet()) { Placeholder ph = entry.getValue(); inputDialog.add(ph.getName(), ph.getDefaultValue(), ph.getType()); } if (inputDialog.input()) { int row = 0; StringBuilder sb = new StringBuilder(); for (Map.Entry<String,Placeholder<Entity,Object>> entry : placeholderMap.entrySet()) { Placeholder ph = entry.getValue(); Object value = inputDialog.get(row++); statement.bindValue(ph.getName(), value); sb.append(entry.getKey()); sb.append("="); if (value instanceof FetchResultComboBoxModel) { FetchResultComboBoxModel<Entity,Object> model = (FetchResultComboBoxModel) value; sb.append(model.getSelectedItem()); } else { sb.append(GObjectHelper.getString(value)); } sb.append(" "); } firePropertyChange(OptionsProperty, null, sb.toString()); return true; } else { return false; } } else { firePropertyChange(OptionsProperty, null, " "); } return true; } }