From 795d66eaacebad159fed29a33445a69ff709ea9e Mon Sep 17 00:00:00 2001 From: jiezhang-tlnd <40561780+jiezhang-tlnd@users.noreply.github.com> Date: Mon, 2 Aug 2021 17:03:21 +0800 Subject: [PATCH] Jzhang/73/tup 31920 (#4481) * feat(TUP-31920)Remove additional packages * simply dialog * change ui * change ui * change ui * change dialog name * change install button * reset manifest Conflicts: main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/service/IUpdateService.java main/plugins/org.talend.librariesmanager.ui/META-INF/MANIFEST.MF --- .../talend/core/service/IUpdateService.java | 2 + .../src/main/java/messages.properties | 2 + .../CheckThirdPartyLibrariesAction.java | 48 ++ .../ui/views/ModulesView.java | 4 +- .../updates/runtime/WorkbenchStartup.java | 3 +- .../engine/ExtraFeaturesUpdatesFactory.java | 16 +- .../runtime/service/UpdateService.java | 7 + .../runtime/ui/AdditionalPackagesDialog.java | 572 ++++++++++++++++++ .../CheckAdditionalPackagesToInstallJob.java | 92 +++ 9 files changed, 739 insertions(+), 7 deletions(-) create mode 100644 main/plugins/org.talend.librariesmanager.ui/src/main/java/org/talend/librariesmanager/ui/actions/CheckThirdPartyLibrariesAction.java create mode 100644 main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/ui/AdditionalPackagesDialog.java create mode 100644 main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/ui/CheckAdditionalPackagesToInstallJob.java diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/service/IUpdateService.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/service/IUpdateService.java index 0a60f41a33..2ded9ba245 100644 --- a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/service/IUpdateService.java +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/service/IUpdateService.java @@ -24,4 +24,6 @@ public interface IUpdateService extends IService { public String getSharedStudioMissingPatchVersion(); public boolean updateArtifactsFileSha256Hex(IProgressMonitor monitor, String studioArtifactsFileShaCodeHex); + + public void checkAdditionalPackages(); } diff --git a/main/plugins/org.talend.librariesmanager.ui/src/main/java/messages.properties b/main/plugins/org.talend.librariesmanager.ui/src/main/java/messages.properties index ba7185b40c..5d08b9e0aa 100644 --- a/main/plugins/org.talend.librariesmanager.ui/src/main/java/messages.properties +++ b/main/plugins/org.talend.librariesmanager.ui/src/main/java/messages.properties @@ -67,6 +67,8 @@ SpecificFilesUtils.operationCanceled=Operation is canceled during copying folder ImportExternalJarAction.title=Import external jars Module.view.download.external.modules.action.text=Download external modules Module.view.download.external.modules.action.description=Download external modules +Module.view.install.additional.packages.action.text=Install third-party libraries +Module.view.install.additional.packages.action.description=Install third-party libraries download.external.dialog.title=The following modules are not yet installed. Please download and install all required modules. download.external.dialog.desciption=List of modules to be downloaded automatically or imported manually. download.external.dialog.help.url=https://help.talend.com/display/KB/How+to+install+external+modules+in+the+Talend+products diff --git a/main/plugins/org.talend.librariesmanager.ui/src/main/java/org/talend/librariesmanager/ui/actions/CheckThirdPartyLibrariesAction.java b/main/plugins/org.talend.librariesmanager.ui/src/main/java/org/talend/librariesmanager/ui/actions/CheckThirdPartyLibrariesAction.java new file mode 100644 index 0000000000..6dd45c5ee3 --- /dev/null +++ b/main/plugins/org.talend.librariesmanager.ui/src/main/java/org/talend/librariesmanager/ui/actions/CheckThirdPartyLibrariesAction.java @@ -0,0 +1,48 @@ +// ============================================================================ +// +// Copyright (C) 2006-2019 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.librariesmanager.ui.actions; + +import org.eclipse.jface.action.Action; +import org.talend.commons.ui.runtime.image.EImage; +import org.talend.commons.ui.runtime.image.ImageProvider; +import org.talend.core.GlobalServiceRegister; +import org.talend.core.service.IUpdateService; +import org.talend.librariesmanager.ui.i18n.Messages; +import org.talend.librariesmanager.ui.views.ModulesView; + +/** + * created by Administrator on 2012-9-20 Detailled comment + * + */ +public class CheckThirdPartyLibrariesAction extends Action { + + private ModulesView parentView = null; + + public CheckThirdPartyLibrariesAction(ModulesView parentView) { + super(); + this.setText(Messages.getString("Module.view.install.additional.packages.action.text")); + this.setDescription(Messages.getString("Module.view.install.additional.packages.action.description")); + this.setImageDescriptor(ImageProvider.getImageDesc(EImage.DOWN_ICON)); + this.parentView = parentView; + } + + @Override + public void run() { + if (GlobalServiceRegister.getDefault().isServiceRegistered(IUpdateService.class)) { + IUpdateService service = GlobalServiceRegister.getDefault().getService(IUpdateService.class); + service.checkAdditionalPackages(); + } + + } + +} diff --git a/main/plugins/org.talend.librariesmanager.ui/src/main/java/org/talend/librariesmanager/ui/views/ModulesView.java b/main/plugins/org.talend.librariesmanager.ui/src/main/java/org/talend/librariesmanager/ui/views/ModulesView.java index 3e35299e66..47e5c8a42a 100644 --- a/main/plugins/org.talend.librariesmanager.ui/src/main/java/org/talend/librariesmanager/ui/views/ModulesView.java +++ b/main/plugins/org.talend.librariesmanager.ui/src/main/java/org/talend/librariesmanager/ui/views/ModulesView.java @@ -27,6 +27,7 @@ import org.talend.core.model.general.ILibrariesService.IChangedLibrariesListener import org.talend.core.model.general.ModuleNeeded; import org.talend.librariesmanager.ui.LibManagerUiPlugin; import org.talend.librariesmanager.ui.actions.CheckModulesAction; +import org.talend.librariesmanager.ui.actions.CheckThirdPartyLibrariesAction; import org.talend.librariesmanager.ui.actions.DownloadExternalJarAction; import org.talend.librariesmanager.ui.actions.ExportCustomSettingsAction; import org.talend.librariesmanager.ui.actions.ImportCustomSettingsAction; @@ -133,7 +134,8 @@ public class ModulesView extends ViewPart { manager.add(importAction); DownloadExternalJarAction downloadAcion = new DownloadExternalJarAction(this); manager.add(downloadAcion); - + CheckThirdPartyLibrariesAction checkThirdPartyLibrariesAction = new CheckThirdPartyLibrariesAction(this); + manager.add(checkThirdPartyLibrariesAction); ShareLibsAction shareAction = new ShareLibsAction(); if (shareAction.show()) { manager.add(shareAction); diff --git a/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/WorkbenchStartup.java b/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/WorkbenchStartup.java index f4771ae074..e1b592eaf1 100644 --- a/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/WorkbenchStartup.java +++ b/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/WorkbenchStartup.java @@ -8,7 +8,8 @@ public class WorkbenchStartup implements IStartup { @Override public void earlyStartup() { CheckExtraFeaturesToInstallJob checkExtraFeaturesToInstallJob = new CheckExtraFeaturesToInstallJob(); - checkExtraFeaturesToInstallJob.schedule(); + //check studio lite PluginChecker +// checkExtraFeaturesToInstallJob.schedule(); } diff --git a/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/engine/ExtraFeaturesUpdatesFactory.java b/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/engine/ExtraFeaturesUpdatesFactory.java index c7904f93c2..c91e8cf602 100644 --- a/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/engine/ExtraFeaturesUpdatesFactory.java +++ b/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/engine/ExtraFeaturesUpdatesFactory.java @@ -20,6 +20,8 @@ import org.talend.commons.exception.ExceptionHandler; import org.talend.core.runtime.util.SharedStudioUtils; import org.talend.updates.runtime.engine.factory.AbstractExtraUpdatesFactory; import org.talend.updates.runtime.engine.factory.IComponentUpdatesFactory; +import org.talend.updates.runtime.engine.factory.PluginOptionalMissingJarsExtraUpdatesFactory; +import org.talend.updates.runtime.engine.factory.PluginRequiredMissingJarsExtraUpdatesFactory; import org.talend.updates.runtime.model.ExtraFeature; /** @@ -60,12 +62,16 @@ public class ExtraFeaturesUpdatesFactory { if (SharedStudioUtils.isSharedStudioMode() && !factory.isSupportSharedMode()) { continue; } - try { - factory.setCheckUpdateOnLine(isCheckUpdateOnLine); - factory.retrieveUninstalledExtraFeatures(monitor, uninstalledExtraFeatures); - } catch (Exception e) { - ExceptionHandler.process(e); + if (factory instanceof PluginRequiredMissingJarsExtraUpdatesFactory + || factory instanceof PluginOptionalMissingJarsExtraUpdatesFactory) { + try { + factory.setCheckUpdateOnLine(isCheckUpdateOnLine); + factory.retrieveUninstalledExtraFeatures(monitor, uninstalledExtraFeatures); + } catch (Exception e) { + ExceptionHandler.process(e); + } } + } } } diff --git a/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/service/UpdateService.java b/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/service/UpdateService.java index 51fd0e9ab6..2fb20e8a2b 100644 --- a/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/service/UpdateService.java +++ b/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/service/UpdateService.java @@ -33,6 +33,7 @@ import org.talend.updates.runtime.model.ExtraFeature; import org.talend.updates.runtime.model.FeatureCategory; import org.talend.updates.runtime.nexus.component.ComponentIndexManager; import org.talend.updates.runtime.nexus.component.NexusServerManager; +import org.talend.updates.runtime.ui.CheckAdditionalPackagesToInstallJob; import org.talend.updates.runtime.utils.PathUtils; import org.talend.updates.runtime.utils.UpdateTools; @@ -143,5 +144,11 @@ public class UpdateService implements IUpdateService { public boolean updateArtifactsFileSha256Hex(IProgressMonitor monitor, String studioArtifactsFileShaCodeHex) { return SharedStudioPatchInfoProvider.getInstance().updateArtifactsFileSha256Hex(studioArtifactsFileShaCodeHex); } + + @Override + public void checkAdditionalPackages() { + CheckAdditionalPackagesToInstallJob checkExtraFeaturesToInstallJob = new CheckAdditionalPackagesToInstallJob(); + checkExtraFeaturesToInstallJob.schedule(); + } } diff --git a/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/ui/AdditionalPackagesDialog.java b/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/ui/AdditionalPackagesDialog.java new file mode 100644 index 0000000000..d81b0c6151 --- /dev/null +++ b/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/ui/AdditionalPackagesDialog.java @@ -0,0 +1,572 @@ +// ============================================================================ +// +// Copyright (C) 2006-2019 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.updates.runtime.ui; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.log4j.Logger; +import org.eclipse.core.databinding.DataBindingContext; +import org.eclipse.core.databinding.beans.PojoObservables; +import org.eclipse.core.databinding.beans.PojoProperties; +import org.eclipse.core.databinding.observable.IObservable; +import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory; +import org.eclipse.core.databinding.observable.set.IObservableSet; +import org.eclipse.core.databinding.observable.set.ISetChangeListener; +import org.eclipse.core.databinding.observable.set.SetChangeEvent; +import org.eclipse.core.databinding.observable.set.WritableSet; +import org.eclipse.core.databinding.observable.value.IObservableValue; +import org.eclipse.core.databinding.property.Properties; +import org.eclipse.core.databinding.property.value.IValueProperty; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; +import org.eclipse.jface.databinding.swt.SWTObservables; +import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider; +import org.eclipse.jface.databinding.viewers.ObservableSetTreeContentProvider; +import org.eclipse.jface.databinding.viewers.ViewersObservables; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.dialogs.TitleAreaDialog; +import org.eclipse.jface.layout.TreeColumnLayout; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.viewers.CheckStateChangedEvent; +import org.eclipse.jface.viewers.CheckboxTreeViewer; +import org.eclipse.jface.viewers.ICheckStateListener; +import org.eclipse.jface.viewers.ITreeViewerListener; +import org.eclipse.jface.viewers.TreeExpansionEvent; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.custom.TableEditor; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.ui.PlatformUI; +import org.talend.commons.ui.runtime.exception.ExceptionHandler; +import org.talend.commons.ui.runtime.update.PreferenceKeys; +import org.talend.commons.ui.swt.tableviewer.TableViewerCreator; +import org.talend.commons.utils.system.EclipseCommandLine; +import org.talend.commons.utils.time.PropertiesCollectorUtil; +import org.talend.core.model.general.ModuleToInstall; +import org.talend.updates.runtime.InstallFeatureObserver; +import org.talend.updates.runtime.engine.InstallNewFeatureJob; +import org.talend.updates.runtime.engine.component.ComponentNexusP2ExtraFeature; +import org.talend.updates.runtime.i18n.Messages; +import org.talend.updates.runtime.model.ExtraFeature; +import org.talend.updates.runtime.model.FeatureCategory; +import org.talend.updates.runtime.model.TalendWebServiceUpdateExtraFeature; + +import us.monoid.json.JSONArray; +import us.monoid.json.JSONException; +import us.monoid.json.JSONObject; + +/** + * DOC wchen class global comment. Detailled comment + */ +public class AdditionalPackagesDialog extends TitleAreaDialog { + + private static Logger log = Logger.getLogger(AdditionalPackagesDialog.class); + + public static final String DO_NOT_SHOW_EXTERNALMODULESINSTALLDIALOG = "do_not_show_ExternalModulesInstallDialog"; //$NON-NLS-1$ + + private Color color = new Color(null, 255, 255, 255); + + protected TableViewerCreator tableViewerCreator; + + protected String text; + + protected String title; + + protected Button installAllBtn; + + protected Button closeButton; + + protected SelectionAdapter closeListener; + + protected List jarsInstalledSuccuss = new ArrayList(); + + protected List inputList = new ArrayList(); + + private Tree tree; + + protected UpdateWizardModel updateWizardModel; + + protected CheckboxTreeViewer checkboxTreeViewer; + + private StyledText featureDescriptionText; + + public DataBindingContext dbc; + + public AdditionalPackagesDialog(Shell shell, String text, String title, UpdateWizardModel updateWizardModel) { + super(shell); + setShellStyle(SWT.DIALOG_TRIM | SWT.MIN | SWT.MAX | SWT.RESIZE | getDefaultOrientation()); + this.text = text; + this.title = title; + this.updateWizardModel = updateWizardModel; + closeListener = new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + closePressed(); + } + }; + } + + public AdditionalPackagesDialog(Shell shell, String text, String title) { + super(shell); + setShellStyle(SWT.DIALOG_TRIM | SWT.MIN | SWT.MAX | SWT.RESIZE | getDefaultOrientation()); + this.text = text; + this.title = title; + } + + public void showDialog(boolean block) { + open(); + } + + protected void closePressed() { + setReturnCode(CANCEL); + close(); + + } + @Override + protected void buttonPressed(int buttonId) { + if (IDialogConstants.CANCEL_ID == buttonId) { + closePressed(); + } // else cancel button has a listener already + } + @Override + protected Button getButton(int id) { + if (id == IDialogConstants.CANCEL_ID) { + return closeButton; + } + return super.getButton(id); + } + + private Button createCloseButton(Composite parent) { + // increment the number of columns in the button bar + ((GridLayout) parent.getLayout()).numColumns++; + Button button = new Button(parent, SWT.PUSH); + button.setText(IDialogConstants.CANCEL_LABEL); + setButtonLayoutData(button); + button.setFont(parent.getFont()); + button.setData(new Integer(IDialogConstants.CANCEL_ID)); + button.addSelectionListener(closeListener); + return button; + } + + + @Override + protected void initializeBounds() { + super.initializeBounds(); + getShell().setSize(700, 400); + Point location = getInitialLocation(getShell().getSize()); + getShell().setLocation(location.x, location.y); + } + + @Override + protected void configureShell(final Shell newShell) { + super.configureShell(newShell); + newShell.setText(text); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) + */ + @Override + protected Control createDialogArea(Composite parent) { + Composite container = new Composite(parent, SWT.NULL); + container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + container.setLayout(new GridLayout(3, false)); + + Label lblNewLabel = new Label(container, SWT.NONE); + lblNewLabel.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true, 1, 1)); +// lblNewLabel.setText(Messages.getString("SelectExtraFeaturesToInstallWizardPage.feature.list.label")); //$NON-NLS-1$ + lblNewLabel.setText("Available features"); + Composite featureComposite = new Composite(container, SWT.NONE); + GridData g = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1); +// g.heightHint = 600; + featureComposite.setLayoutData(g); + TreeColumnLayout friendsColumnLayout = new TreeColumnLayout(); + featureComposite.setLayout(friendsColumnLayout); + + checkboxTreeViewer = new CheckboxTreeViewer(featureComposite, SWT.BORDER | SWT.FULL_SELECTION); + checkboxTreeViewer.setSorter(new ViewerSorter() {// regroupt by class type and then by name + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.viewers.ViewerComparator#category(java.lang.Object) + */ + @Override + public int category(Object element) { + return element.getClass().hashCode(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, + * java.lang.Object, java.lang.Object) + */ + @Override + public int compare(Viewer viewer, Object e1, Object e2) { + if ((e2 instanceof ExtraFeature) && ((ExtraFeature) e2).mustBeInstalled()) { + return 1; + } + if ((e1 instanceof ExtraFeature) && ((ExtraFeature) e1).mustBeInstalled()) { + return -1; + } + return ((ExtraFeature) e1).getName().compareTo(((ExtraFeature) e2).getName()); + } + }); + tree = checkboxTreeViewer.getTree(); + tree.setSize(400, 155); + tree.setLinesVisible(true); + + Label lblDescription = new Label(container, SWT.NONE); + lblDescription.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1)); +// lblDescription.setText(Messages.getString("SelectExtraFeaturesToInstallWizardPage.description.label")); //$NON-NLS-1$ + lblDescription.setText("description"); + featureDescriptionText = new StyledText(container, SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL); + GridData gd_featureDescriptionText = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1); + gd_featureDescriptionText.heightHint = 61; + featureDescriptionText.setLayoutData(gd_featureDescriptionText); + + final IObservableFactory setFactory = new IObservableFactory() { + + @Override + public IObservable createObservable(final Object target) { + if (target instanceof WritableSet) { + return (IObservableSet) target; + } + if (target instanceof FeatureCategory) { + WritableSet set = new WritableSet(); + set.addAll(((FeatureCategory) target).getChildren()); + return set; + } + return null; + } + }; + + ObservableSetTreeContentProvider contentProvider = new ObservableSetTreeContentProvider(setFactory, null); + + checkboxTreeViewer.setContentProvider(contentProvider); + checkboxTreeViewer.addCheckStateListener(new ICheckStateListener() { + + @Override + public void checkStateChanged(CheckStateChangedEvent event) { + if(event.getElement() instanceof TalendWebServiceUpdateExtraFeature){ + if (event.getChecked()) { + updateWizardModel.selectedExtraFeatures.add(((TalendWebServiceUpdateExtraFeature) event.getElement())); + } else { + updateWizardModel.selectedExtraFeatures.remove(((TalendWebServiceUpdateExtraFeature) event.getElement())); + } + } + updateInstallModulesButtonState(); + } + + + }); + + checkboxTreeViewer.addTreeListener(new ITreeViewerListener() { + + @Override + public void treeExpanded(TreeExpansionEvent event) { + dbc.updateTargets(); + } + + @Override + public void treeCollapsed(TreeExpansionEvent event) { + + } + }); + + checkboxTreeViewer + .setLabelProvider(new ObservableMapLabelProvider(Properties.observeEach(contentProvider.getKnownElements(), + new IValueProperty[] { PojoProperties.value(ExtraFeature.class, "name"), //$NON-NLS-1$ + PojoProperties.value(ExtraFeature.class, "version") }))); //$NON-NLS-1$ + + checkboxTreeViewer.setInput(updateWizardModel.availableExtraFeatures); + initDataBindings(); + updateSelectedState(updateWizardModel.availableExtraFeatures); + return container; + } + + protected DataBindingContext initDataBindings() { + dbc = new DataBindingContext(); + + // bind selecting of the check boxes to the selected extra features set in the model + dbc.bindSet(ViewersObservables.observeCheckedElements(checkboxTreeViewer, ExtraFeature.class), + updateWizardModel.selectedExtraFeatures); + + // bind the table selection desctiption to the text field + IObservableValue selectedFeature = ViewersObservables.observeSingleSelection(checkboxTreeViewer); + dbc.bindValue(SWTObservables.observeText(featureDescriptionText), + PojoObservables.observeDetailValue(selectedFeature, "description", String.class)); //$NON-NLS-1$ + // add a validator for feature selection because SetObservable does not provide any validator. + dbc.addValidationStatusProvider(updateWizardModel.new FeatureSelectionValidator()); +// WizardPageSupport.create(this.getDialogArea(), dbc); + + // add a listener to update the description and enabled state when avaialble features are added and also + // add them to the selected list if the must be installed + updateWizardModel.availableExtraFeatures.addSetChangeListener(new ISetChangeListener() { + + @Override + public void handleSetChange(SetChangeEvent arg0) { + updateInstallModulesButtonState(); + updateSelectedState(arg0.diff.getAdditions()); + } + }); + return dbc; + + } + + protected void updateSelectedState(Set features) { + + for (ExtraFeature ef : features) { + if (ef.mustBeInstalled()) { + updateWizardModel.selectedExtraFeatures.add(ef); + } + } + } + + /** + * DOC sgandon Comment method "updateInstallModulesButtonState". + */ + protected void updateInstallModulesButtonState() { + + if (updateWizardModel.selectedExtraFeatures.isEmpty()) { + installAllBtn.setEnabled(false); + }else { + featureDescriptionText.setText("Contains all required third-party libraries that cannot be shipped with this product for licensing reasons, but which are required for the product to run correctly.\n" + + "If you select this option, you will be invited to accept the license for each library you install. You must accept all the licenses to be able to use Talend Studio.\n" + + "If you do not select this option, you will be prompted for each missing library one by one whenever they are needed by the product."); //$NON-NLS-1$ + + installAllBtn.setEnabled(true); + } + } + + + protected void addListeners() { + + installAllBtn.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + InstallNewFeatureJob installNewFeatureJob = new InstallNewFeatureJob( + new HashSet(updateWizardModel.selectedExtraFeatures), updateWizardModel.getFeatureRepositories()); + Set selectedExtraFeatures = updateWizardModel.getSelectedExtraFeatures(); + for (ExtraFeature feature : selectedExtraFeatures) { + InstallFeatureObserver.getInstance().updateInstallFeatureStatus(feature.getName(), + InstallFeatureObserver.FEATURE_STATUS_TO_INSTALL); + } + installNewFeatureJob.schedule(); + close(); + // listen to the job end so that we can ask the user to restart the Studio + installNewFeatureJob.addJobChangeListener(new JobChangeAdapter() { + + @Override + public void done(IJobChangeEvent jobEvent) { + MultiStatus results = (MultiStatus) jobEvent.getResult(); + IStatus[] installStatus = results.getChildren(); + boolean hasAnyFailure = false; + boolean hasAnySuccess = false; + boolean hasCancel = false; + for (IStatus status : installStatus) { + if (!status.isOK()) {// ask the user to restart the Studio + if (status.getSeverity() == IStatus.CANCEL) { + hasCancel = true; + } else { + hasAnyFailure = true; + } + } else { + hasAnySuccess = true; + } + } + // if cancel,should do nothing,not display any pop message + if (hasCancel) { + return; + } + // display message in case of any success + String firstPartOfMessage = Messages.getString("UpdateStudioWizard.all.feautures.installed.successfully"); //$NON-NLS-1$ + if (hasAnySuccess) { + recordSuccessInstallation(); + + if (hasAnyFailure) { + firstPartOfMessage = Messages.getString("UpdateStudioWizard.some.feautures.installed.sucessfully"); //$NON-NLS-1$ + } // else only success to keep initial message + final String finalMessage = firstPartOfMessage + + Messages.getString("UpdateStudioWizard.do.you.want.to.restart"); //$NON-NLS-1$ + Display.getDefault().syncExec(new Runnable() { + + @Override + public void run() { + IPreferenceStore store = PlatformUI.getPreferenceStore(); + // reset the last type of project set. + // this will force from the Application class to reset all the perspectives + store.putValue("last_started_project_type", "NO_TYPE"); + if (needRestart()) { + boolean isOkToRestart = MessageDialog.openQuestion(getShell(), + Messages.getString("UpdateStudioWizard.install.sucessfull"), finalMessage); //$NON-NLS-1$ + if (isOkToRestart) { + EclipseCommandLine.updateOrCreateExitDataPropertyWithCommand(EclipseCommandLine.CLEAN, null, + false); + PlatformUI.getWorkbench().restart(); + } else { + store.setValue(PreferenceKeys.NEED_OSGI_CLEAN, true); // will do clean for next + // time. + } + } + } + }); + } // else only failure or canceled so do nothing cause error are reported by Eclipse + + } + + private void recordSuccessInstallation() { + final String additionalPackages = PropertiesCollectorUtil.getAdditionalPackagePreferenceNode(); + + String records = PropertiesCollectorUtil.getAdditionalPackageRecording(); + + JSONObject allRecords; + try { + allRecords = new JSONObject(records); + } catch (Exception e) { + // the value is not set, or is empty + allRecords = new JSONObject(); + } + + Map featureMap = new HashMap(); + selectedExtraFeatures.stream().filter(feat -> !(feat instanceof FeatureCategory)) + .forEach(feat -> featureMap.put(feat.getName(), feat)); + List installedFeatures = InstallFeatureObserver.getInstance().getInstalledFeatures(); + + try { + JSONObject jso = allRecords.has(additionalPackages) ? (JSONObject) allRecords.get(additionalPackages) + : new JSONObject(); + + for (int i = 0; i < installedFeatures.size(); i++) { + ExtraFeature extraFeature = featureMap.get(installedFeatures.get(i)); + if (extraFeature != null) { + if (extraFeature.getParentCategory() != null) { + String category = extraFeature.getParentCategory().getName(); + JSONArray jsonArray = jso.has(category) ? (JSONArray) jso.get(category) : new JSONArray(); + jsonArray.put(extraFeature.getName()); + jso.put(category, jsonArray); + } else { + String name = extraFeature.getName(); + if (name.contains("(") && name.contains(")")) { + String suffix = name.substring(name.indexOf("(") + 1, name.lastIndexOf(")")); + if (suffix.matches("\\d*")) { + name = name.substring(0, name.indexOf("(")).trim(); + } + } + jso.put(name, ""); + } + } + } + + allRecords.put(additionalPackages, jso); + } catch (JSONException e) { + ExceptionHandler.log(e.getMessage()); + } + + PropertiesCollectorUtil.storeAdditionalPackageRecording(allRecords.toString()); + } + }); + return ; + } + + }); + + } + private boolean needRestart() { + boolean _needRestart = false; + if (updateWizardModel.selectedExtraFeatures != null) { + for (Object feature : updateWizardModel.selectedExtraFeatures) { + if (feature instanceof ExtraFeature) { + if (((ExtraFeature) feature).needRestart()) { + _needRestart = true; + break; + } + if (feature instanceof ComponentNexusP2ExtraFeature) { + _needRestart = true; + break; + } + } + } + } + return _needRestart; + } + + /* + * (non-Javadoc) + * + * @see + * org.talend.librariesmanager.ui.dialogs.ExternalModulesInstallDialog#createButtonsForButtonBar(org.eclipse.swt + * .widgets.Composite) + */ + @Override + protected void createButtonsForButtonBar(Composite parent) { + closeButton = createCloseButton(parent);// make the cancel button the most left + installAllBtn = createInstallButton(parent); + updateInstallModulesButtonState(); + addListeners();// bad name but I accanont change it since it may have been overriden. + + } + + /** + * Creates the Install button for this wizard dialog. Creates a standard (SWT.PUSH) button and + * registers for its selection events. Note that the number of columns in the button bar composite is incremented. + * + * @param parent the parent button bar + * @return the new Install button + */ + private Button createInstallButton(Composite parent) { + // increment the number of columns in the button bar + ((GridLayout) parent.getLayout()).numColumns++; + Button button = new Button(parent, SWT.PUSH); +// button.setText(Messages.getString("ExternalModulesInstallDialog_InstallAll") + " "); //$NON-NLS-1$ //$NON-NLS-2$//a space is added cause the last letter is missing on my MAC + button.setText("OK"); + setButtonLayoutData(button); + button.setFont(parent.getFont()); + + return button; + } + + @Override + protected void okPressed() { + super.okPressed(); + color.dispose(); + } + +} diff --git a/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/ui/CheckAdditionalPackagesToInstallJob.java b/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/ui/CheckAdditionalPackagesToInstallJob.java new file mode 100644 index 0000000000..f4f8467f82 --- /dev/null +++ b/main/plugins/org.talend.updates.runtime/src/main/java/org/talend/updates/runtime/ui/CheckAdditionalPackagesToInstallJob.java @@ -0,0 +1,92 @@ +// ============================================================================ +// +// Copyright (C) 2006-2019 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.updates.runtime.ui; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.PlatformUI; +import org.talend.updates.runtime.engine.ExtraFeaturesUpdatesFactory; +import org.talend.updates.runtime.i18n.Messages; +import org.talend.updates.runtime.model.ExtraFeature; + +/** + * This will check if there are extra features to update and provide a wizard for to choose which featurte to download + * and install. First a check i done to see if the user refused the check once. + * + */ +public class CheckAdditionalPackagesToInstallJob extends Job { + protected boolean isCheckUpdateOnLine = false; + /** + * DOC sgandon CheckExtraFeaturesToUpdateJob constructor comment. + * + * @param name + */ + public CheckAdditionalPackagesToInstallJob() { + super(Messages.getString("CheckExtraFeaturesToInstallJob.check.extra.feature.to.install")); //$NON-NLS-1$ + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + protected IStatus run(IProgressMonitor monitor) { + ExtraFeaturesUpdatesFactory extraFeaturesFactory = new ExtraFeaturesUpdatesFactory(false); + final Set uninstalledExtraFeatures = new HashSet(); + extraFeaturesFactory.retrieveUninstalledExtraFeatures(monitor, uninstalledExtraFeatures, false); + // if feature to update are available then show the update wizard + if (monitor.isCanceled()) { + return Status.CANCEL_STATUS; + } + java.util.List mustInstallList = new ArrayList(); + for (ExtraFeature feature : uninstalledExtraFeatures) { + if (feature.mustBeInstalled()) { + mustInstallList.add(feature); + } + } + if (!mustInstallList.isEmpty()) { + synchronized (ShowWizardHandler.showWizardLock) { + // make sure this dialog won't be popup in some special cases + // just waiting for the lock to be released, then continue to execute. + Display.getDefault().asyncExec(new Runnable() { + + @Override + public void run() { + UpdateWizardModel updateWizardModel = new UpdateWizardModel(uninstalledExtraFeatures); + AdditionalPackagesDialog dialog = new AdditionalPackagesDialog( + PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Third-party Libraries", "title",updateWizardModel); + dialog.showDialog(true); + + } + }); + } + }// else not feature to install + return Status.OK_STATUS; + } + + public boolean isCheckUpdateOnLine() { + return isCheckUpdateOnLine; + } + + public void setCheckUpdateOnLine(boolean isCheckUpdateOnLine) { + this.isCheckUpdateOnLine = isCheckUpdateOnLine; + } +}