blob: 7553830329d816eec9c15867b42c56526ebd05d0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 Tasktop Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.context.ui.state;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.core.CommonListenerList;
import org.eclipse.mylyn.commons.core.CommonListenerList.Notifier;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.context.core.IInteractionContext;
import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
import org.eclipse.ui.XMLMemento;
/**
* @author Steffen Pingel
*/
public class ContextStateManager {
private static final String TAG_CONTEXT_STATE = "ContextState"; //$NON-NLS-1$
private static final String CHARSET = "UTF-8"; //$NON-NLS-1$
private final CommonListenerList<ContextStateParticipant> participants;
private final ContextState defaultState;
public ContextStateManager() {
this.participants = new CommonListenerList<ContextStateParticipant>(ContextUiPlugin.ID_PLUGIN);
this.defaultState = createMemento(null, "default"); //$NON-NLS-1$
}
public void addParticipant(ContextStateParticipant participant) {
participants.add(participant);
}
public void clearState(final String contextHandle, final boolean isActiveContext) {
participants.notify(new Notifier<ContextStateParticipant>() {
@Override
public void run(ContextStateParticipant participant) throws Exception {
participant.clearState(contextHandle, isActiveContext);
}
});
}
public ContextState createMemento(IInteractionContext context, String contextHandle) {
return new ContextState(context, contextHandle, XMLMemento.createWriteRoot(TAG_CONTEXT_STATE));
}
public ContextState read(IInteractionContext context, InputStream in) {
ContextState memento = null;
if (in != null) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(in, CHARSET));
try {
XMLMemento xmlMemento = XMLMemento.createReadRoot(reader);
return new ContextState(context, context.getHandleIdentifier(), xmlMemento);
} finally {
reader.close();
}
} catch (IOException e) {
StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
"Failed to restore context state", e)); //$NON-NLS-1$
} catch (CoreException e) {
StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
"Failed to restore context state", e)); //$NON-NLS-1$
}
}
if (memento == null) {
memento = createMemento(context, context.getHandleIdentifier());
}
return memento;
}
public void removeParticipant(ContextStateParticipant participant) {
participants.remove(participant);
}
public void restoreDefaultState() {
participants.notify(new Notifier<ContextStateParticipant>() {
@Override
public void run(ContextStateParticipant participant) throws Exception {
if (participant.isEnabled()) {
participant.restoreDefaultState(defaultState);
}
}
});
}
public void restoreState(IInteractionContext context, InputStream in) {
final ContextState memento = read(context, in);
participants.notify(new Notifier<ContextStateParticipant>() {
@Override
public void run(ContextStateParticipant participant) throws Exception {
if (participant.isEnabled()) {
participant.restoreState(memento);
}
}
});
}
public void saveDefaultState() {
participants.notify(new Notifier<ContextStateParticipant>() {
@Override
public void run(ContextStateParticipant participant) throws Exception {
if (participant.isEnabled()) {
participant.saveDefaultState(defaultState);
}
}
});
}
public void saveState(IInteractionContext context, OutputStream storable) {
saveState(context, storable, false);
}
public void saveState(IInteractionContext context, OutputStream storable, final boolean allowModifications) {
final ContextState memento = createMemento(context, context.getHandleIdentifier());
participants.notify(new Notifier<ContextStateParticipant>() {
@Override
public void run(ContextStateParticipant participant) throws Exception {
if (participant.isEnabled()) {
participant.saveState(memento, allowModifications);
}
}
});
write(storable, memento);
}
public void write(OutputStream out, ContextState memento) {
try {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, CHARSET));
try {
memento.getMemento().save(writer);
} finally {
writer.close();
}
} catch (IOException e) {
StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Failed to save context state", e)); //$NON-NLS-1$
}
}
}