// ============================================================================
//
// 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.editor.properties.controllers;
import java.beans.PropertyChangeEvent;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.commons.ui.runtime.image.ImageProvider;
import org.talend.commons.ui.swt.dialogs.ModelSelectionDialog;
import org.talend.commons.ui.swt.dialogs.ModelSelectionDialog.EEditSelection;
import org.talend.commons.ui.swt.dialogs.ModelSelectionDialog.ESelectionType;
import org.talend.core.CorePlugin;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.IService;
import org.talend.core.model.metadata.IMetadataColumn;
import org.talend.core.model.metadata.IMetadataTable;
import org.talend.core.model.metadata.MetadataTable;
import org.talend.core.model.metadata.MetadataToolHelper;
import org.talend.core.model.metadata.builder.ConvertionHelper;
import org.talend.core.model.process.EConnectionType;
import org.talend.core.model.process.EParameterFieldType;
import org.talend.core.model.process.IConnection;
import org.talend.core.model.process.IElement;
import org.talend.core.model.process.IElementParameter;
import org.talend.core.model.process.IElementParameterDefaultValue;
import org.talend.core.model.process.INode;
import org.talend.core.model.process.INodeConnector;
import org.talend.core.model.process.IProcess;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.ProcessItem;
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.properties.tab.IDynamicProperty;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.ui.ISAPProviderService;
import org.talend.core.ui.metadata.dialog.MetadataDialog;
import org.talend.core.ui.metadata.dialog.MetadataDialogForMerge;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.designer.core.IDesignerCoreService;
import org.talend.designer.core.i18n.Messages;
import org.talend.designer.core.model.components.EParameterName;
import org.talend.designer.core.model.components.EmfComponent;
import org.talend.designer.core.ui.editor.cmd.ChangeMetadataCommand;
import org.talend.designer.core.ui.editor.cmd.PropertyChangeCommand;
import org.talend.designer.core.ui.editor.cmd.RepositoryChangeMetadataCommand;
import org.talend.designer.core.ui.editor.connections.Connection;
import org.talend.designer.core.ui.editor.nodes.Node;
import org.talend.designer.core.utils.SAPParametersUtils;
import org.talend.designer.core.utils.ValidationRulesUtil;
import org.talend.designer.runprocess.ItemCacheManager;
import org.talend.repository.model.IMetadataService;
import org.talend.repository.model.IProxyRepositoryFactory;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.IRepositoryNode.EProperties;
import org.talend.repository.model.RepositoryNode;
import org.talend.repository.model.RepositoryNodeUtilities;
import org.talend.repository.ui.dialog.RepositoryReviewDialog;
/**
* DOC nrousseau class global comment. Detailled comment <br/>
*
* $Id: talend-code-templates.xml 1 2006-09-29 17:06:40 +0000 (ven., 29 sept. 2006) nrousseau $
*
*/
public class SchemaTypeController extends AbstractRepositoryController {
/**
*
*/
private static final String FORCE_READ_ONLY = "FORCE_READ_ONLY"; //$NON-NLS-1$
private static final String RESET_COLUMNS = "RESET_COLUMNS"; //$NON-NLS-1$
private static final String COPY_CHILD_COLUMNS = "COPY_CHILD_COLUMNS"; //$NON-NLS-1$
private static final String SCHEMA = "SCHEMA"; //$NON-NLS-1$
private static final String RETRIEVE_SCHEMA = "Retrieve Schema"; //$NON-NLS-1$
private static final String TUNISERVBTGENERIC = "tUniservBTGeneric"; //$NON-NLS-1$
protected static final int WIZARD_WIDTH = 800;
protected static final int WIZARD_HEIGHT = 495;
public SchemaTypeController(IDynamicProperty dp) {
super(dp);
}
private boolean prepareReadOnlyTable(IMetadataTable table, boolean readOnlyParam, boolean readOnlyElement) {
boolean isCustom = false;
if (table.isReadOnly()) {
return true;
}
for (IMetadataColumn column : table.getListColumns()) {
if (column.isCustom() && !column.isReadOnly()) {
isCustom = true;
}
}
if (!isCustom) {
return readOnlyParam || readOnlyElement;
}
for (IMetadataColumn column : table.getListColumns()) {
if (!column.isCustom()) {
column.setReadOnly(table.isReadOnly());
}
}
return readOnlyElement;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.designer.core.ui.editor.properties.controllers.AbstractElementPropertySectionController#createControl
* (org.eclipse.swt.widgets.Composite, org.talend.core.model.process.IElementParameter, int, int, int,
* org.eclipse.swt.widgets.Control)
*/
@Override
public Control createControl(Composite subComposite, IElementParameter param, int numInRow, int nbInRow, int top,
Control lastControl) {
Control lastControlUsed = lastControl;
if (elem instanceof Node) {
lastControlUsed = super.createControl(subComposite, param, numInRow, nbInRow, top, lastControl);
}
lastControlUsed = addButton(subComposite, param, lastControlUsed, numInRow, top);
return lastControlUsed;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.designer.core.ui.editor.properties.controllers.AbstractElementPropertySectionController#estimateRowSize
* (org.eclipse.swt.widgets.Composite, org.talend.core.model.process.IElementParameter)
*/
@Override
public int estimateRowSize(Composite subComposite, IElementParameter param) {
int comboSize, buttonSize;
CCombo combo = new CCombo(subComposite, SWT.BORDER);
IElementParameter schemaTypeParameter = param.getChildParameters().get(EParameterName.SCHEMA_TYPE.getName());
// elem.getElementParameter(EParameterName.SCHEMA_TYPE.getName());
String[] originalList = schemaTypeParameter.getListItemsDisplayName();
combo.setItems(originalList);
comboSize = combo.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
combo.dispose();
Button btn = getWidgetFactory().createButton(subComposite, "", SWT.PUSH); //$NON-NLS-1$
buttonSize = btn.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
btn.dispose();
return Math.max(comboSize, buttonSize) + ITabbedPropertyConstants.VSPACE;
}
private Control addButton(Composite subComposite, IElementParameter param, Control lastControl, int numInRow, int top) {
Button btn;
Button resetBtn = null;
Control lastControlUsed = lastControl;
Point btnSize;
FormData data;
btn = getWidgetFactory().createButton(subComposite, "", SWT.PUSH); //$NON-NLS-1$
btnSize = btn.computeSize(SWT.DEFAULT, SWT.DEFAULT);
btn.setImage(ImageProvider.getImage(CorePlugin.getImageDescriptor(DOTS_BUTTON)));
btn.addSelectionListener(listenerSelection);
btn.setData(NAME, SCHEMA);
btn.setData(PARAMETER_NAME, param.getName());
// btn.setEnabled(!param.isReadOnly());
lastControlUsed = btn;
if (elem instanceof Node) {
Node node = (Node) elem;
boolean flowMainInput = false;
boolean multipleInput = false;
boolean tableReadOnly = false;
IMetadataTable table = node.getMetadataTable(param.getContext());
if (table != null) {
if (table.isReadOnly()) {
tableReadOnly = true;
for (IMetadataColumn column : table.getListColumns()) {
if (!column.isReadOnly()) {
tableReadOnly = false;
}
}
}
}
if (!tableReadOnly) {
for (IConnection connec : node.getIncomingConnections()) {
if (connec.getLineStyle().equals(EConnectionType.FLOW_MAIN)
|| connec.getLineStyle().equals(EConnectionType.TABLE)
|| connec.getLineStyle().equals(EConnectionType.FLOW_MERGE)) {
flowMainInput = true;
}
}
if (flowMainInput) {
int nbMain = 0;
for (IConnection connec : node.getIncomingConnections()) {
if (connec.getLineStyle().equals(EConnectionType.FLOW_MAIN)) {
nbMain++;
}
}
INodeConnector nodeConnector = node.getConnectorFromName(EConnectionType.FLOW_MAIN.getName());
if (nodeConnector != null) {
int maxFlowInput = nodeConnector.getMaxLinkInput();
if (maxFlowInput > 1 && nbMain >= 1 && (nbMain <= maxFlowInput || maxFlowInput == -1)) {
multipleInput = true;
}
}
}
}
if (flowMainInput && !multipleInput && !tableReadOnly) {
resetBtn = createAdditionalButton(
subComposite,
btn,
btnSize,
param,
Messages.getString("SchemaController.syncColumns"), Messages.getString("SchemaController.resetButton.tooltip"), //$NON-NLS-1$ //$NON-NLS-2$
top);
resetBtn.setData(NAME, RESET_COLUMNS);
lastControlUsed = resetBtn;
}
if (top == 0 && node.getComponent().getName().equals(TUNISERVBTGENERIC)) {
Button newButton = null;
if (resetBtn != null) {
newButton = resetBtn;
} else {
newButton = btn;
}
Button retrieveSchemaButton = createAdditionalButton(subComposite, newButton, btnSize, param, RETRIEVE_SCHEMA,
RETRIEVE_SCHEMA, top);
retrieveSchemaButton.setData(NAME, RETRIEVE_SCHEMA);
lastControlUsed = retrieveSchemaButton;
}
// 0004322: tRunJob can import the tBufferOutput schema from the son job
if (node.getComponent().getName().equals("tRunJob")) { //$NON-NLS-1$
// for bug 10489
Button newButton = null;
if (resetBtn != null) {
newButton = resetBtn;
} else {
newButton = btn;
}
Button copySchemaButton = createAdditionalButton(subComposite, newButton, btnSize, param,
Messages.getString("SchemaController.copyChildSchema"), Messages //$NON-NLS-1$
.getString("SchemaController.copyChildSchema.tooltip"), top); //$NON-NLS-1$
copySchemaButton.setData(NAME, COPY_CHILD_COLUMNS);
lastControlUsed = copySchemaButton;
}
}
CLabel labelLabel = getWidgetFactory().createCLabel(subComposite, Messages.getString("SchemaController.editSchema")); //$NON-NLS-1$
data = new FormData();
data.left = new FormAttachment(lastControl, 0);
data.right = new FormAttachment(lastControl, labelLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).x
+ (ITabbedPropertyConstants.HSPACE * 2), SWT.RIGHT);
if (resetBtn != null) {
data.top = new FormAttachment(resetBtn, 0, SWT.CENTER);
} else {
data.top = new FormAttachment(0, top);
}
labelLabel.setLayoutData(data);
if (numInRow != 1) {
labelLabel.setAlignment(SWT.RIGHT);
}
data = new FormData();
data.left = new FormAttachment(labelLabel, 0);
data.right = new FormAttachment(labelLabel, STANDARD_BUTTON_WIDTH, SWT.RIGHT);
if (resetBtn != null) {
data.top = new FormAttachment(resetBtn, 0, SWT.CENTER);
} else {
data.top = new FormAttachment(0, top);
}
data.height = STANDARD_HEIGHT - 2;
btn.setLayoutData(data);
// curRowSize = btnSize.y + ITabbedPropertyConstants.VSPACE;
dynamicProperty.setCurRowSize(btnSize.y + ITabbedPropertyConstants.VSPACE);
return lastControlUsed;
}
private Button createAdditionalButton(Composite subComposite, Button button, Point buttonSize, IElementParameter param,
String text, String tooltip, int top) {
Button subButton = getWidgetFactory().createButton(subComposite, text, SWT.PUSH);
subButton.setToolTipText(tooltip);
Point subButtonnSize = subButton.computeSize(SWT.DEFAULT, SWT.DEFAULT);
subButton.addSelectionListener(listenerSelection);
FormData data = new FormData();
data.left = new FormAttachment(button, 0);
data.right = new FormAttachment(button, subButtonnSize.x + ITabbedPropertyConstants.HSPACE, SWT.RIGHT);
data.top = new FormAttachment(0, top);
data.height = subButtonnSize.y;
subButton.setLayoutData(data);
subButton.setData(PARAMETER_NAME, param.getName());
subButton.setEnabled(!param.isReadOnly());
if (subButtonnSize.y > buttonSize.y) {
buttonSize.y = subButtonnSize.y;
}
return subButton;
}
/**
* DOC hcw Comment method "copySchemaFromChildJob".
*
* @param runJobNode
* @param item
*/
private void copySchemaFromChildJob(Node runJobNode, final Item item) {
// 0004322: tRunJob can import the tBufferOutput schema from the son job
if (runJobNode != null && item instanceof ProcessItem) {
IDesignerCoreService service = CorePlugin.getDefault().getDesignerCoreService();
IProcess process = service.getProcessFromProcessItem((ProcessItem) item);
List<? extends INode> graphicalNodes = process.getGraphicalNodes();
for (INode node : graphicalNodes) {
if ((node != null) && node.getComponent().getName().equals("tBufferOutput")) { //$NON-NLS-1$
List<IMetadataTable> list = node.getMetadataList();
if (list.size() > 0) {
List<IMetadataTable> metadata = runJobNode.getMetadataList();
if (metadata.size() == 0) {
metadata.add(list.get(0).clone());
} else {
IMetadataTable table = metadata.get(0);
// clear schema of tRunJob, so we will replace with schema of tBufferOutput
table.getListColumns().clear();
List<IMetadataColumn> columns = list.get(0).getListColumns();
for (IMetadataColumn col : columns) {
table.getListColumns().add(col.clone());
}
}
// skip other tBufferOutput component
break;
}
}
}
}
}
/*
* (non-Javadoc)
*
* @see
* org.talend.designer.core.ui.editor.properties.controllers.AbstractElementPropertySectionController#refresh(org
* .talend.core.model.process.IElementParameter, boolean)
*/
@Override
public void refresh(IElementParameter param, boolean check) {
super.refresh(param, check);
// IElementParameter schemaTypeParameter = param.getChildParameters().get(EParameterName.SCHEMA_TYPE.getName());
// // elem.getElementParameter(EParameterName.SCHEMA_TYPE.getName());
// CCombo combo = (CCombo) hashCurControls.get(param.getName() + ":" + schemaTypeParameter.getName());
//
// if (combo == null || combo.isDisposed()) {
// return;
// }
// Object value = schemaTypeParameter.getValue();
//
// if (value instanceof String) {
// String strValue = ""; //$NON-NLS-1$
// int nbInList = 0, nbMax = schemaTypeParameter.getListItemsValue().length;
// String name = (String) value;
// while (strValue.equals(new String("")) && nbInList < nbMax) { //$NON-NLS-1$
// if (name.equals(schemaTypeParameter.getListItemsValue()[nbInList])) {
// strValue = schemaTypeParameter.getListItemsDisplayName()[nbInList];
// }
// nbInList++;
// }
// String[] paramItems = schemaTypeParameter.getListItemsDisplayName();
// String[] comboItems = combo.getItems();
// if (!paramItems.equals(comboItems)) {
// combo.setItems(paramItems);
// }
// combo.setText(strValue);
// }
//
// IElementParameter repositorySchemaTypeParameter = param.getChildParameters().get(
// EParameterName.REPOSITORY_SCHEMA_TYPE.getName());
// Text text = (Text) hashCurControls.get(param.getName() + ":" + repositorySchemaTypeParameter.getName());
//
// if (text == null || text.isDisposed()) {
// return;
// }
// value = repositorySchemaTypeParameter.getValue();
//
// if (value instanceof String) {
// // dynamicProperty.updateRepositoryList();
// // String strValue = ""; //$NON-NLS-1$
// // int nbInList = 0, nbMax = repositorySchemaTypeParameter.getListItemsValue().length;
// // String name = (String) value;
// // while (strValue.equals(new String("")) && nbInList < nbMax) { //$NON-NLS-1$
// // if (name.equals(repositorySchemaTypeParameter.getListItemsValue()[nbInList])) {
// // strValue = repositorySchemaTypeParameter.getListItemsDisplayName()[nbInList];
// // }
// // nbInList++;
// // }
// // String[] paramItems = repositorySchemaTypeParameter.getListItemsDisplayName();
// // String[] comboItems = combo.getItems();
// // if (!Arrays.equals(paramItems, comboItems)) {
// // combo.setItems(paramItems);
// // // ControlUtils.setSortedValuesForCombo(combo, paramItems);
// // }
// // combo.setText(strValue);
// text.setText((String) value);
// }
}
/*
* (non-Javadoc)
*
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent arg0) {
// TODO Auto-generated method stub
}
/**
* Find the IRepositoryObject of metadata connection thats contains current schema.
*
* @param schemaId
* @return
*/
private IRepositoryViewObject findRepositoryObject(String schemaId) {
try {
String[] names = schemaId.split(" - "); //$NON-NLS-1$
IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
IRepositoryViewObject node = factory.getLastVersion(names[0]);
return node;
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
return null;
}
/**
* Use the database table wizard to update the schema in the repository.
*
* @param button
*/
private void updateRepositorySchema(Button button) {
String paramName = (String) button.getData(PARAMETER_NAME);
String fullParamName = paramName + ":" + getRepositoryChoiceParamName(); //$NON-NLS-1$
IElementParameter schemaParam = elem.getElementParameter(fullParamName);
String schemaId = (String) schemaParam.getValue();
org.talend.core.model.metadata.builder.connection.Connection connection = MetadataToolHelper
.getConnectionFromRepository(schemaId);
String[] names = schemaId.split(" - "); //$NON-NLS-1$
if (connection == null || names == null || names.length != 2) {
// When no repository avaiable on "Repository" mode, open a MessageDialog.
MessageDialog.openError(composite.getShell(), Messages.getString("NoRepositoryDialog.Title"), Messages //$NON-NLS-1$
.getString("NoRepositoryDialog.Text")); //$NON-NLS-1$
return;
}
// find IRepositoryObject from repository that contains current connection
IRepositoryViewObject node = findRepositoryObject(schemaId);
RepositoryNode repositoryNode = RepositoryNodeUtilities.getRepositoryNode(node);
RepositoryNode metadataNode = null;
metadataNode = findRepositoryNode(names[1], names[0], repositoryNode);
if (metadataNode != null) {
final IMetadataService metadataService = CorePlugin.getDefault().getMetadataService();
if (metadataService != null) {
if (metadataNode.getObjectType() == ERepositoryObjectType.METADATA_SAP_FUNCTION) {
IService service = GlobalServiceRegister.getDefault().getService(ISAPProviderService.class);
((IMetadataService) service).runCreateTableAction(metadataNode);
} else {
metadataService.runCreateTableAction(metadataNode);
}
}
}
}
/**
* yzhang Comment method "findRepositoryNode".
*
* @param label
* @param root
* @return
*/
private RepositoryNode findRepositoryNode(String label, String id, RepositoryNode root) {
String name = (String) root.getProperties(EProperties.LABEL);
String rootID = root.getId();
RepositoryNode toReturn = null;
if (label.equals(name) && !id.equals(rootID)) {
toReturn = root;
} else {
for (IRepositoryNode node : root.getChildren()) {
toReturn = findRepositoryNode(label, id, (RepositoryNode) node);
if (toReturn != null) {
break;
}
}
}
return toReturn;
}
/**
* If schema type is repository, display a dialog to ask the user to change to built-in mode or update the schema in
* the repository. Return true to stop the process.
*
* @param button
*/
private boolean checkForRepositoryShema(Button button) {
boolean stop = false;
if (button.getData(NAME).equals(SCHEMA)) {
String paramName = (String) button.getData(PARAMETER_NAME);
String type = (String) elem.getPropertyValue(EParameterName.SCHEMA_TYPE.getName(), paramName);
if (type != null && type.equals(EmfComponent.REPOSITORY)) {
// use repository schema, pop up a dialog to ask the user for changing mode
INode node;
if (elem instanceof INode) {
node = (INode) elem;
} else { // else instanceof Connection
node = ((IConnection) elem).getSource();
}
boolean isReadOnly = node.getProcess().isReadOnly();
if (node.getJobletNode() != null) {
isReadOnly = node.isReadOnly();
}
ModelSelectionDialog modelSelect = new ModelSelectionDialog(button.getShell(), ESelectionType.SCHEMA, isReadOnly);
stop = true;
if (modelSelect.open() == ModelSelectionDialog.OK) {
if (modelSelect.getOptionValue() == EEditSelection.REPOSITORY) {
// update repository schema
button.setData(FORCE_READ_ONLY, false);
updateRepositorySchema(button);
} else if (modelSelect.getOptionValue() == EEditSelection.BUILDIN) {
// change the schema type to built in, then continue the original process
executeCommand(new RepositoryChangeSchemaBuiltinCommand(elem, paramName));
button.setData(FORCE_READ_ONLY, false);
stop = false;
} else if (modelSelect.getOptionValue() == EEditSelection.SHOW_SCHEMA) {
button.setData(FORCE_READ_ONLY, true);
stop = false;
}
}
}
}
return stop;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.designer.core.ui.editor.properties.controllers.AbstractRepositoryController#createButtonCommand(org
* .eclipse.swt.widgets.Button)
*/
@Override
protected Command createButtonCommand(Button button) {
// see 0003766: Problems with the read only mode of the properties on repository mode.
if (checkForRepositoryShema(button)) {
return null;
}
Button inputButton = button;
IElementParameter switchParam = elem.getElementParameter(EParameterName.REPOSITORY_ALLOW_AUTO_SWITCH.getName());
if (inputButton.getData(NAME).equals(SCHEMA)) {
// this map wil hold the all input connection for the tUnite component
Map<INode, Map<IMetadataTable, Boolean>> inputInfos = new HashMap<INode, Map<IMetadataTable, Boolean>>();
INode node;
if (elem instanceof Node) {
node = (INode) elem;
} else { // else instanceof Connection
node = ((IConnection) elem).getSource();
}
IMetadataTable inputMetadata = null, inputMetaCopy = null;
Connection inputConec = null;
String propertyName = (String) inputButton.getData(PARAMETER_NAME);
IElementParameter param = node.getElementParameter(propertyName);
IElementParameter connectionParam = param.getChildParameters().get(EParameterName.CONNECTION.getName());
String connectionName = null;
if (connectionParam != null) {
connectionName = (String) connectionParam.getValue();
}
Object obj = button.getData(FORCE_READ_ONLY);
boolean forceReadOnly = false;
if (obj != null) {
forceReadOnly = (Boolean) obj;
}
boolean inputReadOnly = false, outputReadOnly = false, inputReadOnlyNode = false, inputReadOnlyParam = false;
for (Connection connec : (List<Connection>) node.getIncomingConnections()) {
if (connec.isActivate()
&& (connec.getLineStyle().equals(EConnectionType.FLOW_MAIN)
|| connec.getLineStyle().equals(EConnectionType.TABLE)
|| connec.getLineStyle().equals(EConnectionType.FLOW_MERGE) || connec.getLineStyle() == EConnectionType.FLOW_REF)) {
if (connectionName != null && !connec.getName().equals(connectionName)) {
continue;
}
inputMetadata = connec.getMetadataTable();
inputMetaCopy = inputMetadata.clone();
inputConec = connec;
if (connec.getSource().isReadOnly()) {
inputReadOnlyNode = true;
} else {
for (IElementParameter curParam : connec.getSource().getElementParameters()) {
if (curParam.getFieldType() == EParameterFieldType.SCHEMA_TYPE) {
if (curParam.isReadOnly()) {
inputReadOnlyParam = true;
}
}
}
}
// check if the inputMetadata is readonly
if (inputMetadata != null) {
for (IMetadataColumn column : inputMetadata.getListColumns()) {
IMetadataColumn columnCopied = inputMetaCopy.getColumn(column.getLabel());
columnCopied.setCustom(column.isCustom());
columnCopied.setReadOnly(column.isReadOnly());
}
inputMetaCopy.setReadOnly(inputMetadata.isReadOnly());
inputReadOnly = prepareReadOnlyTable(inputMetaCopy, inputReadOnlyParam, inputReadOnlyNode);
}
// store the value for Dialog
Map<IMetadataTable, Boolean> oneInput = new HashMap<IMetadataTable, Boolean>();
oneInput.put(inputMetaCopy, inputReadOnly);
inputInfos.put(connec.getSource(), oneInput);
}
}
if (connectionParam != null && inputMetadata == null) {
MessageDialog.openError(button.getShell(), Messages.getString("SchemaTypeController.inputNotSet"), //$NON-NLS-1$
Messages.getString("SchemaTypeController.connectionNotAvaliable")); //$NON-NLS-1$
return null;
}
IMetadataTable originaleMetadataTable = getMetadataTableFromXml(node);
// check if the outputMetadata is readonly
IMetadataTable originaleOutputTable = node.getMetadataFromConnector(param.getContext());
if ("tUniservBTGeneric".equals(node.getComponent().getName())) {
originaleOutputTable = node.getMetadataTable("OUTPUT_SCHEMA");
}
IMetadataTable outputMetaCopy = originaleOutputTable.clone(true);
for (IMetadataColumn column : originaleOutputTable.getListColumns()) {
IMetadataColumn columnCopied = outputMetaCopy.getColumn(column.getLabel());
columnCopied.setCustom(column.isCustom());
columnCopied.setReadOnly(column.isReadOnly());
if (("tLogCatcher".equals(node.getComponent().getName()) || "tStatCatcher".equals(node.getComponent().getName())) //$NON-NLS-1$ //$NON-NLS-2$
&& !outputMetaCopy.sameMetadataAs(originaleMetadataTable, IMetadataColumn.OPTIONS_NONE)) {
columnCopied.setReadOnly(false);
}
// setColumnLength(node, param, columnCopied);
}
outputMetaCopy.setReadOnly(originaleOutputTable.isReadOnly()
|| param.isReadOnly(node.getElementParametersWithChildrens()));
if (("tLogCatcher".equals(node.getComponent().getName()) || "tStatCatcher".equals(node.getComponent().getName())) //$NON-NLS-1$ //$NON-NLS-2$
&& !outputMetaCopy.sameMetadataAs(originaleMetadataTable, IMetadataColumn.OPTIONS_NONE)) {
outputMetaCopy.setReadOnly(false);
}
IElementParameter schemaTypeParam = param.getChildParameters().get("SCHEMA_TYPE"); //$NON-NLS-1$
List<IElementParameterDefaultValue> defaultValues = schemaTypeParam.getDefaultValues();
for (IElementParameterDefaultValue elementParameterDefaultValue : defaultValues) {
if (elementParameterDefaultValue.getDefaultValue() instanceof MetadataTable) {
MetadataTable table = (MetadataTable) elementParameterDefaultValue.getDefaultValue();
outputMetaCopy.setReadOnlyColumnPosition(table.getReadOnlyColumnPosition());
break;
}
}
outputMetaCopy.sortCustomColumns();
if (!forceReadOnly) {
outputReadOnly = prepareReadOnlyTable(outputMetaCopy, param.isReadOnly(), node.isReadOnly());
} else {
outputReadOnly = true;
}
// create the MetadataDialog
MetadataDialog metaDialog = null;
if (inputMetadata != null) {
if (inputInfos != null && inputInfos.size() > 1 && connectionName == null) {
MetadataDialogForMerge metaDialogForMerge = new MetadataDialogForMerge(composite.getShell(), inputInfos,
outputMetaCopy, node, getCommandStack());
metaDialogForMerge.setText(Messages.getString("SchemaController.schemaOf") + node.getLabel()); //$NON-NLS-1$
metaDialogForMerge.setInputReadOnly(inputReadOnly);
metaDialogForMerge.setOutputReadOnly(outputReadOnly);
if (metaDialogForMerge.open() == MetadataDialogForMerge.OK) {
// inputMetaCopy = metaDialog.getInputMetaData();
outputMetaCopy = metaDialogForMerge.getOutputMetaData();
// check if the metadata is modified
boolean modified = false;
if (!outputMetaCopy.sameMetadataAs(originaleOutputTable, IMetadataColumn.OPTIONS_NONE)) {
modified = true;
} else {
if (inputMetadata != null) {
// Notice: the Map inputInfos maybe is modified by the dialog.
Set<INode> inputNodes = inputInfos.keySet();
for (INode inputNode : inputNodes) {
Map<IMetadataTable, Boolean> oneInput = inputInfos.get(inputNode);
inputMetaCopy = (IMetadataTable) oneInput.keySet().toArray()[0];
if (!inputMetaCopy.sameMetadataAs(inputNode.getMetadataList().get(0),
IMetadataColumn.OPTIONS_NONE)) {
modified = true;
}
}
}
}
// create the changeMetadataCommand
if (modified) {
if (switchParam != null) {
switchParam.setValue(Boolean.FALSE);
}
Command changeMetadataCommand = null;
// only output, no input
if (inputInfos.isEmpty()) {
changeMetadataCommand = new ChangeMetadataCommand(node, param, null, null, null,
originaleOutputTable, outputMetaCopy);
} else {
Set<INode> inputNodes = inputInfos.keySet();
int count = 0;
for (INode inputNode : inputNodes) {
Map<IMetadataTable, Boolean> oneInput = inputInfos.get(inputNode);
inputMetaCopy = (IMetadataTable) oneInput.keySet().toArray()[0];
if (count == 0) {
changeMetadataCommand = new ChangeMetadataCommand(node, param, inputNode, inputNode
.getMetadataList().get(0), inputMetaCopy, originaleOutputTable, outputMetaCopy);
} else {
changeMetadataCommand = changeMetadataCommand.chain(new ChangeMetadataCommand(node,
param, inputNode, inputNode.getMetadataList().get(0), inputMetaCopy,
originaleOutputTable, outputMetaCopy));
}
count++;
}
}
return changeMetadataCommand;
}
}
} else {
INode inputNode = (inputConec.getSource());
if (inputMetaCopy.getAttachedConnector() == null) {
INodeConnector mainConnector;
if (inputNode.isELTComponent()) {
mainConnector = inputNode.getConnectorFromType(EConnectionType.TABLE);
} else {
mainConnector = inputNode.getConnectorFromType(EConnectionType.FLOW_MAIN);
}
inputMetaCopy.setAttachedConnector(mainConnector.getName());
}
// INodeConnector outputConnector = node.getConnectorFromName(param.getContext());
// if (outputConnector.getMaxLinkOutput() == 0 && (originaleOutputTable.getListColumns().size() ==
// 0)) {
// metaDialog = new MetadataDialog(composite.getShell(), inputMetaCopy, inputNode,
// getCommandStack());
// } else {
metaDialog = new MetadataDialog(composite.getShell(), inputMetaCopy, inputNode, outputMetaCopy, node,
getCommandStack());
// }
}
} else {
metaDialog = new MetadataDialog(composite.getShell(), outputMetaCopy, node, getCommandStack());
}
if (metaDialog != null) {
metaDialog.setText(Messages.getString("SchemaController.schemaOf") + node.getLabel()); //$NON-NLS-1$
metaDialog.setInputReadOnly(inputReadOnly);
metaDialog.setOutputReadOnly(outputReadOnly);
if (metaDialog.open() == MetadataDialog.OK) {
inputMetaCopy = metaDialog.getInputMetaData();
outputMetaCopy = metaDialog.getOutputMetaData();
boolean modified = false;
if (!outputMetaCopy.sameMetadataAs(originaleOutputTable, IMetadataColumn.OPTIONS_NONE)) {
modified = true;
} else {
if (inputMetadata != null) {
if (!inputMetaCopy.sameMetadataAs(inputMetadata, IMetadataColumn.OPTIONS_NONE)) {
modified = true;
}
}
}
if (modified) {
if (switchParam != null) {
switchParam.setValue(Boolean.FALSE);
}
INode inputNode = null;
if (inputConec != null) {
inputNode = inputConec.getSource();
}
ChangeMetadataCommand changeMetadataCommand = new ChangeMetadataCommand(node, param, inputNode,
inputMetadata, inputMetaCopy, originaleOutputTable, outputMetaCopy);
return changeMetadataCommand;
}
}
}
} else if (inputButton.getData(NAME).equals(RETRIEVE_SCHEMA)) {
Node node = (Node) elem;
// String propertyName = (String) inputButton.getData(PARAMETER_NAME);
final Command cmd = RetrieveSchemaHelper.retrieveSchemasCommand(node);
if (switchParam != null) {
switchParam.setValue(Boolean.FALSE);
}
return cmd;
} else if (inputButton.getData(NAME).equals(RESET_COLUMNS)) {
Node node = (Node) elem;
String propertyName = (String) inputButton.getData(PARAMETER_NAME);
IElementParameter param = node.getElementParameter(propertyName);
final Command cmd = SynchronizeSchemaHelper.createCommand(node, param);
if (switchParam != null) {
switchParam.setValue(Boolean.FALSE);
}
return cmd;
} else if (button.getData(NAME).equals(REPOSITORY_CHOICE)) {
String paramName = (String) button.getData(PARAMETER_NAME);
IElementParameter schemaParam = elem.getElementParameter(paramName);
ERepositoryObjectType type = ERepositoryObjectType.METADATA_CON_TABLE;
String filter = schemaParam.getFilter();
if (elem instanceof Node) {
Node sapNode = (Node) elem;
if (sapNode.getComponent().getName().startsWith("tSAP")) { //$NON-NLS-1$
type = ERepositoryObjectType.METADATA_SAP_FUNCTION;
} else if (sapNode.getComponent().getName().startsWith("tESB")) { //$NON-NLS-1$
filter = ERepositoryObjectType.SERVICESOPERATION.getType();
}
}
RepositoryReviewDialog dialog = new RepositoryReviewDialog(button.getShell(), type, filter);
if (dialog.open() == RepositoryReviewDialog.OK) {
RepositoryNode node = dialog.getResult();
while (node.getObject().getProperty().getItem() == null
|| (!(node.getObject().getProperty().getItem() instanceof ConnectionItem))) {
node = node.getParent();
}
String id = dialog.getResult().getObject().getProperty().getId();
String name = dialog.getResult().getObject().getLabel();
String value = id + " - " + name; //$NON-NLS-1$
String fullParamName = paramName + ":" + getRepositoryChoiceParamName(); //$NON-NLS-1$
org.talend.core.model.metadata.builder.connection.Connection connection = null;
if (elem instanceof Node) {
IMetadataTable repositoryMetadata = MetadataToolHelper.getMetadataFromRepository(value);
connection = MetadataToolHelper.getConnectionFromRepository(value);
// For SAP see bug 5423
if (((Node) elem).getUniqueName().startsWith("tSAP")) { //$NON-NLS-1$
Node sapNode = (Node) elem;
String functionName = repositoryMetadata.getLabel();
for (IElementParameter param : sapNode.getElementParameters()) {
SAPParametersUtils.retrieveSAPParams(elem, connection, param, functionName);
}
}
// For validation rule.
boolean isValRulesLost = false;
IRepositoryViewObject currentValRuleObj = ValidationRulesUtil.getCurrentValidationRuleObjs(elem);
if (currentValRuleObj != null) {
List<IRepositoryViewObject> valRuleObjs = ValidationRulesUtil.getRelatedValidationRuleObjs(value);
if (!ValidationRulesUtil.isCurrentValRuleObjInList(valRuleObjs, currentValRuleObj)) {
if (!MessageDialog.openConfirm(button.getShell(),
Messages.getString("SchemaTypeController.validationrule.title.confirm"), //$NON-NLS-1$
Messages.getString("SchemaTypeController.validationrule.selectMetadataMsg"))) { //$NON-NLS-1$
return null;
} else {
isValRulesLost = true;
}
}
}
if (repositoryMetadata == null) {
repositoryMetadata = new MetadataTable();
}
if (switchParam != null) {
switchParam.setValue(Boolean.FALSE);
}
CompoundCommand cc = new CompoundCommand();
RepositoryChangeMetadataCommand changeMetadataCommand = new RepositoryChangeMetadataCommand((Node) elem,
fullParamName, value, repositoryMetadata, null, null);
changeMetadataCommand.setConnection(connection);
cc.add(changeMetadataCommand);
if (isValRulesLost) {
ValidationRulesUtil.appendRemoveValidationRuleCommands(cc, elem);
}
return cc;
}
}
} else if (button.getData(NAME).equals(COPY_CHILD_COLUMNS)) {
// 0004322: tRunJob can import the tBufferOutput schema from the son job
// 0010489 modify
String paramName = (String) button.getData(PARAMETER_NAME);
IElementParameter param = elem.getElementParameter(paramName);
IElementParameter processParam = elem.getElementParameterFromField(EParameterFieldType.PROCESS_TYPE);
IElementParameter processIdParam = processParam.getChildParameters().get(
EParameterName.PROCESS_TYPE_PROCESS.getName());
String id = (String) processIdParam.getValue();
Item item = ItemCacheManager.getProcessItem(id);
Node node = (Node) elem;
copySchemaFromChildJob(node, item);
// pop up the schema dialog
MetadataDialog metaDialog = new MetadataDialog(composite.getShell(), node.getMetadataList().get(0), node,
getCommandStack());
metaDialog.setText(Messages.getString("SchemaController.schemaOf") + node.getLabel()); //$NON-NLS-1$
if (metaDialog.open() == MetadataDialog.OK) {
IMetadataTable outputMetaData = metaDialog.getOutputMetaData();
return new ChangeMetadataCommand(node, param, null, outputMetaData);
}
}
return null;
}
private RepositoryNode getTopParent(RepositoryNode node) {
node = node.getParent();
if (node.getObject() == null) {
node = getTopParent(node);
}
return node;
}
private IMetadataTable getMetadataTableFromXml(INode node) {
IElementParameter param = node.getElementParameterFromField(EParameterFieldType.SCHEMA_TYPE);
if (param.getValue() instanceof IMetadataTable) {
IMetadataTable table = (IMetadataTable) param.getValue();
return table;
}
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.designer.core.ui.editor.properties.controllers.AbstractRepositoryController#createComboCommand(org
* .eclipse.swt.custom.CCombo)
*/
@Override
protected Command createComboCommand(CCombo combo) {
IMetadataTable repositoryMetadata = null;
String fullParamName = (String) combo.getData(PARAMETER_NAME);
IElementParameter switchParam = elem.getElementParameter(EParameterName.REPOSITORY_ALLOW_AUTO_SWITCH.getName());
String value = new String(""); //$NON-NLS-1$
IElementParameter param = elem.getElementParameter(fullParamName);
for (int j = 0; j < param.getListItemsValue().length; j++) {
if (combo.getText().equals(param.getListItemsDisplayName()[j])) {
value = (String) param.getListItemsValue()[j];
}
}
// if change to build-in, unuse the validation rule if the component has.
boolean isValRulesLost = false;
IRepositoryViewObject currentValRuleObj = ValidationRulesUtil.getCurrentValidationRuleObjs(elem);
if (value.equals(EmfComponent.BUILTIN) && currentValRuleObj != null) {
if (!MessageDialog.openConfirm(combo.getShell(),
Messages.getString("SchemaTypeController.validationrule.title.confirm"), //$NON-NLS-1$
Messages.getString("SchemaTypeController.validationrule.selectBuildInMsg"))) { //$NON-NLS-1$
return null;
} else {
isValRulesLost = true;
}
}
org.talend.core.model.metadata.builder.connection.Connection connection = null;
if (elem instanceof Node) {
Node node = (Node) elem;
Command baseCommand = null;
boolean isReadOnly = false;
String newRepositoryIdValue = null;
if (node.getMetadataFromConnector(param.getContext()) != null) {
isReadOnly = node.getMetadataFromConnector(param.getContext()).isReadOnly();
}
if (value.equals(EmfComponent.BUILTIN) && isReadOnly && !"tLogCatcher".equals(node.getComponent().getName()) //$NON-NLS-1$
&& !"tStatCatcher".equals(node.getComponent().getName())) { //$NON-NLS-1$
boolean hasMetadataInput = false;
if (node.getCurrentActiveLinksNbInput(EConnectionType.FLOW_MAIN) > 0
|| node.getCurrentActiveLinksNbInput(EConnectionType.TABLE) > 0) {
hasMetadataInput = true;
}
repositoryMetadata = new MetadataTable();
if (hasMetadataInput) {
for (Connection connec : (List<Connection>) node.getIncomingConnections()) {
if (connec.isActivate()
&& (connec.getLineStyle().equals(EConnectionType.FLOW_MAIN) || connec.getLineStyle().equals(
EConnectionType.TABLE))) {
repositoryMetadata = connec.getMetadataTable().clone();
}
}
}
} else if (value.equals(EmfComponent.REPOSITORY)) {
// Map<String, IMetadataTable> repositoryTableMap = dynamicProperty.getRepositoryTableMap();
IElementParameter property = ((Node) elem).getElementParameter(EParameterName.PROPERTY_TYPE.getName());
if ((property != null) && EmfComponent.REPOSITORY.equals(property.getValue())) {
String propertySelected = (String) ((Node) elem).getElementParameter(
EParameterName.REPOSITORY_PROPERTY_TYPE.getName()).getValue();
IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
/* 16969 */
Item item = null;
try {
IRepositoryViewObject repobj = factory.getLastVersion(propertySelected);
if (repobj != null) {
Property tmpproperty = repobj.getProperty();
if (tmpproperty != null) {
item = tmpproperty.getItem();
}
}
// item = factory.getLastVersion(propertySelected).getProperty().getItem();
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
if (item != null && item instanceof ConnectionItem) {
final ConnectionItem connectionItem = (ConnectionItem) item;
if (connectionItem != null) {
connection = connectionItem.getConnection();
}
}
}
IElementParameter repositorySchemaType = param.getParentParameter().getChildParameters()
.get(EParameterName.REPOSITORY_SCHEMA_TYPE.getName());
String schemaSelected = (String) repositorySchemaType.getValue();
/* value can be devided means the value like "connectionid - label" */
String[] keySplitValues = schemaSelected.toString().split(" - "); //$NON-NLS-1$
if (keySplitValues.length > 1) {
String connectionId = keySplitValues[0];
String tableLabel = keySplitValues[1];
IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
Item item = null;
try {
IRepositoryViewObject repobj = factory.getLastVersion(connectionId);
if (repobj != null) {
Property tmpproperty = repobj.getProperty();
if (tmpproperty != null) {
item = tmpproperty.getItem();
}
}
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
if (item != null && item instanceof ConnectionItem) {
final ConnectionItem connectionItem = (ConnectionItem) item;
if (connectionItem != null) {
connection = connectionItem.getConnection();
}
}
if (item != null && item instanceof ConnectionItem) {
boolean findTable = false;
for (org.talend.core.model.metadata.builder.connection.MetadataTable table : ConnectionHelper
.getTables(connection)) {
if (table.getLabel().equals(tableLabel)) {
repositoryMetadata = ConvertionHelper.convert(table);
newRepositoryIdValue = schemaSelected;
findTable = true;
break;
}
}
if (!findTable) {
repositoryMetadata = new MetadataTable();
}
}
} else { // value only got a empty string
repositoryMetadata = new MetadataTable();
}
/* see bug 16969 */
// if (repositoryTableMap.containsKey(schemaSelected)) {
// repositoryMetadata = repositoryTableMap.get(schemaSelected);
// // bug 6028, Display the parameter of REPOSITORY_SCHEMA_TYPE
// newRepositoryIdValue = schemaSelected;// + " - " + repositoryMetadata.getLabel();
// } else {
// if (repositoryTableMap.keySet().size() == 0) {
// repositoryMetadata = new MetadataTable();
// } else {
// newRepositoryIdValue = repositoryTableMap.keySet().iterator().next();
// // Gets the schema of the first item in repository schema type combo.
// repositoryMetadata = repositoryTableMap.get(newRepositoryIdValue);
// // bug 6028, Display the parameter of REPOSITORY_SCHEMA_TYPE
// // newRepositoryIdValue = newRepositoryIdValue + " - " + repositoryMetadata.getLabel();
// }
// }
} else {
baseCommand = new PropertyChangeCommand(elem, fullParamName, value);
}
if (switchParam != null) {
switchParam.setValue(Boolean.FALSE);
}
CompoundCommand cc = new CompoundCommand();
if (baseCommand != null) {
cc.add(baseCommand);
} else {
RepositoryChangeMetadataCommand changeMetadataCommand = new RepositoryChangeMetadataCommand((Node) elem,
fullParamName, value, repositoryMetadata, newRepositoryIdValue, null);
changeMetadataCommand.setConnection(connection);
cc.add(changeMetadataCommand);
}
// unuse the validation rules of the component.
if (isValRulesLost) {
ValidationRulesUtil.appendRemoveValidationRuleCommands(cc, elem);
}
return cc;
}
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.designer.core.ui.editor.properties.controllers.AbstractRepositoryController#getRepositoryChoiceParamName
* ()
*/
@Override
protected String getRepositoryChoiceParamName() {
return EParameterName.REPOSITORY_SCHEMA_TYPE.getName();
}
/*
* (non-Javadoc)
*
* @see
* org.talend.designer.core.ui.editor.properties.controllers.AbstractRepositoryController#getRepositoryTypeParamName
* ()
*/
@Override
protected String getRepositoryTypeParamName() {
return EParameterName.SCHEMA_TYPE.getName();
}
// @Override
// protected String getDisplayNameFromValue(IElementParameter param, String value) {
// super.getDisplayNameFromValue(param, value);
// if (value == null || "".equals(value)) { //$NON-NLS-1$
// return null;
// }
// Item item = param.getLinkedRepositoryItem();
// org.talend.core.model.metadata.builder.connection.MetadataTable table = null;
// if (item != null) {
// // item not match
// table = UpdateRepositoryUtils.getTableById(item, value);
// }
// if (item == null || table == null) {
// // research
// item = UpdateRepositoryUtils.getConnectionItemByChildId(dynamicProperty.getRepositoryConnectionItemMap(), value);
// if (item != null) {
// table = UpdateRepositoryUtils.getTableById(item, value);
// }
// }
//
// if (table != null && item != null) {
// return dynamicProperty.getRepositoryAliasName((ConnectionItem) item) + ":" + item.getProperty().getLabel() + " -
// " //$NON-NLS-1$ //$NON-NLS-2$
// + table.getLabel();
// }
//
// return null;
// }
/**
* Change the schema type to built in.
*/
class RepositoryChangeSchemaBuiltinCommand extends Command {
private IElement elem;
private String propertyName;
public RepositoryChangeSchemaBuiltinCommand(IElement elem, String propertyName) {
this.elem = elem;
this.propertyName = propertyName;
setLabel(Messages.getString("PropertyChangeCommand.Label")); //$NON-NLS-1$
}
@Override
public void execute() {
// Force redraw of Commponents propoerties
elem.setPropertyValue(EParameterName.UPDATE_COMPONENTS.getName(), new Boolean(true));
IElementParameter param = elem.getElementParameter(propertyName);
IElementParameter schemaTypeParam = param.getChildParameters().get("SCHEMA_TYPE"); //$NON-NLS-1$
schemaTypeParam.setRepositoryValueUsed(false);
schemaTypeParam.setReadOnly(false);
elem.setPropertyValue(param.getName() + ":SCHEMA_TYPE", EmfComponent.BUILTIN); //$NON-NLS-1$
}
@Override
public void undo() {
// Force redraw of Commponents propoerties
elem.setPropertyValue(EParameterName.UPDATE_COMPONENTS.getName(), new Boolean(true));
IElementParameter param = elem.getElementParameter(propertyName);
IElementParameter schemaTypeParam = param.getChildParameters().get("SCHEMA_TYPE"); //$NON-NLS-1$
schemaTypeParam.setRepositoryValueUsed(true);
schemaTypeParam.setReadOnly(true);
elem.setPropertyValue(param.getName() + ":SCHEMA_TYPE", EmfComponent.REPOSITORY); //$NON-NLS-1$
}
}
}