// ============================================================================ // // 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.factory.comparisonlevel; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.DifferenceKind; import org.eclipse.emf.compare.EMFCompare; import org.eclipse.emf.compare.scope.DefaultComparisonScope; import org.eclipse.emf.compare.scope.IComparisonScope; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.talend.commons.utils.platform.PluginChecker; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.metadata.builder.database.DqRepositoryViewService; import org.talend.core.model.properties.ConnectionItem; import org.talend.core.model.properties.Item; import org.talend.cwm.compare.DQStructureComparer; import org.talend.cwm.compare.exception.ReloadCompareException; import org.talend.cwm.compare.i18n.DefaultMessagesImpl; import org.talend.cwm.db.connection.ConnectionUtils; import org.talend.cwm.helper.ColumnSetHelper; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.TaggedValueHelper; import org.talend.cwm.relational.TdColumn; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.nodes.DBColumnFolderRepNode; import org.talend.dq.nodes.DQDBFolderRepositoryNode; import org.talend.dq.writer.EMFSharedResources; import org.talend.repository.model.RepositoryNode; import org.talend.utils.sugars.ReturnCode; import orgomg.cwm.objectmodel.core.Feature; import orgomg.cwm.objectmodel.core.Package; import orgomg.cwm.resource.relational.ColumnSet; /** * DOC rli class global comment. Detailled comment */ public class TableViewComparisonLevel extends AbstractTableComparisonLevel { protected static Logger log = Logger.getLogger(TableViewComparisonLevel.class); private static final List<TdColumn> EMPTY_COLUMN_LIST = Collections.emptyList(); private String tmpConceptName = StringUtils.EMPTY; private Map<String, String[]> tmpTaggedValuesMap = new HashMap<String, String[]>(); public TableViewComparisonLevel(DBColumnFolderRepNode dbFolderNode) { super(dbFolderNode); } public TableViewComparisonLevel(ColumnSet columnSet) { super(null); selectedObj = columnSet; } @Override protected boolean compareWithReloadObject() throws ReloadCompareException { // remove the jrxml from the ResourceSet before doMatch Map<ResourceSet, List<Resource>> rsJrxmlMap = removeJrxmlsFromResourceSet(); DBColumnFolderRepNode columnFolderRepNode = (DBColumnFolderRepNode) selectedObj; // Compare the two models EMFCompare comparator = createDefaultEMFCompare(); IComparisonScope scope = new DefaultComparisonScope(columnFolderRepNode.getColumnSet(), getSavedReloadObject(), null); Comparison compare = comparator.compare(scope); // add the jrxml into the ResourceSet after doMatch addJrxmlsIntoResourceSet(rsJrxmlMap); EList<Diff> differences = compare.getDifferences(); for (Diff diff : differences) { // ignore the move Kind if (diff.getKind() == DifferenceKind.MOVE) { continue; } // copy right to left copyRightToLeft(diff); } return true; } @Override protected Connection findDataProvider() { Connection provider = null; if (selectedObj instanceof DBColumnFolderRepNode) { DBColumnFolderRepNode columnFolderRepNode = (DBColumnFolderRepNode) selectedObj; ColumnSet columnSet = columnFolderRepNode.getColumnSet(); if (columnSet != null) { Package parentCatalogOrSchema = ColumnSetHelper.getParentCatalogOrSchema(columnSet); provider = ConnectionHelper.getTdDataProvider(parentCatalogOrSchema); } } else if (selectedObj instanceof RepositoryNode) { Item connItem = ((RepositoryNode) selectedObj).getObject().getProperty().getItem(); provider = ((ConnectionItem) connItem).getConnection(); } else { ColumnSet columnSet = (ColumnSet) selectedObj; Package parentCatalogOrSchema = ColumnSetHelper.getParentCatalogOrSchema(columnSet); provider = ConnectionHelper.getTdDataProvider(parentCatalogOrSchema); } return provider; } /* * To add the connection check : if the connection is not available, throw exception */ @Override protected IFile createTempConnectionFile() throws ReloadCompareException { // TDQ-9263 add the connection check ReturnCode connectionAvailable = ConnectionUtils.isConnectionAvailable(oldDataProvider); if (!connectionAvailable.isOk()) { throw new ReloadCompareException(DefaultMessagesImpl.getString("TableViewComparisonLevel.ConnectionNotAvaiable")); //$NON-NLS-1$ } return super.createTempConnectionFile(); } @Override public Connection reloadCurrentLevelElement() throws ReloadCompareException { if (selectedObj instanceof DQDBFolderRepositoryNode) { DQDBFolderRepositoryNode columnFolderRepNode = (DQDBFolderRepositoryNode) selectedObj; columnFolderRepNode.setReload(true); } return super.reloadCurrentLevelElement(); } @Override protected EObject getSavedReloadObject() throws ReloadCompareException { ColumnSet selectedColumnSet = getCurrentColumnSet(); ColumnSet toReloadcolumnSet = DQStructureComparer.findMatchedColumnSet(selectedColumnSet, tempReloadProvider); // ADD TDQ-11146 msjian: to save the TaggedValues before clear if (PluginChecker.isTDQLoaded()) { tmpConceptName = TaggedValueHelper.getValueString(TaggedValueHelper.CONCEPT_NAME, toReloadcolumnSet); EList<Feature> feature = toReloadcolumnSet.getFeature(); tmpTaggedValuesMap = new HashMap<String, String[]>(); for (Feature fea : feature) { String[] values = new String[] { StringUtils.EMPTY, StringUtils.EMPTY }; values[0] = TaggedValueHelper.getValueString(TaggedValueHelper.SEMANTIC_NAME, fea); values[1] = TaggedValueHelper.getValueString(TaggedValueHelper.CONTENT_TYPE, fea); if (StringUtils.isNotBlank(values[0]) || StringUtils.isNotBlank(values[1])) { tmpTaggedValuesMap.put(fea.getName(), values); } } } // TDQ-11146~ // MOD scorreia 2009-01-29 clear content of findMatchedColumnSet ColumnSetHelper.setColumns(toReloadcolumnSet, EMPTY_COLUMN_LIST); toReloadcolumnSet.getOwnedElement().clear(); try { DqRepositoryViewService.getColumns(tempReloadProvider, toReloadcolumnSet, true); // MOD mzhao 2009-11-12 save to resoure after reload. util.saveResource(toReloadcolumnSet.eResource()); } catch (Exception e1) { throw new ReloadCompareException(e1); } // MOD scorreia 2009-01-29 columns are stored in the table // ColumnSetHelper.setColumns(toReloadcolumnSet, columns); return toReloadcolumnSet; } @Override protected Resource getLeftResource() throws ReloadCompareException { ColumnSet selectedColumnSet = null; if (selectedObj instanceof DBColumnFolderRepNode) { DBColumnFolderRepNode columnFolderRepNode = (DBColumnFolderRepNode) selectedObj; selectedColumnSet = columnFolderRepNode.getColumnSet(); } else if (selectedObj instanceof RepositoryNode) { selectedColumnSet = (ColumnSet) RepositoryNodeHelper.getMetadataElement((RepositoryNode) selectedObj); } else { selectedColumnSet = (ColumnSet) selectedObj; } 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 upperCaseResource(leftResource); } @Override protected Resource getRightResource() throws ReloadCompareException { ColumnSet selectedColumnSet = null; if (selectedObj instanceof RepositoryNode) { selectedColumnSet = (ColumnSet) RepositoryNodeHelper.getMetadataElement((RepositoryNode) selectedObj); } else if (selectedObj instanceof DBColumnFolderRepNode) { DBColumnFolderRepNode columnFolderRepNode = (DBColumnFolderRepNode) selectedObj; selectedColumnSet = columnFolderRepNode.getColumnSet(); } else { selectedColumnSet = (ColumnSet) selectedObj; } ColumnSet findMatchedColumnSet = DQStructureComparer.findMatchedColumnSet(selectedColumnSet, tempReloadProvider); List<TdColumn> columns = null; try { // MOD scorreia 2009-01-29 clear content of findMatchedColumnSet ColumnSetHelper.setColumns(findMatchedColumnSet, EMPTY_COLUMN_LIST); columns = DqRepositoryViewService.getColumns(tempReloadProvider, findMatchedColumnSet, true); } catch (Exception e1) { throw new ReloadCompareException(e1); } // MOD scorreia 2009-01-29 columns are stored in the table // ColumnSetHelper.addColumns(findMatchedColumnSet, columns); URI uri = tempReloadProvider.eResource().getURI(); Resource rightResource = null; rightResource = EMFSharedResources.getInstance().getResource(uri, true); if (rightResource == null) { throw new ReloadCompareException(DefaultMessagesImpl.getString("TableViewComparisonLevel.NoFactoryFoundForURI", uri)); //$NON-NLS-1$ } rightResource.getContents().clear(); for (TdColumn column : columns) { DQStructureComparer.clearSubNode(column); rightResource.getContents().add(column); } EMFSharedResources.getInstance().saveResource(rightResource); return upperCaseResource(rightResource); } /** * DOC msjian Comment method "getCurrentColumnSet". * * @return */ private ColumnSet getCurrentColumnSet() { ColumnSet columnSet = null; if (selectedObj instanceof DBColumnFolderRepNode) { DBColumnFolderRepNode columnFolderRepNode = (DBColumnFolderRepNode) selectedObj; columnSet = columnFolderRepNode.getColumnSet(); } else if (selectedObj instanceof ColumnSet) { columnSet = (ColumnSet) selectedObj; } return columnSet; } /* * (non-Javadoc) * * @see org.talend.cwm.compare.factory.comparisonlevel.AbstractComparisonLevel#resetTaggedValues() */ @Override protected void resetTaggedValues() throws ReloadCompareException { super.resetTaggedValues(); if (PluginChecker.isTDQLoaded()) { ColumnSet selectedColumnSet = getCurrentColumnSet(); ColumnSet oldColumnSet = DQStructureComparer.findMatchedColumnSet(selectedColumnSet, oldDataProvider); // reset table's taggedvalues "CONCEPT_NAME". TaggedValueHelper.setTaggedValue(oldColumnSet, TaggedValueHelper.CONCEPT_NAME, tmpConceptName); EList<Feature> oldFeatures = oldColumnSet.getFeature(); for (Feature fea : oldFeatures) { // reset the column's tagged values "SEMATIC_NAME", "Content Type". String[] strings = tmpTaggedValuesMap.get(fea.getName()); if (strings != null) { TaggedValueHelper.setTaggedValue(fea, TaggedValueHelper.SEMANTIC_NAME, strings[0]); TaggedValueHelper.setTaggedValue(fea, TaggedValueHelper.CONTENT_TYPE, strings[1]); } } } } }