// ============================================================================
//
// Copyright (C) 2006-2012 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.core.model.metadata;
import java.util.HashMap;
import java.util.Map;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
/**
* Definition of a column in the Meta Data. <br/>
*
* $Id: MetadataColumn.java 38013 2010-03-05 14:21:59Z mhirt $
*
*/
public class MetadataColumn implements IMetadataColumn, Cloneable {
private static int nextId = 0;
private String id;
private String label = ""; //$NON-NLS-1$
private boolean key = false;
private String sourceType = ""; //$NON-NLS-1$
private String talendType = ""; //$NON-NLS-1$
private boolean nullable = false;
private Integer length;
private Integer precision;
private String defaut = ""; //$NON-NLS-1$
private String comment = ""; //$NON-NLS-1$
private Integer originalLength;
private String pattern = ""; //$NON-NLS-1$
private boolean custom = false;
private boolean readOnly = false;
private int customId = 0;
private String originalDbColumnName;
private String relatedEntity = "";
private String relationshipType = "";
private String expression = "";
private Map<String, String> additionalField = new HashMap<String, String>();
public MetadataColumn() {
super();
this.id = getNewId();
}
/**
* copy all fields.
*
* @param metadataColumn
*/
public MetadataColumn(IMetadataColumn metadataColumn) {
this();
this.setLabel(metadataColumn.getLabel());
this.setOriginalDbColumnName(metadataColumn.getOriginalDbColumnName());
this.key = metadataColumn.isKey();
this.pattern = metadataColumn.getPattern();
try {
this.setTalendType(metadataColumn.getTalendType());
} catch (NoClassDefFoundError e) {
// should never happend when product run
// e.printStackTrace();
ExceptionHandler.process(e);
}
this.setType(metadataColumn.getType());
// setDbms(metadataColumn.getDbms());
this.nullable = metadataColumn.isNullable();
this.length = metadataColumn.getLength();
this.precision = metadataColumn.getPrecision();
this.originalLength = metadataColumn.getOriginalLength();
setDefault(metadataColumn.getDefault());
setComment(metadataColumn.getComment());
setOriginalLength(metadataColumn.getOriginalLength());
// Datacert: custom metadataColumn to set relatedEntity
// and relationShipType info.
setRelatedEntity(metadataColumn.getRelatedEntity());
setRelationshipType(metadataColumn.getRelationshipType());
}
private static synchronized String getNewId() {
return String.valueOf(nextId++);
}
@Override
public String toString() {
return getLabel();
}
/**
* Getter for id.
*
* @return the id
*/
public String getId() {
return this.id;
}
/**
* Sets the id.
*
* @param id the id to set
*/
public void setId(String id) {
this.id = id;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#getLabel()
*/
public String getLabel() {
return this.label;
}
// /**
// * Check the input String is empty or not.
// *
// * @param input
// * @return
// */
// private boolean isNull(String input) {
// return input == null;
// }
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#setLabel(java.lang.String)
*/
public void setLabel(String label) {
this.label = label;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#isKey()
*/
public boolean isKey() {
return this.key;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#setKey(boolean)
*/
public void setKey(boolean key) {
this.key = key;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#getType()
*/
public String getType() {
return this.sourceType;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#setType(java.lang.String)
*/
public void setType(String sourceType) {
this.sourceType = sourceType;
}
/*
* (non-Javadoc)
*
* @see org.talend.core.model.metadata.IMetadataColumn#getTalendType()
*/
public String getTalendType() {
// if ((talendType == null) || (talendType.compareTo("") == 0)) { //$NON-NLS-1$
// this.talendType = MetadataTalendType.loadTalendType(this.type, this.dbms, false);
// }
return talendType;
}
/*
* (non-Javadoc)
*
* @see org.talend.core.model.metadata.IMetadataColumn#setTalendType(java.lang.String)
*/
public void setTalendType(String talendType) {
this.talendType = talendType;
}
// /*
// * (non-Javadoc)
// *
// * @see org.talend.core.model.metadata.IMetadataColumn#getDbms()
// */
// public String getDbms() {
// return this.dbms;
// }
// /*
// * (non-Javadoc)
// *
// * @see org.talend.core.model.metadata.IMetadataColumn#setDbms(java.lang.String)
// */
// public void setDbms(String dbms) {
// this.dbms = dbms;
// }
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#getLength()
*/
public Integer getLength() {
return this.length;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#setLength(Integer)
*/
public void setLength(Integer length) {
this.length = length;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#isNullable()
*/
public boolean isNullable() {
return this.nullable;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#setNullable(boolean)
*/
public void setNullable(boolean nullable) {
this.nullable = nullable;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#getPrecision()
*/
public Integer getPrecision() {
return this.precision;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#setPrecision(Integer)
*/
public void setPrecision(Integer precision) {
this.precision = precision;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#getDefault()
*/
public String getDefault() {
return this.defaut;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#setDefault(java.lang.String)
*/
public void setDefault(String defaut) {
this.defaut = defaut;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#getComment()
*/
public String getComment() {
return this.comment;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.model.metadata.IMetadataColumn#setComment(java.lang.String)
*/
public void setComment(String comment) {
this.comment = comment;
}
/*
* (non-Javadoc)
*
* @see org.talend.core.model.metadata.IMetadataColumn#getPattern()
*/
public String getPattern() {
return this.pattern;
}
/*
* (non-Javadoc)
*
* @see org.talend.core.model.metadata.IMetadataColumn#setPattern(java.lang.String)
*/
public void setPattern(String pattern) {
this.pattern = pattern;
}
@Override
public IMetadataColumn clone() {
return clone(false);
}
public IMetadataColumn clone(boolean withCustoms) {
IMetadataColumn clonedMetacolumn = null;
try {
clonedMetacolumn = (IMetadataColumn) super.clone();
if (!withCustoms) {
clonedMetacolumn.setCustom(false);
clonedMetacolumn.setReadOnly(false);
}
} catch (CloneNotSupportedException e) {
// nothing
}
return clonedMetacolumn;
}
public boolean sameMetacolumnAs(IMetadataColumn other, int options) {
if (this == other) {
return true;
}
if (other == null) {
return false;
}
if (!(other instanceof IMetadataColumn)) {
return false;
}
if ((options & OPTIONS_IGNORE_COMMENT) == 0) {
if (!sameStringValue(this.comment, other.getComment())) {
return false;
}
}
if ((options & OPTIONS_IGNORE_KEY) == 0) {
if (this.key != other.isKey()) {
return false;
}
}
if ((options & OPTIONS_IGNORE_LABEL) == 0) {
if (!sameStringValue(this.label, other.getLabel())) {
return false;
}
}
if ((options & OPTIONS_IGNORE_PATTERN) == 0) {
if (!sameStringValue(this.pattern, other.getPattern())) {
return false;
}
}
if ((options & OPTIONS_IGNORE_LENGTH) == 0) {
if (!sameIntegerValue(this.length, other.getLength())) {
if (((options & OPTIONS_IGNORE_BIGGER_SIZE) == 0)) {
return false;
}
if (!largeValue(this.length, other.getLength())) {
return false;
}
}
}
if ((options & OPTIONS_IGNORE_ORIGINALLENGTH) == 0) {
if (!sameIntegerValue(this.originalLength, other.getOriginalLength())) {
if (((options & OPTIONS_IGNORE_BIGGER_SIZE) == 0)) {
return false;
}
if (!largeValue(this.originalLength, other.getOriginalLength())) {
return false;
}
}
}
if ((options & OPTIONS_IGNORE_NULLABLE) == 0) {
if (this.nullable != other.isNullable()) {
return false;
}
}
if ((options & OPTIONS_IGNORE_PRECISION) == 0) {
if (!sameIntegerValue(this.precision, other.getPrecision())) {
if (((options & OPTIONS_IGNORE_BIGGER_SIZE) == 0)) {
return false;
}
if (!largeValue(this.precision, other.getPrecision())) {
return false;
}
}
}
if ((options & OPTIONS_IGNORE_DEFAULT) == 0) {
if (!sameStringValue(this.defaut, other.getDefault())) {
return false;
}
}
if ((options & OPTIONS_IGNORE_TALENDTYPE) == 0) {
if (!sameStringValue(this.talendType, other.getTalendType())) {
return false;
}
}
if ((options & OPTIONS_IGNORE_DBTYPE) == 0) {
if (!sameStringValue(this.sourceType, other.getType())) {
return false;
}
}
if ((options & OPTIONS_IGNORE_DBCOLUMNNAME) == 0) {
if (!sameStringValue(this.originalDbColumnName, other.getOriginalDbColumnName())) {
return false;
}
}
if ((options & OPTIONS_IGNORE_RELATEDENTITY) == 0) {
if (!sameStringValue(this.relatedEntity, other.getRelatedEntity())) {
return false;
}
}
if ((options & OPTIONS_IGNORE_RELATIONSHIPTYPE) == 0) {
if (!sameStringValue(this.relationshipType, other.getRelationshipType())) {
return false;
}
}
return true;
}
public boolean sameMetacolumnAs(IMetadataColumn other) {
return sameMetacolumnAs(other, OPTIONS_NONE);
}
private boolean sameStringValue(String value1, String value2) {
if (value1 == null) {
if (value2 == null) {
return true;
} else {
return value2.equals(""); //$NON-NLS-1$
}
} else {
if (value1.equals("") && value2 == null) { //$NON-NLS-1$
return true;
} else {
return value1.equals(value2);
}
}
}
private boolean sameIntegerValue(Integer value1, Integer value2) {
if (value1 == null) {
if (value2 == null) {
return true;
} else {
return value2 <= 0;
}
} else {
if (value1 <= 0 && value2 == null) {
return true;
} else {
return (value1 <= 0 && value2 <= 0) || value1.equals(value2);
}
}
}
private boolean largeValue(Integer value1, Integer value2) {
if (value1 == null) {
if (value2 == null) {
return false;
} else {
return value2 > 0;
}
} else {
if (value2 == null) {
return value1 < 0;
} else {
return value1 < value2;
}
}
}
/**
* Getter for custom.
*
* @return the custom
*/
public boolean isCustom() {
return custom;
}
/**
* Sets the custom.
*
* @param custom the custom to set
*/
public void setCustom(boolean custom) {
this.custom = custom;
}
/**
* Getter for readOnly.
*
* @return the readOnly
*/
public boolean isReadOnly() {
return readOnly;
}
/**
* Sets the readOnly.
*
* @param readOnly the readOnly to set
*/
public void setReadOnly(boolean readOnly) {
this.readOnly = readOnly;
}
public int getCustomId() {
return customId;
}
public void setCustomId(int customId) {
this.customId = customId;
}
public String getOriginalDbColumnName() {
return originalDbColumnName;
}
public void setOriginalDbColumnName(String originalDbColumnName) {
this.originalDbColumnName = originalDbColumnName;
}
/**
* @return the relatedEntity
*/
public String getRelatedEntity() {
return relatedEntity;
}
/**
* @param relatedEntity the relatedEntity to set
*/
public void setRelatedEntity(String relatedEntity) {
this.relatedEntity = relatedEntity;
}
/**
* @return the relationshipType
*/
public String getRelationshipType() {
return relationshipType;
}
/**
* @param relationshipType the relationshipType to set
*/
public void setRelationshipType(String relationshipType) {
this.relationshipType = relationshipType;
}
public String getExpression() {
return this.expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
public Integer getOriginalLength() {
return originalLength;
}
public void setOriginalLength(Integer originalLength) {
this.originalLength = originalLength;
}
@Override
public Map<String, String> getAdditionalField() {
return additionalField;
}
}