// ============================================================================
//
// 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.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.util.EList;
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.ReferenceChange;
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.emf.FactoriesUtil;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.database.EDatabaseTypeName;
import org.talend.core.database.conn.DatabaseConnStrUtil;
import org.talend.core.model.general.Project;
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.core.repository.model.ProxyRepositoryFactory;
import org.talend.cwm.compare.DQStructureComparer;
import org.talend.cwm.compare.exception.ReloadCompareException;
import org.talend.cwm.db.connection.ConnectionUtils;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.cwm.helper.SwitchHelpers;
import org.talend.dq.helper.PropertyHelper;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.helper.resourcehelper.PrvResourceFileHelper;
import org.talend.dq.writer.EMFSharedResources;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.RepositoryNode;
import orgomg.cwm.objectmodel.core.Package;
import orgomg.cwm.resource.relational.Catalog;
import orgomg.cwm.resource.relational.Schema;
/**
* DOC rli class global comment. Detailled comment
*/
public class DataProviderComparisonLevel extends AbstractComparisonLevel {
private static Logger log = Logger.getLogger(DataProviderComparisonLevel.class);
public DataProviderComparisonLevel(Object selectedObj) {
super(selectedObj);
}
@Override
protected boolean isValid() {
return selectedObj instanceof Connection || ((IFile) selectedObj).getFileExtension().equalsIgnoreCase(FactoriesUtil.PROV);
}
@Override
protected boolean compareWithReloadObject() throws ReloadCompareException {
Map<ResourceSet, List<Resource>> rsJrxmlMap = removeJrxmlsFromResourceSet();
EMFCompare comparator = createDefaultEMFCompare();
IComparisonScope scope = new DefaultComparisonScope(oldDataProvider, 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;
}
if (diff instanceof ReferenceChange) {
EObject value = ((ReferenceChange) diff).getValue();
if (isCatalogOrSchema(value)) {
copyRightToLeft(diff);
}
}
}
return true;
}
/**
*
* if it has only catalog or only schema(like as:yes for mysql and oracle,no for MSSQL SEVER ).
*
* @param obj
* @return
*/
private boolean isCatalogOrSchema(EObject obj) {
Catalog cat = SwitchHelpers.CATALOG_SWITCH.doSwitch(obj);
if (cat != null) {
return true;
}
Schema schema = SwitchHelpers.SCHEMA_SWITCH.doSwitch(obj);
if (schema != null) {
return true;
}
return false;
}
@Override
protected Connection findDataProvider() {
// MOD qiongli 2011-9-5 feature TDQ-3317.
Connection provider = null;
if (selectedObj instanceof RepositoryNode) {
Item connItem = ((RepositoryNode) selectedObj).getObject().getProperty().getItem();
provider = ((ConnectionItem) connItem).getConnection();
} else if (selectedObj instanceof Connection) {
provider = (Connection) selectedObj;
} else {
provider = PrvResourceFileHelper.getInstance().findProvider((IFile) selectedObj);
}
return provider;
}
@Override
protected void saveReloadResult() {
// MOD qiongli 2011-9-9,feature TDQ-3317
Item item = null;
if (selectedObj instanceof Connection) {
Connection con = (Connection) selectedObj;
Property property = PropertyHelper.getProperty(con);
if (property != null) {
item = property.getItem();
// reSet the neweast url value for context mode,this url in item is used by tdq
if (con.isContextMode()) {
if (item != null && con instanceof DatabaseConnection) {
DatabaseConnection dbConn = ConnectionUtils.getOriginalDatabaseConnection((DatabaseConnection) con);
String urlStr = DatabaseConnStrUtil.getURLString(dbConn);
if (urlStr != null) {
// mzhao 2012-06-25 bug TDI-21552 , in case of generic JDBC connection, we must not change
// the connection url in .item file.
if (!dbConn.getDatabaseType().equals(EDatabaseTypeName.GENERAL_JDBC.getDisplayName())) {
((DatabaseConnection) con).setURL(urlStr);
}
}
}
}
}
} else if (selectedObj instanceof IRepositoryViewObject) {
item = ((IRepositoryViewObject) selectedObj).getProperty().getItem();
} else {
// MOD klliu 2001-03-01 bug 17506
RepositoryNode recursiveFind = RepositoryNodeHelper.recursiveFind(oldDataProvider);
if (recursiveFind != null) {
item = recursiveFind.getObject().getProperty().getItem();
}
}
if (item == null) {
return;
}// ~
Project currentProject = ProjectManager.getInstance().getCurrentProject();
// MOD mzhao bug 20523, only save the reloaded connection resource, the client dependency (analysis) should not
// save here, it will be handled later.
try {
ProxyRepositoryFactory.getInstance().save(currentProject, item);
// Added yyin TDQ-6485, after reload the connection, set the need reload tag back to false
if (item instanceof ConnectionItem) {
ConnectionHelper.setIsConnNeedReload(((ConnectionItem) item).getConnection(), Boolean.FALSE);
}
} catch (PersistenceException e) {
log.error(e, e);
}
}
/*
* (non-Javadoc)
*
* @see org.talend.cwm.compare.factory.comparisonlevel.AbstractComparisonLevel #getSavedReloadObject()
*/
@Override
protected EObject getSavedReloadObject() throws ReloadCompareException {
return this.tempReloadProvider;
}
@Override
protected Resource getLeftResource() throws ReloadCompareException {
DQStructureComparer.clearSubNode(copyedDataProvider);
List<Package> packages = new ArrayList<Package>();
packages.addAll(ConnectionHelper.getCatalogs(copyedDataProvider));
packages.addAll(ConnectionHelper.getSchema(copyedDataProvider));
Resource leftResource = null;
leftResource = copyedDataProvider.eResource();
leftResource.getContents().clear();
for (Package catalog : packages) {
catalog.getDataManager().clear();
leftResource.getContents().add(catalog);
}
EMFSharedResources.getInstance().saveResource(leftResource);
return upperCaseResource(leftResource);
}
@Override
protected Resource getRightResource() throws ReloadCompareException {
List<Package> packages = new ArrayList<Package>();
packages.addAll(ConnectionHelper.getCatalogs(tempReloadProvider));
packages.addAll(ConnectionHelper.getSchema(tempReloadProvider));
Resource reloadResource = null;
reloadResource = tempReloadProvider.eResource();
reloadResource.getContents().clear();
for (Package catalog : packages) {
catalog.getDataManager().clear();
reloadResource.getContents().add(catalog);
}
EMFSharedResources.getInstance().saveResource(reloadResource);
return upperCaseResource(reloadResource);
}
// @Override
// protected void handleAddElement(ModelElementChangeRightTarget addElement) {
// EObject rightElement = addElement.getRightElement();
// Catalog catalog = SwitchHelpers.CATALOG_SWITCH.doSwitch(rightElement);
// if (catalog != null) {
// // ADD xqliu 2012-05-03 TDQ-4853
// catalog.getDataManager().clear();
// // ~ TDQ-4853
// ConnectionHelper.addCatalog(catalog, oldDataProvider);
// this.tempReloadProvider.getDataPackage().remove(catalog);
// } else {
// Schema schema = SwitchHelpers.SCHEMA_SWITCH.doSwitch(rightElement);
// if (schema != null) {
// // MOD qiongli 2012-2-2 TDQ 4498,if this connection have Catalog and schema,should add schema into
// // catalog.
// EObject eContainer = schema.eContainer();
// if (eContainer != null && eContainer instanceof Catalog) {
// Catalog schemaParent = (Catalog) eContainer;
// List<Schema> schemas = new ArrayList<Schema>();
// schemas.add(schema);
// Catalog oldCatalog = CatalogHelper.getCatalog(oldDataProvider, schemaParent.getName());
// if (oldCatalog != null) {
// CatalogHelper.addSchemas(schemas, oldCatalog);
// schemaParent.getOwnedElement().remove(schema);
// }
// } else {
// // ADD xqliu 2012-05-03 TDQ-4853
// schema.getDataManager().clear();
// // ~ TDQ-4853
// ConnectionHelper.addSchema(schema, oldDataProvider);
// this.tempReloadProvider.getDataPackage().remove(catalog);
// }
// }
// }
// return;
// }
// @Override
// protected void handleRemoveElement(ModelElementChangeLeftTarget removeElement) {
// Package removePackage = packageSwitch.doSwitch(removeElement.getLeftElement());
// if (removePackage == null) {
// return;
// }
// popRemoveElementConfirm();
// // MOD qiongli 2012-2-2 TDQ 4498,if this connection have Catalog and Schema,should remove schema from catalog.
// Schema schema = SwitchHelpers.SCHEMA_SWITCH.doSwitch(removePackage);
// if (schema != null && schema.eContainer() != null && schema.eContainer() instanceof Catalog) {
// Catalog schemaParent = (Catalog) schema.eContainer();
// Catalog oldCatalog = CatalogHelper.getCatalog(oldDataProvider, schemaParent.getName());
// if (oldCatalog != null && oldCatalog.getName().equalsIgnoreCase(schemaParent.getName())) {
// oldCatalog.getOwnedElement().remove(schema);
// if (oldCatalog.eResource() != null) {
// oldCatalog.eResource().getContents().remove(schema);
// }
// }
// return;
// }
// oldDataProvider.getDataPackage().remove(removePackage);
// oldDataProvider.eResource().getContents().remove(removePackage);
// }
}