// ============================================================================ // // 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.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.action.Action; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.properties.ConnectionItem; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.cwm.helper.CatalogHelper; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.PackageHelper; import org.talend.dq.helper.EObjectHelper; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.nodes.foldernode.IFolderNode; import org.talend.repository.model.IRepositoryNode; import orgomg.cwm.objectmodel.core.ModelElement; 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 SubelementCompareAction extends Action { public static final int COLUMN_COMPARE = 0; public static final int TABLE_COMPARE = 1; public static final int VIEW_COMPARE = 2; private String text = null; // private ModelContentMergeDiffTab diffTabLeft = null; private int actionType; private Object selectedOjbect = null; private PopComparisonUIAction popCompUIAction = null; // public SubelementCompareAction(String showText, ModelContentMergeDiffTab diffTabLeft, Object selectedOjbect, int // actionType) { // text = showText; // this.diffTabLeft = diffTabLeft; // this.selectedOjbect = selectedOjbect; // this.actionType = actionType; // popCompUIAction = new PopComparisonUIAction(text); // } @Override public String getText() { return text; } @Override public void run() { // IStructuredSelection selection = (IStructuredSelection) diffTabLeft.getSelection(); // EObject selectedElement = null; // if (selection.toList().size() == 1) { // selectedElement = (EObject) selection.getFirstElement(); // IFolderNode folderNode = null; // if (selectedElement instanceof ColumnSet) { // IRepositoryViewObject reposViewObj = ((RepositoryNode) selectedOjbect).getParent().getObject(); // Package parentPackage = null; // if (reposViewObj instanceof ISubRepositoryObject) { // parentPackage = (Package) ((ISubRepositoryObject) reposViewObj).getModelElement(); // } // // // MOD mzhao 2009-08-05 Bug 8581 // // PackageHelper.addColumnSet((ColumnSet) selectedElement, // // parentPackage); // // ((ColumnSet) selectedElement).setNamespace(parentPackage); // ModelElement matchedElement = findMatchedModelElement(parentPackage, selectedElement); // // FIXME folderNode is never used. // folderNode = FolderNodeHelper.getFolderNodes(matchedElement)[0]; // IRepositoryNode repositoryNode = RepositoryNodeHelper.recursiveFind(matchedElement); // // openComparisonEditor(repositoryNode.getChildren().get(0)); // } else if (selectedElement instanceof Catalog) { // // Judge and see if there are schemas under the catalog.(Case of // // SQL Servers) // Catalog catalog = (Catalog) selectedElement; // List<Schema> schemas = CatalogHelper.getSchemas(catalog); // if (schemas != null && schemas.size() > 0) { // IRepositoryViewObject reposViewObj = (IRepositoryViewObject) selectedOjbect; // ConnectionItem item = (ConnectionItem) reposViewObj.getProperty().getItem(); // Connection conn = item.getConnection(); // if (catalog.getDataManager().isEmpty()) { // catalog.getDataManager().add(conn); // } // popCompUIAction.setSelectedObject(getTableOrViewFolder(getFirstSchema(catalog))); // popCompUIAction.run(); // } else { // IRepositoryNode repositoryfolderNode = getTableOrViewFolder(selectedElement); // openComparisonEditor(repositoryfolderNode); // } // } else if (selectedElement instanceof Schema) { // IRepositoryNode repositoryfolderNode = getTableOrViewFolder(selectedElement); // openComparisonEditor(repositoryfolderNode); // } else { // return; // } // // // Remove namespace link // if (selectedElement instanceof ColumnSet) { // IRepositoryViewObject reposViewObj = ((RepositoryNode) selectedOjbect).getParent().getObject(); // Package parentPackage = null; // if (reposViewObj instanceof ISubRepositoryObject) { // parentPackage = (Package) ((ISubRepositoryObject) reposViewObj).getModelElement(); // } // // FIXME the originPackage might be Null, and we should never used a new object to replace the old one. // Package originPackage = parentPackage; // if (originPackage.eIsProxy()) { // originPackage = (Package) EObjectHelper.resolveObject(originPackage); // } // PackageHelper.removeColumnSet((ColumnSet) selectedElement, originPackage); // EMFSharedResources.getInstance().saveResource(originPackage.eResource()); // } // } } /** * get the first Schema under the Catalog. * * @param catalog * @return */ private Schema getFirstSchema(Catalog catalog) { Schema schema = null; List<Schema> schemas = CatalogHelper.getSchemas(catalog); if (schemas != null && schemas.size() > 0) { for (Schema tdSchema : schemas) { schema = tdSchema; break; } } return schema; } /** * DOC klliu Comment method "openComparisonEditor". * * @param folderNode */ public void openComparisonEditor(IFolderNode folderNode) { folderNode.loadChildren(); popCompUIAction.setSelectedObject(folderNode); popCompUIAction.run(); } /** * DOC zshen Comment method "openComparisonEditor". * * @param repositoryfolderNode */ public void openComparisonEditor(IRepositoryNode repositoryfolderNode) { repositoryfolderNode.getChildren(); popCompUIAction.setSelectedObject(repositoryfolderNode); popCompUIAction.run(); } private IRepositoryNode getTableOrViewFolder(EObject selectedElement) { IRepositoryNode folderNode = null; ModelElement matchedElement = null; Connection conn = null; if (selectedOjbect instanceof Catalog) { conn = ConnectionHelper.getTdDataProvider(((Catalog) selectedOjbect)); } else { IRepositoryViewObject reposViewObj = (IRepositoryViewObject) selectedOjbect; ConnectionItem item = (ConnectionItem) reposViewObj.getProperty().getItem(); conn = item.getConnection(); } matchedElement = findMatchedModelElement(conn, selectedElement); if (matchedElement != null) { IRepositoryNode repositoryNode = RepositoryNodeHelper.recursiveFind(matchedElement); if (repositoryNode != null) { if (actionType == TABLE_COMPARE) { folderNode = repositoryNode.getChildren().get(0); } else if (actionType == VIEW_COMPARE) { folderNode = repositoryNode.getChildren().get(1); } } } return folderNode; } /** * DOC klliu Comment method "findMatchedModelElement". don't understand this method!!! * * @param parent * @param similarElement * @return */ private ModelElement findMatchedModelElement(EObject parent, EObject similarElement) { if (parent instanceof Connection) { if (similarElement instanceof Schema) { Schema schema = (Schema) similarElement; // Case of MS SQL Server. if (selectedOjbect instanceof Catalog) { // ?????? List<Schema> schemas = CatalogHelper.getSchemas((Catalog) selectedOjbect); if (schemas != null && schemas.size() > 0) { for (Schema tdSchema : schemas) { if (tdSchema.getName().equalsIgnoreCase((schema).getName())) { return tdSchema; } } } } // case of MS SQL Server, Postgresql...... EObject eContainer = schema.eContainer(); if (eContainer != null && eContainer instanceof Catalog) { List<Catalog> catalogs = ConnectionHelper.getCatalogs((Connection) parent); for (Catalog catalog : catalogs) { if (((Catalog) eContainer).getName().equals(catalog.getName())) { List<Schema> schemas = CatalogHelper.getSchemas(catalog); if (schemas != null && schemas.size() > 0) { for (Schema tdSchema : schemas) { if (tdSchema.getName().equalsIgnoreCase((schema).getName())) { return tdSchema; } } } } } } // Case of Oracle List<Schema> schames = ConnectionHelper.getSchema((Connection) parent); for (Schema schame : schames) { if (schame.getName().equalsIgnoreCase((schema).getName())) { return schame; } } } // Case of Mysql if (similarElement instanceof Catalog) { List<Catalog> catalogs = ConnectionHelper.getCatalogs((Connection) parent); for (Catalog catalog : catalogs) { if (catalog.getName().equalsIgnoreCase(((Catalog) similarElement).getName())) { return catalog; } } } } else if (parent instanceof Package) { // MOD klliu bug 15822 resolve proxy caused two Instance,so we must use one Instance if (parent != null && parent.eIsProxy()) { parent = EObjectHelper.resolveObject(parent); } // MOD mzhao bug 8581 2009-08-05 List<ColumnSet> columnSets = new ArrayList<ColumnSet>(); columnSets.addAll(PackageHelper.getTables((Package) parent)); columnSets.addAll(PackageHelper.getViews((Package) parent)); for (ModelElement columnSet : columnSets) { if (((ColumnSet) columnSet).getName().equalsIgnoreCase(((ColumnSet) similarElement).getName())) { return columnSet; } } } return null; } }