blob: 166ff6ac140072287ed8ffabd41cee38ccbb9ba9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 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.tasks.ui;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.commons.core.storage.ICommonStorable;
import org.eclipse.mylyn.context.core.ContextCore;
import org.eclipse.mylyn.context.core.IInteractionContext;
import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
import org.eclipse.mylyn.internal.context.ui.state.ContextStateManager;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
/**
* Manages the persistence for {@link ContextStateManager}.
*
* @author Steffen Pingel
*/
public class ContextStatePersistenceHandler {
public static final String FILE_NAME = "context-state.xml"; //$NON-NLS-1$
public ContextStatePersistenceHandler() {
}
public void activated(IInteractionContext context) {
if (!isOnUiThread()) {
return;
}
getStateManager().saveDefaultState();
ICommonStorable storable = getStorable(context.getHandleIdentifier());
if (storable != null) {
try {
InputStream in = null;
if (storable.exists(FILE_NAME)) {
in = storable.read(FILE_NAME, null);
}
try {
getStateManager().restoreState(context, in);
} finally {
if (in != null) {
in.close();
}
}
} catch (Exception e) {
StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, NLS.bind(
"Unexpected error restoring the context state for {0}", context.getHandleIdentifier()), e)); //$NON-NLS-1$
} finally {
storable.release();
}
} else {
// StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, NLS.bind(
// "Context restore failed: No corresponding task for {0} found.", context.getHandleIdentifier()))); //$NON-NLS-1$
}
}
public void clear(ITask task) {
if (!isOnUiThread()) {
return;
}
ICommonStorable storable = getStorable(task);
try {
storable.delete(FILE_NAME);
} catch (Exception e) {
StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, NLS.bind(
"Unexpected error deleting the context state for {0}", task.getHandleIdentifier()), e)); //$NON-NLS-1$
} finally {
storable.release();
}
}
public void clear(String contextHandle, boolean activeContext) {
// bug 255588: use the handle since the context is null when it is cleared
getStateManager().clearState(contextHandle, activeContext);
}
public void copy(ITask sourceTask, ITask targetTask) {
if (!isOnUiThread()) {
return;
}
copyState(sourceTask, targetTask, true);
}
public void deactivated(IInteractionContext context) {
if (!isOnUiThread()) {
return;
}
save(context, true);
getStateManager().restoreDefaultState();
}
public void merge(ITask sourceTask, ITask targetTask) {
if (!isOnUiThread()) {
return;
}
copyState(sourceTask, targetTask, false);
}
public void save(IInteractionContext context) {
save(context, false);
}
public void save(IInteractionContext context, boolean allowModifications) {
if (!isOnUiThread()) {
return;
}
ICommonStorable storable = getStorable(context.getHandleIdentifier());
if (storable != null) {
try {
OutputStream out = storable.write(FILE_NAME, null);
try {
getStateManager().saveState(context, out, allowModifications);
} finally {
out.close();
}
} catch (Exception e) {
StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, NLS.bind(
"Unexpected error saving the context state for {0}", context.getHandleIdentifier()), e)); //$NON-NLS-1$
} finally {
storable.release();
}
} else {
// StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, NLS.bind(
// "Context save failed: No corresponding task for {0} found.", context.getHandleIdentifier()))); //$NON-NLS-1$
}
}
public void saved(ITask task) {
if (!isOnUiThread()) {
return;
}
IInteractionContext context = ContextCore.getContextManager().getActiveContext();
if (context != null && task.getHandleIdentifier().equals(context.getHandleIdentifier())) {
save(context);
}
}
private void copyState(ITask sourceTask, ITask targetTask, boolean overwrite) {
ICommonStorable targetStorable = getStorable(targetTask);
try {
if (overwrite || !targetStorable.exists(FILE_NAME)) {
ICommonStorable sourceStorable = getStorable(sourceTask);
try {
copyStateFile(sourceStorable, targetStorable, FILE_NAME);
} finally {
sourceStorable.release();
}
}
} catch (Exception e) {
StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, NLS.bind(
"Unexpected error saving the context state for {0}", targetTask.getHandleIdentifier()), e)); //$NON-NLS-1$
} finally {
targetStorable.release();
}
}
private void copyStateFile(ICommonStorable sourceStorable, ICommonStorable targetStorable, String handle)
throws CoreException, IOException {
BufferedInputStream in = new BufferedInputStream(sourceStorable.read(handle, null));
try {
BufferedOutputStream out = new BufferedOutputStream(targetStorable.write(handle, null));
try {
byte[] buffer = new byte[4096];
while (true) {
int count = in.read(buffer);
if (count == -1) {
return;
}
out.write(buffer, 0, count);
}
} finally {
out.close();
}
} finally {
in.close();
}
}
private ContextStateManager getStateManager() {
return ContextUiPlugin.getDefault().getStateManager();
}
private ICommonStorable getStorable(ITask task) {
return ((TaskContextStore) TasksUiPlugin.getContextStore()).getStorable(task);
}
private ICommonStorable getStorable(String contextHandle) {
ITask task = TasksUi.getRepositoryModel().getTask(contextHandle);
return (task != null) ? getStorable(task) : null;
}
private boolean isOnUiThread() {
return Display.getCurrent() != null;
}
}