// ============================================================================ // // Copyright (C) 2006-2016 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.cwm.compare.ui.actions; import java.lang.reflect.InvocationTargetException; import java.util.List; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.talend.core.GlobalServiceRegister; import org.talend.core.ITDQRepositoryService; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.core.model.properties.ConnectionItem; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.Property; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.cwm.compare.exception.ReloadCompareException; import org.talend.cwm.compare.factory.ComparisonLevelFactory; import org.talend.cwm.compare.factory.IComparisonLevel; import org.talend.cwm.compare.i18n.Messages; import org.talend.cwm.compare.ui.ImageLib; import org.talend.dataprofiler.core.CorePlugin; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.ui.dialog.message.DeleteModelElementConfirmDialog; import org.talend.dataprofiler.core.ui.progress.ProgressUI; import org.talend.dataprofiler.core.ui.utils.MessageUI; import org.talend.dataprofiler.core.ui.utils.WorkbenchUtils; import org.talend.dq.CWMPlugin; import org.talend.dq.helper.EObjectHelper; import org.talend.dq.helper.PropertyHelper; import org.talend.dq.nodes.foldernode.IConnectionElementSubFolder; import org.talend.metadata.managment.utils.MetadataConnectionUtils; import org.talend.repository.model.RepositoryNode; import org.talend.utils.sugars.ReturnCode; import orgomg.cwm.objectmodel.core.ModelElement; /** * DOC rli class global comment. Detailled comment */ public class ReloadDatabaseAction extends Action { private static Logger log = Logger.getLogger(ReloadDatabaseAction.class); private Object selectedObject; private ReturnCode returnCode = new ReturnCode(true); private boolean needCompare = true; /** * Getter for returnCode. * * @return the returnCode */ public ReturnCode getReturnCode() { return this.returnCode; } /** * constructor. * * @param selectedNode * @param menuText */ public ReloadDatabaseAction(Object selectedNode, String menuText) { super(menuText); this.selectedObject = selectedNode; setImageDescriptor(ImageLib.getImageDescriptor(ImageLib.UPDATE_IMAGE)); } /** * constructor. * * @param selectedNode * @param menuText * @param needCompare */ public ReloadDatabaseAction(Object selectedNode, String menuText, boolean needCompare) { this(selectedNode, menuText); // Added TDQ-7528: add a parameter to control if popup the select dialog(reload or compare) this.needCompare = needCompare; } /* * (non-Javadoc) * * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { returnCode = new ReturnCode(true); if (!isSupport()) { returnCode.setReturnCode(Messages.getString("ReloadDatabaseAction.NotSupportMessage"), false); //$NON-NLS-1$ return; } // Added yyin 20130131 TDQ-6780, warn the user to check the compare result before copy // Added TDQ-6999 Copy from right to left should not popup reloading/comparing confirmation dialog,yyin // MOD TDQ-7528 20130627 yyin: if needCompare=false,no need to popup select compare dialog if (this.needCompare) { // popup a dialog to warn the user better do the compare before the reload, and provide two buttons: // if the user click the compare button, the compare will be executed. // if the user click the reload button, the reload will continue. String[] dialogButtonLabels = { Messages.getString("ReloadDatabaseAction.ReloadLabel") };//$NON-NLS-1$ MessageDialog dialog = new MessageDialog( CorePlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.getString("ReloadDatabaseAction.ReloadLabel"), null, Messages.getString("ReloadDatabaseAction.IsContinue"), 3, dialogButtonLabels, SWT.NONE);//$NON-NLS-1$ //$NON-NLS-2$ int open = dialog.open(); // when click close, do nothing. if (open == -1) { return; } // when click compare // if (open == 0) { // // go to compare instead of reloading now // new PopComparisonUIAction(selectedObject, Messages.getString("ReloadDatabaseAction.CompareLabel")).run();//$NON-NLS-1$ // returnCode.setReturnCode(Messages.getString("ReloadDatabaseAction.IsContinue"), false);//$NON-NLS-1$ // return; // }// ~ } Connection conn = getConnection(); List<ModelElement> dependencyClients = EObjectHelper.getDependencyClients(conn); if (!(dependencyClients == null || dependencyClients.isEmpty())) { int isOk = DeleteModelElementConfirmDialog.showElementImpactConfirmDialog(null, new ModelElement[] { conn }, DefaultMessagesImpl.getString("TOPRepositoryService.dependcyTile"), //$NON-NLS-1$ DefaultMessagesImpl.getString("TOPRepositoryService.dependcyMessage", conn.getLabel())); //$NON-NLS-1$ if (isOk != Dialog.OK) { returnCode.setReturnCode("The user canceled the operation!", false); //$NON-NLS-1$ return; } } IRunnableWithProgress op = new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException { final IComparisonLevel creatComparisonLevel = ComparisonLevelFactory.creatComparisonLevel(selectedObject); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { try { Connection oldDataProvider = creatComparisonLevel.reloadCurrentLevelElement(); // MOD mzhao 2009-07-13 bug 7454 Impact existing analysis. // MOD qiongli 2011-9-8,move method 'impactExistingAnalyses(...)' to class WorkbenchUtils // update the sql explore. Property property = PropertyHelper.getProperty(oldDataProvider); if (property != null) { Item newItem = property.getItem(); if (newItem != null) { CWMPlugin.getDefault() .updateConnetionAliasByName(oldDataProvider, oldDataProvider.getLabel()); } } // update the related analyses. WorkbenchUtils.impactExistingAnalyses(oldDataProvider); // Update software system. updateSoftwareSystem(oldDataProvider); } catch (ReloadCompareException e) { MessageUI.openError(Messages.getString("ReloadDatabaseAction.Error", e.getMessage())); //$NON-NLS-1$ log.error(e, e); returnCode.setReturnCode(e.getMessage(), false); } catch (PartInitException e) { log.error(e, e); returnCode.setReturnCode(e.getMessage(), false); } } }); } }; try { ProgressUI.popProgressDialog(op); CorePlugin.getDefault().refreshDQView(selectedObject); } catch (InvocationTargetException e) { MessageUI.openError(Messages.getString("ReloadDatabaseAction.checkConnectionFailured", e.getCause().getMessage())); //$NON-NLS-1$ log.error(e, e); } catch (InterruptedException e) { log.error(e, e); } } private void updateSoftwareSystem(Connection oldProvider) { if (GlobalServiceRegister.getDefault().isServiceRegistered(ITDQRepositoryService.class)) { ITDQRepositoryService tdqRepService = (ITDQRepositoryService) GlobalServiceRegister.getDefault().getService( ITDQRepositoryService.class); if (tdqRepService != null) { tdqRepService.publishSoftwareSystemUpdateEvent((DatabaseConnection) oldProvider); } } } /** * check whether support the reload database action. * * @return boolean */ private boolean isSupport() { Connection conn = getConnection(); if (!(conn instanceof DatabaseConnection)) { return false; } if (!MetadataConnectionUtils.isTDQSupportDBTemplate(conn)) { MessageDialog.openInformation(PlatformUI.getWorkbench().getDisplay().getActiveShell(), Messages.getString("ReloadDatabaseAction.NotSupportTitle"), //$NON-NLS-1$ Messages.getString("ReloadDatabaseAction.NotSupportMessage")); //$NON-NLS-1$ return false; } return true; } /** * get Connection. * * @return */ private Connection getConnection() { Connection conn = null; IRepositoryViewObject object = null; if (selectedObject == null) { return conn; } if (selectedObject instanceof RepositoryNode) { object = ((RepositoryNode) selectedObject).getObject(); } if (object != null) { Item item = object.getProperty().getItem(); if (item instanceof ConnectionItem) { conn = ((ConnectionItem) item).getConnection(); } } else if (selectedObject instanceof IConnectionElementSubFolder) { conn = ((IConnectionElementSubFolder) selectedObject).getConnection(); } else if (selectedObject instanceof Connection) { conn = (Connection) selectedObject; } return conn; } }