// ============================================================================
//
// 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.repository;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.IService;
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.MetadataColumn;
import org.talend.core.model.metadata.builder.connection.MetadataTable;
import org.talend.core.model.metadata.builder.connection.QueriesConnection;
import org.talend.core.model.metadata.builder.connection.Query;
import org.talend.core.model.properties.DatabaseConnectionItem;
import org.talend.core.model.properties.FolderItem;
import org.talend.core.model.properties.InformationLevel;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.ItemState;
import org.talend.core.model.properties.PropertiesFactory;
import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.User;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.cwm.helper.PackageHelper;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.ERepositoryStatus;
import org.talend.repository.model.IProxyRepositoryFactory;
import org.talend.repository.model.IProxyRepositoryService;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.IRepositoryService;
import orgomg.cwm.objectmodel.core.Package;
import orgomg.cwm.resource.relational.Catalog;
/**
* DOC nrousseau class global comment. Detailled comment
*/
public class RepositoryObject implements IRepositoryObject {
protected Property property = PropertiesFactory.eINSTANCE.createProperty();
private IRepositoryNode repositoryNode;
public RepositoryObject() {
}
public RepositoryObject(Property property) {
this.property = property;
}
public Property getProperty() {
return this.property;
}
public void setProperty(Property property) {
this.property = property;
}
public RepositoryObject(String id, String label) {
this.setId(id);
this.setLabel(label);
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof RepositoryObject)) {
return false;
}
if (property == null) {
return super.equals(obj);
}
RepositoryObject another = (RepositoryObject) obj;
return getProperty().equals(another.getProperty());
}
public User getAuthor() {
return this.property.getAuthor();
}
public Date getCreationDate() {
return this.property.getCreationDate();
}
public String getDescription() {
return this.property.getDescription();
}
public String getId() {
return this.property.getId();
}
public Date getModificationDate() {
return this.property.getModificationDate();
}
public String getLabel() {
return this.property.getLabel();
}
public String getDisplayName() {
return this.property.getDisplayName();
}
public String getPurpose() {
return this.property.getPurpose();
}
public String getStatusCode() {
return this.property.getStatusCode();
}
public String getVersion() {
return this.property.getVersion();
}
public void setAuthor(User value) {
this.property.setAuthor(value);
}
public void setCreationDate(Date value) {
this.property.setCreationDate(value);
}
public void setDescription(String value) {
this.property.setDescription(value);
}
public void setId(String value) {
this.property.setId(value);
}
public void setModificationDate(Date value) {
this.property.setModificationDate(value);
}
public void setLabel(String value) {
this.property.setLabel(value);
}
public void setPurpose(String value) {
this.property.setPurpose(value);
}
public void setStatusCode(String value) {
this.property.setStatusCode(value);
}
public void setVersion(String value) {
this.property.setVersion(value);
}
public ERepositoryObjectType getRepositoryObjectType() {
return ERepositoryObjectType.getItemType(this.property.getItem());
}
public List<IRepositoryViewObject> getChildren() {
List<IRepositoryViewObject> toReturn = new ArrayList<IRepositoryViewObject>();
return toReturn;
}
@SuppressWarnings("unchecked")
public RepositoryObject cloneNewObject() {
RepositoryObject object = new RepositoryObject();
try {
Property connectionProperty = PropertiesFactory.eINSTANCE.createProperty();
connectionProperty.setAuthor(getAuthor());
connectionProperty.setCreationDate(getCreationDate());
connectionProperty.setDescription(getDescription());
connectionProperty.setId(getId());
connectionProperty.setLabel(getLabel());
connectionProperty.setDisplayName(getDisplayName());
connectionProperty.setModificationDate(getModificationDate());
connectionProperty.setPurpose(getPurpose());
connectionProperty.setStatusCode(getStatusCode());
connectionProperty.setVersion(getVersion());
final Item oldItem = getProperty().getItem();
DatabaseConnectionItem newItem = null;
if (oldItem instanceof DatabaseConnectionItem) {
DatabaseConnectionItem item = (DatabaseConnectionItem) oldItem;
newItem = PropertiesFactory.eINSTANCE.createDatabaseConnectionItem();
newItem.setProperty(connectionProperty);
ItemState state = PropertiesFactory.eINSTANCE.createItemState();
// state.setCommitDate(oldItem.getState().getCommitDate());
// state.setDeleted(oldItem.getState().isDeleted());
// state.setLockDate(oldItem.getState().getLockDate());
// state.setLocked(oldItem.getState().isLocked());
// state.setLocker(oldItem.getState().getLocker());
state.setPath(oldItem.getState().getPath());
newItem.setState(state);
final DatabaseConnection connection = (DatabaseConnection) item.getConnection();
DatabaseConnection conn = null;
if (GlobalServiceRegister.getDefault().isServiceRegistered(IRepositoryService.class)) {
IRepositoryService service = (IRepositoryService) GlobalServiceRegister.getDefault().getService(
IRepositoryService.class);
conn = service.cloneOriginalValueConnection(connection);
}
final QueriesConnection queries = connection.getQueries();
QueriesConnection newQ = null;
if (queries != null) {
newQ = ConnectionFactory.eINSTANCE.createQueriesConnection();
newQ.setConnection(conn);
final List<Query> query = queries.getQuery();
List<Query> queries2 = new ArrayList<Query>();
for (Query query2 : query) {
Query newQuery = ConnectionFactory.eINSTANCE.createQuery();
newQuery.setProperties(query2.getProperties());
newQuery.setComment(query2.getComment());
newQuery.setDivergency(query2.isDivergency());
newQuery.setId(query2.getId());
newQuery.setLabel(query2.getLabel());
newQuery.setQueries(newQ);
// newQuery.setReadOnly(query2.isReadOnly());
newQuery.setSynchronised(query2.isSynchronised());
newQuery.setValue(query2.getValue());
newQuery.setContextMode(query2.isContextMode());
queries2.add(newQuery);
}
newQ.getQuery().addAll(queries2);
}
final Set<MetadataTable> tables = ConnectionHelper.getTables(connection);
List<MetadataTable> newTs = null;
if (tables != null) {
newTs = new ArrayList<MetadataTable>();
for (MetadataTable table : tables) {
MetadataTable table2 = ConnectionFactory.eINSTANCE.createMetadataTable();
table2.setProperties(table.getProperties());
table2.setComment(table.getComment());
if (table2.getNamespace() instanceof Package) { // hywang
// remove
// setconn
Package pkg = (Package) table2.getNamespace();
pkg.getDataManager().add(conn);
}
// table2.setConnection(conn);
table2.setDivergency(table.isDivergency());
table2.setId(table.getId());
table2.setLabel(table.getLabel());
// table2.setReadOnly(table.isReadOnly());
table2.setSourceName(table.getSourceName());
table2.setSynchronised(table.isSynchronised());
table2.setTableType(table.getTableType());
List<MetadataColumn> list = new ArrayList<MetadataColumn>();
for (MetadataColumn column : (List<MetadataColumn>) table.getColumns()) {
MetadataColumn column2 = ConnectionFactory.eINSTANCE.createMetadataColumn();
column2.setProperties(column.getProperties());
column2.setComment(column.getComment());
column2.setDefaultValue(column.getDefaultValue());
column2.setDivergency(column.isDivergency());
column2.setId(column.getId());
column2.setKey(column.isKey());
column2.setLabel(column.getLabel());
column2.setLength(column.getLength());
column2.setNullable(column.isNullable());
column2.setOriginalField(column.getOriginalField());
column2.setPattern(column.getPattern());
column2.setPrecision(column.getPrecision());
// column2.setReadOnly(column.isReadOnly());
column2.setSourceType(column.getSourceType());
column2.setSynchronised(column.isSynchronised());
column2.setTable(table2);
column2.setTalendType(column.getTalendType());
list.add(column2);
}
table2.getColumns().addAll(list);
newTs.add(table2);
}
}
Catalog c = (Catalog) ConnectionHelper.getPackage(conn.getSID(), (Connection) conn, Catalog.class);
if (c != null) {
PackageHelper.addMetadataTable(newTs, c);
c.getOwnedElement().addAll(newTs);
}
conn.setQueries(newQ);
// conn.getTables().addAll(newTs);
newItem.setConnection(conn);
}
connectionProperty.setItem(newItem);
object.setProperty(connectionProperty);
} catch (Exception e) {
// e.printStackTrace();
ExceptionHandler.process(e);
// do notbing.
}
return object;
}
/*
* (non-Javadoc)
*
* @see org.talend.core.model.repository.IRepositoryObject#getRepositoryNode()
*/
public IRepositoryNode getRepositoryNode() {
return this.repositoryNode;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.core.model.repository.IRepositoryObject#setRepositoryNode(org.talend.repository.model.RepositoryNode)
*/
public void setRepositoryNode(IRepositoryNode node) {
this.repositoryNode = node;
}
/*
* (non-Javadoc)
*
* @see org.talend.core.model.repository.IRepositoryViewObject#isDeleted()
*/
public boolean isDeleted() {
return property.getItem().getState().isDeleted();
}
/*
* (non-Javadoc)
*
* @see org.talend.core.model.repository.IRepositoryViewObject#getProjectLabel()
*/
public String getProjectLabel() {
org.talend.core.model.properties.Project emfproject = ProjectManager.getInstance().getProject(property.getItem());
return emfproject.getLabel();
}
/*
* (non-Javadoc)
*
* @see org.talend.core.model.repository.IRepositoryViewObject#getPath()
*/
public String getPath() {
return property.getItem().getState().getPath();
}
/*
* (non-Javadoc)
*
* @see org.talend.core.model.repository.IRepositoryViewObject#getInformationStatus()
*/
public ERepositoryStatus getInformationStatus() {
IService service = GlobalServiceRegister.getDefault().getService(IProxyRepositoryService.class);
IProxyRepositoryFactory factory = ((IProxyRepositoryService) service).getProxyRepositoryFactory();
InformationLevel informationLevel = property.getMaxInformationLevel();
return factory.getStatus(informationLevel);
}
/*
* (non-Javadoc)
*
* @see org.talend.core.model.repository.IRepositoryViewObject#getRepositoryStatus()
*/
public ERepositoryStatus getRepositoryStatus() {
IService service = GlobalServiceRegister.getDefault().getService(IProxyRepositoryService.class);
IProxyRepositoryFactory factory = ((IProxyRepositoryService) service).getProxyRepositoryFactory();
return factory.getStatus(property.getItem());
}
/*
* (non-Javadoc)
*
* @see org.talend.core.model.repository.IRepositoryViewObject#throwPersistenceExceptionIfAny()
*/
public void throwPersistenceExceptionIfAny() throws PersistenceException {
// can't have any exception here...
}
@Override
public String toString() {
if (property != null) {
String label = "";
if (property.getItem() != null) {
ERepositoryObjectType type = ERepositoryObjectType.getItemType(property.getItem());
label = "[" + type.getKey() + "] ";
}
label += property.getLabel();
return label;
}
return super.toString();
}
public void unload() {
Item item = property.getItem();
if (item.getParent() != null && item.getParent() instanceof FolderItem) {
((FolderItem) item.getParent()).getChildren().remove(item);
item.setParent(null);
}
property = null;
}
}