// ============================================================================
//
// Copyright (C) 2006-2012 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.repository.preview;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.ListenerList;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
/**
* DOC amaumont class global comment. Detailled comment <br/>
*
* $Id$
*
* @param <R> result of preview
*/
public class AsynchronousPreviewHandler<R> {
private IPreview preview;
private R result;
private ListenerList listeners = new ListenerList();
private boolean previewStopped;
/**
* DOC amaumont PreviewHandler constructor comment.
*/
public AsynchronousPreviewHandler(IPreview preview) {
super();
this.preview = preview;
}
/**
* DOC amaumont Comment method "launchSynchronousPreview".
*
* @throws CoreException
*/
public void launchPreview(final ProcessDescription processDescription, final String type) {
this.result = null;
this.previewStopped = false;
Thread thread = new Thread() {
/*
* (non-Javadoc)
*
* @see java.lang.Thread#run()
*/
@SuppressWarnings("unchecked") //$NON-NLS-1$
@Override
public void run() {
result = null;
try {
PreviewHandlerEvent event = new PreviewHandlerEvent(PreviewHandlerEvent.TYPE.PREVIEW_STARTED, AsynchronousPreviewHandler.this);
fireEvent(event);
result = (R) preview.preview(processDescription, type);
event = new PreviewHandlerEvent(PreviewHandlerEvent.TYPE.PREVIEW_ENDED, AsynchronousPreviewHandler.this);
fireEvent(event);
} catch (CoreException e) {
if (!previewStopped) {
PreviewHandlerEvent event = new PreviewHandlerEvent(PreviewHandlerEvent.TYPE.PREVIEW_IN_ERROR, AsynchronousPreviewHandler.this,
e);
fireEvent(event);
ExceptionHandler.process(e);
}
} finally {
if (previewStopped) {
PreviewHandlerEvent event = new PreviewHandlerEvent(PreviewHandlerEvent.TYPE.PREVIEW_INTERRUPTED,
AsynchronousPreviewHandler.this);
fireEvent(event);
}
}
}
};
thread.start();
}
/**
* Stop the preview process.
*/
public void stopPreviewProcess() {
previewStopped = true;
preview.stopLoading();
}
/**
* Getter for result.
*
* @return the result
*/
public R getResult() {
return this.result;
}
public void addListener(IPreviewHandlerListener listener) {
this.listeners.add(listener);
}
public void removeListener(IPreviewHandlerListener listener) {
this.listeners.remove(listener);
}
/**
* DOC amaumont Comment method "fireEvent".
*
* @param event
*/
protected void fireEvent(PreviewHandlerEvent event) {
final Object[] listenerArray = listeners.getListeners();
for (int i = 0; i < listenerArray.length; i++) {
((IPreviewHandlerListener) listenerArray[i]).handleEvent(event);
}
}
}