// ============================================================================ // // 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.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.metadata.builder.database.DqRepositoryViewService; import org.talend.cwm.compare.DQStructureComparer; import org.talend.cwm.compare.exception.ReloadCompareException; import org.talend.cwm.compare.i18n.Messages; import org.talend.cwm.helper.ColumnSetHelper; import org.talend.cwm.relational.TdColumn; import org.talend.dataprofiler.core.helper.FolderNodeHelper; import org.talend.dq.helper.resourcehelper.PrvResourceFileHelper; import org.talend.dq.nodes.foldernode.IFolderNode; import org.talend.dq.writer.EMFSharedResources; import org.talend.dq.writer.impl.ElementWriterFactory; import org.talend.utils.sugars.TypedReturnCode; import orgomg.cwm.objectmodel.core.Feature; import orgomg.cwm.objectmodel.core.ModelElement; import orgomg.cwm.objectmodel.core.Namespace; import orgomg.cwm.objectmodel.core.Package; import orgomg.cwm.resource.relational.Catalog; import orgomg.cwm.resource.relational.ColumnSet; import orgomg.cwm.resource.relational.Schema; /** * DOC mzhao class global comment. Detailled comment */ public class RenameComparedElementAction extends Action { private static Logger log = Logger.getLogger(RenameComparedElementAction.class); private ModelElement theSelectedElement = null; private Namespace originCompareElement = null; private IFolderNode selectedFolderNode = null; private Map<String, Object> options = null; private List<ModelElement> newAddedColumnSet = null; public RenameComparedElementAction(IFolderNode selectedFolderNode, ModelElement theSelectedElement, List<ModelElement> addElementList) { this.selectedFolderNode = selectedFolderNode; this.originCompareElement = (Namespace) selectedFolderNode.getParent(); this.theSelectedElement = theSelectedElement; this.newAddedColumnSet = addElementList; options = new HashMap<String, Object>(); // options.put(MatchOptions.OPTION_IGNORE_XMI_ID, true); } @Override public String getText() { return Messages.getString("RenameComparedElementAction.ChooseCorrespondElement"); //$NON-NLS-1$ } @Override public void run() { // Open the add element model dialog if (newAddedColumnSet == null || newAddedColumnSet.size() == 0) { MessageDialog.openConfirm(null, "", Messages.getString("RenameComparedElementAction.NoNewElement")); //$NON-NLS-1$ //$NON-NLS-2$ return; } RightPanelAddedElementsDialog addedEleDialog = new RightPanelAddedElementsDialog(null, newAddedColumnSet); if (addedEleDialog.open() != Window.OK) { return; } // Propagate the changes ModelElement checkedElement = addedEleDialog.getCheckedColumnSet(); if (originCompareElement instanceof Package) { theSelectedElement.setNamespace(originCompareElement); checkedElement.setNamespace(originCompareElement); } if (originCompareElement instanceof Package) { originCompareElement.getOwnedElement().remove(theSelectedElement); originCompareElement.getOwnedElement().remove(checkedElement); } // Save to the copied resource. refreshReposigoryTree(checkedElement); refreshEditor(); } public void refreshEditor() { IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); activePage.closeEditor(activePage.getActiveEditor(), false); new PopComparisonUIAction(selectedFolderNode, Messages.getString("RenameComparedElementAction.Compare")).run(); //$NON-NLS-1$ } private void refreshReposigoryTree(ModelElement checkedColumnSet) { // ~ Save to the original resource. // Remove theSelectedElement by iteratively comparing its name. // Because theSelectedElement in compare editor is not the same // instance with that of in repository tree. if (originCompareElement instanceof Package) { // ColumnSet for (Iterator<ModelElement> it = originCompareElement.getOwnedElement().iterator(); it.hasNext();) { if (it.next().getName().equalsIgnoreCase(theSelectedElement.getName())) { it.remove(); break; } } originCompareElement.getOwnedElement().add(checkedColumnSet); } else { // Column for (Iterator<Feature> it = ((ColumnSet) originCompareElement).getFeature().iterator(); it.hasNext();) { if (it.next().getName().equalsIgnoreCase(theSelectedElement.getName())) { it.remove(); break; } } ((ColumnSet) originCompareElement).getFeature().add((Feature) checkedColumnSet); } EMFSharedResources.getInstance().saveResource(originCompareElement.eResource()); // ~ } // private void getDiffElements(DiffElement diffEle, List<DiffElement> diffElementList) { // if (diffEle instanceof DiffGroup) { // for (DiffElement subDiffEle : ((DiffGroup) diffEle).getSubDiffElements()) { // getDiffElements(subDiffEle, diffElementList); // } // } else { // diffElementList.add(diffEle); // } // } private Resource getLeftResource() throws ReloadCompareException { ColumnSet selectedColumnSet = (ColumnSet) theSelectedElement; Connection copyedDataProvider = createCopyedProvider(); ColumnSet findMatchedColumnSet = DQStructureComparer.findMatchedColumnSet(selectedColumnSet, copyedDataProvider); List<TdColumn> columnList = new ArrayList<TdColumn>(); columnList.addAll(ColumnSetHelper.getColumns(findMatchedColumnSet)); Resource leftResource = copyedDataProvider.eResource(); leftResource.getContents().clear(); for (TdColumn column : columnList) { DQStructureComparer.clearSubNode(column); leftResource.getContents().add(column); } EMFSharedResources.getInstance().saveResource(leftResource); return leftResource; } @SuppressWarnings("deprecation") private Connection createCopyedProvider() { Package catalogOrSchema = getTopLevelPackage(); IFile selectedFile = PrvResourceFileHelper.getInstance().findCorrespondingFile(catalogOrSchema.getDataManager().get(0)); IFile createNeedReloadElementsFile = DQStructureComparer.getNeedReloadElementsFile(); IFile copyedFile = DQStructureComparer.copyedToDestinationFile(selectedFile, createNeedReloadElementsFile); TypedReturnCode<Connection> returnValue = DqRepositoryViewService.readFromFile(copyedFile); return returnValue.getObject(); } private Package getTopLevelPackage() { Package catalogOrSchema = (Package) originCompareElement; if (originCompareElement instanceof Schema) { if (originCompareElement.eContainer() != null && originCompareElement.eContainer() instanceof Catalog) { catalogOrSchema = (Package) originCompareElement.eContainer(); } } return catalogOrSchema; } private Resource getRightResource(ColumnSet selectedColumnSet) throws ReloadCompareException { Connection tempReloadProvider = createTempConnectionFile(); Package matchedPackage = DQStructureComparer.findMatchedPackage((Package) originCompareElement, tempReloadProvider); IFolderNode columnSetFolderNode = FolderNodeHelper.getFolderNode(matchedPackage, selectedColumnSet); columnSetFolderNode.loadChildren(); ColumnSet findMatchedColumnSet = DQStructureComparer.findMatchedColumnSet(selectedColumnSet, tempReloadProvider); List<TdColumn> columns = null; try { columns = DqRepositoryViewService.getColumns(tempReloadProvider, findMatchedColumnSet, null, true); } catch (Exception e1) { throw new ReloadCompareException(e1); } URI uri = tempReloadProvider.eResource().getURI(); Resource rightResource = null; rightResource = EMFSharedResources.getInstance().getResource(uri, true); if (rightResource == null) { throw new ReloadCompareException("NoFactoryFoundForURI" + uri.toFileString()); //$NON-NLS-1$ } rightResource.getContents().clear(); for (TdColumn column : columns) { DQStructureComparer.clearSubNode(column); rightResource.getContents().add(column); } EMFSharedResources.getInstance().saveResource(rightResource); return rightResource; } private Connection createTempConnectionFile() throws ReloadCompareException { Package catalogOrSchema = getTopLevelPackage(); Connection oldDataProvider = (Connection) catalogOrSchema.getDataManager().get(0); IFile tempConnectionFile = DQStructureComparer.getSecondComparisonLocalFile(); // MOD mzhao ,Extract method getRefreshedDataProvider to class // DQStructureComparer for common use. TypedReturnCode<Connection> returnProvider = DQStructureComparer.getRefreshedDataProvider(oldDataProvider); if (!returnProvider.isOk()) { throw new ReloadCompareException(returnProvider.getMessage()); } Connection tempReloadProvider = returnProvider.getObject(); tempReloadProvider.setComponent(oldDataProvider.getComponent()); ElementWriterFactory.getInstance().createDataProviderWriter().create(tempReloadProvider, tempConnectionFile); tempReloadProvider.setComponent(null); oldDataProvider.getComponent(); return tempReloadProvider; } /** * * DOC mzhao RenameComparedElementAction class global comment. Detailled comment * * FIXME is it better to make it static? */ private class RightPanelAddedElementsDialog extends Dialog { private CheckboxTableViewer tableViewer = null; private List<ModelElement> newAddedColumnSet; private ModelElement checkedElement = null; protected RightPanelAddedElementsDialog(Shell parentShell, List<ModelElement> newAddedColumnSet) { super(parentShell); this.newAddedColumnSet = newAddedColumnSet; } public ModelElement getCheckedColumnSet() { return checkedElement; } @Override protected boolean isResizable() { return true; } @Override protected void createButtonsForButtonBar(Composite parent) { // create OK and Cancel buttons by default Button okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); okButton.setEnabled(false); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /* * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets .Shell) */ @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(Messages.getString("RenameComparedElementAction.NewNameOfElement")); //$NON-NLS-1$ } @Override protected Point getInitialSize() { return new Point(455, 340); } @Override protected void okPressed() { if (tableViewer.getCheckedElements().length > 0) { checkedElement = (ModelElement) tableViewer.getCheckedElements()[0]; } super.okPressed(); } @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); composite.setLayout(new FillLayout()); tableViewer = CheckboxTableViewer.newCheckList(composite, SWT.SINGLE); tableViewer.setContentProvider(new IStructuredContentProvider() { @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof List<?>) { return ((List<?>) inputElement).toArray(); } return new Object[] { inputElement }; } @Override public void dispose() { // needn't to do anyting ??? } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // needn't to do anyting ??? } }); tableViewer.setLabelProvider(new ILabelProvider() { @Override public Image getImage(Object element) { return null; } @Override public String getText(Object element) { ModelElement me = (ModelElement) element; return me.getName(); } @Override public void addListener(ILabelProviderListener listener) { // needn't to do anyting ??? } @Override public void dispose() { // needn't to do anyting ??? } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) { // needn't to do anyting ??? } }); tableViewer.setInput(newAddedColumnSet); tableViewer.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { tableViewer.setAllChecked(false); tableViewer.setChecked(event.getElement(), event.getChecked()); getButton(IDialogConstants.OK_ID).setEnabled(tableViewer.getCheckedElements().length > 0); } }); return composite; } } }