X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/blobdiff_plain/523455820e10358a0eb111aa6ff72e41386a3772..7cda107ce11940b64749ee7f5a8fc065f96ffab0:/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractUtility.java diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractUtility.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractUtility.java index 1bc0a686e..ee8102c73 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractUtility.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractUtility.java @@ -1,4 +1,3 @@ -// $Id$ /** * Copyright (C) 2007 EDIT * European Distributed Institute of Taxonomy @@ -10,75 +9,76 @@ package eu.etaxonomy.taxeditor.model; -import java.lang.reflect.InvocationTargetException; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.TreeSet; import java.util.UUID; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.commands.NotEnabledException; -import org.eclipse.core.commands.NotHandledException; -import org.eclipse.core.commands.common.NotDefinedException; import org.eclipse.core.commands.operations.AbstractOperation; import org.eclipse.core.commands.operations.IOperationHistory; import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.ICoreRunnable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; -import org.eclipse.core.runtime.jobs.ISchedulingRule; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.e4.ui.di.UISynchronize; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.jface.action.IStatusLineManager; -import org.eclipse.jface.dialogs.ProgressMonitorDialog; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.resource.ColorRegistry; -import org.eclipse.jface.resource.FontRegistry; -import org.eclipse.jface.window.ApplicationWindow; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.IEditorPart; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.ide.undo.WorkspaceUndoUtil; -import org.eclipse.ui.part.EditorPart; -import org.eclipse.ui.progress.IProgressService; -import org.eclipse.ui.progress.IWorkbenchSiteProgressService; -import org.eclipse.ui.themes.ITheme; -import org.eclipse.ui.themes.IThemeManager; +import org.eclipse.ui.progress.IProgressConstants; import eu.etaxonomy.cdm.api.application.CdmApplicationState; import eu.etaxonomy.cdm.api.service.IProgressMonitorService; +import eu.etaxonomy.cdm.api.service.UpdateResult; import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor; +import eu.etaxonomy.cdm.io.common.ExportDataWrapper; +import eu.etaxonomy.cdm.io.common.ExportResult; +import eu.etaxonomy.cdm.io.common.ExportResultType; +import eu.etaxonomy.cdm.io.common.ExportType; import eu.etaxonomy.cdm.model.common.IEnumTerm; +import eu.etaxonomy.taxeditor.event.EventUtility; import eu.etaxonomy.taxeditor.operation.AbstractPostOperation; +import eu.etaxonomy.taxeditor.operation.IFeedbackGenerator; import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled; import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled; -import eu.etaxonomy.taxeditor.operation.RemotingCdmHandler; +import eu.etaxonomy.taxeditor.operation.e4.RemotingCdmHandlerE4; import eu.etaxonomy.taxeditor.store.CdmStore; import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin; import eu.etaxonomy.taxeditor.ui.dialog.ReportTextDialog; -import eu.etaxonomy.taxeditor.view.AbstractCdmDataViewer; -import eu.etaxonomy.taxeditor.view.detail.DetailsViewPart; -import eu.etaxonomy.taxeditor.view.supplementaldata.SupplementalDataViewPart; +import eu.etaxonomy.taxeditor.view.e4.AbstractCdmDataViewerE4; +import eu.etaxonomy.taxeditor.view.e4.details.DetailsPartE4; +import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart; /** - *

- * Abstract AbstractUtility class. - *

* * @author n.hoffmann * @created 11.05.2009 @@ -86,230 +86,42 @@ import eu.etaxonomy.taxeditor.view.supplementaldata.SupplementalDataViewPart; */ public abstract class AbstractUtility { - private static final Logger logger = Logger.getLogger(AbstractUtility.class); + protected static final Logger logger = Logger.getLogger(AbstractUtility.class); /** Constant statusLineManager */ protected static IStatusLineManager statusLineManager; + /** Constant DATE_FORMAT_NOW="yyyyMMddHHmm" */ + public static final String DATE_FORMAT_NOW = "yyyyMMddHHmm"; - - /** - *

- * closeAll - *

- * - * @return a boolean. - */ - public static boolean closeAll() { - return getActivePage().closeAllEditors(true); - } - - /** - * Close the given editor. - * - * @param editor - * The MultipageTaxonEditor to close. - * @return true on success - */ - public static boolean close(EditorPart editor) { - return getActivePage().closeEditor(editor, true); + public static Object getActivePart() { + MPart activePart = EventUtility.getActivePart(); + if(activePart!=null){ + return activePart.getObject(); + } + return null; } - /** - *

- * getShell - *

- * - * @return a {@link org.eclipse.swt.widgets.Shell} object. - */ public static Shell getShell() { - - return TaxeditorStorePlugin.getDefault().getWorkbench() - .getActiveWorkbenchWindow().getShell(); - } - - /** - *

- * getActivePage - *

- * - * @return a {@link org.eclipse.ui.IWorkbenchPage} object. - */ - public static IWorkbenchPage getActivePage() { - - return TaxeditorStorePlugin.getDefault().getWorkbench() - .getActiveWorkbenchWindow().getActivePage(); - } - - /** - *

- * getActivePart - *

- * - * @return a {@link org.eclipse.ui.IWorkbenchPart} object. - */ - public static IWorkbenchPart getActivePart() { - return getActivePage() != null ? getActivePage().getActivePart() : null; + return EventUtility.getShell(); } public static IWorkbench getWorkbench() { return TaxeditorStorePlugin.getDefault().getWorkbench(); } - /** - *

- * getWorkbenchWindow - *

- * - * @return a {@link org.eclipse.jface.window.ApplicationWindow} object. - */ - public static ApplicationWindow getWorkbenchWindow() { - if (getWorkbench().getWorkbenchWindowCount() > 1) { - throw new IllegalStateException("More than one workbench window"); - } - return (ApplicationWindow) getWorkbench().getWorkbenchWindows()[0]; - } - - /** - *

- * showView - *

- * - * @param id - * a {@link java.lang.String} object. - * @return a {@link org.eclipse.ui.IViewPart} object. - */ - public static IViewPart showView(String id) { - try { - return PlatformUI.getWorkbench().getActiveWorkbenchWindow() - .getActivePage() - .showView(id, null, IWorkbenchPage.VIEW_VISIBLE); - } catch (PartInitException e) { - MessagingUtils.messageDialog("Error opening view", AbstractUtility.class, "Could not open view: " + id, e); - return null; - } - } - - /** - *

- * hideView - *

- * - * @param view - * a {@link org.eclipse.ui.IViewPart} object. - */ - public static void hideView(IViewPart view) { - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() - .hideView(view); - } - - /** - *

- * getView - *

- * - * @param id - * a {@link java.lang.String} object. - * @param restore - * a boolean. - * @return a {@link org.eclipse.ui.IViewPart} object. - */ - public static IViewPart getView(String id, boolean restore) { - IViewReference[] references = PlatformUI.getWorkbench() - .getActiveWorkbenchWindow().getActivePage().getViewReferences(); - for (IViewReference reference : references) { - if (reference.getId().equals(id)) { - return reference.getView(restore); - } - } - return null; - } - - /** - *

- * getService - *

- * - * @param api - * a {@link java.lang.Class} object. - * @return a {@link java.lang.Object} object. - */ public static Object getService(Class api) { return TaxeditorStorePlugin.getDefault().getWorkbench().getService(api); } - /** - *

- * getCurrentTheme - *

- * - * @return a {@link org.eclipse.ui.themes.ITheme} object. - */ - public static ITheme getCurrentTheme() { - IThemeManager themeManager = TaxeditorStorePlugin.getDefault() - .getWorkbench().getThemeManager(); - return themeManager.getCurrentTheme(); - } - - /** - * Fonts registered to the plugin may be obtained with the Eclipse themeing - * functionality. Thus fonts are chooseable by the user via - * Preferences->General->Appearance->Colors and Fonts - * - * @return the FontRegistry for the current theme - */ - public static FontRegistry getFontRegistry() { - return getCurrentTheme().getFontRegistry(); - } - - /** - *

- * getFont - *

- * - * @param symbolicName - * a {@link java.lang.String} object. - * @return a {@link org.eclipse.swt.graphics.Font} object. - */ public static Font getFont(String symbolicName) { - return getFontRegistry().get(symbolicName); - } - - /** - * Color registered to the plugin may be obtained with the Eclipse themeing - * functionality. Thus colors are editable by the user via - * Preferences->General->Appearance->Colors and Fonts - * - * @return the ColorRegistry for the current theme - */ - public static ColorRegistry getColorRegistry() { - return getCurrentTheme().getColorRegistry(); + return FontResources.getFont(symbolicName); } - /** - *

- * getColor - *

- * - * @param symbolicName - * a {@link java.lang.String} object. - * @return a {@link org.eclipse.swt.graphics.Color} object. - */ public static Color getColor(String symbolicName) { - return getColorRegistry().get(symbolicName); + return ColorResources.getColor(symbolicName); } - /** - *

- * executeOperation - *

- * - * @param operation - * a - * {@link eu.etaxonomy.taxeditor.operation.AbstractPostTaxonOperation} - * object. - * @return a {@link org.eclipse.core.runtime.IStatus} object. - */ - public static IStatus executeOperation(final AbstractPostOperation operation) { + public static IStatus executeOperation(final AbstractPostOperation operation, UISynchronize sync) { if (getOperationHistory() == null) { throw new IllegalArgumentException( "There is no operation history for this context"); @@ -318,21 +130,17 @@ public abstract class AbstractUtility { final IAdaptable uiInfoAdapter = WorkspaceUndoUtil .getUIInfoAdapter(getShell()); - IRunnableWithProgress runnable = new IRunnableWithProgress() { - - @Override - public void run(IProgressMonitor monitor) - throws InvocationTargetException, InterruptedException { + Job job = Job.create(operation.getLabel(), (ICoreRunnable) monitor -> { + sync.syncExec(() -> { String operationlabel = operation.getLabel(); monitor.beginTask(operationlabel, 100); IStatus status = Status.CANCEL_STATUS; try { operation.addContext(IOperationHistory.GLOBAL_UNDO_CONTEXT); - status = getOperationHistory().execute(operation, monitor, - uiInfoAdapter); + status = operation.execute(monitor, uiInfoAdapter); } catch (ExecutionException e) { - MessagingUtils.operationDialog(this, e, TaxeditorStorePlugin.PLUGIN_ID, operationlabel, null); + MessagingUtils.operationDialog(AbstractUtility.class, e, TaxeditorStorePlugin.PLUGIN_ID, operationlabel, null); } finally { monitor.done(); @@ -341,25 +149,30 @@ public abstract class AbstractUtility { String statusString = status.equals(Status.OK_STATUS) ? "completed" : "cancelled"; setStatusLine(operationlabel + " " + statusString + "."); - - } - }; + IPostOperationEnabled postOperationEnabled = operation + .getPostOperationEnabled(); + if (postOperationEnabled != null) { + postOperationEnabled.onComplete(); + } + }); + }); try { - runInUI(runnable, null); + job.setUser(true); + job.schedule(); } catch (Exception e) { - MessagingUtils.messageDialog("Error executing operation", AbstractUtility.class, "An error occured while executing " + operation.getLabel(), e); + MessagingUtils.messageDialog("Error executing operation", AbstractUtility.class, "An error occurred while executing " + operation.getLabel(), e); } - IPostOperationEnabled postOperationEnabled = operation - .getPostOperationEnabled(); - if (postOperationEnabled != null) { - postOperationEnabled.onComplete(); - } return Status.OK_STATUS; } - public static IStatus executeOperation(final AbstractOperation operation, final RemotingCdmHandler handler) { + public static IStatus executeOperation(final AbstractOperation operation, final RemotingCdmHandlerE4 handler, UISynchronize sync) { + return executeOperation_internal(operation, handler, sync); + } + + private static IStatus executeOperation_internal(final AbstractOperation operation, final RemotingCdmHandlerE4 handler, + UISynchronize sync) { if (getOperationHistory() == null) { throw new IllegalArgumentException( "There is no operation history for this context"); @@ -368,23 +181,19 @@ public abstract class AbstractUtility { final IAdaptable uiInfoAdapter = WorkspaceUndoUtil .getUIInfoAdapter(getShell()); - IRunnableWithProgress runnable = new IRunnableWithProgress() { - @Override - public void run(IProgressMonitor monitor) - throws InvocationTargetException, InterruptedException { + Job job = Job.create(operation.getLabel(), (ICoreRunnable) monitor -> { + sync.syncExec(() -> { String operationlabel = operation.getLabel(); monitor.beginTask(operationlabel, 100); IStatus status = Status.CANCEL_STATUS; try { operation.addContext(IOperationHistory.GLOBAL_UNDO_CONTEXT); - status = getOperationHistory().execute(operation, monitor, + status = operation.execute(monitor, uiInfoAdapter); - if(handler != null) { - handler.postOperation(status); - } + handler.postOperation(status); } catch (ExecutionException e) { - MessagingUtils.operationDialog(this, e, TaxeditorStorePlugin.PLUGIN_ID, operationlabel, null); + MessagingUtils.operationDialog(AbstractUtility.class, e, TaxeditorStorePlugin.PLUGIN_ID, operationlabel, null); } finally { monitor.done(); } @@ -392,14 +201,14 @@ public abstract class AbstractUtility { String statusString = status.equals(Status.OK_STATUS) ? "completed" : "cancelled"; setStatusLine(operationlabel + " " + statusString + "."); - - } - }; + }); + }); try { - runInUI(runnable, null); + job.setUser(true); + sync.syncExec(()->job.schedule()); } catch (Exception e) { - MessagingUtils.messageDialog("Error executing operation", AbstractUtility.class, "An error occured while executing " + operation.getLabel(), e); + MessagingUtils.messageDialog("Error executing operation", AbstractUtility.class, "An error occurred while executing " + operation.getLabel(), e); } return Status.OK_STATUS; @@ -415,53 +224,148 @@ public abstract class AbstractUtility { * @param postOp callback for running post operation logic * @return */ - public static IStatus executeMoniteredOperation(final String label, + public static IStatus executeMoniteredExport(final String label, final UUID uuid, final int pollInterval, final boolean cancelable, - final IPostMoniteredOperationEnabled postOp) { + final IPostMoniteredOperationEnabled postOp, + final IFeedbackGenerator feedbackGenerator, + String urlString, + boolean createZip) { try { // get the remoting monitor the first time to make sure that the // operation is valid final IProgressMonitorService progressMonitorService = CdmApplicationState.getCurrentAppConfig().getProgressMonitorService(); - final IRemotingProgressMonitor firstRemotingMonitor = progressMonitorService.getRemotingMonitor(uuid); - if(firstRemotingMonitor == null) { - throw new IllegalStateException("Remoting progress monitor is null"); - } +// final IRemotingProgressMonitor firstRemotingMonitor = progressMonitorService.getRemotingMonitor(uuid); +// if(firstRemotingMonitor == null) { +// throw new IllegalStateException("Remoting progress monitor is null"); +// } + + Job job = new Job(label) { - final ProgressMonitorDialog progressDialog = new ProgressMonitorDialog(getShell()); - IRunnableWithProgress runnable = new IRunnableWithProgress() { @Override - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - // run the monitor untilthe operation is finished - IRemotingProgressMonitor remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor(label, uuid, pollInterval, postOp, monitor); - final StringBuilder reportSb = new StringBuilder(); - // collect reports - for(String report : remotingMonitor.getReports()) { - reportSb.append(report); + public IStatus run(IProgressMonitor monitor) { + // run the monitor until the operation is finished + monitor.beginTask("Start", 100); + IRemotingProgressMonitor remotingMonitor; + try { + remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor(label, + uuid, + pollInterval, + postOp, + feedbackGenerator, + monitor); + } catch (Exception ex) { + return new Status(Status.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex); } - if(!StringUtils.isBlank(reportSb.toString())) { - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - // display reports with possibility to save - ReportTextDialog dialog = new ReportTextDialog(progressDialog.getShell()); - dialog.setTitle(label + " Report"); - dialog.setReportText(reportSb.toString()); - dialog.open(); - } - }); + final StringBuilder reportSb = new StringBuilder(); + if (remotingMonitor.getResult() instanceof ExportResult){ + ExportResult result = (ExportResult)remotingMonitor.getResult(); + + reportSb.append(result.createReport()); + + if(!StringUtils.isBlank(reportSb.toString())) { + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + // display reports with possibility to save + ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell()); + dialog.setTitle(label + " Report"); + dialog.setReportText(reportSb.toString()); + dialog.open(); + } + }); + } + + if (urlString != null){ + ExportDataWrapper data = result.getExportData(); + try{ + if (result.getExportData().getType().equals(ExportResultType.BYTE_ARRAY)){ + byte[] exportData = (byte[])data.getExportData(); + if(exportData != null){ + File file = new File(urlString); + FileOutputStream stream = new FileOutputStream(file); + Writer out = new BufferedWriter(new OutputStreamWriter( + stream, "UTF8")); + + stream.write(exportData); + out.flush(); + stream.close(); + } + } else if (result.getExportData().getType().equals(ExportResultType.MAP_BYTE_ARRAY)){ + Map resultMap = (Map)data.getExportData(); + Set keySet = resultMap.keySet(); + SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); + Calendar cal = Calendar.getInstance(); + String fileEnding = ".csv"; + + if (createZip){ + File file = new File(urlString+File.separator + sdf.format(cal.getTime())+ ".zip"); + FileOutputStream stream = new FileOutputStream(file); + ZipOutputStream zos = new ZipOutputStream(stream); + for (String key: keySet){ + byte[] fileData = resultMap.get(key); + ZipEntry entry = new ZipEntry( key + fileEnding); + zos.putNextEntry(entry); + zos.write(fileData); + zos.closeEntry(); + } + zos.close(); + }else{ + if(result.getExportType().equals(ExportType.DWCA)){ + + File file = new File(urlString); + FileOutputStream stream = new FileOutputStream(file); + ZipOutputStream zos = new ZipOutputStream(stream); + for (String key: keySet){ + byte[] fileData = resultMap.get(key); + ZipEntry entry = new ZipEntry( key); + zos.putNextEntry(entry); + zos.write(fileData); + zos.closeEntry(); + } + zos.close(); + }else{ + for (String key: keySet){ + byte[] fileData = resultMap.get(key); + File file = new File(urlString+File.separator + key + fileEnding); + FileOutputStream stream = new FileOutputStream(file); + Writer out = new BufferedWriter(new OutputStreamWriter( + stream, "UTF8")); + stream.write(fileData); + stream.close(); + } + } + } + }else{ + logger.error("This kind of result data is not supported yet." + result.getExportData().getType().toString()); + } + } catch(Exception e){ + logger.error(e.getStackTrace()); + } + } } + return Status.OK_STATUS; + } + + @Override + protected void canceling() { + CdmStore.getCurrentApplicationConfiguration().getProgressMonitorService().cancel(uuid); } }; - progressDialog.run(true, cancelable, runnable); + // configure the job + job.setProperty(IProgressConstants.KEEP_PROPERTY, true); + job.setUser(true); + // schedule job + job.schedule(); + } catch (Exception e) { MessagingUtils.errorDialog("Error executing operation", AbstractUtility.class, - "An error occured while executing " + label, + "An error occurred while executing " + label, TaxeditorStorePlugin.PLUGIN_ID, e, true); @@ -470,27 +374,10 @@ public abstract class AbstractUtility { return Status.OK_STATUS; } - - /** - *

- * getOperationHistory - *

- * - * @return a {@link org.eclipse.core.commands.operations.IOperationHistory} - * object. - */ public static IOperationHistory getOperationHistory() { return getWorkbench().getOperationSupport().getOperationHistory(); } - /** - *

- * setStatusLine - *

- * - * @param message - * a {@link java.lang.String} object. - */ public static void setStatusLine(final String message) { Display.getDefault().asyncExec(new Runnable() { @@ -503,13 +390,6 @@ public abstract class AbstractUtility { } - /** - *

- * getMonitor - *

- * - * @return a {@link org.eclipse.core.runtime.IProgressMonitor} object. - */ public static IProgressMonitor getMonitor() { statusLineManager.setCancelEnabled(false); return statusLineManager.getProgressMonitor(); @@ -583,157 +463,36 @@ public abstract class AbstractUtility { newMonitor.worked(steps); } - /** - * Present a progress dialog to the user. This dialog will block the UI - * - * @param runnable - * an implementation of {@link IRunnableWithProgress} - * @throws java.lang.InterruptedException - * if any. - * @throws java.lang.reflect.InvocationTargetException - * if any. - */ - public static void busyCursorWhile(IRunnableWithProgress runnable) - throws InvocationTargetException, InterruptedException { - getProgressService().busyCursorWhile(runnable); - } - - /** - *

- * runInUI - *

- * - * @see {@link IProgressService#runInUI(org.eclipse.jface.operation.IRunnableContext, IRunnableWithProgress, ISchedulingRule)} - * @param runnable - * a {@link org.eclipse.jface.operation.IRunnableWithProgress} - * object. - * @param rule - * a {@link org.eclipse.core.runtime.jobs.ISchedulingRule} - * object. - * @throws java.lang.reflect.InvocationTargetException - * if any. - * @throws java.lang.InterruptedException - * if any. - */ - public static void runInUI(IRunnableWithProgress runnable, - ISchedulingRule rule) throws InvocationTargetException, - InterruptedException { - getProgressService().runInUI(getWorkbenchWindow(), runnable, rule); - } - - /** - *

- * run - *

- * - * @param fork - * a boolean. - * @param cancelable - * a boolean. - * @param runnable - * a {@link org.eclipse.jface.operation.IRunnableWithProgress} - * object. - * @throws java.lang.reflect.InvocationTargetException - * if any. - * @throws java.lang.InterruptedException - * if any. - */ - public static void run(boolean fork, boolean cancelable, - IRunnableWithProgress runnable) throws InvocationTargetException, - InterruptedException { - getProgressService().run(fork, cancelable, runnable); - } - - /** - *

- * getProgressService - *

- * - * @return a {@link org.eclipse.ui.progress.IProgressService} object. - */ - public static IProgressService getProgressService() { - IWorkbench workbench = PlatformUI.getWorkbench(); - return workbench.getProgressService(); - } - - /** - *

- * getProgressService2 - *

- * - * @return a {@link org.eclipse.ui.progress.IWorkbenchSiteProgressService} - * object. - */ - public static IWorkbenchSiteProgressService getProgressService2() { - return (IWorkbenchSiteProgressService) getService(IWorkbenchSiteProgressService.class); - } - - /** - *

- * getPluginId - *

- * - * @return a {@link java.lang.String} object. - */ public static String getPluginId() { return "eu.taxeditor"; } - /** - *

- * getActiveEditor - *

- * - * @return a {@link org.eclipse.ui.IEditorPart} object. - */ - public static IEditorPart getActiveEditor() { - return getActivePage() != null ? getActivePage().getActiveEditor() - : null; - } - - /** - *

- * getDetailsView - *

- * - * @return a {@link eu.etaxonomy.taxeditor.view.detail.DetailsViewPart} - * object. - */ - public static DetailsViewPart getDetailsView() { - return (DetailsViewPart) getView(DetailsViewPart.ID, false); - } - - /** - *

- * refreshDetailsViewer - *

- */ - public static void refreshDetailsViewer() { - if (getDetailsView() != null) { - ((AbstractCdmDataViewer) getDetailsView().getViewer()).refresh(); + public static Object getActiveEditor() { + MPart activePart = EventUtility.getActivePart(); + if(activePart!=null && activePart.getObject()!=null + && activePart.getObject() instanceof IE4SavablePart){ + return activePart.getObject(); } + return null; } - /** - *

- * reflowDetailsViewer - *

- */ - public static void reflowDetailsViewer() { - if (getDetailsView() != null) { - ((AbstractCdmDataViewer) getDetailsView().getViewer()).reflow(); + public static DetailsPartE4 getDetailsView(EPartService partService) { + MPart part = partService.findPart("eu.etaxonomy.taxeditor.view.e4.details.DetailsPartE4"); + if(part!=null){ + return (DetailsPartE4) part.getObject(); } + return null; } - public static SupplementalDataViewPart getSupplementalDataView() { - return (SupplementalDataViewPart) getView(SupplementalDataViewPart.ID, - false); + public static void refreshDetailsViewer(EPartService partService) { + if (getDetailsView(partService) != null) { + ((AbstractCdmDataViewerE4) getDetailsView(partService).getViewer()).refresh(); + } } - public static void reflowSupplementalViewer() { - if (getSupplementalDataView() != null) { - ((AbstractCdmDataViewer) getSupplementalDataView().getViewer()) - .reflow(); + public static void reflowDetailsViewer(EPartService partService) { + if (getDetailsView(partService) != null) { + ((AbstractCdmDataViewerE4) getDetailsView(partService).getViewer()).reflow(); } } @@ -832,10 +591,6 @@ public abstract class AbstractUtility { private final T term; private final TreeSet> children; - /** - * @param term - * @param children - */ public TermNode(T term) { super(); this.term = term; @@ -846,23 +601,14 @@ public abstract class AbstractUtility { this.children.add(child); } - /** - * @return the children - */ public TreeSet> getChildren() { return children; } - /** - * @return the term - */ public T getTerm() { return term; } - /* (non-Javadoc) - * @see java.lang.Object#hashCode() - */ @Override public int hashCode() { final int prime = 31; @@ -871,9 +617,6 @@ public abstract class AbstractUtility { return result; } - /* (non-Javadoc) - * @see java.lang.Object#equals(java.lang.Object) - */ @Override public boolean equals(Object obj) { if (this == obj) { @@ -896,38 +639,118 @@ public abstract class AbstractUtility { return true; } - /* (non-Javadoc) - * @see java.lang.Comparable#compareTo(java.lang.Object) - */ @Override public int compareTo(TermNode that) { return this.term.getMessage().compareTo(that.term.getMessage()); } } - - public static void executeCommand(String commandId, Object source, String pluginId) { - IHandlerService handlerService = (IHandlerService) AbstractUtility.getService(IHandlerService.class); - Exception exception = null; - try { - handlerService.executeCommand(commandId, null); - } catch (ExecutionException e) { - exception = e; - } catch (NotDefinedException e) { - exception = e; - } catch (NotEnabledException e) { - exception = e; - } catch (NotHandledException e) { - exception = e; - } finally { - if(exception != null) { - MessagingUtils.errorDialog("Error executing command", - source, - "Could not execute command with id " + commandId , - pluginId, - exception, - true); + public static Object getElementsFromSelectionChangedEvent(SelectionChangedEvent event) { + IStructuredSelection selection = (IStructuredSelection) event.getSelection(); + Object selectionToSet = selection; + if(selection.size() == 1){ + selectionToSet = selection.getFirstElement(); + if (selectionToSet instanceof Object[]){ + Object[] selectionArray = (Object[])selectionToSet; + selectionToSet = selectionArray; } } + else if(!selection.isEmpty()){ + selectionToSet = selection.toArray(); + } + return selectionToSet; } + + /** + * Executes a remoting monitored import + * + * @param label for the import + * @param uuid of the remoting monitor already started on the server + * @param pollInterval in milliseconds + * @param cancelable flag which determines whether the operation can be cancelled + * @param postOp callback for running post operation logic + * @return + */ + public static IStatus executeMoniteredOperation(final String label, + final UUID uuid, + final int pollInterval, + final boolean cancelable, + final IPostMoniteredOperationEnabled postOp, + final IFeedbackGenerator feedbackGenerator) { + + try{ + // get the remoting monitor the first time to make sure that the + // operation is valid + final IProgressMonitorService progressMonitorService = CdmApplicationState.getCurrentAppConfig().getProgressMonitorService(); + final IRemotingProgressMonitor firstRemotingMonitor = progressMonitorService.getRemotingMonitor(uuid); + if(firstRemotingMonitor == null) { + throw new IllegalStateException("Remoting progress monitor is null"); + } + + Job job = new Job(label) { + + + @Override + public IStatus run(IProgressMonitor monitor) { + // run the monitor until the operation is finished + monitor.beginTask("Start", 100); + IRemotingProgressMonitor remotingMonitor; + try { + remotingMonitor = CdmStore.getProgressMonitorClientManager().pollMonitor(label, + uuid, + pollInterval, + postOp, + feedbackGenerator, + monitor); + } catch (Exception ex) { + return new Status(Status.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Operation Interrupted", ex); + } + final StringBuilder reportSb = new StringBuilder(); + // collect reports +// for(String report : remotingMonitor.getResult()) { + if (remotingMonitor.getResult() instanceof ExportResult) { + reportSb.append(((ExportResult)remotingMonitor.getResult()).createReport()); + }else if (remotingMonitor.getResult() instanceof UpdateResult){ + reportSb.append(((UpdateResult)remotingMonitor.getResult()).getExceptions().toString()); + } +// } + if(!StringUtils.isBlank(reportSb.toString())) { + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + // display reports with possibility to save + ReportTextDialog dialog = new ReportTextDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell()); + dialog.setTitle(label + " Report"); + dialog.setReportText(reportSb.toString()); + dialog.open(); + } + }); + } + return Status.OK_STATUS; + } + + @Override + protected void canceling() { + CdmStore.getCurrentApplicationConfiguration().getProgressMonitorService().cancel(uuid); + } + }; + + // configure the job + job.setProperty(IProgressConstants.KEEP_PROPERTY, true); + job.setUser(true); + // schedule job + job.schedule(); + + } catch (Exception e) { + MessagingUtils.errorDialog("Error executing operation", + AbstractUtility.class, + "An error occurred while executing " + label, + TaxeditorStorePlugin.PLUGIN_ID, + e, + true); + } + + return Status.OK_STATUS; + } + }