// ============================================================================ // // 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.views.jobsettings; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.emf.common.util.EList; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.SelectionDialog; import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants; import org.talend.commons.exception.PersistenceException; import org.talend.commons.ui.swt.dialogs.ProgressDialog; import org.talend.commons.ui.utils.TypedTextCommandExecutor; import org.talend.core.CorePlugin; import org.talend.core.model.metadata.builder.connection.Connection; 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.IElement; import org.talend.core.model.process.IElementParameter; 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.properties.ConnectionItem; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.JobletProcessItem; import org.talend.core.model.properties.ProcessItem; import org.talend.core.model.properties.Property; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.model.update.RepositoryUpdateManager; import org.talend.core.model.update.UpdatesConstants; import org.talend.designer.core.DesignerPlugin; 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.model.utils.emf.talendfile.ElementParameterType; import org.talend.designer.core.model.utils.emf.talendfile.NodeType; import org.talend.designer.core.model.utils.emf.talendfile.ProcessType; import org.talend.designer.core.ui.MultiPageTalendEditor; import org.talend.designer.core.ui.editor.cmd.ChangeValuesFromRepository; import org.talend.designer.core.ui.editor.process.Process; import org.talend.designer.core.ui.views.properties.MultipleThreadDynamicComposite; import org.talend.designer.core.ui.views.statsandlogs.StatsAndLogsViewHelper; import org.talend.designer.core.utils.DesignerUtilities; import org.talend.designer.joblet.model.JobletProcess; import org.talend.designer.runprocess.ItemCacheManager; import org.talend.repository.UpdateRepositoryUtils; import org.talend.repository.model.IProxyRepositoryFactory; /** * Add buttons for loading and saving values between preference page and job view. */ public abstract class AbstractPreferenceComposite extends MultipleThreadDynamicComposite { protected Button reloadBtn; protected Button saveBtn; private String dialogTitle; protected Button applyToChildrenJob; private List<INode> tRunJobNodes; private static final String PROCESS = "PROCESS"; //$NON-NLS-1$ // achen added to fix 0005991 & 0005993 protected boolean isUsingProjectSetting; protected Button useProjectSetting; protected Composite topComposite; /** * DOC chuang AbstractPreferenceComposite constructor comment. * * @param parentComposite * @param styles * @param section * @param element * @param isCompactView */ public AbstractPreferenceComposite(Composite parentComposite, int styles, EComponentCategory section, Element element, boolean isCompactView) { super(parentComposite, styles, section, element, isCompactView); } public void setDialogTitle(String dialogTitle) { this.dialogTitle = dialogTitle; } protected abstract boolean needApplyToChildren(); @Override public void addComponents(boolean forceRedraw, boolean reInitialize, int height) { if (forceRedraw || isNeedRedraw()) { disposeChildren(); topComposite = new Composite(getComposite(), SWT.NONE); if (hasRunJobNode(false) && needApplyToChildren() || isUsingProjectSetting) { topComposite.setLayout(new GridLayout(3, false)); } else { topComposite.setLayout(new GridLayout(2, false)); } topComposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); reloadBtn = new Button(topComposite, SWT.PUSH); reloadBtn.setText(Messages.getString("StatsAndLogsComposite.Reload")); //$NON-NLS-1$ reloadBtn.setToolTipText(Messages.getString("StatsAndLogsComposite.ReloadToolTipText")); //$NON-NLS-1$ saveBtn = new Button(topComposite, SWT.PUSH); saveBtn.setText(Messages.getString("StatsAndLogsComposite.Save")); //$NON-NLS-1$ saveBtn.setToolTipText(Messages.getString("StatsAndLogsComposite.SaveToolTipText")); //$NON-NLS-1$ // achen modify to fix 0005993 if (isUsingProjectSetting) { saveBtn.setText(Messages.getString("SaveToProjectSettings")); //$NON-NLS-1$ saveBtn.setToolTipText(Messages.getString("SaveToProjectSettingsToolTipText")); //$NON-NLS-1$ reloadBtn.setText(Messages.getString("ReloadFromProjectSettings")); //$NON-NLS-1$ reloadBtn.setToolTipText(Messages.getString("ReloadFromProjectSettingsToolTipText")); //$NON-NLS-1$ // add useprojectsetting button useProjectSetting = new Button(topComposite, SWT.CHECK); useProjectSetting.setText(Messages.getString("StatsAndLogs.UseProjectSettings")); //$NON-NLS-1$ useProjectSetting.setToolTipText(Messages.getString("StatsAndLogs.UseProjectSettings")); //$NON-NLS-1$ useProjectSetting.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); } // end if (hasRunJobNode(false) && needApplyToChildren()) { applyToChildrenJob = new Button(topComposite, SWT.PUSH); applyToChildrenJob.setText(Messages.getString("AbstractPreferenceComposite.textContent")); //$NON-NLS-1$ applyToChildrenJob.setToolTipText(Messages.getString("AbstractPreferenceComposite.tipContent")); //$NON-NLS-1$ } Point initialSize = topComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT); addButtonListeners(); refresh(); super.addComponents(true, false, initialSize.y + ITabbedPropertyConstants.VSPACE); } } // protected ProcessItem getItem() { // Process process = (Process) elem; // return (ProcessItem) process.getProperty().getItem(); // } /** * * DOC aimingchen Comment method "setMainCompositeEnable". * * @param enabled */ protected void setMainCompositeEnable(boolean enabled) { Control[] controls = getComposite().getChildren(); for (int i = 0; i < controls.length; i++) { Control control = controls[i]; if (control != topComposite) { if (control instanceof Composite) { setEditable((Composite) control, enabled); } else { setTextEnable(control, enabled, enabled); } } } } /** * wchen Comment method "setTextEnable". */ private void setTextEnable(Control control, boolean enabled, boolean flag) { if (control instanceof Text) { Text t = (Text) control; Object data = t.getData(TypedTextCommandExecutor.PARAMETER_NAME); if (useRepository((String) data)) { t.setEditable(false); } else { t.setEditable(enabled); } if (!t.getEditable()) { t.removeMouseListener(listenerSelection); t.addMouseListener(listenerSelection); } else { t.removeMouseListener(listenerSelection); } } else if (control instanceof Button) { Object p = control.getData(TypedTextCommandExecutor.PARAMETER_NAME); Object n = control.getData("NAME"); if (p != null && n != null && p instanceof String && n instanceof String) { if (((String) p).equals("SQLEDITOR") && ((String) n).equals("TABLE_STATS")) { return; } } } else { control.setEnabled(flag); } } private void setEditable(Composite parent, boolean editable) { Control[] children = parent.getChildren(); for (int i = 0; i < children.length; i++) { if (children[i] instanceof Composite) { setEditable((Composite) children[i], editable); } else { setTextEnable(children[i], editable, true); } } } protected void updateContextValue(boolean update) { if (!update) { return; } IElementParameter proElement = elem.getElementParameter(EParameterName.PROPERTY_TYPE.getName()).getChildParameters() .get(EParameterName.PROPERTY_TYPE.getName()); Object value = proElement.getValue(); if (value instanceof String && ((String) value).equalsIgnoreCase(EmfComponent.REPOSITORY)) { String id = (String) elem.getElementParameter( EParameterName.PROPERTY_TYPE.getName() + ":" + EParameterName.REPOSITORY_PROPERTY_TYPE.getName()) //$NON-NLS-1$ .getValue(); String propertyType = EParameterName.PROPERTY_TYPE.getName() + ":" + EParameterName.REPOSITORY_PROPERTY_TYPE.getName(); ConnectionItem connectionItem = UpdateRepositoryUtils.getConnectionItemByItemId(id); Connection connection = connectionItem.getConnection(); ChangeValuesFromRepository command = new ChangeValuesFromRepository(elem, connection, propertyType, id); getCommandStack().execute(command); } } protected boolean useRepository(String paramName) { if (elem == null) { return false; } IElementParameter param = elem.getElementParameterFromField(EParameterFieldType.PROPERTY_TYPE, section); if (param == null) { return false; } param = param.getChildParameters().get(EParameterName.PROPERTY_TYPE.getName()); if (param == null) { return false; } if (!EmfComponent.REPOSITORY.equals(param.getValue())) { return false; } if (EParameterName.PROPERTY_TYPE.getName().equals(paramName)) { return true; } IElementParameter elementParameter = elem.getElementParameter(paramName); // ? if (elementParameter != null && elementParameter.getCategory() == section && elementParameter.getRepositoryValue() != null) { return true; } return false; } private String implicitParamName(String parameterName) { return parameterName + "_IMPLICIT_CONTEXT"; } MouseListener listenerSelection = new MouseAdapter() { public void mouseDown(MouseEvent e) { if (inUseProjectSettingMode(elem, section, EParameterName.STATANDLOG_USE_PROJECT_SETTINGS) || inUseProjectSettingMode(elem, section, EParameterName.IMPLICITCONTEXT_USE_PROJECT_SETTINGS)) { UseProjectSettingDialog modelSelect = new UseProjectSettingDialog(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell()); if (modelSelect.open() == UseProjectSettingDialog.OK) { if (modelSelect.getOptionValue().equals("noUseProjectSettings")) { //$NON-NLS-1$ useProjectSetting.setSelection(false); useProjectSettingButtonClick(); } if (modelSelect.getOptionValue().equals("updateProjectSettings")) {//$NON-NLS-1$ useProjectSetting.setSelection(true); useProjectSettingButtonClick(); } } } } }; private void addButtonListeners() { reloadBtn.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { onReloadButtonClick(); } public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }); saveBtn.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { onSaveButtonClick(); } public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }); if (hasRunJobNode(false) && needApplyToChildren()) { applyToChildrenJob.addSelectionListener(new SelectionListener() { /* * (non-Javadoc) * * @see * org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent) */ public void widgetDefaultSelected(SelectionEvent e) { } /* * (non-Javadoc) * * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ public void widgetSelected(SelectionEvent e) { // zli for bug 12335 final ProgressDialog progress = new ProgressDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getShell()) { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IEditorReference[] editorReferences = activePage.getEditorReferences(); CorePlugin defaultPlugin = CorePlugin.getDefault(); IDesignerCoreService designerCoreService = defaultPlugin.getDesignerCoreService(); List<IProcess2> openedProcessList = designerCoreService.getOpenedProcess(RepositoryUpdateManager .getEditors()); List<String> activeProcessId = new ArrayList<String>(); for (IProcess process : openedProcessList) { activeProcessId.add(process.getId()); } final int rate = 1 / openedProcessList.size() - activeProcessId.size(); for (INode runjobNode : tRunJobNodes) { String id = (String) runjobNode .getElementParameter(EParameterName.PROCESS_TYPE_PROCESS.getName()).getValue(); String version = (String) runjobNode.getElementParameter( EParameterName.PROCESS_TYPE_VERSION.getName()).getValue(); if ("".equals(id) || id == null) { //$NON-NLS-1$ MessageDialog.openWarning( getShell(), Messages.getString("AbstractPreferenceComposite.warning", runjobNode.getUniqueName()), //$NON-NLS-1$ Messages.getString( "AbstractPreferenceComposite.jobAssigned", runjobNode.getUniqueName())); //$NON-NLS-1$ return; } if (activeProcessId.contains(id)) { IEditorPart activeEditorPart = activePage.getActiveEditor(); for (IEditorReference editorReference : editorReferences) { IEditorPart editorPart = editorReference.getEditor(false); if ((editorPart != activeEditorPart) && (editorPart instanceof MultiPageTalendEditor)) { IElement element = ((MultiPageTalendEditor) editorPart).getProcess(); StatsAndLogsViewHelper.applySettings(elem, element, AbstractPreferenceComposite.this); } } } else { try { SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1 * UpdatesConstants.SCALE, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK); subMonitor.beginTask(UpdatesConstants.EMPTY, 1 * rate); IRepositoryViewObject lastVersion = DesignerPlugin.getDefault() .getProxyRepositoryFactory().getLastVersion(id); if (lastVersion != null) { Item item = lastVersion.getProperty().getItem(); IProcess processFromItem = designerCoreService.getProcessFromItem(item); if (processFromItem instanceof Process) { Process process = (Process) processFromItem; StatsAndLogsViewHelper.applySettings(elem, process, AbstractPreferenceComposite.this); IProxyRepositoryFactory factory = defaultPlugin.getProxyRepositoryFactory(); Property property = factory.getUptodateProperty(process.getProperty()); process.setProperty(property); subMonitor.subTask(RepositoryUpdateManager.getUpdateJobInfor(process .getProperty())); ProcessType processType = process.saveXmlFile(); Item item2 = process.getProperty().getItem(); if (item2 instanceof JobletProcessItem) { ((JobletProcessItem) item2).setJobletProcess((JobletProcess) processType); } else { ((ProcessItem) item2).setProcess(processType); } factory.save(item2); subMonitor.done(); } } } catch (PersistenceException e1) { e1.printStackTrace(); } catch (IOException e2) { e2.printStackTrace(); } } applySettingsToSubJob(id, version); } } }; try { progress.executeProcess(); } catch (InvocationTargetException e1) { e1.printStackTrace(); } catch (InterruptedException e1) { e1.printStackTrace(); } } /** * yzhang Comment method "applySettingsToSubJob". * * @param id * @param version */ private void applySettingsToSubJob(String id, String version) { ProcessType processType = ItemCacheManager.getProcessItem(id, version).getProcess(); EList<ElementParameterType> parameters = processType.getParameters().getElementParameter(); StatsAndLogsViewHelper.applySettings(parameters, elem); List<NodeType> nodes = findRunJobNode(processType.getNode()); for (NodeType nodeType : nodes) { EList<ElementParameterType> list = nodeType.getElementParameter(); ElementParameterType idParam = getElementParameterType(list, PROCESS + ":" //$NON-NLS-1$ + EParameterName.PROCESS_TYPE_PROCESS.getName()); ElementParameterType versionParam = getElementParameterType(list, PROCESS + ":" //$NON-NLS-1$ + EParameterName.PROCESS_TYPE_VERSION.getName()); String subId = idParam.getValue(); String subVersion = versionParam.getValue(); applySettingsToSubJob(subId, subVersion); } } }); } } /** * * DOC aimingchen Comment method "useProjectSetting". */ protected void useProjectSetting() { if (elem == null) { return; } // achen modify to fix 0005991& 0005993 onReloadPreference(); // IEditorPart activeEditor = // PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); // // if (activeEditor != null) { // AbstractTalendEditor workbenchPart = ((AbstractMultiPageTalendEditor) activeEditor).getTalendEditor(); // workbenchPart.setDirty(true); // } addComponents(true); refresh(); } /** * yzhang Comment method "getElementParameterType". * * @param paraName * @return */ private ElementParameterType getElementParameterType(EList<ElementParameterType> list, String paraName) { for (ElementParameterType parameter : list) { if (parameter.getName().equals(paraName)) { return parameter; } } return null; } /** * yzhang Comment method "hasRunJobNode". * * @return */ private boolean hasRunJobNode(boolean needRefresh) { if (tRunJobNodes == null || needRefresh) { tRunJobNodes = findRunJobNode(); } if (tRunJobNodes == null) { return false; } return tRunJobNodes.size() > 0; } /** * yzhang Comment method "foundRunJobNode". * * @return */ private List<INode> findRunJobNode() { if (elem instanceof IProcess) { return DesignerUtilities.getTRunjobs((IProcess) elem); } else { return null; } } /** * yzhang Comment method "findRunJobNode". * * @param nodes * @return */ private List<NodeType> findRunJobNode(EList<NodeType> nodes) { List<NodeType> matchingNodes = new ArrayList<NodeType>(); for (NodeType nodeType : nodes) { if (DesignerUtilities.isTRunJobComponent(nodeType)) { matchingNodes.add(nodeType); } } return matchingNodes; } protected void onReloadButtonClick() { if (elem == null) { return; } // achen modify to fix 0005991& 0005993 String message = ""; //$NON-NLS-1$ if (!isUsingProjectSetting) { message = Messages.getString("StatsAndLogsComposite.ReloadMessages"); //$NON-NLS-1$ } else { message = Messages.getString("ReloadFromProjectSettingsMessages"); //$NON-NLS-1$ } boolean isOK = MessageDialog.openConfirm(Display.getDefault().getActiveShell(), dialogTitle, message); //$NON-NLS-1$ if (isOK) { onReloadPreference(); // IEditorPart activeEditor = // PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); // // if (activeEditor != null) { // AbstractTalendEditor workbenchPart = ((AbstractMultiPageTalendEditor) activeEditor).getTalendEditor(); // workbenchPart.setDirty(true); // } } addComponents(true); refresh(); } /** * Override by subclass * */ protected void useProjectSettingButtonClick() { } /** * Override by subclass. */ protected void onReloadPreference() { } protected void onSaveButtonClick() { if (elem == null) { return; } // achen modify to fix 0005991& 0005993 String message = ""; //$NON-NLS-1$ if (!isUsingProjectSetting) { message = Messages.getString("StatsAndLogsComposite.SavePreferenceMessages"); //$NON-NLS-1$ } else { message = Messages.getString("SaveToProjectSettingsMessage"); //$NON-NLS-1$ } boolean isOK = MessageDialog.openConfirm(Display.getDefault().getActiveShell(), dialogTitle, message); //$NON-NLS-1$ if (isOK) { onSavePreference(); } } /** * Override by subclass. */ protected void onSavePreference() { } @Override public void refresh() { super.refresh(); Element element = getElement(); if (element != null && element instanceof IProcess) { IProcess process = (IProcess) element; if (reloadBtn != null && !reloadBtn.isDisposed()) { reloadBtn.setEnabled(!process.isReadOnly()); } if (saveBtn != null && !saveBtn.isDisposed()) { saveBtn.setEnabled(!process.isReadOnly()); } if (applyToChildrenJob != null && !applyToChildrenJob.isDisposed()) { applyToChildrenJob.setEnabled(!process.isReadOnly()); } } } public static boolean inUseProjectSettingMode(final IElement element, final EComponentCategory category, final EParameterName paramName) { if (element != null && category != null && element instanceof IProcess && (paramName == EParameterName.STATANDLOG_USE_PROJECT_SETTINGS || paramName == EParameterName.IMPLICITCONTEXT_USE_PROJECT_SETTINGS)) { IElementParameter tmpParam = element.getElementParameter(paramName.getName()); if (tmpParam != null && tmpParam.getCategory() == category && tmpParam.getValue() instanceof Boolean && (Boolean) tmpParam.getValue()) { return true; } } return false; } /** * * DOC Administrator AbstractPreferenceComposite class global comment. Detailled comment */ class UseProjectSettingDialog extends SelectionDialog { private final String TITLE = "Edit parameter"; //$NON-NLS-1$ private final String MESSAGE = "Plese choose one option."; //$NON-NLS-1$ private String str; private Button noUseProjectSettingsButton, updateProjectSettingsButton; private Boolean readOnlyJob; public UseProjectSettingDialog(Shell parentShell) { this(parentShell, false); } public UseProjectSettingDialog(Shell parentShell, boolean isReadOnly) { super(parentShell); setHelpAvailable(false); setTitle(TITLE); setMessage(MESSAGE); this.readOnlyJob = isReadOnly; } @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); createMessageArea(composite); Label titleBarSeparator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR); titleBarSeparator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); createOptionArea(composite); return composite; } protected Control createOptionArea(Composite composite) { Composite inner = new Composite(composite, SWT.NONE); GridLayout gridLayout = new GridLayout(); gridLayout.marginHeight = 0; inner.setLayout(gridLayout); GridData gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.minimumWidth = 300; inner.setLayoutData(gridData); Group group = new Group(inner, SWT.NONE); group.setText("Option"); //$NON-NLS-1$ gridLayout = new GridLayout(); gridLayout.horizontalSpacing = 10; group.setLayout(gridLayout); group.setLayoutData(gridData); noUseProjectSettingsButton = new Button(group, SWT.RADIO); noUseProjectSettingsButton.setText("Don't use project settings"); //$NON-NLS-1$ updateProjectSettingsButton = new Button(group, SWT.RADIO); updateProjectSettingsButton.setText("Update project settings"); //$NON-NLS-1$ configControlStatus(); return inner; } private void configControlStatus() { if (readOnlyJob) { noUseProjectSettingsButton.setEnabled(false); updateProjectSettingsButton.setEnabled(false); } } @Override protected void okPressed() { if (noUseProjectSettingsButton.getSelection()) setOptionValue("noUseProjectSettings"); //$NON-NLS-1$ if (updateProjectSettingsButton.getSelection()) setOptionValue("updateProjectSettings");//$NON-NLS-1$ super.okPressed(); } public String getOptionValue() { return this.str; } public void setOptionValue(String str) { this.str = str; } } }