// ============================================================================ // // 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.repository.ui.dialog; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.EList; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.talend.commons.exception.PersistenceException; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.commons.utils.VersionUtils; import org.talend.core.CorePlugin; import org.talend.core.GlobalServiceRegister; import org.talend.core.context.Context; import org.talend.core.context.RepositoryContext; import org.talend.core.model.context.JobContextManager; import org.talend.core.model.process.IContext; import org.talend.core.model.process.IContextManager; import org.talend.core.model.process.IContextParameter; import org.talend.core.model.properties.ContextItem; import org.talend.core.model.properties.PropertiesFactory; 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.model.utils.RepositoryManagerHelper; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.designer.core.IDesignerCoreService; import org.talend.designer.core.model.utils.emf.talendfile.ContextParameterType; import org.talend.designer.core.model.utils.emf.talendfile.ContextType; import org.talend.designer.core.model.utils.emf.talendfile.TalendFileFactory; import org.talend.repository.RepositoryPlugin; import org.talend.repository.i18n.Messages; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.IRepositoryService; import org.talend.repository.model.RepositoryConstants; import org.talend.repository.model.RepositoryNode; import org.talend.repository.ui.views.IRepositoryView; /** * DOC xye class global comment. Detailled comment <br/> * * $Id: talend.epf 1 2006-09-29 17:06:40 +0000 (星期五, 29 九月 2006) nrousseau $ * */ public class ContextRepositoryReviewDialog extends RepositoryReviewDialog { // added by hyWang private IContextManager contextManager; private final List<IContextParameter> params; private Text contextNameText; private Button createNewButton; private String msg = org.talend.core.i18n.Messages.getString("PropertiesWizardPage.NameFormatError"); //$NON-NLS-1$ private String title = Messages.getString("ContextRepositoryReviewDialog.conflictError"); //$NON-NLS-1$ private String errorMsg = Messages.getString("ContextRepositoryReviewDialog.contextSameNameError"); //$NON-NLS-1$ /** * DOC xye ContextRepositoryReviewDialog constructor comment. * * @param parentShell * @param type */ public ContextRepositoryReviewDialog(Shell parentShell, ERepositoryObjectType type, final List<IContextParameter> params, IContextManager contextManager) { super(parentShell, type); this.params = params; this.contextManager = contextManager; } /* * (non-Javadoc) * * @see org.talend.repository.ui.dialog.RepositoryReviewDialog#createDialogArea(org.eclipse.swt.widgets.Composite) */ @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); Composite bg = new Composite(container, SWT.NULL); bg.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); GridLayout layout = new GridLayout(); layout.numColumns = 3; bg.setLayout(layout); Label label = new Label(bg, SWT.NONE); label.setText(Messages.getString("BuiltinToContext.newContextName")); //$NON-NLS-1$ contextNameText = new Text(bg, SWT.BORDER); contextNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); contextNameText.setEnabled(false); createNewButton = new Button(bg, SWT.CHECK); createNewButton.setText(Messages.getString("BuiltinToContext.createNewContext")); //$NON-NLS-1$ createNewButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { contextNameText.setEnabled(createNewButton.getSelection()); getButton(IDialogConstants.OK_ID).setEnabled(createNewButton.getSelection()); } }); return container; } private boolean nameInvalid(Text nameText) { return nameText.getText().length() == 0 || !Pattern.matches(RepositoryConstants.getPattern(ERepositoryObjectType.CONTEXT), nameText.getText()) || nameText.getText().trim().contains(" "); //$NON-NLS-1$ } /* * (non-Javadoc) * * @see org.talend.repository.ui.dialog.RepositoryReviewDialog#okPressed() */ @SuppressWarnings("unchecked") @Override protected void okPressed() { if (params == null || params.isEmpty()) { super.okPressed(); } ContextItem item = null; ProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance(); if (createNewButton.getSelection()) { if (nameInvalid(contextNameText)) { MessageDialog.openError(getShell(), "Context", msg); //$NON-NLS-1$ return; } else { item = PropertiesFactory.eINSTANCE.createContextItem(); if (item == null) { return; } Property createProperty = PropertiesFactory.eINSTANCE.createProperty(); createProperty .setAuthor(((RepositoryContext) CorePlugin.getContext().getProperty(Context.REPOSITORY_CONTEXT_KEY)) .getUser()); createProperty.setVersion(VersionUtils.DEFAULT_VERSION); createProperty.setStatusCode(""); //$NON-NLS-1$ try { String nextId = factory.getNextId(); createProperty.setId(nextId); item.setProperty(createProperty); for (IContext context : contextManager.getListContext()) { ContextType contextType = TalendFileFactory.eINSTANCE.createContextType(); contextType.setName(context.getName()); item.getContext().add(contextType); } item.setDefaultContext(contextManager.getDefaultContext().getName()); item.getProperty().setLabel(contextNameText.getText().trim()); IRepositoryService service = (IRepositoryService) GlobalServiceRegister.getDefault().getService( IRepositoryService.class); IProxyRepositoryFactory repositoryFactory = service.getProxyRepositoryFactory(); try { boolean nameAvaliabe = repositoryFactory.isNameAvailable(createProperty.getItem(), contextNameText.getText()); if (!nameAvaliabe) { MessageDialog.openError(getShell(), "Context", org.talend.core.i18n.Messages //$NON-NLS-1$ .getString("PropertiesWizardPage.ItemExistsError")); //$NON-NLS-1$ return; } } catch (PersistenceException e) { ExceptionHandler.process(e); super.okPressed(); } factory.create(item, new Path("")); //$NON-NLS-1$ } catch (PersistenceException e) { ExceptionHandler.process(e); super.okPressed(); } } } else { IStructuredSelection selection = (IStructuredSelection) getRepositoryTreeViewer().getSelection(); RepositoryNode context = (RepositoryNode) selection.getFirstElement(); try { // get the item from file IRepositoryViewObject contextObj = factory.getLastVersion(context.getObject().getProperty().getId()); item = (ContextItem) contextObj.getProperty().getItem(); } catch (PersistenceException e) { ExceptionHandler.process(e); super.okPressed(); } } IContext jobDefaultContext = contextManager.getDefaultContext(); // get default context from job List<IContext> jobContextlist = contextManager.getListContext(); // get all context from job List<String> jobContextNames = getJobContextGroupNames(jobContextlist); if (item == null) { return; } EList contextList = item.getContext(); // if (contextList.isEmpty()) { // ContextType contextType = TalendFileFactory.eINSTANCE.createContextType(); // contextList.add(contextType); // } boolean conflictflag = false; JobContextManager itemManager = new JobContextManager(); itemManager.loadFromEmf(contextList, item.getDefaultContext()); // this loop is used to get all context groups for (int i = 0, n = contextList.size(); i < n; i++) { ContextType type = (ContextType) contextList.get(i); if (type == null) { super.okPressed(); } EList contextParameters = type.getContextParameter(); // parameters from current contextType List<IContextParameter> allParameters = getAllExistContextParameters(contextParameters, params); // find one same context group,this group will get the // values from the same group of designer if (jobContextNames.contains(type.getName())) { int index = jobContextNames.indexOf(type.getName()); IContext currentContext = jobContextlist.get(index); for (IContextParameter param : params) { if (!allParameters.contains(param)) { IContextParameter selectedParam = currentContext.getContextParameter(param.getName()); ContextParameterType parameter = TalendFileFactory.eINSTANCE.createContextParameterType(); copyContextParameter(item, contextParameters, parameter, selectedParam); } else { for (int k = 0; k < contextParameters.size(); k++) { ContextParameterType parameter = (ContextParameterType) contextParameters.get(k); if (parameter.getName().equals(param.getName())) { conflictflag = true; break; } } } } // this group will get the vaules from default group of designer } else if (!jobContextNames.contains(type.getName()) && type.getName() != null) { for (IContextParameter param : params) { if (!allParameters.contains(param)) { IContextParameter selectedParam = jobDefaultContext.getContextParameter(param.getName()); ContextParameterType parameter = TalendFileFactory.eINSTANCE.createContextParameterType(); copyContextParameter(item, contextParameters, parameter, selectedParam); } else { for (int k = 0; k < contextParameters.size(); k++) { ContextParameterType parameter = (ContextParameterType) contextParameters.get(k); if (parameter.getName().equals(param.getName())) { conflictflag = true; break; } } } } } // Update some parameters // EList contextParameters = type.getContextParameter(); // List<IContextParameter> updateParams = new ArrayList<IContextParameter>(); // for (int j = 0, m = contextParameters.size(); j < m; j++) { // ContextParameterType parameter = (ContextParameterType) contextParameters.get(j); // for (IContextParameter param : params) { // if (parameter.getName().equals(param.getName())) { // copyContextParameter(item, contextParameters, parameter, param); // updateParams.add(param); // } // } // } // Add parameter to group // for (IContextParameter param : params) { // if (!updateParams.contains(param)) { // ContextParameterType parameter = TalendFileFactory.eINSTANCE.createContextParameterType(); // copyContextParameter(item, contextParameters, parameter, param); // } // } } if (conflictflag) { MessageDialog.openError(getShell(), title, errorMsg); } // Save try { ProxyRepositoryFactory.getInstance().save(item, false); updateRelatedView(); } catch (PersistenceException e) { ExceptionHandler.process(e); } super.okPressed(); } private List<IContextParameter> getAllExistContextParameters(EList contextParameters, List<IContextParameter> params) { List<IContextParameter> allParameters = new ArrayList<IContextParameter>(); for (int i = 0; i < contextParameters.size(); i++) { ContextParameterType parameter = (ContextParameterType) contextParameters.get(i); for (IContextParameter param : params) { if (parameter.getName().equals(param.getName())) { allParameters.add(param); } } } return allParameters; } /** * DOC xye Comment method "copyContextParameter". * * @param context * @param item * @param contextParameters * @param parameter * @param param */ @SuppressWarnings("unchecked") private void copyContextParameter(ContextItem item, EList contextParameters, ContextParameterType parameter, IContextParameter selectedParam) { parameter.setName(selectedParam.getName()); parameter.setComment(selectedParam.getComment()); parameter.setPrompt(selectedParam.getPrompt()); parameter.setPromptNeeded(selectedParam.isPromptNeeded()); // parameter.setRepositoryContextId(item.getProperty().getId()); parameter.setType(selectedParam.getType()); parameter.setValue(selectedParam.getValue()); contextParameters.add(parameter); selectedParam.setSource(item.getProperty().getId()); } /** * DOC xye Comment method "updateProcessContextManager". */ private void updateRelatedView() { // refresh context view IDesignerCoreService designerCoreService = RepositoryPlugin.getDefault().getDesignerCoreService(); designerCoreService.switchToCurContextsView(); designerCoreService.switchToCurComponentSettingsView(); designerCoreService.switchToCurJobSettingsView(); // refresh repository view IRepositoryView view = RepositoryManagerHelper.findRepositoryView(); if (view != null) { view.refresh(ERepositoryObjectType.CONTEXT); } // refresh fake repository view if (getRepositoryTreeViewer() != null) { getRepositoryTreeViewer().refresh(); } } /** * DOC hyWang Comment method "getJobContextGroupNames". */ private List<String> getJobContextGroupNames(List<IContext> jobContextlist) { List<String> jobContextNames = new ArrayList<String>(); // parameters from designer of default context for (int k = 0; k < jobContextlist.size(); k++) { jobContextNames.add(k, jobContextlist.get(k).getName()); } return jobContextNames; } }