// ============================================================================
//
// 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.eclipse.emf.common.util.EList;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
import org.talend.core.model.metadata.builder.connection.MetadataColumn;
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.ProxyRepositoryFactory;
import org.talend.core.repository.model.repositoryObject.MetadataCatalogRepositoryObject;
import org.talend.core.repository.model.repositoryObject.MetadataColumnRepositoryObject;
import org.talend.core.repository.model.repositoryObject.MetadataSchemaRepositoryObject;
import org.talend.core.repository.model.repositoryObject.TdTableRepositoryObject;
import org.talend.core.repository.model.repositoryObject.TdViewRepositoryObject;
import org.talend.cwm.management.i18n.Messages;
import org.talend.cwm.relational.TdColumn;
import org.talend.cwm.relational.TdTable;
import org.talend.cwm.relational.TdView;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.analysis.AnalysisContext;
import org.talend.dataquality.properties.TDQAnalysisItem;
import org.talend.dq.helper.PropertyHelper;
import org.talend.dq.nodes.factory.DQRepNodeCreateFactory;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.RepositoryNode;
import orgomg.cwm.objectmodel.core.ModelElement;
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 AnalysisSubFolderRepNode extends AnalysisFolderRepNode {
private static Logger log = Logger.getLogger(AnalysisSubFolderRepNode.class);
private List<IRepositoryNode> anaElement;
/**
* DOC talend AnalysisSubFolderRepNode constructor comment.
*
* @param object
* @param parent
* @param type
* @param inWhichProject
*/
public AnalysisSubFolderRepNode(IRepositoryViewObject object, RepositoryNode parent, ENodeType type,
org.talend.core.model.general.Project inWhichProject) {
super(object, parent, type, inWhichProject);
}
/*
* (non-Jsdoc)
*
* @see org.talend.dq.nodes.AnalysisFolderRepNode#getChildren()
*/
@Override
public List<IRepositoryNode> getChildren() {
IRepositoryViewObject anaViewObject = this.getObject();
anaElement = new ArrayList<IRepositoryNode>();
if (anaViewObject == null) {
anaViewObject = this.getParent().getObject();
TDQAnalysisItem item = (TDQAnalysisItem) anaViewObject.getProperty().getItem();
Analysis analysis = item.getAnalysis();
AnalysisContext context = analysis.getContext();
EList<ModelElement> analysedElements = context.getAnalysedElements();
// AnalysisResult results = analysis.getResults();
// EList<Indicator> indicators = results.getIndicators();
for (ModelElement analyzedElement : analysedElements) {
// ModelElement analyzedElement = indicator.getAnalyzedElement();
IRepositoryNode elementNode = doSwichNode(analyzedElement, this);
if (null == elementNode) {
// just when filtering 'elementNode' could be null
continue;
}
if (elementNode instanceof DBConnectionRepNode) {
List<IRepositoryNode> children = elementNode.getChildren();
anaElement.addAll(children);
} else {
anaElement.add(elementNode);
}
}
// MOD gdbu 2011-7-1 bug : 22204
return filterResultsIfAny(anaElement);
}
return filterResultsIfAny(super.getChildren());
// ~22204
}
/**
* DOC klliu Comment method "doSwichNode".
*
* @param analyzedElement
* @return
*/
private IRepositoryNode doSwichNode(ModelElement analyzedElement, AnalysisSubFolderRepNode childNodeFolder) {
Property anaEleProperty = PropertyHelper.getProperty(analyzedElement);
IRepositoryViewObject medataViewObject = null;
try {
medataViewObject = ProxyRepositoryFactory.getInstance().getLastVersion(anaEleProperty.getId());
} catch (Exception e) {
log.error(e);
}
// RepositoryNode recursiveFind = RepositoryNodeHelper.recursiveFind(analyzedElement);
// IRepositoryViewObject medataViewObject = null;
// if (recursiveFind != null) {
// medataViewObject = recursiveFind.getObject();
// }
if (medataViewObject != null) {
if (analyzedElement instanceof DatabaseConnection) {
DBConnectionRepNode connNode = new DBConnectionRepNode(medataViewObject, this, ENodeType.REPOSITORY_ELEMENT,
getProject());
connNode.setProperties(EProperties.CONTENT_TYPE, ERepositoryObjectType.METADATA_CONNECTIONS);
connNode.setProperties(EProperties.LABEL, ERepositoryObjectType.METADATA_CONNECTIONS);
medataViewObject.setRepositoryNode(connNode);
return connNode;
} else if (analyzedElement instanceof Catalog) {
RepositoryNode catalogNode = DQRepNodeCreateFactory.createDBCatalogRepNode(new MetadataCatalogRepositoryObject(
medataViewObject, (Catalog) analyzedElement), this, ENodeType.TDQ_REPOSITORY_ELEMENT, getProject());
catalogNode.setProperties(EProperties.LABEL, ERepositoryObjectType.METADATA_CON_CATALOG);
catalogNode.setProperties(EProperties.CONTENT_TYPE, ERepositoryObjectType.METADATA_CON_CATALOG);
medataViewObject.setRepositoryNode(catalogNode);
return catalogNode;
} else if (analyzedElement instanceof Schema) {
RepositoryNode schemaNode = new DBSchemaRepNode(new MetadataSchemaRepositoryObject(medataViewObject,
(Schema) analyzedElement), this, ENodeType.TDQ_REPOSITORY_ELEMENT, getProject());
schemaNode.setProperties(EProperties.LABEL, ERepositoryObjectType.METADATA_CON_SCHEMA);
schemaNode.setProperties(EProperties.CONTENT_TYPE, ERepositoryObjectType.METADATA_CON_SCHEMA);
medataViewObject.setRepositoryNode(schemaNode);
return schemaNode;
} else if (analyzedElement instanceof TdTable) {
DBTableRepNode tableNode = new DBTableRepNode(new TdTableRepositoryObject(medataViewObject,
(TdTable) analyzedElement), childNodeFolder, ENodeType.TDQ_REPOSITORY_ELEMENT, getProject());
tableNode.setProperties(EProperties.LABEL, ERepositoryObjectType.METADATA_CON_TABLE);
tableNode.setProperties(EProperties.CONTENT_TYPE, ERepositoryObjectType.METADATA_CON_TABLE);
medataViewObject.setRepositoryNode(tableNode);
return tableNode;
} else if (analyzedElement instanceof TdView) {
DBViewRepNode viewNode = new DBViewRepNode(
new TdViewRepositoryObject(medataViewObject, (TdView) analyzedElement), childNodeFolder,
ENodeType.TDQ_REPOSITORY_ELEMENT, getProject());
viewNode.setProperties(EProperties.LABEL, ERepositoryObjectType.METADATA_CON_VIEW);
viewNode.setProperties(EProperties.CONTENT_TYPE, ERepositoryObjectType.METADATA_CON_VIEW);
medataViewObject.setRepositoryNode(viewNode);
return viewNode;
} else if (analyzedElement instanceof MetadataColumn) {
RepositoryNode columnNode = null;
if (analyzedElement instanceof TdColumn) {
columnNode = new DBColumnRepNode(new MetadataColumnRepositoryObject(medataViewObject,
(MetadataColumn) analyzedElement), childNodeFolder, ENodeType.TDQ_REPOSITORY_ELEMENT, getProject());
} else {
columnNode = new DFColumnRepNode(new MetadataColumnRepositoryObject(medataViewObject,
(MetadataColumn) analyzedElement), this, ENodeType.TDQ_REPOSITORY_ELEMENT, getProject());
}
columnNode.setProperties(EProperties.LABEL, ERepositoryObjectType.METADATA_CON_COLUMN);
columnNode.setProperties(EProperties.CONTENT_TYPE, ERepositoryObjectType.METADATA_CON_COLUMN);
medataViewObject.setRepositoryNode(columnNode);
return columnNode;
}
}
return null;
}
public String getCount() {
IRepositoryViewObject anaViewObject = this.getParent().getObject();
if (anaViewObject.getProperty() != null) {
TDQAnalysisItem item = (TDQAnalysisItem) anaViewObject.getProperty().getItem();
Analysis analysis = item.getAnalysis();
AnalysisContext context = analysis.getContext();
EList<ModelElement> analysedElements = context.getAnalysedElements();
if (analysedElements.size() == 1) {
ModelElement modelElement = analysedElements.get(0);
if (modelElement instanceof DatabaseConnection) {
EList<Package> dataPackage = ((DatabaseConnection) modelElement).getDataPackage();
return "(" + dataPackage.size() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
}
}
return "(" + analysedElements.size() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
}
return "(0)"; //$NON-NLS-1$
}
@Override
public boolean isVirtualFolder() {
return this.getObject() == null;
}
@Override
public String getLabel() {
if (getObject() == null) {
return this.getProperties(EProperties.LABEL).toString();
// return this.getObject().getLabel();
}
return super.getLabel();
}
/*
* (non-Javadoc)
*
* @see org.talend.repository.model.RepositoryNode#getDisplayText()
*/
@Override
public String getDisplayText() {
if (getObject() == null) {
return Messages.getString("AnalysisSubFolderRepNode.analyzedElement") + getCount(); //$NON-NLS-1$
}
return getLabelWithCount();
}
}