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