package org.ebayopensource.turmeric.eclipse.ui.handlers;
import org.ebayopensource.turmeric.eclipse.core.logging.SOALogger;
import org.ebayopensource.turmeric.eclipse.repositorysystem.core.SOAGlobalRegistryAdapter;
import org.ebayopensource.turmeric.eclipse.ui.TypeLibRegistryJob;
import org.ebayopensource.turmeric.eclipse.ui.views.registry.RegistryView;
import org.ebayopensource.turmeric.eclipse.ui.views.registry.TypeViewer;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.handlers.HandlerUtil;
/**
* An event handler that refreshes the Type Library tree view. This invalidates
* the existing SOA Type Registry and re-populates it. It also uses the Job API
* to allow the user to move this to a background thread in case it runs too
* long.
*
* @author dcarver
* @since 1.0
*/
public class RegistryRefreshHandler extends AbstractHandler implements IHandler {
private TreeViewer typeLibraryViewer = null;
private TypeViewer typeViewer = null;
private Object input = null;
private IViewPart typeView = null;
private RegistryView view;
/* (non-Javadoc)
* @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
init(event);
if (view.getTypeLibraryViewer() == null) {
return null;
}
RefreshJob job = new RefreshJob("Registry Refresh Job");
job.setUser(true);
job.addJobChangeListener(new RegistryRefreshJobListener());
job.schedule();
return null;
}
private void init(ExecutionEvent event) {
IWorkbenchPage page = HandlerUtil.getActiveWorkbenchWindow(event)
.getActivePage();
IViewPart viewPart = page.findView(RegistryView.VIEW_ID);
if (!(viewPart instanceof RegistryView)) {
return;
}
view = (RegistryView) viewPart;
}
/**
* This class executes a refresh of the treeViewer using the Job API to
* allow the user to move this to a background thread if it takes a long
* time to run. The class fetches the latest Type Libraries from the registry.
*
* @author dcarver
*
*/
private class RefreshJob extends TypeLibRegistryJob {
public RefreshJob(String name) {
super(name);
}
@Override
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask("Refreshing Registry", 100);
SOAGlobalRegistryAdapter registryAdapter = SOAGlobalRegistryAdapter.getInstance();
registryAdapter.invalidateRegistry();
monitor.worked(50);
if (monitor.isCanceled()) {
return cancelJob(monitor);
}
refreshRegistry(monitor, registryAdapter);
if (monitor.isCanceled()) {
return cancelJob(monitor);
}
if (input == null) {
return cancelJob(monitor);
}
// refreshViewers();
monitor.done();
return Status.OK_STATUS;
}
@Override
protected void refreshRegistry(IProgressMonitor monitor,
SOAGlobalRegistryAdapter registryAdapter) {
try {
input = registryAdapter.getGlobalRegistry();
monitor.worked(30);
} catch (Exception e) {
SOALogger.getLogger().error(e);
}
}
}
private void refreshViewers() {
Display.getDefault().asyncExec(new Runnable() {
/**
* Refresh the tree viewer with the data
*/
@Override
public void run() {
typeLibraryViewer = view.getTypeLibraryViewer();
typeViewer = view.getTypeViewer();
// if (input == null) {
// try {
// input = SOAGlobalRegistryAdapter.getInstance().getGlobalRegistry();
// } catch (Exception e) {
// }
// }
if (view.getTypeLibraryViewer() != null && input != null) {
typeLibraryViewer.setInput(input);
typeLibraryViewer.refresh(true);
typeViewer.setInput(input);
typeViewer.refresh(true);
}
};
});
}
/**
* This class listens for changes in the RegistryRefreshJob. When the job completes
* it refreshes the Type View.
*
* @see RegistryRefreshJobEvent
*/
public class RegistryRefreshJobListener implements IJobChangeListener {
@Override
public void aboutToRun(IJobChangeEvent event) {
}
@Override
public void awake(IJobChangeEvent event) {
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void done(IJobChangeEvent event) {
refreshViewers();
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#running(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void running(IJobChangeEvent event) {
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#scheduled(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void scheduled(IJobChangeEvent event) {
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#sleeping(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void sleeping(IJobChangeEvent event) {
}
}
}