// ============================================================================
//
// 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.ui.projectsetting;
import java.util.List;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.gef.commands.CommandStackEvent;
import org.eclipse.gef.commands.CommandStackEventListener;
import org.eclipse.swt.widgets.Composite;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
import org.talend.core.model.metadata.designerproperties.RepositoryToComponentProperty;
import org.talend.core.model.process.EComponentCategory;
import org.talend.core.model.process.Element;
import org.talend.core.model.process.IElementParameter;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.DatabaseConnectionItem;
import org.talend.core.model.properties.Item;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.update.UpdatesConstants;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.designer.core.model.components.EmfComponent;
import org.talend.designer.core.ui.editor.cmd.ChangeValuesFromRepository;
import org.talend.designer.core.ui.views.properties.MultipleThreadDynamicComposite;
import org.talend.repository.UpdateRepositoryUtils;
/**
* cli class global comment. Detailled comment
*/
public class ProjectSettingMultipleThreadDynamicComposite extends MultipleThreadDynamicComposite {
private CommandStack cs;
private boolean isCommandExcute;
private String repositoryPropertyName;
private boolean connectionUpdated;
public ProjectSettingMultipleThreadDynamicComposite(Composite parentComposite, int styles, EComponentCategory section,
Element element, boolean isCompactView, String repositoryPropertyName) {
super(parentComposite, styles, section, element, isCompactView);
this.repositoryPropertyName = repositoryPropertyName;
}
@Override
public CommandStack getCommandStack() {
if (cs == null) { // fixed bug 12476
cs = new CommandStack();
cs.addCommandStackEventListener(new CommandStackEventListener() {
public void stackChanged(CommandStackEvent event) {
if (event.getDetail() == CommandStack.POST_EXECUTE) {
isCommandExcute = true;
// when show connection param ,update it if needed
updateConnectionFromRepository();
}
}
});
}
return cs;
}
public boolean isCommandExcute() {
return this.isCommandExcute;
}
private void updateConnectionFromRepository() {
if (repositoryPropertyName == null || repositoryPropertyName.split(":").length != 2 || connectionUpdated) {
return;
}
String[] split = repositoryPropertyName.split(":");
String parentParamName = split[0];
Element elementParams = elem;
IElementParameter elementParameter = elementParams.getElementParameter(parentParamName);
if (elementParameter != null && elementParameter.isShow(elem.getElementParameters())
&& elementParameter.getChildParameters() != null) {
if (elementParameter.getChildParameters().get("PROPERTY_TYPE") != null
&& !EmfComponent.BUILTIN.equals(elementParameter.getChildParameters().get("PROPERTY_TYPE").getValue())) {
DatabaseConnection connection = null;
String id = (String) elementParameter.getChildParameters().get("REPOSITORY_PROPERTY_TYPE").getValue();
// bug 0018192
String propertyType = (String) elementParameter.getChildParameters().get("PROPERTY_TYPE").getValue();
ProxyRepositoryFactory proxyRepositoryFactory = ProxyRepositoryFactory.getInstance();
IRepositoryViewObject lastVersion = null;
if (null != id && !"".equals(id)) {
try {
lastVersion = proxyRepositoryFactory.getLastVersion(id);
if (null == lastVersion && propertyType.equals(EmfComponent.REPOSITORY)) {
List<ConnectionItem> connectionItems = proxyRepositoryFactory.getMetadataConnectionsItem();
if (connectionItems.isEmpty()) {
elem.setPropertyValue("REPOSITORY_PROPERTY_TYPE", "");
ChangeValuesFromRepository changeValuesFromRepository1 = new ChangeValuesFromRepository(elem,
null, parentParamName + ":" + "PROPERTY_TYPE", EmfComponent.REPOSITORY);
changeValuesFromRepository1.execute();
}
for (ConnectionItem cItem : connectionItems) {
if (cItem instanceof DatabaseConnectionItem) {
id = cItem.getProperty().getId();
lastVersion = proxyRepositoryFactory.getLastVersion(id);
elem.setPropertyValue("REPOSITORY_PROPERTY_TYPE", id);
break;
}
}
}
} catch (PersistenceException e) {
e.printStackTrace();
}
} else {
try {
List<ConnectionItem> connectionItems = proxyRepositoryFactory.getMetadataConnectionsItem();
for (ConnectionItem cItem : connectionItems) {
if (cItem instanceof DatabaseConnectionItem) {
lastVersion = UpdateRepositoryUtils.getRepositoryObjectById(cItem.getProperty().getId());
id = cItem.getProperty().getId();
lastVersion = UpdateRepositoryUtils.getRepositoryObjectById(id);
elem.setPropertyValue("REPOSITORY_PROPERTY_TYPE", id);
break;
}
}
} catch (PersistenceException e) {
e.printStackTrace();
}
}
if (lastVersion != null && lastVersion.getProperty() != null) {
Item item = lastVersion.getProperty().getItem();
if (item instanceof DatabaseConnectionItem) {
DatabaseConnectionItem dbItem = (DatabaseConnectionItem) item;
connection = (DatabaseConnection) dbItem.getConnection();
}
}
if (connection != null) {
boolean sameValues = true;
for (IElementParameter param : elementParams.getElementParameters()) {
String repositoryValue = param.getRepositoryValue();
if (param.isShow(elementParams.getElementParameters()) && repositoryValue != null
&& !param.getName().equals("PROPERTY_TYPE")) {
Object repValue = RepositoryToComponentProperty.getValue(connection, repositoryValue, null);
if (repValue == null) {
continue;
}
if (repositoryValue.equals(UpdatesConstants.TYPE)) { // datebase type
boolean found = false;
String[] list = param.getListRepositoryItems();
for (int i = 0; (i < list.length) && (!found); i++) {
if (repValue.equals(list[i])) {
found = true;
}
}
if (!found) {
sameValues = false;
break;
}
} else {
// check the value
if (!param.getValue().equals(repValue)) {
sameValues = false;
break;
}
}
}
}
if (!sameValues) {
ChangeValuesFromRepository changeValuesFromRepository = new ChangeValuesFromRepository(elem, connection,
repositoryPropertyName, id);
changeValuesFromRepository.execute();
connectionUpdated = true;
}
}
// bug 0018192
// else {
// change to build in
// ChangeValuesFromRepository changeValuesFromRepository1 = new ChangeValuesFromRepository(elem,
// null,
// parentParamName + ":" + "PROPERTY_TYPE", EmfComponent.BUILTIN);
// changeValuesFromRepository1.execute();
// }
}
}
}
}