| /******************************************************************************* |
| * 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$ |
| } |
| } |
| |
| } |