/* ApplicationWorkspace.java created 2007-12-15
*
*/
package org.signalml.app.config.workspace;
import java.io.IOException;
import java.util.LinkedList;
import multiplexer.jmx.client.ConnectException;
import org.apache.log4j.Logger;
import org.signalml.app.action.selector.ActionFocusManager;
import org.signalml.app.document.BookDocument;
import org.signalml.app.document.DocumentFlowIntegrator;
import org.signalml.app.document.DocumentManager;
import org.signalml.app.document.FileBackedDocument;
import org.signalml.app.document.ManagedDocumentType;
import org.signalml.app.document.signal.SignalDocument;
import org.signalml.app.util.XMLUtils;
import org.signalml.exception.SanityCheckException;
import org.signalml.plugin.export.SignalMLException;
import org.signalml.plugin.export.signal.Document;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.Annotations;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import org.signalml.app.config.AbstractXMLConfiguration;
import org.signalml.app.config.preset.managers.EegSystemsPresetManager;
/** ApplicationWorkspace
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
@XStreamAlias("workspace")
public class ApplicationWorkspace extends AbstractXMLConfiguration {
protected static final Logger logger = Logger.getLogger(ApplicationWorkspace.class);
private LinkedList<WorkspaceDocument> documents = new LinkedList<WorkspaceDocument>();
private WorkspaceDocument activeDocument;
/**
* A {@link PresetManager} for managing the available {@link EegSystem EegSystems}.
*/
private EegSystemsPresetManager eegSystemsPresetManager;
public ApplicationWorkspace() {
}
@Override
public String getStandardFilename() {
return "workspace.xml";
}
public void configureFrom(DocumentFlowIntegrator integrator) {
DocumentManager documentManager = integrator.getDocumentManager();
ActionFocusManager actionFocusManager = integrator.getActionFocusManager();
int count = documentManager.getDocumentCount();
WorkspaceDocument workspaceDocument;
Document activeDocument = actionFocusManager.getActiveDocument();
Document document;
for (int i=0; i<count; i++) {
document = documentManager.getDocumentAt(i);
try {
workspaceDocument = addDocument(document);
if (document == activeDocument) {
this.activeDocument = workspaceDocument;
}
} catch (Throwable t) {
logger.error("Failed to add document: "+document, t);
}
}
}
public void configureIntegrator(DocumentFlowIntegrator integrator) {
int cnt = documents.size();
Document document;
Document activeDocument = null;
WorkspaceDocument workspaceDocument;
for (int i=0; i<cnt; i++) {
document = null;
workspaceDocument = documents.get(i);
try {
document = restoreDocument(workspaceDocument, integrator);
} catch (IOException ex) {
logger.error("Exception while restoring workspace", ex);
} catch (SignalMLException ex) {
logger.error("Exception while restoring workspace", ex);
} catch (ConnectException ex) {
logger.error("Exception while restoring workspace", ex);
}
if (this.activeDocument == workspaceDocument) {
activeDocument = document;
}
}
if (activeDocument != null) {
integrator.getActionFocusManager().setActiveDocument(activeDocument);
}
}
public WorkspaceDocument addDocument(Document document) {
ManagedDocumentType type;
if (document instanceof FileBackedDocument) {
type = ManagedDocumentType.getForClass(document.getClass());
if (type == ManagedDocumentType.SIGNAL || type == ManagedDocumentType.MONITOR) {
WorkspaceSignal signal = new WorkspaceSignal((SignalDocument) document);
documents.add(signal);
return signal;
}
else if (type == ManagedDocumentType.TAG) {
// tags are added inside their signals
return null;
}
else if (type == ManagedDocumentType.BOOK) {
WorkspaceBook book = new WorkspaceBook((BookDocument) document);
documents.add(book);
return book;
} else {
throw new SanityCheckException("Bad document type [" + type + "]");
}
} else {
// other types not saved into workspace - currently no such documents
return null;
}
}
public int getDocumentCount() {
return documents.size();
}
public Document restoreDocument(WorkspaceDocument workspaceDocument, DocumentFlowIntegrator integrator) throws IOException, SignalMLException, ConnectException {
if (workspaceDocument instanceof WorkspaceSignal) {
Document document = integrator.openMRUDEntry(workspaceDocument.getMrudEntry());
if (document == null || !(document instanceof SignalDocument)) {
logger.warn("WARNING: not a signal");
return null;
}
((WorkspaceSignal) workspaceDocument).configureSignal((SignalDocument) document, integrator, eegSystemsPresetManager);
return document;
}
else if (workspaceDocument instanceof WorkspaceBook) {
Document document = integrator.openMRUDEntry(workspaceDocument.getMrudEntry());
if (document == null || !(document instanceof BookDocument)) {
logger.warn("WARNING: not a book");
return null;
}
((WorkspaceBook) workspaceDocument).configureBook((BookDocument) document);
return document;
}
else if (workspaceDocument instanceof WorkspaceTag) {
return null;
// do nothing - tags restored inside signals
} else {
throw new SanityCheckException("Bad workspace document class [" + workspaceDocument.getClass() + "]");
}
}
@Override
public XStream getStreamer() {
if (streamer == null) {
streamer = createWorkspaceStreamer();
}
return streamer;
}
private XStream createWorkspaceStreamer() {
XStream streamer = XMLUtils.getDefaultStreamer();
XMLUtils.configureStreamerForMontage(streamer);
XMLUtils.configureStreamerForBookFilter(streamer);
Annotations.configureAliases(
streamer,
ApplicationWorkspace.class,
WorkspaceDocument.class,
WorkspaceSignal.class,
WorkspaceBook.class,
WorkspaceTag.class,
WorkspaceSignalPlot.class,
WorkspaceBookPlot.class
);
streamer.setMode(XStream.ID_REFERENCES);
return streamer;
}
/**
* Sets the Eeg systems preset manager for this ApplicationWorkspace.
* @param eegSystemsPresetManager
*/
public void setEegSystemsPresetManager(EegSystemsPresetManager eegSystemsPresetManager) {
this.eegSystemsPresetManager = eegSystemsPresetManager;
}
}