// ============================================================================
//
// 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.apache.log4j.Logger;
import org.talend.core.model.metadata.builder.database.DqRepositoryViewService;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.repository.model.repositoryObject.MetadataCatalogRepositoryObject;
import org.talend.core.repository.model.repositoryObject.MetadataSchemaRepositoryObject;
import org.talend.core.repository.model.repositoryObject.TdViewRepositoryObject;
import org.talend.cwm.db.connection.ConnectionUtils;
import org.talend.cwm.helper.PackageHelper;
import org.talend.cwm.relational.TdView;
import org.talend.dataquality.PluginConstant;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.factory.DQRepNodeCreateFactory;
import org.talend.dq.nodes.foldernode.IConnectionElementSubFolder;
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 class global comment. Detailled comment
*/
public class DBViewFolderRepNode extends DQDBFolderRepositoryNode implements IConnectionElementSubFolder {
private static Logger log = Logger.getLogger(DBViewFolderRepNode.class);
private IRepositoryViewObject viewObject;
private Catalog catalog;
private Schema schema;
public Catalog getCatalog() {
return this.catalog;
}
public Schema getSchema() {
return this.schema;
}
/**
* DBViewFolderRepNode constructor comment.
*
* @param object
* @param parent if parent is null will try to create new one to insert of old parent.
* @param type
*/
public DBViewFolderRepNode(IRepositoryViewObject object, RepositoryNode parent, ENodeType type,
org.talend.core.model.general.Project inWhichProject) {
super(object, parent, type, inWhichProject);
this.viewObject = object;
if (parent == null) {
RepositoryNode createParentNode = createParentNode();
this.setParent(createParentNode);
}
}
/**
* create the node of parent.
*
* @return
*/
private RepositoryNode createParentNode() {
RepositoryNode dbParentRepNode = null;
if (viewObject instanceof MetadataCatalogRepositoryObject) {
dbParentRepNode = DQRepNodeCreateFactory.createDBCatalogRepNode(viewObject, null, ENodeType.TDQ_REPOSITORY_ELEMENT,
getProject());
} else if (viewObject instanceof MetadataSchemaRepositoryObject) {
dbParentRepNode = new DBSchemaRepNode(viewObject, null, ENodeType.TDQ_REPOSITORY_ELEMENT, getProject());
}
viewObject.setRepositoryNode(dbParentRepNode);
return dbParentRepNode;
}
@Override
public List<IRepositoryNode> getChildren() {
if (!this.isReload() && !children.isEmpty()) {
// MOD gdbu 2011-6-29 bug : 22204
return filterResultsIfAny(children);
}
children.clear();
IRepositoryViewObject object = this.getParent().getObject();
createRepositoryNodeViewFolderNode(object);
// ADD msjian 2011-7-22 22206: fix the note 93101
if (DQRepositoryNode.isUntilSchema()) {
return children;
}
// ~22206
this.setReload(false);
return filterResultsIfAny(children);
// ~22204
}
/**
* Create ViewFolderNodeRepositoryNode.
*
* @param metadataObject parent CatalogViewObject or SchemaViewObject
*/
private void createRepositoryNodeViewFolderNode(IRepositoryViewObject metadataObject) {
List<TdView> views = new ArrayList<TdView>();
String filterCharacter = null;
try {
if (metadataObject instanceof MetadataCatalogRepositoryObject) {
viewObject = ((MetadataCatalogRepositoryObject) metadataObject).getViewObject();
item = (ConnectionItem) viewObject.getProperty().getItem();
setConnection(item.getConnection());
if (((MetadataCatalogRepositoryObject) metadataObject).getCatalog().eIsProxy()) {
// reload the connection to make sure the connection(and all it's owned elements) is not proxy
reloadConnectionViewObject();
}
catalog = ((MetadataCatalogRepositoryObject) metadataObject).getCatalog();
views = PackageHelper.getViews(catalog);
filterCharacter = RepositoryNodeHelper.getViewFilter(catalog, schema);
// MOD TDQ-8718 20140505 yyin --the repository view cares about if use the filter or not, the column
// select dialog cares about if connect to DB or not.
if (views.isEmpty()) {
if (isCallingFromColumnDialog()) {
views = DqRepositoryViewService.getViews(getConnection(), catalog, null, isLoadDBFromDialog(), true);
} else if (!isOnFilterring()) {
// MOD gdbu 2011-7-21 bug 23220
views = DqRepositoryViewService.getViews(getConnection(), catalog, null, true, true);
}
if (views != null && views.size() > 0) {
ProxyRepositoryFactory.getInstance().save(item, false);
}
}
} else {
viewObject = ((MetadataSchemaRepositoryObject) metadataObject).getViewObject();
item = (ConnectionItem) viewObject.getProperty().getItem();
setConnection(item.getConnection());
if (((MetadataSchemaRepositoryObject) metadataObject).getSchema().eIsProxy()) {
// reload the connection to make sure the connection(and all it's owned elements) is not proxy
reloadConnectionViewObject();
}
schema = ((MetadataSchemaRepositoryObject) metadataObject).getSchema();
views = PackageHelper.getViews(schema);
filterCharacter = RepositoryNodeHelper.getViewFilter(catalog, schema);
RepositoryNode parent = metadataObject.getRepositoryNode().getParent();
IRepositoryViewObject object = parent.getObject();
if (object instanceof MetadataCatalogRepositoryObject && filterCharacter.equals(PluginConstant.EMPTY_STRING)) {
filterCharacter = RepositoryNodeHelper.getViewFilter(((MetadataCatalogRepositoryObject) object).getCatalog(),
null);
}
// MOD gdbu 2011-6-29 bug : 22204
if (views.isEmpty()) {
if (isCallingFromColumnDialog()) {
views = DqRepositoryViewService.getViews(getConnection(), schema, null, isLoadDBFromDialog(), true);
} else if (!isOnFilterring()) {
// MOD gdbu 2011-7-21 bug 23220
views = DqRepositoryViewService.getViews(getConnection(), schema, null, true, true);
}
if (views != null && views.size() > 0) {
ProxyRepositoryFactory.getInstance().save(item, false);
}
}
// ~22204
}
ConnectionUtils.retrieveColumn(views);
} catch (Exception e) {
log.error(e, e);
}
if (filterCharacter != null && !filterCharacter.equals(PluginConstant.EMPTY_STRING)) {
views = RepositoryNodeHelper.filterViews(views, filterCharacter);
}
createViewRepositoryNode(views, children);
}
/**
* DOC klliu Comment method "createTableRepositoryNode".
*
* @param tables
*/
private void createViewRepositoryNode(List<TdView> views, List<IRepositoryNode> node) {
if (views != null) {
for (TdView view : views) {
// create view object
TdViewRepositoryObject metadataView = new TdViewRepositoryObject(viewObject, view);
metadataView.setTableName(view.getName());
metadataView.setLabel(view.getName());
metadataView.setId(view.getName());
// create a node for ui
DBViewRepNode viewNode = new DBViewRepNode(metadataView, this, ENodeType.TDQ_REPOSITORY_ELEMENT, getProject());
viewNode.setProperties(EProperties.LABEL, ERepositoryObjectType.METADATA_CON_TABLE);
viewNode.setProperties(EProperties.CONTENT_TYPE, ERepositoryObjectType.METADATA_CON_VIEW);
metadataView.setRepositoryNode(viewNode);
node.add(viewNode);
}
}
}
/*
* (non-Javadoc)
*
* @see org.talend.repository.model.RepositoryNode#getLabel()
*/
@Override
public String getLabel() {
if (hasChildren()) {
return "Views (" + this.getChildrenCount() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
}
return "Views"; //$NON-NLS-1$
}
/*
* ADD gdbu 2011-7-25 bug : 23220
*
* children count : only read from the file
*/
private int getChildrenCount() {
List<TdView> tables = new ArrayList<TdView>();
IRepositoryViewObject object = this.getParent().getObject();
if (object instanceof MetadataCatalogRepositoryObject) {
catalog = ((MetadataCatalogRepositoryObject) object).getCatalog();
tables = PackageHelper.getViews(catalog);
} else {
schema = ((MetadataSchemaRepositoryObject) object).getSchema();
tables = PackageHelper.getViews(schema);
}
return tables.size();
}
/**
* return the Catalog or Schema, or null.
*
* @return
*/
public Package getPackage() {
Package result = null;
if (this.getCatalog() != null) {
result = this.getCatalog();
} else if (this.getSchema() != null) {
result = this.getSchema();
} else {
RepositoryNode parent = this.getParent();
if (parent instanceof DBSchemaRepNode) {
this.schema = ((DBSchemaRepNode) parent).getSchema();
result = this.schema;
} else if (parent instanceof DBCatalogRepNode) {
this.catalog = ((DBCatalogRepNode) parent).getCatalog();
result = this.catalog;
}
}
return result;
}
}