// ============================================================================
//
// 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.analysis;
import java.text.DateFormat;
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.MetadataColumn;
import org.talend.core.model.metadata.builder.connection.MetadataTable;
import org.talend.core.model.properties.Property;
import org.talend.cwm.helper.ColumnHelper;
import org.talend.cwm.helper.ColumnSetHelper;
import org.talend.cwm.helper.TaggedValueHelper;
import org.talend.cwm.management.i18n.Messages;
import org.talend.cwm.relational.TdColumn;
import org.talend.dataquality.PluginConstant;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.analysis.ExecutionInformations;
import org.talend.dataquality.analysis.SampleDataShowWay;
import org.talend.dq.analysis.connpool.TdqAnalysisConnectionPool;
import org.talend.dq.analysis.parameters.IParameterConstant;
import org.talend.dq.helper.ContextHelper;
import org.talend.dq.helper.PropertyHelper;
import orgomg.cwm.foundation.softwaredeployment.DataManager;
import orgomg.cwm.objectmodel.core.ModelElement;
import orgomg.cwm.objectmodel.core.Package;
import orgomg.cwm.objectmodel.core.TaggedValue;
import orgomg.cwm.resource.relational.ColumnSet;
import orgomg.cwm.resource.relational.RelationalPackage;
import orgomg.cwm.resource.relational.Table;
import orgomg.cwm.resource.relational.View;
/**
* DOC rli class global comment. Detailled comment
*/
public class AnalysisHandler {
private static Logger log = Logger.getLogger(AnalysisHandler.class);
protected Analysis analysis;
private ExecutionInformations resultMetadata;
public AnalysisHandler() {
super();
}
/**
* DOC xqliu Comment method "createHandler".
*
* @param analysis
* @return
*/
public static AnalysisHandler createHandler(Analysis analysis) {
AnalysisHandler handler = new AnalysisHandler();
handler.setAnalysis(analysis);
return handler;
}
/**
* Method "setAnalysis".
*
* @param columnAnalysis the analysis to set
*/
public void setAnalysis(Analysis columnAnalysis) {
this.analysis = columnAnalysis;
this.resultMetadata = columnAnalysis.getResults().getResultMetadata();
}
/**
* Method "getAnalysis".
*
* @return the analysis
*/
public Analysis getAnalysis() {
return this.analysis;
}
public String getName() {
assert analysis != null;
return this.analysis.getName();
}
public void setName(String name) {
assert analysis != null;
this.analysis.setName(name);
}
public void clearAnalysis() {
assert analysis != null;
assert analysis.getContext() != null;
analysis.getContext().getAnalysedElements().clear();
analysis.getResults().getIndicators().clear();
}
public String getExecuteData() {
if (resultMetadata.getExecutionDate() != null) {
DateFormat format = DateFormat.getDateInstance(DateFormat.DEFAULT);
return format.format(resultMetadata.getExecutionDate());
} else {
return PluginConstant.EMPTY_STRING;
}
}
public String getExecuteDuration() {
return resultMetadata.getExecutionDuration() / 1000.0d + " s"; //$NON-NLS-1$
}
public String getExecuteNumber() {
return String.valueOf(resultMetadata.getExecutionNumber());
}
public String getLastExecutionNumberOk() {
if (resultMetadata != null) {
return String.valueOf(resultMetadata.getLastExecutionNumberOk());
} else {
return "0"; //$NON-NLS-1$
}
}
public ExecutionInformations getResultMetadata() {
return resultMetadata;
}
public String getConnectionName() {
DataManager connection = analysis.getContext().getConnection();
if (connection == null) {
return PluginConstant.EMPTY_STRING;
} else {
Property property = PropertyHelper.getProperty(connection);
return property == null ? PluginConstant.EMPTY_STRING : property.getLabel();
}
}
public String getTableNames() {
String str = PluginConstant.EMPTY_STRING;
for (String aStr : getColumnSetOwnerNames()) {
str = str + aStr + " "; //$NON-NLS-1$
}
return str;
}
// bug 10541 fix by zshen,Change some character set to be proper to add view in the table anasys
public String getViewNames() {
String str = PluginConstant.EMPTY_STRING;
for (String aStr : getColumnSetOwnerViewNames()) {
str = str + aStr + " "; //$NON-NLS-1$
}
return str;
}
/**
* Method "getSchemaNames".
*
* @return the schema names concatenated or the empty string (never null)
*/
public String getSchemaNames() {
String str = PluginConstant.EMPTY_STRING;
for (ColumnSet columnSet : getColumnSets()) {
Package schema = ColumnSetHelper.getParentCatalogOrSchema(columnSet);
if (schema != null && RelationalPackage.eINSTANCE.getSchema().equals(schema.eClass())) {
str = str + schema.getName() + " "; //$NON-NLS-1$
}
}
return str;
}
/**
* Method "getCatalogNames".
*
* @return the catalog names concatenated or the empty string (never null)
*/
public String getCatalogNames() {
String str = PluginConstant.EMPTY_STRING;
for (ColumnSet columnSet : getColumnSets()) {
Package schema = ColumnSetHelper.getParentCatalogOrSchema(columnSet);
if (schema == null) {
continue;
}
if (RelationalPackage.eINSTANCE.getCatalog().equals(schema.eClass())) {
str = str + schema.getName() + " "; //$NON-NLS-1$
} else {
Package catalog = ColumnSetHelper.getParentCatalogOrSchema(schema);
if (catalog != null) {
str = str + catalog.getName() + " "; //$NON-NLS-1$
}
}
}
return str;
}
public boolean isCatalogExisting() {
return getCatalogNames().trim().length() != 0 ? true : false;
}
public boolean isSchemaExisting() {
return getSchemaNames().trim().length() != 0 ? true : false;
}
private ColumnSet[] getColumnSets() {
List<ColumnSet> existingTables = new ArrayList<ColumnSet>();
for (ModelElement element : getAnalyzedColumns()) {
if (element instanceof TdColumn) {
ColumnSet columnSet = ColumnHelper.getColumnOwnerAsColumnSet(element);
if (!existingTables.contains(columnSet)) {
existingTables.add(columnSet);
}
} else if (element instanceof Table) {
ColumnSet columnSet = (ColumnSet) element;
if (!existingTables.contains(columnSet)) {
existingTables.add(columnSet);
}
}
}
return existingTables.toArray(new ColumnSet[existingTables.size()]);
}
public EList<ModelElement> getAnalyzedColumns() {
return analysis.getContext().getAnalysedElements();
}
private String[] getColumnSetOwnerNames() {
List<String> existingTables = new ArrayList<String>();
for (ModelElement element : getAnalyzedColumns()) {
if (element instanceof TdColumn && element.eContainer() instanceof Table) {
String tableName = ColumnHelper.getTableFullName((TdColumn) element);
if (!existingTables.contains(tableName)) {
existingTables.add(tableName);
}
} else if (element instanceof Table) {
String tableName = ((Table) element).getName();
if (!existingTables.contains(tableName)) {
existingTables.add(tableName);
}
} else if (element instanceof MetadataColumn) {
// ADD by msjian 2011-5-10 20881: select columns from views, "Tables:" should be followed by blank in
// the result page
if (!(element instanceof TdColumn)) {
// MOD qiongli 2011-1-28,for delimited file
try {
MetadataTable table = ColumnHelper.getColumnOwnerAsMetadataTable((MetadataColumn) element);
String tableName = table.getLabel();
if (!existingTables.contains(tableName)) {
existingTables.add(tableName);
}
} catch (java.lang.NullPointerException e) {
log.error(Messages.getString("AnalysisHandler.CanNotFindColumnParent", element.getName()), e);//$NON-NLS-1$
}
}
}
}
return existingTables.toArray(new String[existingTables.size()]);
}
// bug 10541 fix by zshen,Change some character set to be proper to add view in the table anasys
private String[] getColumnSetOwnerViewNames() {
List<String> existingViews = new ArrayList<String>();
for (ModelElement element : getAnalyzedColumns()) {
if (element instanceof TdColumn && element.eContainer() instanceof View) {
String viewName = ColumnHelper.getTableFullName((TdColumn) element);
if (!existingViews.contains(viewName)) {
existingViews.add(viewName);
}
} else if (element instanceof View) {
String viewName = ((View) element).getName();
if (!existingViews.contains(viewName)) {
existingViews.add(viewName);
}
}
}
return existingViews.toArray(new String[existingViews.size()]);
}
/**
* get NumberOfConnections Per Analysis with the real value.
*
* @return
*/
public int getNumberOfConnectionsPerAnalysis() throws NumberFormatException {
int num = TdqAnalysisConnectionPool.CONNECTIONS_PER_ANALYSIS_DEFAULT_LENGTH;
if (this.analysis != null) {
TaggedValue taggedValue = TaggedValueHelper.getTaggedValue(
TdqAnalysisConnectionPool.NUMBER_OF_CONNECTIONS_PER_ANALYSIS, this.analysis.getTaggedValue());
if (taggedValue != null) {
num = Integer.valueOf(ContextHelper.getAnalysisContextValue(analysis, taggedValue.getValue()));
}
}
return num;
}
/**
* get NumberOfConnections Per Analysis with context value.
*
* @return
*/
public String getNumberOfConnectionsPerAnalysisWithContext() {
int num = TdqAnalysisConnectionPool.CONNECTIONS_PER_ANALYSIS_DEFAULT_LENGTH;
if (this.analysis != null) {
TaggedValue taggedValue = TaggedValueHelper.getTaggedValue(
TdqAnalysisConnectionPool.NUMBER_OF_CONNECTIONS_PER_ANALYSIS, this.analysis.getTaggedValue());
if (taggedValue != null) {
return taggedValue.getValue();
}
}
return String.valueOf(num);
}
/**
* find in analysis's parameter if has: DefaultLoadedRowCount".if has:get its value, if not, create one
*
* @return
*/
public String getDefaultLoadedRowCount() {
if (this.analysis != null) {
TaggedValue taggedValue = TaggedValueHelper.getTaggedValue(TaggedValueHelper.PREVIEW_ROW_NUMBER,
this.analysis.getTaggedValue());
if (taggedValue != null) {
return taggedValue.getValue();
}
}
return IParameterConstant.ANALYSIS_PREVIEW_NUMBER_ROW;
}
/**
* Change the max number of rows
*
* @param text
*/
public void changeDefaultRowLoaded(String text) {
TaggedValueHelper.setTaggedValue(analysis, TaggedValueHelper.PREVIEW_ROW_NUMBER, text);
}
/**
* Change the max number of rows
*
* @param text
*/
public void changeSampleDataShowWay(String text) {
analysis.getParameters().setSampleDataShowWay(SampleDataShowWay.get(text));
}
}