// ============================================================================
//
// 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.designer.core.model.metadata;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.talend.core.PluginChecker;
import org.talend.core.model.metadata.IMetadataColumn;
import org.talend.core.model.metadata.IMetadataTable;
import org.talend.core.model.metadata.MetadataColumn;
import org.talend.core.model.metadata.MetadataTable;
import org.talend.core.model.process.EConnectionType;
import org.talend.designer.core.model.utils.emf.talendfile.ColumnType;
import org.talend.designer.core.model.utils.emf.talendfile.MetadataType;
import org.talend.designer.core.model.utils.emf.talendfile.TalendFileFactory;
import org.talend.designer.core.model.utils.emf.talendfile.TalendFilePackage;
import org.talend.designer.core.model.utils.emf.talendfile.util.TalendFileResourceImpl;
/**
* Class that will take either a metadata or an emf object for the metadata, and that can return after the emf object or
* the metadata object.
*
* $Id: MetadataEmfFactory.java 51271 2010-11-15 08:40:42Z nrousseau $
*
*/
public class MetadataEmfFactory {
IMetadataTable metadataTable;
MetadataType metadataType;
@SuppressWarnings("unchecked")//$NON-NLS-1$
public void setMetadataTable(final IMetadataTable metadataTable) {
this.metadataTable = metadataTable;
TalendFileFactory fileFact = TalendFileFactory.eINSTANCE;
metadataType = fileFact.createMetadataType();
IMetadataColumn metaCol;
ColumnType colType;
EList listColType;
metadataType.setComment(metadataTable.getComment());
metadataType.setName(metadataTable.getTableName());
metadataType.setLabel(metadataTable.getLabel());
metadataType.setConnector(metadataTable.getAttachedConnector());
listColType = metadataType.getColumn();
if (metadataTable.getListColumns() != null) {
for (int i = 0; i < metadataTable.getListColumns().size(); i++) {
metaCol = metadataTable.getListColumns().get(i);
colType = fileFact.createColumnType();
colType.setComment(metaCol.getComment());
colType.setKey(metaCol.isKey());
colType.setNullable(metaCol.isNullable());
if (metaCol.getLength() == null) {
// colType.setLength(-1);
colType.unsetLength();
} else {
colType.setLength(metaCol.getLength());
}
if (metaCol.getOriginalLength() != null) {
colType.setOriginalLength(metaCol.getOriginalLength());
}
if (metaCol.getAdditionalField().size() > 0) {
for (String key : metaCol.getAdditionalField().keySet()) {
colType.getAdditionalField().put(key, metaCol.getAdditionalField().get(key));
}
}
colType.setName(metaCol.getLabel());
if (metaCol.getPrecision() == null) {
// colType.setPrecision(-1);
colType.unsetPrecision();
} else {
colType.setPrecision(metaCol.getPrecision());
}
if (!metaCol.getLabel().equals(metaCol.getOriginalDbColumnName())) {
colType.setOriginalDbColumnName(metaCol.getOriginalDbColumnName());
}
colType.setType(metaCol.getTalendType());
colType.setSourceType(metaCol.getType());
colType.setPattern(metaCol.getPattern());
colType.setDefaultValue(metaCol.getDefault());
if (PluginChecker.isDatacertPluginLoaded()) {
colType.setRelatedEntity(metaCol.getRelatedEntity());
colType.setRelationshipType(metaCol.getRelationshipType());
}
listColType.add(colType);
}
}
}
public void setMetadataType(final MetadataType metadataType) {
this.metadataType = metadataType;
metadataTable = new MetadataTable();
IMetadataColumn metaCol;
ColumnType colType;
EList listColType;
List<IMetadataColumn> listMetadataColumn;
metadataTable.setComment(metadataType.getComment());
metadataTable.setTableName(metadataType.getName());
metadataTable.setLabel(metadataType.getLabel());
if (metadataType.getConnector() != null) {
metadataTable.setAttachedConnector(metadataType.getConnector());
} else {
metadataTable.setAttachedConnector(EConnectionType.FLOW_MAIN.getName());
}
listColType = metadataType.getColumn();
listMetadataColumn = new ArrayList<IMetadataColumn>();
for (int i = 0; i < listColType.size(); i++) {
colType = (ColumnType) listColType.get(i);
metaCol = new MetadataColumn();
metaCol.setComment(colType.getComment());
metaCol.setKey(colType.isKey());
metaCol.setNullable(colType.isNullable());
if (colType.isSetLength()) {
if (colType.getLength() >= 0) {
metaCol.setLength(new Integer(colType.getLength()));
} else {
metaCol.setLength(null);
}
} else {
metaCol.setLength(null);
}
if (colType.getOriginalLength() >= 0) {
metaCol.setOriginalLength(new Integer(colType.getOriginalLength()));
} else {
metaCol.setOriginalLength(null);
}
if (colType.getAdditionalField().size() > 0) {
Iterator it = colType.getAdditionalField().keySet().iterator();
while (it.hasNext()) {
String key = (String) it.next();
metaCol.getAdditionalField().put(key, (String) colType.getAdditionalField().get(key));
}
}
metaCol.setLabel(colType.getName());
if (colType.isSetPrecision()) {
if (colType.getPrecision() >= 0) {
metaCol.setPrecision(new Integer(colType.getPrecision()));
} else {
metaCol.setPrecision(null);
}
} else {
metaCol.setPrecision(null);
}
metaCol.setTalendType(colType.getType());
metaCol.setType(colType.getSourceType());
metaCol.setPattern(colType.getPattern());
metaCol.setDefault(colType.getDefaultValue());
metaCol.setRelatedEntity(colType.getRelatedEntity());
metaCol.setRelationshipType(colType.getRelationshipType());
if (colType.getOriginalDbColumnName() == null) {
metaCol.setOriginalDbColumnName(colType.getName());
} else {
metaCol.setOriginalDbColumnName(colType.getOriginalDbColumnName());
}
listMetadataColumn.add(metaCol);
}
metadataTable.setListColumns(listMetadataColumn);
}
public MetadataType getMetadataType() {
return metadataType;
}
public IMetadataTable getMetadataTable() {
return metadataTable;
}
@SuppressWarnings("unchecked")//$NON-NLS-1$
public OutputStream getOutputStream() throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
URI uri = URI.createURI(""); //$NON-NLS-1$
Resource res = new TalendFileResourceImpl(uri);
res.getContents().add(metadataType);
res.save(out, null);
return out;
}
public void setInputStream(final InputStream istream) throws IOException {
URI uri = URI.createURI(""); //$NON-NLS-1$
TalendFilePackage.eINSTANCE.getNsURI();
Resource res = new TalendFileResourceImpl(uri);
res.load(istream, null);
setMetadataType((MetadataType) res.getContents().get(0));
}
}