// ============================================================================
//
// 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.dq.nodes;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.Property;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.repositoryObject.MetadataCatalogRepositoryObject;
import org.talend.core.repository.model.repositoryObject.MetadataSchemaRepositoryObject;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.factory.DQRepNodeCreateFactory;
import org.talend.repository.model.IRepositoryNode;
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 klliu Database connection repository node displayed on repository view (UI).
*/
public class DBConnectionRepNode extends ConnectionRepNode {
List<IRepositoryNode> afterGlobalFilter;
/**
* DBConnectionRepNode constructor.
*
* @param object
* @param parent
* @param type
* @param inWhichProject
*/
public DBConnectionRepNode(IRepositoryViewObject object, RepositoryNode parent, ENodeType type,
org.talend.core.model.general.Project inWhichProject) {
super(object, parent, type, inWhichProject);
}
public DatabaseConnection getDatabaseConnection() {
Property property = this.getObject().getProperty();
if (property != null && property.getItem() != null) {
return (DatabaseConnection) ((ConnectionItem) property.getItem()).getConnection();
}
return null;
}
/*
* (non-Jsdoc)
*
* @see org.talend.repository.model.RepositoryNode#getChildren()
*/
@Override
public List<IRepositoryNode> getChildren() {
afterGlobalFilter = new ArrayList<IRepositoryNode>();
// Retrieve catalogs/schemes.
DatabaseConnection databaseConnection = getDatabaseConnection();
EList<Package> dataPackage = databaseConnection.getDataPackage();
if (dataPackage != null && dataPackage.size() > 0) {
Package pack = dataPackage.get(0);
String filterCharater = ConnectionHelper.getPackageFilter(databaseConnection);
List<IRepositoryNode> afterPackageFilter = null;
if (pack instanceof Schema) {
// MOD gdbu 2011-6-29 bug : 22204
afterGlobalFilter = filterResultsIfAny(createRepositoryNodeSchema(dataPackage));
afterPackageFilter = filterPackages(filterCharater, afterGlobalFilter);
return afterPackageFilter == null ? afterGlobalFilter : afterPackageFilter;
} else if (pack instanceof Catalog) {
afterGlobalFilter = filterResultsIfAny(createRepositoryNodeCatalog(dataPackage));
afterPackageFilter = filterPackages(filterCharater, afterGlobalFilter);
return afterPackageFilter == null ? afterGlobalFilter : afterPackageFilter;
// ~22204
}
}
return new ArrayList<IRepositoryNode>();
}
/**
*
* Filter package node for connection.
*
* @param filterCharater
* @param afterGlobalFilter
* @return
*/
private List<IRepositoryNode> filterPackages(String filterCharater, List<IRepositoryNode> afterGlobalFilter) {
if (filterCharater == null || filterCharater.trim().equalsIgnoreCase("")) {//$NON-NLS-1$
return afterGlobalFilter;
}
if (isReturnAllNodesWhenFiltering()) {
return afterGlobalFilter;
}
// MOD yyin TDQ-5077 20121213
return RepositoryNodeHelper.filterPackages(afterGlobalFilter, filterCharater);
}
/**
* DOC klliu Comment method "createRepositoryNodeSchema".
*
* @param node
* @param viewObject
* @param schema
*/
private List<IRepositoryNode> createRepositoryNodeSchema(EList<Package> dataPackage) {
List<IRepositoryNode> nodes = new ArrayList<IRepositoryNode>();
for (Package pack : dataPackage) {
initializedSchemaRepNode(nodes, pack);
}
return nodes;
}
private void initializedSchemaRepNode(List<IRepositoryNode> nodes, Package pack) {
MetadataSchemaRepositoryObject metadataSchema = new MetadataSchemaRepositoryObject(getObject(), (Schema) pack);
RepositoryNode schemaNode = new DBSchemaRepNode(metadataSchema, this, ENodeType.TDQ_REPOSITORY_ELEMENT, getProject());
schemaNode.setProperties(EProperties.LABEL, ERepositoryObjectType.METADATA_CON_SCHEMA);
schemaNode.setProperties(EProperties.CONTENT_TYPE, ERepositoryObjectType.METADATA_CON_SCHEMA);
metadataSchema.setRepositoryNode(schemaNode);
nodes.add(schemaNode);
}
/**
* DOC klliu Comment method "createRepositoryNodeCatalog".
*
* @param node
* @param viewObject
* @param catalog
*/
private List<IRepositoryNode> createRepositoryNodeCatalog(EList<Package> dataPackage) {
List<IRepositoryNode> nodes = new ArrayList<IRepositoryNode>();
for (Package pack : dataPackage) {
initializedCatalogRepNode(nodes, pack);
}
return nodes;
}
private void initializedCatalogRepNode(List<IRepositoryNode> nodes, Package pack) {
if (pack instanceof Catalog) {
MetadataCatalogRepositoryObject metadataCatalog = new MetadataCatalogRepositoryObject(getObject(), (Catalog) pack);
RepositoryNode catalogNode = DQRepNodeCreateFactory.createDBCatalogRepNode(metadataCatalog, this,
ENodeType.TDQ_REPOSITORY_ELEMENT, getProject());
catalogNode.setProperties(EProperties.LABEL, ERepositoryObjectType.METADATA_CON_CATALOG);
catalogNode.setProperties(EProperties.CONTENT_TYPE, ERepositoryObjectType.METADATA_CON_CATALOG);
metadataCatalog.setRepositoryNode(catalogNode);
nodes.add(catalogNode);
}
}
@Override
public String getLabel() {
if (getObject() == null) {
return this.getProperties(EProperties.LABEL).toString();
}
return this.getObject().getLabel();
}
@Override
public boolean canExpandForDoubleClick() {
return false;
}
public List<IRepositoryNode> getAfterGlobalFilter() {
return this.afterGlobalFilter;
}
}