// ============================================================================
//
// 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.repository.ui.actions.metadata;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.common.util.EList;
import org.talend.commons.exception.BusinessException;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.commons.utils.VersionUtils;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.context.Context;
import org.talend.core.context.RepositoryContext;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.metadata.builder.connection.ConnectionFactory;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
import org.talend.core.model.metadata.builder.connection.GenericPackage;
import org.talend.core.model.metadata.builder.connection.GenericSchemaConnection;
import org.talend.core.model.metadata.builder.connection.MetadataColumn;
import org.talend.core.model.metadata.builder.connection.MetadataTable;
import org.talend.core.model.metadata.builder.connection.impl.MetadataColumnImpl;
import org.talend.core.model.properties.DatabaseConnectionItem;
import org.talend.core.model.properties.GenericSchemaConnectionItem;
import org.talend.core.model.properties.PropertiesFactory;
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.model.utils.ContextParameterUtils;
import org.talend.core.repository.i18n.Messages;
import org.talend.core.repository.model.repositoryObject.MetadataTableRepositoryObject;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.core.service.IMetadataManagmentUiService;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.cwm.helper.PackageHelper;
import org.talend.designer.core.model.utils.emf.talendfile.ContextType;
import org.talend.repository.model.IProxyRepositoryFactory;
import orgomg.cwm.objectmodel.core.Package;
/**
* Administrator class global comment. Detailed comment <br/>
*
*/
public class CopyToGenericSchemaHelper {
private static final String DEFAULT_TABLE_NAME = "metadata"; //$NON-NLS-1$
private static IProxyRepositoryFactory repositoryFactory;
/**
* Administrator Comment method "moveToGenericSchema".
*
* @param factory
* @param targetPath
* @param ve
* @param isConnectionTableSchema
* @throws PersistenceException
*/
public static void copyToGenericSchema(IProxyRepositoryFactory factory, IRepositoryViewObject tableToMove, IPath targetPath)
throws PersistenceException {
repositoryFactory = factory;
String connectionLabel;
String dbmsId = null;
DatabaseConnection dbConnectiona = null;
if (tableToMove.getProperty().getItem() instanceof DatabaseConnectionItem) {
Connection connection = ((DatabaseConnectionItem) tableToMove.getProperty().getItem()).getConnection();
dbConnectiona = (DatabaseConnection) connection;
dbmsId = dbConnectiona.getDbmsId();
connectionLabel = tableToMove.getLabel();
} else if (tableToMove.getProperty().getItem() instanceof GenericSchemaConnectionItem) {
Connection connection = ((GenericSchemaConnectionItem) tableToMove.getProperty().getItem()).getConnection();
GenericSchemaConnection dbConnection = (GenericSchemaConnection) connection;
dbmsId = dbConnection.getMappingTypeId();
connectionLabel = tableToMove.getProperty().getItem().getProperty().getLabel();
} else {
connectionLabel = tableToMove.getProperty().getItem().getProperty().getLabel();
}
connectionLabel = connectionLabel.replace(" ", "_"); //$NON-NLS-1$ //$NON-NLS-2$
GenericSchemaConnectionItem connectionItem = PropertiesFactory.eINSTANCE.createGenericSchemaConnectionItem();
GenericSchemaConnection connection = ConnectionFactory.eINSTANCE.createGenericSchemaConnection();
// bug 23018
if (dbmsId != null && dbmsId.length() > 0) {
if (ContextParameterUtils.containContextVariables(dbmsId)) {
if (GlobalServiceRegister.getDefault().isServiceRegistered(IMetadataManagmentUiService.class)) {
IMetadataManagmentUiService mmUIService = (IMetadataManagmentUiService) GlobalServiceRegister.getDefault()
.getService(IMetadataManagmentUiService.class);
ContextType contextType = mmUIService.getContextTypeForContextMode(dbConnectiona);
if (contextType != null) {
String context = mmUIService.getOriginalValue(contextType, dbmsId);
if (context != null) {
connection.setMappingTypeId(context);
connection.setMappingTypeUsed(true);
}
}
}
}
}
MetadataTable metadataTable = ConnectionFactory.eINSTANCE.createMetadataTable();
if (metadataTable.getNamespace() instanceof Package) {
Package pkg = (Package) metadataTable.getNamespace();
pkg.getDataManager().add(connection);
}
EList listColumns;
if (tableToMove instanceof MetadataTableRepositoryObject) {
listColumns = ((MetadataTableRepositoryObject) tableToMove).getTable().getColumns();
} else {
Connection sourceConnection = ((GenericSchemaConnectionItem) tableToMove.getProperty().getItem()).getConnection();
GenericSchemaConnection dbConnection = (GenericSchemaConnection) sourceConnection;
listColumns = (ConnectionHelper.getTables(dbConnection).toArray(new MetadataTable[0])[0]).getColumns();
}
boolean isConnectionTableSchema = checkIsConnectionTableSchema(tableToMove);
if (isConnectionTableSchema) {
metadataTable.setLabel(DEFAULT_TABLE_NAME);
} else {
metadataTable.setLabel(tableToMove.getLabel() == null ? DEFAULT_TABLE_NAME : tableToMove.getLabel());
}
for (Object temp : listColumns) {
MetadataColumn column = (MetadataColumnImpl) temp;
MetadataColumn metadataColumn = ConnectionFactory.eINSTANCE.createMetadataColumn();
metadataColumn.setComment(column.getComment());
metadataColumn.setLabel(column.getLabel());
metadataColumn.setDefaultValue(column.getDefaultValue());
metadataColumn.setKey(column.isKey());
metadataColumn.setLength(column.getLength());
metadataColumn.setPrecision(column.getPrecision());
metadataColumn.setPattern(column.getPattern());
metadataColumn.setNullable(column.isNullable());
String originalField = column.getOriginalField();
if (originalField == null || "".equals(originalField)) { //$NON-NLS-1$
originalField = column.getLabel();
}
metadataColumn.setOriginalField(originalField);
metadataColumn.setTalendType(column.getTalendType());
metadataColumn.setSourceType(column.getSourceType());
metadataTable.getColumns().add(metadataColumn);
}
Property connectionProperty = PropertiesFactory.eINSTANCE.createProperty();
connectionProperty.setAuthor(((RepositoryContext) CoreRuntimePlugin.getInstance().getContext()
.getProperty(Context.REPOSITORY_CONTEXT_KEY)).getUser());
connectionProperty.setVersion(VersionUtils.DEFAULT_VERSION);
connectionProperty.setStatusCode(""); //$NON-NLS-1$
connectionProperty.setLabel(connectionLabel);
metadataTable.setId(factory.getNextId());
GenericPackage g = (GenericPackage) ConnectionHelper.getPackage(connection.getName(), (Connection) connection,
GenericPackage.class);
if (g != null) { // hywang
g.getOwnedElement().add(metadataTable);
} else {
GenericPackage gpkg = ConnectionFactory.eINSTANCE.createGenericPackage();
PackageHelper.addMetadataTable(metadataTable, gpkg);
ConnectionHelper.addPackage(gpkg, connection);
}
connectionItem.setConnection(connection);
connectionProperty.setItem(connectionItem);
connectionProperty.setId(factory.getNextId());
if (!repositoryFactory.isNameAvailable(connectionItem, connectionLabel))// name is existing in generic
// schema.
try {
setPropNewName(connectionProperty);
} catch (BusinessException e) {
// e.printStackTrace();
ExceptionHandler.process(e);
}
repositoryFactory.create(connectionItem, targetPath);
}
/**
* Comment method "checkIsConnectionTableSchema".
*
* @param objectToM m isConnectionTableSchema
* @return
*/
private static boolean checkIsConnectionTableSchema(IRepositoryViewObject objectToMove) {
if (objectToMove != null && objectToMove.getRepositoryObjectType() != null) {
ERepositoryObjectType objectType = objectToMove.getRepositoryObjectType();
if (objectType == ERepositoryObjectType.METADATA_CON_TABLE
|| objectType == ERepositoryObjectType.METADATA_CON_SYNONYM
|| objectType == ERepositoryObjectType.METADATA_CON_VIEW) {
return true;
} else {
return false;
}
}
return false;
}
/**
* Comment method "getCopiedLabel".
*
* @param copiedProperty
* @return
* @throws PersistenceException
* @throws BusinessException
*/
private static void setPropNewName(Property copiedProperty) throws PersistenceException, BusinessException {
String originalLabel = copiedProperty.getLabel();
String add1 = "Copy_of_"; //$NON-NLS-1$
String initialTry = add1 + originalLabel;
copiedProperty.setLabel(initialTry);
if (repositoryFactory.isNameAvailable(copiedProperty.getItem(), null)) {
return;
} else {
char j = 'a';
while (!repositoryFactory.isNameAvailable(copiedProperty.getItem(), null)) {
if (j > 'z') {
throw new BusinessException(Messages.getString("CopyToGenericSchemaHelper.cannotGenarateItem")); //$NON-NLS-1$
}
String nextTry = initialTry + "_" + (j++) + ""; //$NON-NLS-1$ //$NON-NLS-2$
copiedProperty.setLabel(nextTry);
}
}
}
}