// ============================================================================
//
// 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.PropertyChangeListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.collections.BidiMap;
import org.apache.commons.lang.StringUtils;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.fieldassist.IContentProposal;
import org.eclipse.jface.fieldassist.IContentProposalListener;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Resource;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.views.properties.PropertySheet;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
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.commons.ui.swt.proposal.ContentProposalAdapterExtended;
import org.talend.commons.ui.utils.ControlUtils;
import org.talend.commons.ui.utils.TypedTextCommandExecutor;
import org.talend.commons.utils.generation.CodeGenerationUtils;
import org.talend.core.CorePlugin;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.context.RepositoryContext;
import org.talend.core.database.EDatabaseTypeName;
import org.talend.core.database.conn.version.EDatabaseVersion4Drivers;
import org.talend.core.language.CodeProblemsChecker;
import org.talend.core.language.ECodeLanguage;
import org.talend.core.language.ICodeProblemsChecker;
import org.talend.core.model.metadata.IMetadataTable;
import org.talend.core.model.metadata.QueryUtil;
import org.talend.core.model.metadata.builder.ConvertionHelper;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.metadata.builder.database.ExtractMetaDataUtils;
import org.talend.core.model.process.EComponentCategory;
import org.talend.core.model.process.EParameterFieldType;
import org.talend.core.model.process.Element;
import org.talend.core.model.process.IContext;
import org.talend.core.model.process.IElement;
import org.talend.core.model.process.IElementParameter;
import org.talend.core.model.process.IGraphicalNode;
import org.talend.core.model.process.INode;
import org.talend.core.model.process.IProcess;
import org.talend.core.model.process.IProcess2;
import org.talend.core.model.process.Problem;
import org.talend.core.model.process.Problem.ProblemStatus;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.Information;
import org.talend.core.model.properties.InformationLevel;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.PropertiesFactory;
import org.talend.core.model.properties.Property;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.utils.ContextParameterUtils;
import org.talend.core.model.utils.RepositoryManagerHelper;
import org.talend.core.model.utils.TalendTextUtils;
import org.talend.core.properties.tab.IDynamicProperty;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.sqlbuilder.util.ConnectionParameters;
import org.talend.core.sqlbuilder.util.EConnectionParameterName;
import org.talend.core.sqlbuilder.util.TextUtil;
import org.talend.core.ui.ISQLBuilderService;
import org.talend.core.ui.proposal.TalendProposalUtils;
import org.talend.core.ui.viewer.ReconcilerStyledText;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.designer.core.DesignerPlugin;
import org.talend.designer.core.IMultiPageTalendEditor;
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.model.process.jobsettings.JobSettingsConstants;
import org.talend.designer.core.ui.AbstractMultiPageTalendEditor;
import org.talend.designer.core.ui.editor.cmd.ChangeValuesFromRepository;
import org.talend.designer.core.ui.editor.cmd.PropertyChangeCommand;
import org.talend.designer.core.ui.editor.nodes.Node;
import org.talend.designer.core.ui.editor.process.Process;
import org.talend.designer.core.ui.editor.properties.ContextParameterExtractor;
import org.talend.designer.core.ui.preferences.TalendDesignerPrefConstants;
import org.talend.designer.core.ui.projectsetting.ImplicitContextLoadElement;
import org.talend.designer.core.ui.projectsetting.StatsAndLogsElement;
import org.talend.designer.core.ui.views.jobsettings.AbstractPreferenceComposite;
import org.talend.designer.core.ui.views.jobsettings.JobSettingsView;
import org.talend.designer.core.ui.views.problems.Problems;
import org.talend.designer.core.ui.views.properties.ComponentSettingsView;
import org.talend.designer.core.ui.views.properties.MultipleThreadDynamicComposite;
import org.talend.designer.core.ui.views.properties.WidgetFactory;
import org.talend.designer.core.utils.UpgradeParameterHelper;
import org.talend.designer.runprocess.IRunProcessService;
import org.talend.repository.RepositoryPlugin;
import org.talend.repository.model.IMetadataService;
import org.talend.repository.model.IProxyRepositoryFactory;
import org.talend.repository.ui.views.IRepositoryView;
/**
* DOC yzhang class global comment. Detailled comment <br/>
*
* $Id: talend-code-templates.xml 1 2006-09-29 17:06:40 +0000 (鏄熸湡浜�, 29 涔濇湀 2006) yzhang $
*
*/
public abstract class AbstractElementPropertySectionController implements PropertyChangeListener {
protected static final String SQLEDITOR = "SQLEDITOR"; //$NON-NLS-1$
private Map<String, Dialog> sqlbuilers = new HashMap<String, Dialog>();
protected IDynamicProperty dynamicProperty;
protected Composite composite;
protected BidiMap hashCurControls;
protected IElement elem;
protected IMultiPageTalendEditor part;
protected EComponentCategory section;
protected EditionControlHelper editionControlHelper;
private int additionalHeightSize;
private List<Problem> proForJavaErrorMark = null;
protected static final String VARIABLE_TOOLTIP = Messages
.getString("AbstractElementPropertySectionController.variableTooltip"); //$NON-NLS-1$
protected static final String NAME = "NAME"; //$NON-NLS-1$
protected static final String COLUMN = "COLUMN"; //$NON-NLS-1$
// PTODO qzhang use PARAMETER_NAME it for bug 853.
protected static final String PARAMETER_NAME = TypedTextCommandExecutor.PARAMETER_NAME; //$NON-NLS-1$
protected static final int MAX_PERCENT = 100;
protected static final int STANDARD_LABEL_WIDTH = 100;
protected static final int STANDARD_HEIGHT = 20;
protected static final int STANDARD_BUTTON_WIDTH = 25;
protected static final String DOTS_BUTTON = "icons/dots_button.gif"; //$NON-NLS-1$s
private static Map<String, Problem> proForPerlErrorMark = new HashMap<String, Problem>();
protected EParameterFieldType paramFieldType;
private List<Problem> codeProblems;
// for job settings extra.(feature 2710)
protected IElementParameter curParameter;
public static Map<String, String> connKeyMap = new HashMap<String, String>(10);
static {
connKeyMap.put("SERVER_NAME", "HOST"); //$NON-NLS-1$ //$NON-NLS-2$
connKeyMap.put("PORT", "PORT"); //$NON-NLS-1$ //$NON-NLS-2$
connKeyMap.put("SID", "DBNAME"); //$NON-NLS-1$ //$NON-NLS-2$
connKeyMap.put("SCHEMA", "SCHEMA_DB"); //$NON-NLS-1$ //$NON-NLS-2$
connKeyMap.put("USERNAME", "USER"); //$NON-NLS-1$ //$NON-NLS-2$
connKeyMap.put("PASSWORD", "PASS"); //$NON-NLS-1$ //$NON-NLS-2$
connKeyMap.put("PROPERTIES_STRING", "PROPERTIES"); //$NON-NLS-1$ //$NON-NLS-2$
connKeyMap.put("DIRECTORY", "DIRECTORY"); //$NON-NLS-1$ //$NON-NLS-2$
connKeyMap.put("FILE", "FILE"); //$NON-NLS-1$ //$NON-NLS-2$
connKeyMap.put("DATASOURCE", "DATASOURCE"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* DOC yzhang Comment method "createControl".
*
* Create control within the tabbed property setcion.
*
* @param subComposite. The composite selected in the editor or view, transfered from super class of tabbed
* properties framwork.
* @param param. The paramenter from EMF.
* @param numInRow. The ID of the control in a row.
* @param nbInRow. The total quantity of the control in a row.
* @param top
* @param rowSize height that can take the control (0 if default size)
* @param lastControl. The latest control created beside current being created.
* @return. The control created by this method will be the paramenter of next be called createControl method for
* position calculate.
*/
public abstract Control createControl(final Composite subComposite, final IElementParameter param, final int numInRow,
final int nbInRow, final int top, final Control lastControl);
public abstract int estimateRowSize(final Composite subComposite, final IElementParameter param);
protected int getColorStyledTextRowSize(int nbLines) {
return 0;
}
/**
* Will return true of false depends if the control has dynamic size or not.
*
* @return
*/
public boolean hasDynamicRowSize() {
return false;
}
/**
* Used only to force the rowSize if the size is dynamic.
*
* @param height
*/
public void setAdditionalHeightSize(int height) {
this.additionalHeightSize = height;
}
/**
* Used only to force the rowSize if the size is dynamic.
*
* @return the height
*/
public int getAdditionalHeightSize() {
return additionalHeightSize;
}
/**
* DOC yzhang AbstractElementPropertySectionController constructor comment.
*/
public AbstractElementPropertySectionController(IDynamicProperty dp) {
init(dp);
}
protected String getRepositoryItemFromRepositoryName(IElementParameter param, String repositoryName) {
String value = (String) param.getValue();
Object[] valuesList = param.getListItemsValue();
String[] originalList = param.getListItemsDisplayCodeName();
for (int i = 0; i < valuesList.length; i++) {
if (valuesList[i].equals(value)) {
if ("DB_VERSION".equals(repositoryName)) {
return valuesList[i].toString();
}
return originalList[i];
}
}
return ""; //$NON-NLS-1$
}
protected String getValueFromRepositoryName(String repositoryName) {
for (IElementParameter param : (List<IElementParameter>) elem.getElementParameters()) {
if (param.getRepositoryValue() != null) {
if (param.getRepositoryValue().equals(repositoryName)) {
if (param.getFieldType().equals(EParameterFieldType.CLOSED_LIST)) {
return getRepositoryItemFromRepositoryName(param, repositoryName);
}
if (param.getValue() instanceof String) {
return (String) param.getValue();
} else if (param.getValue() instanceof List) {
// for jdbc parm driver jar
String value = "";
List list = (List) param.getValue();
for (int i = 0; i < list.size(); i++) {
Object object = list.get(i);
if (object instanceof Map) {
Map valueMap = (Map) object;
if (valueMap.get("JAR_NAME") != null) {
if (value.equals("")) {
value = value + valueMap.get("JAR_NAME");
} else {
value = value + ";" + valueMap.get("JAR_NAME");
}
}
}
}
return value;
}
}
}
}
return ""; //$NON-NLS-1$
}
protected String getValueFromRepositoryName(IElement elem2, String repositoryName) {
for (IElementParameter param : (List<IElementParameter>) elem2.getElementParameters()) {
// for job settings extra.(feature 2710)
if (!sameExtraParameter(param)) {
continue;
}
// if ("TYPE".equals(repositoryName) && "CONNECTION_TYPE".equals(param.getName())) {
// return (String) param.getValue();
// }
if (param.getRepositoryValue() != null) {
if (param.getRepositoryValue().equals(repositoryName)) {
if (param.getFieldType().equals(EParameterFieldType.CLOSED_LIST)) {
return getRepositoryItemFromRepositoryName(param, repositoryName);
}
if (param.getValue() instanceof String) {
return (String) param.getValue();
} else if (param.getValue() instanceof List) {
// for jdbc parm driver jar
String value = "";
List list = (List) param.getValue();
for (int i = 0; i < list.size(); i++) {
Object object = list.get(i);
if (object instanceof Map) {
Map valueMap = (Map) object;
if (valueMap.get("JAR_NAME") != null) {
if (value.equals("")) {
value = value + valueMap.get("JAR_NAME");
} else {
value = value + ";" + valueMap.get("JAR_NAME");
}
}
}
}
return value;
}
}
}
}
return ""; //$NON-NLS-1$
}
/**
* DOC zli Comment method "getValueFromRepositoryName".
*
* @param elem2
* @param repositoryName
* @param parameterName
* @return
*/
protected String getValueFromRepositoryNameAndParameterName(IElement elem2, String repositoryName, String parameterName) {
for (IElementParameter param : (List<IElementParameter>) elem2.getElementParameters()) {
if (!sameExtraParameter(param)) {
continue;
}
if (param.getRepositoryValue() != null) {
if (param.getRepositoryValue().equals(repositoryName)) {
if (param.getName().contains(parameterName)) {
if (param.getValue() instanceof String) {
return (String) param.getValue();
} else if (param.getValue() instanceof List) {
// for jdbc parm driver jar
String value = "";
List list = (List) param.getValue();
for (int i = 0; i < list.size(); i++) {
Object object = list.get(i);
if (object instanceof Map) {
Map valueMap = (Map) object;
if (valueMap.get("JAR_NAME") != null) {
if (value.equals("")) {
value = value + valueMap.get("JAR_NAME");
} else {
value = value + ";" + valueMap.get("JAR_NAME");
}
}
}
}
return value;
}
}
}
}
}
return ""; //$NON-NLS-1$
}
protected String getParaNameFromRepositoryName(String repositoryName) {
for (IElementParameter param : (List<IElementParameter>) elem.getElementParameters()) {
// for job settings extra.(feature 2710)
if (!sameExtraParameter(param)) {
continue;
}
if (param.getRepositoryValue() != null) {
if (param.getRepositoryValue().equals(repositoryName)) {
return param.getName();
}
}
}
return null;
}
protected String getParaNameFromRepositoryName(IElement elem2, String repositoryName) {
for (IElementParameter param : (List<IElementParameter>) elem2.getElementParameters()) {
// for job settings extra.(feature 2710)
if (!sameExtraParameter(param)) {
continue;
}
if (param.getRepositoryValue() != null) {
if (param.getRepositoryValue().equals(repositoryName)) {
return param.getName();
}
}
}
return null;
}
/**
* DOC yzhang Comment method "init".
*
* Configuration for necessay parameters from class DynamicTabbedPropertiesSection.
*/
public void init(IDynamicProperty dp) {
this.dynamicProperty = dp;
hashCurControls = dp.getHashCurControls();
elem = dp.getElement();
Object obj = dp.getPart();
if (obj instanceof IMultiPageTalendEditor) {
part = (IMultiPageTalendEditor) obj;
} else {
// throw new RuntimeException("Type IMultiPageTalendEditor is requried.");
}
section = dp.getSection();
composite = dp.getComposite();
editionControlHelper = new EditionControlHelper();
// elem.addPropertyChangeListener(this);
}
/**
* Getter for dynamicTabbedPropertySection.
*
* @return the dynamicTabbedPropertySection
*/
public IDynamicProperty getDynamicProperty() {
return this.dynamicProperty;
}
static WidgetFactory widgetFactory = null;
/**
* DOC yzhang Comment method "getWidgetFactory".
*
* Get the TabbedPropertySheetWidgetFactory for control creating.
*
* @return
*/
protected WidgetFactory getWidgetFactory() {
if (widgetFactory == null) {
widgetFactory = new WidgetFactory();
}
return widgetFactory;
}
/**
*
* DOC amaumont DynamicTabbedPropertySection class global comment. Detailled comment <br/>
*
* @author amaumont $Id: DynamicTabbedPropertySection.java 344 2006-11-08 14:29:42 +0000 (mer., 08 nov. 2006)
* smallet $
*
*/
class EditionControlHelper {
private final CheckErrorsHelper checkErrorsHelper;
protected UndoRedoHelper undoRedoHelper;
private ContentProposalAdapterExtended extendedProposal;
/**
* DOC amaumont EditionListenerManager constructor comment.
*/
public EditionControlHelper() {
super();
this.checkErrorsHelper = new CheckErrorsHelper();
this.undoRedoHelper = new UndoRedoHelper();
}
/**
* DOC amaumont Comment method "checkErrors".
*
* @param t
* @param b
*/
public void checkErrors(Control control) {
this.checkErrorsHelper.checkErrors(control);
}
/**
* DOC amaumont Comment method "register".
*
* @param parameterName
* @param control
* @param checkSyntax
*/
public void register(final String parameterName, final Control control) {
if (parameterName == null || control == null) {
throw new NullPointerException();
}
IElementParameter param = elem.getElementParameter(parameterName);
if (param != null && !param.isNoContextAssist() && !param.isReadOnly() && !(control instanceof ReconcilerStyledText)) {
final IProcess2 process = (IProcess2) getProcess(elem, part);
if (elem instanceof INode) {
this.extendedProposal = TalendProposalUtils.installOn(control, process, (INode) elem);
} else {
this.extendedProposal = TalendProposalUtils.installOn(control, process);
}
if (!elem.getElementParameter(parameterName).isNoCheck()) {
this.checkErrorsHelper.register(control, extendedProposal);
}
extendedProposal.addContentProposalListener(new IContentProposalListener() {
public void proposalAccepted(IContentProposal proposal) {
if (control instanceof Text) {
ContextParameterExtractor.saveContext(parameterName, elem, ((Text) control).getText(), process);
} else if (control instanceof StyledText) {
ContextParameterExtractor.saveContext(parameterName, elem, ((StyledText) control).getText(), process);
}
}
});
// this.checkErrorsHelper.checkErrors(control, false);
ContextParameterExtractor.installOn(control, process, parameterName, elem);
}
this.undoRedoHelper.register(control);
}
public void unregisterUndo(Control control) {
this.undoRedoHelper.unregister(control);
}
/**
* DOC amaumont Comment method "register".
*
* @param control
*/
public void unregister(Control control) {
this.checkErrorsHelper.unregister(control);
this.undoRedoHelper.unregister(control);
}
}
private static Map<Control, ControlProperties> controlToProp = new HashMap<Control, ControlProperties>();
/**
*
* DOC amaumont DynamicTabbedPropertySection class global comment. Detailled comment <br/>
*
* @author amaumont $Id: DynamicTabbedPropertySection.java 344 2006-11-08 14:29:42 +0000 (mer., 08 nov. 2006)
* smallet $
*
*/
class CheckErrorsHelper {
/**
* DOC amaumont CheckSyntaxHelper constructor comment.
*/
public CheckErrorsHelper() {
super();
}
private final FocusListener focusListenerForCheckingError = new FocusListener() {
public void focusGained(FocusEvent event) {
focusGainedExecute((Control) event.widget);
}
public void focusLost(FocusEvent event) {
if (!extendedProposal.isProposalOpened()) {
Control control = (Control) event.widget;
setCodeProblems(null);
checkErrorsForPropertiesOnly(control);
IWorkbench workbench = PlatformUI.getWorkbench();
Property property = null;
if (workbench != null) {
IWorkbenchPage page = workbench.getActiveWorkbenchWindow().getActivePage();
if (page != null) {
IEditorPart editorPart = page.getActiveEditor();
if (editorPart instanceof AbstractMultiPageTalendEditor) {
AbstractMultiPageTalendEditor multiPageTalendEditor = ((AbstractMultiPageTalendEditor) editorPart);
property = multiPageTalendEditor.getProcess().getProperty();
}
}
}
if (property == null) {
return;
}
ECodeLanguage language = ((RepositoryContext) org.talend.core.CorePlugin.getContext().getProperty(
org.talend.core.context.Context.REPOSITORY_CONTEXT_KEY)).getProject().getLanguage();
property.getInformations().clear();
if (language == ECodeLanguage.JAVA && proForJavaErrorMark != null) {
for (Problem problem : proForJavaErrorMark) {
if (ProblemStatus.ERROR.equals(problem.getStatus())) {
String problemResource = problem.getDescription();
Information information = PropertiesFactory.eINSTANCE.createInformation();
if (problemResource != null) {
information.setText(problemResource);
}
information.setLevel(InformationLevel.ERROR_LITERAL);
property.getInformations().add(information);
}
}
} else if (language == ECodeLanguage.PERL && proForPerlErrorMark != null) {
for (String componentName : proForPerlErrorMark.keySet()) {
Problem problem = proForPerlErrorMark.get(componentName);
if (ProblemStatus.ERROR.equals(problem.getStatus())) {
String problemResource = problem.getDescription();
Information information = PropertiesFactory.eINSTANCE.createInformation();
if (problemResource != null) {
information.setText(problemResource);
}
information.setLevel(InformationLevel.ERROR_LITERAL);
property.getInformations().add(information);
}
}
}
Problems.computePropertyMaxInformationLevel(property);
Problems.refreshRepositoryView();
Problems.refreshProblemTreeView();
}
}
};
private final KeyListener keyListenerForCheckingError = new KeyListener() {
public void keyPressed(KeyEvent event) {
Control control = (Control) event.widget;
resetErrorState(control);
}
public void keyReleased(KeyEvent e) {
}
};
private ContentProposalAdapterExtended extendedProposal;
public void register(Control control, ContentProposalAdapterExtended extendedProposal) {
control.addFocusListener(focusListenerForCheckingError);
control.addKeyListener(keyListenerForCheckingError);
this.extendedProposal = extendedProposal;
}
/**
* DOC amaumont Comment method "unregister".
*
* @param control
*/
public void unregister(Control control) {
control.removeFocusListener(focusListenerForCheckingError);
control.removeKeyListener(keyListenerForCheckingError);
}
private void focusGainedExecute(Control control) {
resetErrorState(control);
}
private void refreshNode() {
boolean flag = CorePlugin.getDefault().getPreferenceStore()
.getBoolean(TalendDesignerPrefConstants.PROPERTY_CODE_CHECK);
if (flag) {
return;
}
if (elem instanceof IGraphicalNode) {
IGraphicalNode errorNode = (IGraphicalNode) elem;
if (errorNode == null) {
return;
}
if (errorNode.isCheckProperty()) {
errorNode.setCheckProperty(false);
errorNode.setErrorFlag(false);
errorNode.setCompareFlag(false);
errorNode.setErrorInfo(null);
((Node) errorNode).getNodeError().updateState("UPDATE_STATUS", false);//$NON-NLS-1$
errorNode.setErrorInfoChange("ERRORINFO", false);//$NON-NLS-1$
}
}
}
/**
* DOC amaumont Comment method "checkSyntax".
*
* @param control
* @param modifying
*/
public void checkErrors(final Control control) {
refreshNode();
IElementParameter elementParameter = elem.getElementParameter(getParameterName(control));
if (elementParameter.isReadOnly() || elementParameter.isNoCheck()) {
return;
}
final Color bgColorError = control.getDisplay().getSystemColor(SWT.COLOR_RED);
final Color fgColorError = control.getDisplay().getSystemColor(SWT.COLOR_WHITE);
final ECodeLanguage language = ((RepositoryContext) org.talend.core.CorePlugin.getContext().getProperty(
org.talend.core.context.Context.REPOSITORY_CONTEXT_KEY)).getProject().getLanguage();
IRunProcessService service = DesignerPlugin.getDefault().getRunProcessService();
final ICodeProblemsChecker syntaxChecker = service.getSyntaxChecker(language);
final String valueFinal = ControlUtils.getText(control);
ControlProperties existingControlProperties = controlToProp.get(control);
List<Problem> problems = getCodeProblems();
proForJavaErrorMark = new ArrayList<Problem>();
if (valueFinal != null) {
String key = CodeGenerationUtils.buildProblemKey(elem.getElementName(), elementParameter.getName());
if (language == ECodeLanguage.PERL) {
problems = syntaxChecker.checkProblemsForExpression(valueFinal);
getAllPerlProblem(key, problems);
showErrorMarkForPerl(elem);
} else if (language == ECodeLanguage.JAVA) {
if (problems == null) {
problems = syntaxChecker.checkProblemsFromKey(key, null);
} else {
((CodeProblemsChecker) syntaxChecker).updateNodeProblems(problems, key);
}
proForJavaErrorMark = syntaxChecker.checkProblemsForErrorMark(key, null);
showErrorMarkForJava(proForJavaErrorMark, elem);
}
}
boolean isRequired = elem.getElementParameter(getParameterName(control)).isRequired();
if (problems != null) {
if (isRequired && (valueFinal == null || valueFinal.trim().length() == 0)) {
problems.add(new Problem(null,
Messages.getString("AbstractElementPropertySectionController.fieldRequired"), ProblemStatus.ERROR)); //$NON-NLS-1$
}
}
if (problems != null && problems.size() > 0) {
if (existingControlProperties == null) {
ControlProperties properties = new ControlProperties();
controlToProp.put(control, properties);
// store original properties to restore them when error will be corrected
properties.originalBgColor = control.getBackground();
properties.originalFgColor = control.getForeground();
properties.originalToolTip = control.getToolTipText();
}
control.setBackground(bgColorError);
control.setForeground(fgColorError);
String tooltip = Messages.getString("AbstractElementPropertySectionController.syntaxError"); //$NON-NLS-1$
for (Problem problem : problems) {
tooltip += "\n" + problem.getDescription(); //$NON-NLS-1$
}
control.setToolTipText(tooltip);
} else {
resetErrorState(control);
}
}
private void getAllPerlProblem(String key, List<Problem> problems) {
if (proForPerlErrorMark != null && proForPerlErrorMark.size() > 0) {
int indexM = key.indexOf(":");//$NON-NLS-1$
String keyAfter = "";//$NON-NLS-1$
if (indexM > 0) {
keyAfter = key.substring(0, key.indexOf(":"));//$NON-NLS-1$
} else {
keyAfter = key;
}
Set<Map.Entry<String, Problem>> set = proForPerlErrorMark.entrySet();
for (Iterator<Map.Entry<String, Problem>> ite = set.iterator(); ite.hasNext();) {
Map.Entry<String, Problem> tmp = ite.next();
if (tmp == null) {
continue;
}
String proKey = tmp.getKey();
if (proKey == null) {
proKey = "";//$NON-NLS-1$
}
int indMark = proKey.indexOf(":");//$NON-NLS-1$
if (indMark > 0) {
proKey = proKey.substring(0, proKey.indexOf(":"));//$NON-NLS-1$
}
if (!proKey.equals(keyAfter)) {
ite.remove();
}
}
}
if (problems != null && problems.size() > 0) {
for (Problem problem : problems) {
if (problem != null) {
proForPerlErrorMark.put(key, problem);
} else {
proForPerlErrorMark.put(key, new Problem());
}
return;
}
} else {
proForPerlErrorMark.put(key, new Problem());
}
}
private void showErrorMarkForPerl(IElement elem) {
if (elem instanceof IGraphicalNode) {
IGraphicalNode errorNode = (IGraphicalNode) elem;
if (errorNode == null) {
return;
}
StringBuffer errorMessage = new StringBuffer(256);
if (proForPerlErrorMark != null && proForPerlErrorMark.size() > 0) {
Set<Map.Entry<String, Problem>> set = proForPerlErrorMark.entrySet();
for (Iterator<Map.Entry<String, Problem>> ite = set.iterator(); ite.hasNext();) {
Map.Entry<String, Problem> tmp = ite.next();
if (tmp == null) {
continue;
}
Problem pro = tmp.getValue();
if (pro == null) {
continue;
}
String description = pro.getDescription();
if (!"".equals(description) && description != null) {//$NON-NLS-1$
errorMessage.append(description.replaceFirst("\r\n", ""));//$NON-NLS-1$//$NON-NLS-1$
errorMessage.append("\n");//$NON-NLS-1$
}
}
if ((!"".equals(errorMessage.toString())) && errorMessage != null) {
if (errorNode.isCheckProperty() == false) {
errorNode.setCheckProperty(true);
errorNode.setErrorFlag(true);
errorNode.setCompareFlag(false);
errorNode.setErrorInfo(errorMessage.toString());
((Node) errorNode).getNodeError().updateState("UPDATE_STATUS", true);//$NON-NLS-1$
errorNode.setErrorInfoChange("ERRORINFO", true);//$NON-NLS-1$
}
} else {
if (errorNode.isCheckProperty()) {
errorNode.setCheckProperty(false);
errorNode.setErrorFlag(false);
errorNode.setCompareFlag(false);
errorNode.setErrorInfo(null);
((Node) errorNode).getNodeError().updateState("UPDATE_STATUS", false);//$NON-NLS-1$
errorNode.setErrorInfoChange("ERRORINFO", false);//$NON-NLS-1$
}
}
} else {
if (errorNode.isCheckProperty()) {
errorNode.setCheckProperty(false);
errorNode.setErrorFlag(false);
errorNode.setCompareFlag(false);
errorNode.setErrorInfo(null);
((Node) errorNode).getNodeError().updateState("UPDATE_STATUS", false);//$NON-NLS-1$
errorNode.setErrorInfoChange("ERRORINFO", false);//$NON-NLS-1$
}
}
}
}
private void showErrorMarkForJava(List<Problem> problems, IElement elem) {
Node errorNode = null;
if (elem instanceof Node) {
errorNode = (Node) elem;
if (errorNode == null) {
return;
}
if (problems != null && problems.size() > 0) {
StringBuffer errorMessage = new StringBuffer(256);
for (Problem pro : problems) {
if (pro == null || pro.getDescription() == null) {
continue;
}
if (pro.getKey() != null) {
int indMark = pro.getKey().indexOf(":");//$NON-NLS-1$
String proKey = "";//$NON-NLS-1$
if (indMark > 0) {
proKey = pro.getKey().substring(0, pro.getKey().indexOf(":"));//$NON-NLS-1$
} else {
proKey = pro.getKey();
}
if (errorNode.getUniqueName().equals(proKey)) {
errorMessage.append(pro.getDescription());
errorMessage.append("\n");//$NON-NLS-1$
}
}
}
if (errorNode.isCheckProperty() == false) {
if ((!"".equals(errorMessage)) && errorMessage != null) {//$NON-NLS-1$
errorNode.setCheckProperty(true);
errorNode.setErrorFlag(true);
errorNode.setCompareFlag(false);
errorNode.setErrorInfo(errorMessage.toString());
errorNode.getNodeError().updateState("UPDATE_STATUS", true);//$NON-NLS-1$
errorNode.setErrorInfoChange("ERRORINFO", true);//$NON-NLS-1$
}
}
} else {
if (errorNode.isCheckProperty()) {
errorNode.setCheckProperty(false);
errorNode.setErrorFlag(false);
errorNode.setCompareFlag(false);
errorNode.setErrorInfo(null);
errorNode.getNodeError().updateState("UPDATE_STATUS", false);//$NON-NLS-1$
errorNode.setErrorInfoChange("ERRORINFO", false);//$NON-NLS-1$
}
}
}
}
/**
* DOC amaumont Comment method "resetErrorState".
*
* @param control
* @param previousProblem
*/
private void resetErrorState(final Control control) {
ControlProperties existingControlProperties = controlToProp.get(control);
if (existingControlProperties != null) {
control.setToolTipText(existingControlProperties.originalToolTip);
control.setBackground(existingControlProperties.originalBgColor);
control.setForeground(existingControlProperties.originalFgColor);
controlToProp.remove(control);
}
}
}
/**
*
* Container of original properties of Control. <br/>
*
* $Id: DynamicTabbedPropertySection.java 865 2006-12-06 06:14:57 +0000 (鏄熸湡涓�, 06 鍗佷簩鏈� 2006) bqian $
*
*/
class ControlProperties {
private Color originalBgColor;
private Color originalFgColor;
private String originalToolTip;
/**
* DOC amaumont ControlProperties constructor comment.
*/
public ControlProperties() {
super();
}
}
protected Command getTextCommandForHelper(String paramName, String text) {
return new PropertyChangeCommand(elem, paramName, text);
}
/**
*
* DOC amaumont DynamicTabbedPropertySection class global comment. Detailled comment <br/>
*
* @author amaumont
*
* $Id: DynamicTabbedPropertySection.java 865 2006-12-06 06:14:57 +0000 (鏄熸湡涓�, 06 鍗佷簩鏈� 2006) bqian $
*
*/
class UndoRedoHelper {
protected TypedTextCommandExecutor typedTextCommandExecutor;
/**
* DOC amaumont Comment method "unregister".
*
* @param control
*/
public void unregister(Control control) {
// ControlUtils.removeModifyListener(control, modifyListenerForUndoRedo);
typedTextCommandExecutor.unregister(control);
}
public UndoRedoHelper() {
this.typedTextCommandExecutor = new TypedTextCommandExecutor() {
@Override
public void addNewCommand(Control control) {
String name = getParameterName(control);
String text = ControlUtils.getText(control);
Command cmd = getTextCommandForHelper(name, text);
// getCommandStack().execute(cmd);
executeCommand(cmd);
}
@Override
public void updateCommand(Control control) {
CommandStack commandStack = getCommandStack();
String name = getParameterName(control);
String text = ControlUtils.getText(control);
if (commandStack == null) {
executeCommand(new PropertyChangeCommand(elem, name, text));
return;
}
Object[] commands = commandStack.getCommands();
if (commands.length == 0 || commandStack.getRedoCommand() != null) {
addNewCommand(control);
} else {
Object lastCommandObject = commands[commands.length - 1];
if (lastCommandObject instanceof PropertyChangeCommand) {
PropertyChangeCommand lastCommand = (PropertyChangeCommand) lastCommandObject;
if (name.equals(lastCommand.getPropName()) && (lastCommand.getElement() == elem)) {
lastCommand.dispose();
// commandStack.execute(new PropertyChangeCommand(elem, name, text));
executeCommand(new PropertyChangeCommand(elem, name, text));
// lastCommand.modifyValue(text);
}
}
}
}
};
}
/**
* DOC amaumont Comment method "register".
*
* @param control
*/
public void register(Control control) {
// ControlUtils.addModifyListener(control, modifyListenerForUndoRedo);
typedTextCommandExecutor.register(control);
}
}
/**
* DOC amaumont Comment method "getParameterName".
*
* @param control
* @return
*/
public String getParameterName(Control control) {
String name = (String) control.getData(PARAMETER_NAME);
if (name == null) { // if the control don't support this property, then take in the list.
name = (String) hashCurControls.getKey(control);
}
if (name == null) {
throw new IllegalStateException(
"parameterName shouldn't be null or you call this method too early ! (control value : '" //$NON-NLS-1$
+ ControlUtils.getText(control) + "')"); //$NON-NLS-1$
}
return name;
}
/**
* Get the command stack of the Gef editor.
*
* @return
*/
protected CommandStack getCommandStack() {
if (dynamicProperty != null && dynamicProperty instanceof MultipleThreadDynamicComposite) {
CommandStack commandStack = ((MultipleThreadDynamicComposite) dynamicProperty).getCommandStack();
if (commandStack != null) {
return commandStack;
}
}
if (part == null) {
return null;
}
Object adapter = part.getAdapter(CommandStack.class);
return (CommandStack) adapter;
}
protected void executeCommand(Command c) {
if (c == null) {
return;
}
if (getCommandStack() != null) {
getCommandStack().execute(c);
} else {
// if can't find command stack, just execute it.
c.execute();
}
// refreshDynamicProperty();
}
private void refreshDynamicProperty() {
if (this.dynamicProperty == null)
return;
dynamicProperty.refresh();
}
/**
* Accept Text and StyledText control.
*
* @param labelText
*/
public void addDragAndDropTarget(final Control textControl) {
DropTargetListener dropTargetListener = new DropTargetListener() {
String propertyName = null;
public void dragEnter(final DropTargetEvent event) {
}
public void dragLeave(final DropTargetEvent event) {
}
public void dragOperationChanged(final DropTargetEvent event) {
}
public void dragOver(final DropTargetEvent event) {
if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
propertyName = getParameterName(textControl);
for (int i = 0; i < elem.getElementParameters().size(); i++) {
IElementParameter param = elem.getElementParameters().get(i);
if (param.getName().equals(propertyName)) {
if (param.isReadOnly()) {
event.detail = DND.ERROR_INVALID_DATA;
}
}
}
}
}
public void drop(final DropTargetEvent event) {
if (propertyName != null) {
String text;
if (textControl instanceof StyledText) {
text = ((StyledText) textControl).getText() + (String) event.data;
((StyledText) textControl).setText(text);
} else {
text = ((Text) textControl).getText() + (String) event.data;
((Text) textControl).setText(text);
}
Command cmd = new PropertyChangeCommand(elem, propertyName, text);
// getCommandStack().execute(cmd);
executeCommand(cmd);
}
}
public void dropAccept(final DropTargetEvent event) {
}
};
DropTarget target = new DropTarget(textControl, DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT);
Transfer[] transfers = new Transfer[] { TextTransfer.getInstance() };
target.setTransfer(transfers);
target.addDropListener(dropTargetListener);
}
/**
* Sets the elem.
*
* @param elem the elem to set
*/
protected void setElem(Element elem) {
this.elem = elem;
}
/**
* Sets the hashCurControls.
*
* @param hashCurControls the hashCurControls to set
*/
protected void setHashCurControls(BidiMap hashCurControls) {
this.hashCurControls = hashCurControls;
}
/**
* Sets the part.
*
* @param part the part to set
*/
protected void setPart(AbstractMultiPageTalendEditor part) {
this.part = part;
}
/**
* Sets the section.
*
* @param section the section to set
*/
protected void setSection(EComponentCategory section) {
this.section = section;
}
/**
* DOC amaumont Comment method "checkErrors".
*
* @param control must be or extends <code>Text</code> or <code>StyledText</code>
*/
protected void checkErrorsForPropertiesOnly(Control control) {
if (this.section == EComponentCategory.BASIC) {
editionControlHelper.checkErrors(control);
}
}
public abstract void refresh(IElementParameter param, boolean check);
/**
* qzhang Comment method "fixedCursorPosition".
*
* @param param
* @param labelText
* @param value
* @param valueChanged
*/
protected void fixedCursorPosition(IElementParameter param, Control labelText, Object value, boolean valueChanged) {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IWorkbenchPart workbenchPart = page.getActivePart();
if ((workbenchPart instanceof PropertySheet) || (workbenchPart instanceof JobSettingsView)
|| (workbenchPart instanceof ComponentSettingsView)) {
Object control = editionControlHelper.undoRedoHelper.typedTextCommandExecutor.getActiveControl();
if (param.getName().equals(control) && valueChanged && !param.isRepositoryValueUsed()) {
String previousText = editionControlHelper.undoRedoHelper.typedTextCommandExecutor.getPreviousText2();
String currentText = (String) value;
labelText.setFocus();
ControlUtils.setCursorPosition(labelText, getcursorPosition(previousText, currentText));
}
}
}
/**
* qzhang Comment method "getcursorPosition".
*
* @param previousText
* @param currentText
* @return
*/
private int getcursorPosition(String previousText, String currentText) {
if (previousText.length() == currentText.length() + 1) {
return getLeftCharPosition(currentText, previousText, false);
} else if (previousText.length() == currentText.length() - 1) {
return getLeftCharPosition(previousText, currentText, true);
}
return 0;
}
/**
* qzhang Comment method "getLeftCharPosition".
*
* @param previousText
* @param currentText
* @return
*/
private int getLeftCharPosition(String previousText, String currentText, boolean add) {
int i = 0;
for (; i < currentText.length() - 1; i++) {
if (currentText.charAt(i) != previousText.charAt(i)) {
break;
}
}
if (add) {
return i + 1;
} else {
return i;
}
}
public void openSqlBuilderBuildIn(final ConnectionParameters connParameters, final String propertyName) {
ISQLBuilderService service = (ISQLBuilderService) GlobalServiceRegister.getDefault().getService(ISQLBuilderService.class);
service.openSQLBuilderDialog(connParameters, composite, elem, propertyName, getCommandStack(), this, part);
}
protected ConnectionParameters connParameters;
private void setAllConnectionParameters(String typ, IElement element) {
String type = null;
if (typ != null && !typ.equals("")) { //$NON-NLS-1$
type = typ;
} else {
type = getValueFromRepositoryName(element, "TYPE"); //$NON-NLS-1$
}
if (type.equals("Oracle") || type.contains("OCLE")) {
IElementParameter ele = element.getElementParameter("CONNECTION_TYPE");
if (ele != null) {
type = (String) ele.getValue();
} else
type = "ORACLE_SID"; //$NON-NLS-1$
}
// If the dbtype has been setted don't reset it again unless the dbtype of connParameters is null.
if (StringUtils.trimToNull(type) == null && StringUtils.trimToNull(connParameters.getDbType()) == null) {
type = EDatabaseTypeName.GENERAL_JDBC.getXmlName();
}
connParameters.setDbType(type);
String frameWorkKey = getValueFromRepositoryName(element, "FRAMEWORK_TYPE"); //$NON-NLS-1$
connParameters.setFrameworkType(frameWorkKey);
String schema = getValueFromRepositoryName(element, EConnectionParameterName.SCHEMA.getName());
connParameters.setSchema(schema);
String userName = getValueFromRepositoryName(element, EConnectionParameterName.USERNAME.getName());
connParameters.setUserName(userName);
String password = getValueFromRepositoryName(element, EConnectionParameterName.PASSWORD.getName());
connParameters.setPassword(password);
String host = getValueFromRepositoryName(element, EConnectionParameterName.SERVER_NAME.getName());
connParameters.setHost(host);
String port = getValueFromRepositoryName(element, EConnectionParameterName.PORT.getName());
connParameters.setPort(port);
boolean https = Boolean.parseBoolean(getValueFromRepositoryName(element, EConnectionParameterName.HTTPS.getName()));
connParameters.setHttps(https);
boolean isOracleOCI = type.equals(EDatabaseTypeName.ORACLE_OCI.getXmlName())
|| type.equals(EDatabaseTypeName.ORACLE_OCI.getDisplayName());
if (isOracleOCI) {
String localServiceName = getValueFromRepositoryNameAndParameterName(element, EConnectionParameterName.SID.getName(),
EParameterName.LOCAL_SERVICE_NAME.getName());
// sid is the repository value both for DBName and Local_service_name
connParameters.setLocalServiceName(localServiceName);
}
String datasource = getValueFromRepositoryName(element, EConnectionParameterName.DATASOURCE.getName());
connParameters.setDatasource(datasource);
// qli modified to fix the bug "7364".
String dbName = getValueFromRepositoryName(element, EConnectionParameterName.SID.getName());
connParameters.setDbName(dbName);
if (connParameters.getDbType().equals(EDatabaseTypeName.SQLITE.getXmlName())
|| connParameters.getDbType().equals(EDatabaseTypeName.ACCESS.getXmlName())
|| connParameters.getDbType().equals(EDatabaseTypeName.FIREBIRD.getXmlName())) {
String file = getValueFromRepositoryName(element, EConnectionParameterName.FILE.getName());
connParameters.setFilename(file);
}
String dir = getValueFromRepositoryName(element, EConnectionParameterName.DIRECTORY.getName());
connParameters.setDirectory(dir);
// General jdbc
String url = getValueFromRepositoryName(element, EConnectionParameterName.URL.getName());
if (StringUtils.isEmpty(url)) {
// for oracle RAC
// url = getValueFromRepositoryName(element, "RAC_" + EConnectionParameterName.URL.getName());
// Changed by Marvin Wang on Feb. 14, 2012 for bug TDI-19597. Above is the original code, below is new code
// to get the Oracle RAC url.
if (EDatabaseTypeName.ORACLE_RAC.getXmlName().equals(type)) {
url = getValueFromRepositoryName(element, "RAC_" + EConnectionParameterName.URL.getName());
}
}
connParameters.setUrl(TalendTextUtils.removeQuotes(url));
String driverJar = getValueFromRepositoryName(element, EConnectionParameterName.DRIVER_JAR.getName());
connParameters.setDriverJar(TalendTextUtils.removeQuotes(driverJar));
String driverClass = getValueFromRepositoryName(element, EConnectionParameterName.DRIVER_CLASS.getName());
connParameters.setDriverClass(TalendTextUtils.removeQuotes(driverClass));
if (driverClass != null && !"".equals(driverClass)) {//$NON-NLS-N$
if (driverClass.startsWith("\"") && driverClass.endsWith("\"")) {//$NON-NLS-N$//$NON-NLS-N$
driverClass = TalendTextUtils.removeQuotes(driverClass);
}
String dbTypeByClassName = "";//$NON-NLS-N$
if (driverJar != null && !"".equals(driverJar)) {//$NON-NLS-N$
dbTypeByClassName = ExtractMetaDataUtils.getDbTypeByClassNameAndDriverJar(driverClass, driverJar);
} else {
dbTypeByClassName = ExtractMetaDataUtils.getDbTypeByClassName(driverClass);
}
if (dbTypeByClassName != null) {
connParameters.setDbType(dbTypeByClassName);
}
}
String jdbcProps = getValueFromRepositoryName(element, EConnectionParameterName.PROPERTIES_STRING.getName());
connParameters.setJdbcProperties(jdbcProps);
String realTableName = null;
if (EmfComponent.REPOSITORY.equals(elem.getPropertyValue(EParameterName.SCHEMA_TYPE.getName()))) {
final Object propertyValue = elem.getPropertyValue(EParameterName.REPOSITORY_SCHEMA_TYPE.getName());
IMetadataTable metadataTable = null;
String connectionId = propertyValue.toString().split(" - ")[0]; //$NON-NLS-N$
String tableLabel = propertyValue.toString().split(" - ")[1]; //$NON-NLS-N$
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)) {
if (table.getLabel().equals(tableLabel)) {
metadataTable = ConvertionHelper.convert(table);
break;
}
}
}
if (metadataTable != null) {
realTableName = metadataTable.getTableName();
}
}
connParameters.setSchemaName(QueryUtil.getTableName(elem, connParameters.getMetadataTable(),
TalendTextUtils.removeQuotes(schema), type, realTableName));
}
protected void initConnectionParametersWithContext(IElement element, IContext context) {
// qli modified to fix the bug "7364".
if (connParameters == null) {
connParameters = new ConnectionParameters();
}
Object value = elem.getPropertyValue("USE_EXISTING_CONNECTION"); //$NON-NLS-1$
IElementParameter compList = elem.getElementParameterFromField(EParameterFieldType.COMPONENT_LIST);
if (value != null && (value instanceof Boolean) && ((Boolean) value) && compList != null) {
if (connectionNode == null) {
Object compValue = compList.getValue();
if (compValue != null && !compValue.equals("")) { //$NON-NLS-1$
List<? extends INode> nodes = part.getProcess().getGraphicalNodes();
for (INode node : nodes) {
if (node.getUniqueName().equals(compValue) && (node instanceof Node)) {
connectionNode = (Node) node;
break;
}
}
}
}
if (connectionNode != null) {
element = connectionNode;
}
}
connParameters.setDbName(getParameterValueWithContext(element, EConnectionParameterName.SID.getName(), context));
connParameters.setPassword(getParameterValueWithContext(element, EConnectionParameterName.PASSWORD.getName(), context));
connParameters.setPort(getParameterValueWithContext(element, EConnectionParameterName.PORT.getName(), context));
connParameters.setSchema(getParameterValueWithContext(element, EConnectionParameterName.SCHEMA.getName(), context));
connParameters.setHost(getParameterValueWithContext(element, EConnectionParameterName.SERVER_NAME.getName(), context));
connParameters.setUserName(getParameterValueWithContext(element, EConnectionParameterName.USERNAME.getName(), context));
connParameters.setDirectory(getParameterValueWithContext(element, EConnectionParameterName.DIRECTORY.getName(), context));
connParameters.setHttps(Boolean.parseBoolean(getParameterValueWithContext(element,
EConnectionParameterName.HTTPS.getName(), context)));
String url = TalendTextUtils.removeQuotesIfExist(getParameterValueWithContext(element,
EConnectionParameterName.URL.getName(), context));
if (StringUtils.isEmpty(url)) {
// try to get url for oracle RAC.
// url = TalendTextUtils.removeQuotesIfExist(getParameterValueWithContext(element,
// "RAC_" + EConnectionParameterName.URL.getName(), context));
// Changed by Marvin Wang on Feb. 14, 2012 for bug TDI-19597. Above is the original code, below is new code
// to get the Oracle RAC url.
String dbType = connParameters.getDbType();
if (EDatabaseTypeName.ORACLE_RAC.getDisplayName().equals(dbType))
url = TalendTextUtils.removeQuotesIfExist(getParameterValueWithContext(element, "RAC_"
+ EConnectionParameterName.URL.getName(), context));
}
connParameters.setUrl(url);
connParameters.setDriverClass(TalendTextUtils.removeQuotesIfExist(getParameterValueWithContext(element,
EConnectionParameterName.DRIVER_CLASS.getName(), context)));
connParameters.setDriverJar(TalendTextUtils.removeQuotesIfExist(getParameterValueWithContext(element,
EConnectionParameterName.DRIVER_JAR.getName(), context)));
// for jdbc connection from reposiotry
final String dbTypeByClassName = ExtractMetaDataUtils.getDbTypeByClassName(connParameters.getDriverClass());
if (connParameters.getDbType() == null || EDatabaseTypeName.MYSQL.getDisplayName().equals(connParameters.getDbType())
&& !EDatabaseTypeName.MYSQL.getProduct().equals(dbTypeByClassName)) {
if (dbTypeByClassName != null && !"".equals(dbTypeByClassName)) {
connParameters.setDbType(dbTypeByClassName);
}
}
if (connParameters.getDbType().equals(EDatabaseTypeName.SQLITE.getXmlName())
|| connParameters.getDbType().equals(EDatabaseTypeName.ACCESS.getXmlName())
|| connParameters.getDbType().equals(EDatabaseTypeName.FIREBIRD.getXmlName())) {
connParameters.setFilename(getParameterValueWithContext(element, EConnectionParameterName.FILE.getName(), context));
}
connParameters.setJdbcProperties(getParameterValueWithContext(element,
EConnectionParameterName.PROPERTIES_STRING.getName(), context));
connParameters
.setDatasource(getParameterValueWithContext(element, EConnectionParameterName.DATASOURCE.getName(), context));
}
private String getParameterValueWithContext(IElement elem, String key, IContext context) {
if (elem == null || key == null)
return ""; //$NON-NLS-1$
String actualKey = this.getParaNameFromRepositoryName(key); // connKeyMap.get(key);
if (actualKey != null) {
return fetchElementParameterValue(elem, context, actualKey);
} else {
return fetchElementParameterValue(elem, context, key);
}
}
/**
* DOC yexiaowei Comment method "fetchElementParameterValude".
*
* @param elem
* @param context
* @param actualKey
* @return
*/
private String fetchElementParameterValue(IElement elem, IContext context, String actualKey) {
IElementParameter elemParam = elem.getElementParameter(actualKey);
if (elemParam != null) {
Object value = elemParam.getValue();
if (value instanceof String) {
return ContextParameterUtils.parseScriptContextCode((String) value, context);
} else if (value instanceof List) {
// for jdbc parm driver jars
String jarValues = "";
List list = (List) value;
for (int i = 0; i < list.size(); i++) {
Object object = list.get(i);
if (object instanceof Map) {
Map valueMap = (Map) object;
if (valueMap.get("JAR_NAME") != null) {
if (jarValues.equals("")) {
jarValues = jarValues + valueMap.get("JAR_NAME");
} else {
jarValues = jarValues + ";" + valueMap.get("JAR_NAME");
}
}
}
}
return ContextParameterUtils.parseScriptContextCode(jarValues, context);
}
}
return "";
}
Node connectionNode = null;
/**
* DOC zli Comment method "getImplicitRepositoryId".
*
* @return
*/
protected String getImplicitRepositoryId() {
// TDI-17078:when db connection with jdbc work as the implicit context,the elem is Process intance ,it also need
// get the ImplicitRepositoryId
if (elem instanceof ImplicitContextLoadElement || elem instanceof Process) {
IElementParameter implicitContext = elem.getElementParameter("PROPERTY_TYPE_IMPLICIT_CONTEXT");//$NON-NLS-N$
if (implicitContext != null) {
Map<String, IElementParameter> childParameters = implicitContext.getChildParameters();
if (childParameters != null) {
if (childParameters.get("PROPERTY_TYPE").getValue().equals("REPOSITORY")) {//$NON-NLS-N$//$NON-NLS-N$
IElementParameter iElementParameter = childParameters.get("REPOSITORY_PROPERTY_TYPE");//$NON-NLS-N$
if (iElementParameter != null) {
Object value = iElementParameter.getValue();
if (value != null) {
return value.toString();
}
}
}
}
}
}
return null;
}
/**
* DOC zli Comment method "getStatsLogRepositoryId".
*
* @return
*/
protected String getStatsLogRepositoryId() {
if (elem instanceof StatsAndLogsElement) {
IElementParameter statsLogContext = elem.getElementParameter("PROPERTY_TYPE");//$NON-NLS-N$
if (statsLogContext != null) {
Map<String, IElementParameter> childParameters = statsLogContext.getChildParameters();
if (childParameters != null) {
if (childParameters.get("PROPERTY_TYPE").getValue().equals("REPOSITORY")) {//$NON-NLS-N$//$NON-NLS-N$
IElementParameter iElementParameter = childParameters.get("REPOSITORY_PROPERTY_TYPE");//$NON-NLS-N$
if (iElementParameter != null) {
Object value = iElementParameter.getValue();
if (value != null) {
return value.toString();
}
}
}
}
}
}
return null;
}
protected void initConnectionParameters() {
connParameters = null;
connParameters = new ConnectionParameters();
String type = getValueFromRepositoryName(elem, "TYPE"); //$NON-NLS-1$
if (type.equals("Oracle") || type.contains("OCLE")) {
IElementParameter ele = elem.getElementParameter("CONNECTION_TYPE");
if (ele != null) {
type = (String) ele.getValue();
} else
type = "ORACLE_SID"; //$NON-NLS-1$
}
connParameters.setDbType(type);
String driverName = getValueFromRepositoryName(elem, "DB_VERSION"); //$NON-NLS-1$
String dbVersionName = EDatabaseVersion4Drivers.getDbVersionName(type, driverName);
connParameters.setDbVersion(dbVersionName);
connParameters.setNode(elem);
String selectedComponentName = (String) elem.getPropertyValue(EParameterName.UNIQUE_NAME.getName());
connParameters.setSelectedComponentName(selectedComponentName);
connParameters.setFieldType(paramFieldType);
if (elem instanceof Node) {
connParameters.setMetadataTable(((Node) elem).getMetadataList().get(0));
}
connParameters.setSchemaRepository(EmfComponent.REPOSITORY.equals(elem.getPropertyValue(EParameterName.SCHEMA_TYPE
.getName())));
connParameters.setFromDBNode(true);
connParameters.setQuery(""); //$NON-NLS-1$
List<? extends IElementParameter> list = elem.getElementParameters();
boolean end = false;
for (int i = 0; i < list.size() && !end; i++) {
IElementParameter param = list.get(i);
if (param.getFieldType() == EParameterFieldType.MEMO_SQL) {
connParameters.setNodeReadOnly(param.isReadOnly());
end = true;
}
}
Object value = elem.getPropertyValue("USE_EXISTING_CONNECTION"); //$NON-NLS-1$
IElementParameter compList = elem.getElementParameterFromField(EParameterFieldType.COMPONENT_LIST);
if (value != null && (value instanceof Boolean) && ((Boolean) value) && compList != null) {
Object compValue = compList.getValue();
if (compValue != null && !compValue.equals("")) { //$NON-NLS-1$
List<? extends INode> nodes = part.getProcess().getGraphicalNodes();
for (INode node : nodes) {
if (node.getUniqueName().equals(compValue) && (node instanceof Node)) {
connectionNode = (Node) node;
break;
}
}
if (connectionNode != null) {
setAllConnectionParameters(type, connectionNode);
}
}
} else {
setAllConnectionParameters(null, elem);
}
if (connectionNode != null) {
setConnectionParameterNames(connectionNode, connParameters);
} else {
setConnectionParameterNames(elem, connParameters);
}
}
private void setConnectionParameterNames(IElement element, ConnectionParameters connParameters) {
addConnectionParameter(element, connParameters, EConnectionParameterName.SCHEMA.getName());
addConnectionParameter(element, connParameters, EConnectionParameterName.USERNAME.getName());
addConnectionParameter(element, connParameters, EConnectionParameterName.PASSWORD.getName());
addConnectionParameter(element, connParameters, EConnectionParameterName.SERVER_NAME.getName());
addConnectionParameter(element, connParameters, EConnectionParameterName.PORT.getName());
addConnectionParameter(element, connParameters, EConnectionParameterName.DATASOURCE.getName());
addConnectionParameter(element, connParameters, EConnectionParameterName.SID.getName());
addConnectionParameter(element, connParameters, EConnectionParameterName.FILE.getName());
addConnectionParameter(element, connParameters, EConnectionParameterName.DIRECTORY.getName());
addConnectionParameter(element, connParameters, EConnectionParameterName.URL.getName());
addConnectionParameter(element, connParameters, EConnectionParameterName.DRIVER_CLASS.getName());
addConnectionParameter(element, connParameters, EConnectionParameterName.DRIVER_JAR.getName());
addConnectionParameter(element, connParameters, EConnectionParameterName.PROPERTIES_STRING.getName());
}
private void addConnectionParameter(IElement element, ConnectionParameters connParameters, String repositoryName) {
final String paraNameFromRepositoryName = getParaNameFromRepositoryName(element, repositoryName);
if (paraNameFromRepositoryName != null) {
connParameters.getRepositoryNameParaName().put(repositoryName, paraNameFromRepositoryName);
}
}
/**
*
* DOC ggu Comment method "isExtra".
*
* for extra db setting.
*/
private boolean sameExtraParameter(IElementParameter param) {
// for job settings extra.(feature 2710)
if (curParameter != null) {
boolean extra = JobSettingsConstants.isExtraParameter(this.curParameter.getName());
boolean paramFlag = JobSettingsConstants.isExtraParameter(param.getName());
return extra == paramFlag;
}
return true;
}
protected boolean isUseExistingConnection() {
IElementParameter elementParameter = elem.getElementParameter(EParameterName.USE_EXISTING_CONNECTION.getName());
if (elementParameter != null) {
Boolean value = (Boolean) elementParameter.getValue();
return value;
}
return false;
}
/**
* DOC qzhang Comment method "openSQLBuilder".
*
* @param repositoryType
* @param propertyName
* @param query
*/
protected String openSQLBuilder(String repositoryType, String propertyName, String query) {
if (repositoryType.equals(EmfComponent.BUILTIN)) {
connParameters.setQuery(query);
if (connParameters.isShowConfigParamDialog()) {
if (!isUseExistingConnection()) {
initConnectionParametersWithContext(elem, part.getProcess().getContextManager().getDefaultContext());
} else {
initConnectionParametersWithContext(connectionNode, part.getProcess().getContextManager().getDefaultContext());
}
}
// add for bug TDI-20335
if (part == null) {
Shell parentShell = new Shell(composite.getShell().getDisplay());
ISQLBuilderService service = (ISQLBuilderService) GlobalServiceRegister.getDefault().getService(
ISQLBuilderService.class);
Dialog sqlBuilder = service.openSQLBuilderDialog(parentShell, "", connParameters);
sqlBuilder.open();
} else {
openSqlBuilderBuildIn(connParameters, propertyName);
}
} else if (repositoryType.equals(EmfComponent.REPOSITORY)) {
String repositoryName2 = ""; //$NON-NLS-1$
String repositoryId = null;
IElementParameter memoParam = elem.getElementParameter(propertyName);
IElementParameter repositoryParam = elem.getElementParameterFromField(EParameterFieldType.PROPERTY_TYPE,
memoParam.getCategory());
if (repositoryParam != null) {
IElementParameter itemFromRepository = repositoryParam.getChildParameters().get(
EParameterName.REPOSITORY_PROPERTY_TYPE.getName());
String value = (String) itemFromRepository.getValue();
repositoryId = value;
// for (String key : this.dynamicProperty.getRepositoryConnectionItemMap().keySet()) {
// if (key.equals(value)) {
// repositoryName2 =
// this.dynamicProperty.getRepositoryConnectionItemMap().get(key).getProperty().getLabel();
// }
// }
/* get connection item dynamictly,not from cache ,see 16969 */
IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
try {
IRepositoryViewObject repobj = factory.getLastVersion(value);
if (repobj != null) {
Property property = repobj.getProperty();
if (property != null) {
repositoryName2 = property.getLabel();
}
}
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
}
// When no repository avaiable on "Repository" mode, open a MessageDialog.
if (repositoryName2 == null || repositoryName2.length() == 0) {
MessageDialog.openError(composite.getShell(), Messages.getString("NoRepositoryDialog.Title"), Messages //$NON-NLS-1$
.getString("NoRepositoryDialog.Text")); //$NON-NLS-1$
return null;
}
// Part maybe not exist
String processName = "";//$NON-NLS-1$
String key = "";//$NON-NLS-1$
if (elem instanceof Node) {
processName = ((Node) elem).getProcess().getName();
key = processName + ((Node) elem).getUniqueName();
} else if (elem instanceof IProcess) {
processName = ((IProcess) elem).getName();
key = processName;
}
key += repositoryName2;
final Dialog builderDialog = sqlbuilers.get(key);
if (!composite.isDisposed() && builderDialog != null && builderDialog.getShell() != null
&& !builderDialog.getShell().isDisposed()) {
builderDialog.getShell().setActive();
} else {
connParameters.setRepositoryName(repositoryName2);
if (repositoryId != null) {
connParameters.setRepositoryId(repositoryId);
}
Shell parentShell = new Shell(composite.getShell().getDisplay());
String nodeLabel = null;
if (elem instanceof Node) {
nodeLabel = (String) ((Node) elem).getElementParameter(EParameterName.LABEL.getName()).getValue();
}
TextUtil.setDialogTitle(processName, nodeLabel, elem.getElementName());
ISQLBuilderService service = (ISQLBuilderService) GlobalServiceRegister.getDefault().getService(
ISQLBuilderService.class);
connParameters.setQuery(query);
connParameters.setFirstOpenSqlBuilder(true); // first open Sql Builder,set true
Dialog sqlBuilder = service.openSQLBuilderDialog(parentShell, processName, connParameters);
sqlbuilers.put(key, sqlBuilder);
if (Window.OK == sqlBuilder.open()) {
if (!composite.isDisposed() && !connParameters.isNodeReadOnly()) {
String sql = connParameters.getQuery();
// modified by hyWang
if (!connParameters.getIfContextButtonCheckedFromBuiltIn()) {
sql = QueryUtil.checkAndAddQuotes(sql);
}
return sql;
}
}
}
}
return null;
}
public void dispose() {
if (widgetFactory != null) {
widgetFactory.dispose();
}
widgetFactory = null;
sqlbuilers.clear();
sqlbuilers = null;
dynamicProperty = null;
composite = null;
hashCurControls = null;
elem = null;
part = null;
section = null;
editionControlHelper = null;
curParameter = null;
}
public void addRepositoryPropertyListener(Control control) {
boolean flag = false;
if (this.curParameter != null) {
final EComponentCategory category = this.curParameter.getCategory();
final IElement element = this.curParameter.getElement();
if (AbstractPreferenceComposite.inUseProjectSettingMode(element, category,
EParameterName.STATANDLOG_USE_PROJECT_SETTINGS)
|| AbstractPreferenceComposite.inUseProjectSettingMode(element, category,
EParameterName.IMPLICITCONTEXT_USE_PROJECT_SETTINGS)) {
flag = true; // don't add the listener.
}
}
if (!flag) {
control.addMouseListener(listenerSelection);
}
}
MouseListener listenerSelection = new MouseAdapter() {
public void mouseDown(MouseEvent e) {
ModelSelectionDialog modelSelect = new ModelSelectionDialog(((Control) e.getSource()).getShell(),
ESelectionType.NORMAL);
if (modelSelect.open() == ModelSelectionDialog.OK) {
if (modelSelect.getOptionValue() == EEditSelection.BUILDIN) {
// getCommandStack().execute(changeToBuildInCommand((Control) e.getSource()));
executeCommand(changeToBuildInCommand((Control) e.getSource()));
}
if (modelSelect.getOptionValue() == EEditSelection.REPOSITORY) {
// getCommandStack().execute(refreshConnectionCommand((Control) e.getSource()));
executeCommand(refreshConnectionCommand((Control) e.getSource()));
}
}
}
};
private Command changeToBuildInCommand(Control control) {
final String typeName = ":" + EParameterName.PROPERTY_TYPE.getName(); //$NON-NLS-1$
if (curParameter != null) {
String parentName = null;
if (curParameter.getCategory() == EComponentCategory.EXTRA) {
parentName = JobSettingsConstants.getExtraParameterName(EParameterName.PROPERTY_TYPE.getName());
} else if (curParameter.getCategory() == EComponentCategory.STATSANDLOGS) {
parentName = EParameterName.PROPERTY_TYPE.getName();
}
if (parentName != null) {
return new ChangeValuesFromRepository(elem, null, parentName + typeName, EmfComponent.BUILTIN);
}
}
return new ChangeValuesFromRepository(elem, null, UpgradeParameterHelper.PROPERTY + typeName, EmfComponent.BUILTIN);
}
private Command refreshConnectionCommand(Control control) {
final IElementParameter propertyParam = elem.getElementParameterFromField(EParameterFieldType.PROPERTY_TYPE);
if (propertyParam != null) {
final IElementParameter repositoryParam = propertyParam.getChildParameters().get(
EParameterName.REPOSITORY_PROPERTY_TYPE.getName());
if (repositoryParam != null) {
try {
IRepositoryViewObject o = RepositoryPlugin.getDefault().getRepositoryService().getProxyRepositoryFactory()
.getLastVersion((String) repositoryParam.getValue());
// for bug 14535
if (o != null && elem instanceof INode) {
INode node = (INode) elem;
IMetadataService metadataService = CorePlugin.getDefault().getMetadataService();
if (metadataService != null) {
metadataService.openMetadataConnection(o, node);
}
IRepositoryView view = RepositoryManagerHelper.findRepositoryView();
if (view != null) {
view.refresh();
}
}
} catch (Exception e) {
ExceptionHandler.process(e);
}
}
}
return null;
}
protected IProcess getProcess(final IElement elem, final IMultiPageTalendEditor part) {
IProcess process = null;
if (part == null) {
// achen modify to fix 0005991 part is null
if (elem instanceof INode) {
process = ((INode) elem).getProcess();
}
} else {
process = part.getProcess();
}
return process;
}
/**
*
* cli Comment method "addResourceDisposeListener".
*
* When dispose the control, dispose resource at the same time. (bug 6916)
*/
protected void addResourceDisposeListener(final Control parent, final Resource res) {
if (parent != null) {
parent.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (res != null && !res.isDisposed()) {
res.dispose();
}
parent.removeDisposeListener(this);
}
});
}
}
public List<Problem> getCodeProblems() {
return this.codeProblems;
}
public void updateCodeProblems(List<Problem> codeProblems) {
if (codeProblems != null) {
this.codeProblems = new ArrayList<Problem>(codeProblems);
}
}
public void setCodeProblems(List<Problem> codeProblems) {
this.codeProblems = codeProblems;
}
}