/******************************************************************************* * Copyright (c) 2004, 2010 BREDEX GmbH. * 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: * BREDEX GmbH - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.jubula.client.ui.rcp.handlers.project; import java.lang.reflect.InvocationTargetException; import javax.persistence.EntityManager; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jubula.client.core.businessprocess.progress.ProgressMonitorTracker; import org.eclipse.jubula.client.core.events.DataEventDispatcher; import org.eclipse.jubula.client.core.events.DataEventDispatcher.ProjectState; import org.eclipse.jubula.client.core.model.IProjectPO; import org.eclipse.jubula.client.core.model.IReusedProjectPO; import org.eclipse.jubula.client.core.persistence.GeneralStorage; import org.eclipse.jubula.client.core.persistence.NodePM; import org.eclipse.jubula.client.core.persistence.ProjectPM; import org.eclipse.jubula.client.ui.handlers.project.AbstractProjectHandler; import org.eclipse.jubula.client.ui.rcp.Plugin; import org.eclipse.jubula.client.ui.rcp.controllers.PMExceptionHandler; import org.eclipse.jubula.client.ui.rcp.i18n.Messages; import org.eclipse.jubula.tools.internal.exception.JBException; import org.eclipse.jubula.tools.internal.exception.ProjectDeletedException; import org.eclipse.ui.PlatformUI; /** * @author BREDEX GmbH * @created 01.06.2006 */ public class RefreshProjectHandler extends AbstractProjectHandler { /** {@inheritDoc} */ public Object executeImpl(ExecutionEvent event) { return refreshProject(); } /** * @author BREDEX GmbH * @created 25.01.2008 */ public static class RefreshProjectOperation implements IRunnableWithProgress { /** * {@inheritDoc} */ public void run(IProgressMonitor monitor) { int totalWork = getTotalWork(); monitor.beginTask( Messages.RefreshProjectOperationRefreshing, totalWork); ProgressMonitorTracker instance = ProgressMonitorTracker.SINGLETON; instance.setProgressMonitor(monitor); Plugin.clearAllEditorsClipboard(); try { GeneralStorage.getInstance().reloadMasterSession( monitor); } catch (ProjectDeletedException e) { PMExceptionHandler.handleProjectDeletedException(); } finally { instance.setProgressMonitor(null); monitor.done(); } } /** * @return the amount of work required to complete the operation. This * value can then be used when creating a progress monitor. */ private int getTotalWork() { int totalWork = 0; EntityManager masterSession = GeneralStorage.getInstance().getMasterSession(); IProjectPO currentProject = GeneralStorage.getInstance().getProject(); long currentProjectId = currentProject.getId(); // (node=1) totalWork += NodePM.getNumNodes(currentProjectId, masterSession); // (tdMan=1) totalWork += NodePM.getNumTestDataManagers( currentProjectId, masterSession); // (execTC=1 [each corresponding specTC needs to be fetched]) totalWork += NodePM.getNumExecTestCases( currentProjectId, masterSession); for (IReusedProjectPO reused : currentProject.getUsedProjects()) { try { IProjectPO reusedProject = ProjectPM.loadReusedProject(reused); if (reusedProject != null) { long reusedId = reusedProject.getId(); // (node=1) totalWork += NodePM.getNumNodes(reusedId, masterSession); // (tdMan=1) totalWork += NodePM.getNumTestDataManagers( reusedId, masterSession); // (execTC=1 [each corresponding specTC needs to be fetched]) totalWork += NodePM.getNumExecTestCases( reusedId, masterSession); } } catch (JBException e) { // Do nothing } } return totalWork; } } /** * Refreshes the currently open Project. * * @return the result of the operation. */ public IStatus refreshProject() { Plugin.startLongRunning(Messages .RefreshTSBrowserActionProgressMessage); try { PlatformUI.getWorkbench().getProgressService().run(true, false, new RefreshProjectOperation()); } catch (InvocationTargetException e) { // Already handled within the operation. return new Status(IStatus.ERROR, Plugin.PLUGIN_ID, e.getLocalizedMessage()); } catch (InterruptedException e) { // Operation canceled. return Status.CANCEL_STATUS; } finally { Plugin.stopLongRunning(); DataEventDispatcher.getInstance().fireProjectStateChanged( ProjectState.opened); } return Status.OK_STATUS; } }