// ============================================================================ // // 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.util.List; import org.eclipse.gef.commands.Command; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.fieldassist.DecoratedField; import org.eclipse.jface.fieldassist.IControlCreator; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; 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.swt.widgets.Shell; import org.talend.commons.exception.PersistenceException; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.core.database.EDatabaseTypeName; import org.talend.core.model.metadata.IMetadataTable; import org.talend.core.model.metadata.MetadataToolHelper; import org.talend.core.model.metadata.builder.ConvertionHelper; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.core.model.metadata.builder.connection.QueriesConnection; import org.talend.core.model.metadata.builder.connection.Query; import org.talend.core.model.metadata.builder.database.ExtractMetaDataUtils; 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.INode; 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.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.cwm.helper.ConnectionHelper; 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.PropertyChangeCommand; import org.talend.designer.core.ui.editor.cmd.QueryGuessCommand; import org.talend.designer.core.ui.editor.cmd.RepositoryChangeQueryCommand; import org.talend.designer.core.ui.editor.nodes.Node; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.RepositoryNode; import org.talend.repository.ui.dialog.RepositoryReviewDialog; /** * DOC nrousseau class global comment. Detailled comment */ public class QueryTypeController extends AbstractRepositoryController { private static final String GUESS_QUERY_NAME = "Guess Query"; //$NON-NLS-1$ /** * DOC nrousseau QueryTypeController constructor comment. * * @param dp */ public QueryTypeController(IDynamicProperty dp) { super(dp); } /* * (non-Javadoc) * * @see * org.talend.designer.core.ui.editor.properties.controllers.AbstractRepositoryController#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 = super.createControl(subComposite, param, numInRow, nbInRow, top, lastControl); IElementParameter queryStoreTypeParameter = param.getChildParameters().get(EParameterName.QUERYSTORE_TYPE.getName()); if (queryStoreTypeParameter != null) { String queryStoreType = (String) queryStoreTypeParameter.getValue(); if (queryStoreType != null && queryStoreType.equals(EmfComponent.BUILTIN)) { lastControlUsed = addGuessQueryButton(subComposite, param, lastControlUsed, numInRow, top); } } return lastControlUsed; } private Control addGuessQueryButton(Composite subComposite, IElementParameter param, Control lastControl, int numInRow, int top) { final DecoratedField dField1 = new DecoratedField(subComposite, SWT.PUSH, new IControlCreator() { @Override public Control createControl(Composite parent, int style) { return new Button(parent, style); } }); Button guessQueryButton = null; Control buttonControl = dField1.getLayoutControl(); guessQueryButton = (Button) dField1.getControl(); guessQueryButton.computeSize(SWT.DEFAULT, SWT.DEFAULT); buttonControl.setBackground(subComposite.getBackground()); guessQueryButton.setEnabled(!param.isReadOnly() || !ExtractMetaDataUtils.haveLoadMetadataNode()); guessQueryButton.setData(NAME, GUESS_QUERY_NAME); guessQueryButton.setData(PARAMETER_NAME, param.getName()); guessQueryButton.setText(GUESS_QUERY_NAME); FormData data1 = new FormData(); data1.left = new FormAttachment(lastControl, 0); data1.top = new FormAttachment(0, top); data1.height = STANDARD_HEIGHT + 2; buttonControl.setLayoutData(data1); guessQueryButton.addSelectionListener(listenerSelection); return buttonControl; } private IElementParameter getQueryTextElementParameter(IElement elem) { for (IElementParameter param : (List<IElementParameter>) elem.getElementParameters()) { if (param.getFieldType() == EParameterFieldType.MEMO_SQL) { return param; } } return null; } /* * (non-Javadoc) * * @see * org.talend.designer.core.ui.editor.properties.controllers.AbstractRepositoryController#createButtonCommand(org * .eclipse.swt.widgets.Button) */ @Override protected Command createButtonCommand(Button button) { if (button.getData(NAME).equals(GUESS_QUERY_NAME)) { return getGuessQueryCommand(); } if (button.getData(NAME).equals(REPOSITORY_CHOICE)) { RepositoryReviewDialog dialog = new RepositoryReviewDialog(button.getShell(), ERepositoryObjectType.METADATA_CON_QUERY, null); 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 = node.getObject().getProperty().getId(); String name = dialog.getResult().getObject().getLabel(); String paramName = (String) button.getData(PARAMETER_NAME); String value = id + " - " + name; //$NON-NLS-1$ Query query = MetadataToolHelper.getQueryFromRepository(value); if (query != null) { IElementParameter queryText = getQueryTextElementParameter(elem); if (queryText != null) { return new RepositoryChangeQueryCommand(elem, query, EParameterName.REPOSITORY_QUERYSTORE_TYPE.getName(), value); } } } } return null; } /** * DOC nrousseau Comment method "getGuessQueryCommand". * * @return */ private QueryGuessCommand getGuessQueryCommand() { // Map<String, IMetadataTable> repositoryTableMap = null; IMetadataTable newRepositoryMetadata = null; String realTableName = null; String realTableId = null; String schemaName = ""; // Only for getting the real table name. if (elem.getPropertyValue(EParameterName.SCHEMA_TYPE.getName()).equals(EmfComponent.REPOSITORY)) { IElementParameter repositorySchemaTypeParameter = elem.getElementParameter(EParameterName.REPOSITORY_SCHEMA_TYPE .getName()); if (repositorySchemaTypeParameter != null) { final Object value = repositorySchemaTypeParameter.getValue(); if (elem instanceof Node) { /* value can be devided means the value like "connectionid - label" */ String[] keySplitValues = value.toString().split(" - "); if (keySplitValues.length > 1) { String connectionId = value.toString().split(" - ")[0]; String tableLabel = value.toString().split(" - ")[1]; IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance(); Item item = null; try { IRepositoryViewObject repobj = factory.getLastVersion(connectionId); if (repobj != null) { Property property = repobj.getProperty(); if (property != null) { item = property.getItem(); } } } catch (PersistenceException e) { ExceptionHandler.process(e); } if (item != null && item instanceof ConnectionItem) { Connection connection = ((ConnectionItem) item).getConnection(); for (org.talend.core.model.metadata.builder.connection.MetadataTable table : ConnectionHelper .getTables(connection)) { // bug 20365 if (table.getLabel().equals(tableLabel)) { IMetadataTable repositoryMetadata = ConvertionHelper.convert(table); realTableName = repositoryMetadata.getTableName(); realTableId = repositoryMetadata.getId(); // if (table.eContainer() != null && table.eContainer() instanceof SchemaImpl) { // SchemaImpl schemaImpl = (SchemaImpl) table.eContainer(); // schemaName = schemaImpl.getName(); // dynamicProperty.getTableIdAndDbSchemaMap().put(realTableId, schemaName); // } break; } } } } // if (repositoryTableMap.containsKey(value)) { // IMetadataTable repositoryMetadata = repositoryTableMap.get(value); // realTableName = repositoryMetadata.getTableName(); // realTableId = repositoryMetadata.getId(); // } } } // } // } } // Ends Connection repositoryConnection = null; if (elem.getPropertyValue(EParameterName.PROPERTY_TYPE.getName()).equals(EmfComponent.REPOSITORY)) { final Object propertyValue = elem.getPropertyValue(EParameterName.REPOSITORY_PROPERTY_TYPE.getName()); if (propertyValue != null) { IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance(); Item item = null; try { IRepositoryViewObject repobj = factory.getLastVersion(propertyValue.toString()); if (repobj != null) { Property property = repobj.getProperty(); if (property != null) { item = property.getItem(); } } } catch (PersistenceException e) { ExceptionHandler.process(e); } if (item != null && item instanceof ConnectionItem) { repositoryConnection = ((ConnectionItem) item).getConnection(); } } } QueryGuessCommand cmd = null; INode node = null; if (elem instanceof INode) { node = (INode) elem; } else { // else instanceof Connection node = ((IConnection) elem).getSource(); } List<IMetadataTable> metadataList = node.getMetadataList(); newRepositoryMetadata = metadataList.get(0); // for tInformixRow if (newRepositoryMetadata.getListColumns().size() == 0 && metadataList.size() > 1) { newRepositoryMetadata = metadataList.get(1); } if (newRepositoryMetadata == null) { String schemaSelected = (String) node.getPropertyValue(EParameterName.REPOSITORY_SCHEMA_TYPE.getName()); if (schemaSelected != null) { // repositoryMetadata = repositoryTableMap.get(schemaSelected); } else if (newRepositoryMetadata == null) { MessageDialog .openWarning( new Shell(), Messages.getString("QueryTypeController.alert"), Messages.getString("QueryTypeController.nothingToGuess")); //$NON-NLS-1$ //$NON-NLS-2$ return cmd; } } cmd = new QueryGuessCommand(node, newRepositoryMetadata, repositoryConnection); cmd.setMaps(dynamicProperty.getTableIdAndDbTypeMap(), dynamicProperty.getTableIdAndDbSchemaMap(), null); String type = getValueFromRepositoryName("TYPE"); //$NON-NLS-1$ if ("Oracle".equalsIgnoreCase(type)) { type = EDatabaseTypeName.ORACLEFORSID.getDisplayName(); } cmd.setParameters(realTableId, realTableName, type); return cmd; } /* * (non-Javadoc) * * @see * org.talend.designer.core.ui.editor.properties.controllers.AbstractRepositoryController#createComboCommand(org * .eclipse.swt.custom.CCombo) */ @Override protected Command createComboCommand(CCombo combo) { String paramName = (String) combo.getData(PARAMETER_NAME); IElementParameter param = elem.getElementParameter(paramName); IElementParameter switchParam = elem.getElementParameter(EParameterName.REPOSITORY_ALLOW_AUTO_SWITCH.getName()); String name = param.getName(); String value = combo.getText(); for (int j = 0; j < param.getListItemsValue().length; j++) { if (combo.getText().equals(param.getListItemsDisplayName()[j])) { value = (String) param.getListItemsValue()[j]; } } if (name.equals(EParameterName.QUERYSTORE_TYPE.getName())) { if (elem instanceof Node) { String querySelected; Query repositoryQuery = null; // Map<String, Query> repositoryQueryStoreMap = this.dynamicProperty.getRepositoryQueryStoreMap(); IElementParameter repositoryParam = param.getParentParameter().getChildParameters() .get(EParameterName.REPOSITORY_QUERYSTORE_TYPE.getName()); querySelected = (String) repositoryParam.getValue(); /* value can be devided means the value like "connectionid - label" */ String[] keySplitValues = querySelected.toString().split(" - "); if (keySplitValues.length > 1) { String connectionId = querySelected.split(" - ")[0]; String queryLabel = querySelected.split(" - ")[1]; IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance(); Item item = null; try { IRepositoryViewObject repobj = factory.getLastVersion(connectionId); if (repobj != null) { Property property = repobj.getProperty(); if (property != null) { item = property.getItem(); } } } catch (PersistenceException e) { ExceptionHandler.process(e); } if (item != null && item instanceof DatabaseConnectionItem) { Connection conn = ((DatabaseConnectionItem) item).getConnection(); if (conn instanceof DatabaseConnection) { DatabaseConnection dbconn = (DatabaseConnection) conn; QueriesConnection queryConnection = dbconn.getQueries(); for (Query query : queryConnection.getQuery()) { if (query.getLabel().equals(queryLabel)) { repositoryQuery = query; break; } } } } } // if (repositoryQueryStoreMap.containsKey(querySelected)) { // repositoryQuery = repositoryQueryStoreMap.get(querySelected); // } /* * else if (dynamicProperty.getRepositoryQueryStoreMap().size() > 0) { repositoryQuery = (Query) * dynamicProperty.getRepositoryQueryStoreMap().values().toArray()[0]; } */ if (switchParam != null) { switchParam.setValue(Boolean.FALSE); } if (repositoryQuery != null) { return new RepositoryChangeQueryCommand(elem, repositoryQuery, name, value); } else { return new PropertyChangeCommand(elem, name, value); } } } return null; } /* * (non-Javadoc) * * @see * org.talend.designer.core.ui.editor.properties.controllers.AbstractRepositoryController#getRepositoryChoiceParamName * () */ @Override protected String getRepositoryChoiceParamName() { return EParameterName.REPOSITORY_QUERYSTORE_TYPE.getName(); } /* * (non-Javadoc) * * @see * org.talend.designer.core.ui.editor.properties.controllers.AbstractRepositoryController#getRepositoryTypeParamName * () */ @Override protected String getRepositoryTypeParamName() { return EParameterName.QUERYSTORE_TYPE.getName(); } // @Override // protected String getDisplayNameFromValue(IElementParameter param, String value) { // super.getDisplayNameFromValue(param, value); // if (param == null || value == null || value.equals("")) { //$NON-NLS-1$ // return null; // } // if (!param.getName().equals(getRepositoryChoiceParamName())) { // return null; // } // Item item = param.getLinkedRepositoryItem(); // Query query = null; // if (item != null) { // // item not match // query = UpdateRepositoryUtils.getQueryById(item, value); // } // if (item == null || query == null) { // // research // item = UpdateRepositoryUtils.getConnectionItemByChildId(dynamicProperty.getRepositoryConnectionItemMap(), value); // if (item != null) { // query = UpdateRepositoryUtils.getQueryById(item, value); // } // } // // if (query != null && item != null && item instanceof ConnectionItem) { // return dynamicProperty.getRepositoryAliasName((ConnectionItem) item) + ":" //$NON-NLS-1$ // + item.getProperty().getLabel() + " - " + query.getLabel(); //$NON-NLS-1$ // } // return null; // } }