/*
* RapidMiner
*
* Copyright (C) 2001-2011 by Rapid-I and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapid-i.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.repository.gui.actions;
import com.rapidminer.Process;
import com.rapidminer.RepositoryProcessLocation;
import com.rapidminer.gui.RapidMinerGUI;
import com.rapidminer.gui.tools.ProgressThread;
import com.rapidminer.gui.tools.SwingTools;
import com.rapidminer.gui.tools.dialogs.ConfirmDialog;
import com.rapidminer.repository.Entry;
import com.rapidminer.repository.Folder;
import com.rapidminer.repository.ProcessEntry;
import com.rapidminer.repository.RepositoryException;
import com.rapidminer.repository.RepositoryLocation;
import com.rapidminer.repository.gui.RepositoryTree;
/**
* This action stores the current process at the selected entry.
*
*/
public class StoreProcessAction extends AbstractRepositoryAction<Entry> {
private static final long serialVersionUID = 1L;
public StoreProcessAction(RepositoryTree tree) {
super(tree, Entry.class, false, "repository_store_process");
}
@Override
public void actionPerformed(Entry entry) {
if (entry instanceof Folder) {
storeInFolder(Folder.class.cast(entry));
}
if (entry instanceof ProcessEntry) {
overwriteProcess(ProcessEntry.class.cast(entry));
}
}
private void storeInFolder(final Folder folder) {
// get current process name (if present)
String currentName = null;
if (RapidMinerGUI.getMainFrame().getProcess().getProcessLocation() != null) {
currentName = RapidMinerGUI.getMainFrame().getProcess().getProcessLocation().getShortName();
}
final String name = SwingTools.showInputDialog("store_process", currentName);
if (name != null) {
if (name.isEmpty()) {
SwingTools.showVerySimpleErrorMessage("please_enter_non_empty_name");
return;
}
try {
if (folder.containsEntry(name)) {
SwingTools.showVerySimpleErrorMessage("repository_entry_already_exists", name);
return;
}
} catch (RepositoryException e1) {
SwingTools.showSimpleErrorMessage("cannot_store_process_in_repository", e1, name);
return;
}
ProgressThread storeProgressThread = new ProgressThread("store_process") {
public void run() {
getProgressListener().setTotal(100);
try {
getProgressListener().setCompleted(10);
Process process = RapidMinerGUI.getMainFrame().getProcess();
process.setProcessLocation(new RepositoryProcessLocation(new RepositoryLocation(folder.getLocation(), name)));
folder.createProcessEntry(name, process.getRootOperator().getXML(false));
tree.expandPath(tree.getSelectionPath());
RapidMinerGUI.getMainFrame().processHasBeenSaved();
} catch (Exception e) {
SwingTools.showSimpleErrorMessage("cannot_store_process_in_repository", e, name);
} finally {
getProgressListener().setCompleted(10);
getProgressListener().complete();
}
}
};
storeProgressThread.start();
}
}
private void overwriteProcess(final ProcessEntry processEntry) {
if (SwingTools.showConfirmDialog("overwrite", ConfirmDialog.YES_NO_OPTION, processEntry.getLocation()) == ConfirmDialog.YES_OPTION) {
ProgressThread storeProgressThread = new ProgressThread("store_process") {
@Override
public void run() {
getProgressListener().setTotal(100);
getProgressListener().setCompleted(10);
try {
Process process = RapidMinerGUI.getMainFrame().getProcess();
process.setProcessLocation(new RepositoryProcessLocation(processEntry.getLocation()));
processEntry.storeXML(process.getRootOperator().getXML(false));
} catch (Exception e) {
SwingTools.showSimpleErrorMessage("cannot_store_process_in_repository", e, processEntry.getName());
} finally {
getProgressListener().setCompleted(100);
getProgressListener().complete();
}
}
};
storeProgressThread.start();
}
}
@Override
public void enable() {
Entry entry = tree.getSelectedEntry();
setEnabled((Folder.class.isInstance(entry) || ProcessEntry.class.isInstance(entry)));
}
}