package org.signalml.plugin.newartifact.method;
import java.awt.Window;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.InvalidClassException;
import java.util.ArrayList;
import org.apache.log4j.Logger;
import org.signalml.app.document.TagDocument;
import org.signalml.app.view.common.dialogs.OptionPane;
import org.signalml.app.view.common.dialogs.errors.Dialogs;
import org.signalml.domain.tag.StyledTagSet;
import org.signalml.method.Method;
import org.signalml.plugin.export.SignalMLException;
import org.signalml.plugin.export.signal.ExportedSignalDocument;
import org.signalml.plugin.export.signal.ExportedTagDocument;
import org.signalml.plugin.export.signal.SvarogAccessSignal;
import org.signalml.plugin.export.view.FileChooser;
import org.signalml.plugin.method.IPluginMethodResultConsumer;
import org.signalml.plugin.method.PluginMethodManager;
import org.signalml.plugin.newartifact.data.NewArtifactApplicationData;
import org.signalml.plugin.newartifact.data.NewArtifactResult;
import org.signalml.plugin.newartifact.ui.NewArtifactResultDialog;
import org.signalml.plugin.newartifact.ui.NewArtifactResultTargetDescriptor;
import org.signalml.util.Util;
/**
* ArtifactMethodConsumer
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe
* Sp. z o.o.
*/
public class NewArtifactMethodConsumer implements IPluginMethodResultConsumer {
protected static final Logger logger = Logger
.getLogger(NewArtifactMethodConsumer.class);
private Window dialogParent;
private FileChooser fileChooser;
private NewArtifactResultDialog resultDialog;
private PluginMethodManager manager;
@Override
public void initialize(PluginMethodManager manager) {
this.manager = manager;
this.dialogParent = manager.getSvarogAccess().getGUIAccess().getDialogParent();
this.fileChooser = manager.getSvarogAccess().getGUIAccess().getFileChooser();
this.resultDialog = new NewArtifactResultDialog(
this.dialogParent, true);
this.resultDialog.setFileChooser(fileChooser);
}
@Override
public boolean consumeResult(Method method, Object methodData,
Object methodResult) throws SignalMLException {
if (!(methodData instanceof NewArtifactApplicationData)) {
logger.error("Invalid artifact data");
return false;
}
NewArtifactApplicationData data = (NewArtifactApplicationData) methodData;
NewArtifactResult result = (NewArtifactResult) methodResult;
NewArtifactResultTargetDescriptor descriptor = new NewArtifactResultTargetDescriptor();
SvarogAccessSignal signalAccess = this.manager.getSvarogAccess()
.getSignalAccess();
ExportedSignalDocument signalDocument = data.getSignalDocument();
boolean signalAvailable;
if (signalDocument == null || signalDocument.isClosed()) {
logger.warn("Document unavailable or has been closed");
signalAvailable = false;
} else {
signalAvailable = true;
}
descriptor.setSignalAvailable(signalAvailable);
final File primaryTagFile = result.getTagFile();
if (primaryTagFile == null || !primaryTagFile.exists()) {
throw new SignalMLException("No result tag");
}
ExportedTagDocument primaryTag = null;
try {
primaryTag = new TagDocument(primaryTagFile);
} catch (IOException e) {
logger.error("Invalid tag file");
return false;
}
descriptor.setPrimaryTag(primaryTag);
File workingDirectory = new File(data.getProjectPath(),
data.getPatientName());
File[] additionalTagFiles = workingDirectory
.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.equals(primaryTagFile)) {
return false;
}
String fileExtension = Util.getFileExtension(pathname,
false);
return (fileExtension != null && "tag"
.equalsIgnoreCase(fileExtension));
}
});
ArrayList<File> additionalTags = new ArrayList<File>();
for (File f : additionalTagFiles) {
additionalTags.add(f);
}
descriptor.setAdditionalTags(additionalTags);
descriptor.setChosenAdditionalTags(new ArrayList<File>());
descriptor.setPrimaryOpenInWindow(true);
descriptor.setPrimarySaveToFile(true);
descriptor.setAdditionalOpenInWindow(false);
descriptor.setAdditionalSaveToFile(false);
boolean dialogOk = resultDialog.showDialog(descriptor, true);
if (!dialogOk) {
return false;
}
if (descriptor.isPrimarySaveToFile()) {
primaryTag.setBackingFile(descriptor.getPrimaryTagFile());
try {
primaryTag.saveDocument();
} catch (SignalMLException ex) {
logger.error("Failed to save document", ex);
Dialogs.showExceptionDialog(dialogParent, ex);
return false;
} catch (IOException ex) {
logger.error("Failed to save document - i/o exception", ex);
Dialogs.showExceptionDialog(dialogParent, ex);
return false;
}
}
if (signalAvailable && descriptor.isPrimaryOpenInWindow()) {
try {
signalAccess.openTagDocument(primaryTag.getBackingFile(),
signalDocument, true);
} catch (InvalidClassException ex) {
Dialogs.showExceptionDialog(dialogParent, ex);
return false;
} catch (IOException ex) {
Dialogs.showExceptionDialog(dialogParent, ex);
return false;
}
}
ArrayList<File> chosenAdditionalTags = descriptor
.getChosenAdditionalTags();
if (!chosenAdditionalTags.isEmpty()) {
boolean additionalOpenInWindow = descriptor
.isAdditionalOpenInWindow();
boolean additionalSaveToFile = descriptor.isAdditionalSaveToFile();
if (additionalOpenInWindow || additionalSaveToFile) {
for (File file : chosenAdditionalTags) {
StyledTagSet additionalTagSet = null;
File saveFile;
boolean hasFile = false;
TagDocument additionalTag = null;
if (additionalSaveToFile) {
TagDocument d;
try {
d = new TagDocument(file);
d.openDocument();
} catch (IOException ex) {
Dialogs.showExceptionDialog(
dialogParent, ex);
return false;
}
additionalTagSet = d.getTagSet();
additionalTag = new TagDocument(additionalTagSet);
d.closeDocument();
hasFile = false;
do {
saveFile = fileChooser.chooseSaveTag(dialogParent);
if (saveFile == null) {
// file choice canceled
break;
}
hasFile = true;
// file exists warning
if (saveFile.exists()) {
int res = OptionPane
.showFileAlreadyExists(dialogParent);
if (res != OptionPane.OK_OPTION) {
hasFile = false;
}
}
} while (!hasFile);
if (hasFile) {
additionalTag.setBackingFile(saveFile);
try {
additionalTag.saveDocument();
} catch (SignalMLException ex) {
logger.error("Failed to save document", ex);
Dialogs.showExceptionDialog(
dialogParent, ex);
return false;
} catch (IOException ex) {
logger.error(
"Failed to save document - i/o exception",
ex);
Dialogs.showExceptionDialog(
dialogParent, ex);
return false;
}
}
}
if (additionalOpenInWindow) {
File tagFile = null;
if (additionalTag != null) {
tagFile = additionalTag.getBackingFile();
}
if (tagFile == null) {
tagFile = file;
}
try {
signalAccess.openTagDocument(file, signalDocument,
false);
} catch (InvalidClassException ex) {
Dialogs.showExceptionDialog(
dialogParent, ex);
return false;
} catch (IOException ex) {
Dialogs.showExceptionDialog(
dialogParent, ex);
return false;
}
}
}
}
}
return true;
}
}