// ============================================================================
//
// 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.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
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.core.model.repository.IRepositoryViewObject;
import org.talend.cwm.compare.DQStructureComparer;
import org.talend.cwm.compare.exception.ReloadCompareException;
import org.talend.cwm.compare.factory.IComparisonLevel;
import org.talend.cwm.compare.factory.IUIHandler;
import org.talend.cwm.db.connection.ConnectionUtils;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.cwm.helper.SwitchHelpers;
import org.talend.cwm.relational.TdColumn;
import org.talend.dq.helper.EObjectHelper;
import org.talend.dq.helper.resourcehelper.PrvResourceFileHelper;
import org.talend.dq.writer.EMFSharedResources;
import org.talend.resource.ResourceManager;
import org.talend.utils.sugars.TypedReturnCode;
import orgomg.cwm.foundation.softwaredeployment.Component;
import orgomg.cwm.objectmodel.core.ModelElement;
import orgomg.cwm.objectmodel.core.Package;
import orgomg.cwm.resource.relational.ColumnSet;
/**
*
* DOC mzhao class global comment. Compare two selected element in local structure.
*/
public class SelectedLocalComparison implements IComparisonLevel {
private static final int LEFT_RESOURCE = 0;
private static final int RIGHT_RESOURCE = 1;
private Object firstSelectedObj = null, secondSelectedObj = null;
private Connection firstSelectedDataProvider;
private Connection secondSelectedDataProvider;
private Connection tempFirstSelectedDataProvider;
private Connection tempSecondSelectedDataProvider;
private Map<String, Object> options;
public SelectedLocalComparison(Object firstSelectedObj, Object secondSelectedObj) {
this.firstSelectedObj = firstSelectedObj;
this.secondSelectedObj = secondSelectedObj;
options = new HashMap<String, Object>();
// options.put(MatchOptions.OPTION_IGNORE_XMI_ID, true);
}
@Override
public void popComparisonUI(IUIHandler uiHandler) throws ReloadCompareException {
// Judge selected elements types.
ModelElementAdapter meAdapter = new ModelElementAdapter();
firstSelectedDataProvider = meAdapter.getAdaptableProvider(firstSelectedObj);
if (firstSelectedDataProvider != null && firstSelectedDataProvider.eIsProxy()) {
firstSelectedDataProvider = (DatabaseConnection) EObjectHelper.resolveObject(firstSelectedDataProvider);
}
secondSelectedDataProvider = meAdapter.getAdaptableProvider(secondSelectedObj);
if (secondSelectedDataProvider != null && secondSelectedDataProvider.eIsProxy()) {
secondSelectedDataProvider = (DatabaseConnection) EObjectHelper.resolveObject(secondSelectedDataProvider);
}
if (firstSelectedDataProvider == null || secondSelectedDataProvider == null) {
return;
}
DQStructureComparer.deleteFirstResourceFile();
DQStructureComparer.deleteSecondResourceFile();
createTempConnectionFile();
// createCopyedProvider();
// MOD mzhao 2009-03-09 Set default dbname is first. (When compare local
// with distant structure, dbname need to
// displayed at left panel of compare editor,have not handled case when
// compared models both from local
// structure)
// DQStructureComparer.openDiffCompareEditor(getResource(LEFT_RESOURCE), getResource(RIGHT_RESOURCE), options,
// uiHandler,
// DQStructureComparer.getLocalDiffResourceFile(), firstSelectedDataProvider.getName(), firstSelectedObj, true);
}
@SuppressWarnings("deprecation")
protected void createTempConnectionFile() throws ReloadCompareException {
// First resource.
IFile selectedFile1 = PrvResourceFileHelper.getInstance().findCorrespondingFile(firstSelectedDataProvider);
if (selectedFile1 == null) {
selectedFile1 = ResourceManager.getRoot().getFile(
new Path(firstSelectedDataProvider.eResource().getURI().toPlatformString(false)));
}
IFile firstConnectionFile = DQStructureComparer.getFirstComparisonLocalFile();
IFile copyedFile1 = DQStructureComparer.copyedToDestinationFile(selectedFile1, firstConnectionFile);
TypedReturnCode<Connection> returnProvider = DqRepositoryViewService.readFromFile(copyedFile1);
if (!returnProvider.isOk()) {
throw new ReloadCompareException(returnProvider.getMessage());
}
tempFirstSelectedDataProvider = returnProvider.getObject();
// Second resource.
IFile selectedFile2 = PrvResourceFileHelper.getInstance().findCorrespondingFile(secondSelectedDataProvider);
if (selectedFile2 == null) {
selectedFile2 = ResourceManager.getRoot().getFile(
new Path(secondSelectedDataProvider.eResource().getURI().toPlatformString(false)));
}
IFile secondConnectionFile = DQStructureComparer.getSecondComparisonLocalFile();
IFile copyedFile2 = DQStructureComparer.copyedToDestinationFile(selectedFile2, secondConnectionFile);
TypedReturnCode<Connection> returnProvider2 = DqRepositoryViewService.readFromFile(copyedFile2);
if (!returnProvider2.isOk()) {
throw new ReloadCompareException(returnProvider2.getMessage());
}
tempSecondSelectedDataProvider = returnProvider2.getObject();
}
private Resource getResource(int pos) throws ReloadCompareException {
Connection tdProvider = null;
Object selectedObj = null;
switch (pos) {
case LEFT_RESOURCE:
selectedObj = firstSelectedObj;
tdProvider = tempFirstSelectedDataProvider;
break;
case RIGHT_RESOURCE:
selectedObj = secondSelectedObj;
tdProvider = tempSecondSelectedDataProvider;
break;
default:
break;
}
ModelElementAdapter meAdapter = new ModelElementAdapter();
Object rootElement = meAdapter.getListModelElements(selectedObj, tdProvider);
Resource leftResource = null;
if (rootElement instanceof Resource) {
leftResource = (Resource) rootElement;
} else {
// leftResource = tdProvider.eResource();
// leftResource.getContents().clear();
leftResource = ((ModelElement) rootElement).eResource();
leftResource.getContents().clear();
leftResource.getContents().add((ModelElement) rootElement);
}
EMFSharedResources.getInstance().saveResource(leftResource);
return leftResource;
}
/**
* DOC mzhao Interface that do instanceof converter to provider common object to client.
*
* FIXME the class should be made static.
*/
private class ModelElementAdapter {
public Connection getAdaptableProvider(Object element) {
Connection adaptedDataProvider = null;
if (element instanceof IFile) {
// IFile
adaptedDataProvider = PrvResourceFileHelper.getInstance().findProvider((IFile) element);
} else if (element instanceof IRepositoryViewObject) {
Item item = ((IRepositoryViewObject) element).getProperty().getItem();
if (item instanceof ConnectionItem) {
adaptedDataProvider = ((ConnectionItem) item).getConnection();
}
} else if (element instanceof Connection) {
adaptedDataProvider = ConnectionUtils.fillConnectionMetadataInformation((Connection) element);
} else {
Package package1 = SwitchHelpers.PACKAGE_SWITCH.doSwitch((ModelElement) element);
if (package1 != null) {
adaptedDataProvider = ConnectionHelper.getTdDataProvider(package1);
} else {
ColumnSet columnSet1 = SwitchHelpers.COLUMN_SET_SWITCH.doSwitch((ModelElement) element);
if (columnSet1 != null) {
adaptedDataProvider = ConnectionHelper.getDataProvider(columnSet1);
} else {
TdColumn column1 = SwitchHelpers.COLUMN_SWITCH.doSwitch((TdColumn) element);
if (column1 != null) {
adaptedDataProvider = ConnectionHelper.getTdDataProvider(column1);
}
}
}
}
return adaptedDataProvider;
}
public Object getListModelElements(Object element, Connection tdProvider) throws ReloadCompareException {
Object rootElement = null;
// List<ModelElement> meList = new ArrayList<ModelElement>();
if (element instanceof IFile) {
rootElement = tdProvider.eResource();
} else if (element instanceof IRepositoryViewObject) {
rootElement = tdProvider.eResource();
} else if (element instanceof Connection) {
Resource eResource = tdProvider.eResource();
EList<Package> contents = ((Connection) element).getDataPackage();// eResource().getContents();
eResource.getContents().clear();
List<EObject> objects = new ArrayList<EObject>();
for (EObject object : contents) {
if (!(object instanceof Connection || object instanceof Component)) {
objects.add(object);
}
}
eResource.getContents().addAll(objects);
rootElement = eResource;
} else {
Package package1 = SwitchHelpers.PACKAGE_SWITCH.doSwitch((ModelElement) element);
if (package1 != null) {
Package findMatchPackage = DQStructureComparer.findMatchedPackage((Package) element, tdProvider);
findMatchPackage.getDataManager().clear();
rootElement = findMatchPackage;
} else {
ColumnSet columnSet1 = SwitchHelpers.COLUMN_SET_SWITCH.doSwitch((ModelElement) element);
if (columnSet1 != null) {
ColumnSet findMatchedColumnSet = DQStructureComparer.findMatchedColumnSet(columnSet1, tdProvider);
rootElement = findMatchedColumnSet;
} else {
TdColumn column1 = SwitchHelpers.COLUMN_SWITCH.doSwitch((TdColumn) element);
if (column1 != null) {
TdColumn findMathedColumn = DQStructureComparer.findMatchedColumn(column1, tdProvider);
rootElement = findMathedColumn;
((TdColumn) rootElement).getTaggedValue().clear();
// ~MOD 2009-04-21 Clear primary key as well. If
// not clear, it
// will cause exception: not contained in
// a resource
((TdColumn) rootElement).getUniqueKey().clear();
// ~MOD 2009-04-21 Clear foreign key.
((TdColumn) rootElement).getKeyRelationship().clear();
}
}
}
}
return rootElement;
}
}
@Override
public Connection reloadCurrentLevelElement() throws ReloadCompareException {
// FIXME implement this method
return null;
}
}