/******************************************************************************* * Copyright (c) 2008 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.smooks.graphical.actions; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.ecore.util.FeatureMapUtil; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.wizard.IWizard; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.ui.IEditorPart; import org.jboss.tools.smooks.SmooksModelUtils; import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils; import org.jboss.tools.smooks.editor.ISmooksModelProvider; import org.jboss.tools.smooks.graphical.editors.TaskTypeManager; import org.jboss.tools.smooks.graphical.editors.process.ProcessFactory; import org.jboss.tools.smooks.graphical.editors.process.TaskType; import org.jboss.tools.smooks.graphical.wizard.TemplateMessageTypeWizard; import org.jboss.tools.smooks.graphical.wizard.freemarker.FreemarkerTemplateParametersProvider; import org.jboss.tools.smooks.model.ModelFilter; import org.jboss.tools.smooks.model.freemarker.Freemarker; import org.jboss.tools.smooks.model.freemarker.FreemarkerFactory; import org.jboss.tools.smooks.model.freemarker.FreemarkerPackage; import org.jboss.tools.smooks.model.smooks.ParamType; import org.jboss.tools.smooks.model.smooks.ResourceConfigType; import org.jboss.tools.smooks.model.smooks.ResourceType; import org.jboss.tools.smooks.model.smooks.SmooksFactory; import org.jboss.tools.smooks.model.smooks.SmooksPackage; import org.jboss.tools.smooks.model.smooks.SmooksResourceListType; import org.milyn.delivery.DomModelCreator; /** * @author Dart * */ public class AddNextTaskNodeAction extends AddTaskNodeAction { public AddNextTaskNodeAction(String taskID, String text, ISmooksModelProvider provider, IEditorPart editor) { super(taskID, text, provider, editor); } @Override protected void init() { super.init(); } protected void addFreemarkerTemplateTask(IWizard currentWizard, SmooksResourceListType resourceList) { if (currentWizard instanceof FreemarkerTemplateParametersProvider) { List<TaskType> selectedTask = getCurrentSelectedTask(); if(selectedTask == null || selectedTask.isEmpty()) { // No node properly selected in the Task Detail panel... return; } TaskType parentTask = selectedTask.get(0); Freemarker freemarker = FreemarkerFactory.eINSTANCE.createFreemarker(); Map<String, String> parameters = ((FreemarkerTemplateParametersProvider) currentWizard).getParameters(); Iterator<String> keys = parameters.keySet().iterator(); while (keys.hasNext()) { String key = keys.next(); String value = parameters.get(key); ParamType param = SmooksFactory.eINSTANCE.createParamType(); param.setName(key); param.setStringValue(value); freemarker.getParam().add(param); } String type = ((FreemarkerTemplateParametersProvider) currentWizard).getTemplateType(); if (type != null) { ParamType param = SmooksFactory.eINSTANCE.createParamType(); param.setName(SmooksModelUtils.KEY_TEMPLATE_TYPE); param.setStringValue(type); freemarker.getParam().add(param); } // Add the templateDataProvider param... ParamType param = SmooksFactory.eINSTANCE.createParamType(); param.setName(SmooksModelUtils.TEMPLATE_DATA_PROVIDER_PARAM_NAME); param.setStringValue(parentTask.getId()); freemarker.getParam().add(param); CompoundCommand compoundCommand = new CompoundCommand(); compoundCommand.append(AddCommand.create(this.provider.getEditingDomain(), resourceList, SmooksPackage.Literals.SMOOKS_RESOURCE_LIST_TYPE__ABSTRACT_RESOURCE_CONFIG_GROUP, FeatureMapUtil .createEntry(FreemarkerPackage.Literals.DOCUMENT_ROOT__FREEMARKER, freemarker))); // If the template is connected from the input, create a // DomNodeModel configuration, if one doesn't already exist... if(TaskTypeManager.TASK_ID_INPUT.equals(parentTask.getId().trim())) { if(ModelFilter.DomModelCreator.execute(resourceList).isEmpty()) { compoundCommand.append(createDomNodeModelConfig(resourceList)); } } if (compoundCommand.canExecute()) { provider.getEditingDomain().getCommandStack().execute(compoundCommand); TaskType childTask = ProcessFactory.eINSTANCE.createTaskType(); childTask.setId(getTaskID()); childTask.addTaskResource(freemarker); childTask.setType(type); parentTask.addTask(childTask); } } } private Command createDomNodeModelConfig(SmooksResourceListType resourceList) { ResourceConfigType resourceConfig = SmooksFactory.eINSTANCE.createResourceConfigType(); ResourceType resource = SmooksFactory.eINSTANCE.createResourceType(); resourceConfig.setSelector("#document"); resource.setValue(DomModelCreator.class.getName()); resourceConfig.setResource(resource); return AddCommand.create(this.provider.getEditingDomain(), resourceList, SmooksPackage.Literals.SMOOKS_RESOURCE_LIST_TYPE__ABSTRACT_RESOURCE_CONFIG_GROUP, FeatureMapUtil .createEntry(SmooksPackage.Literals.DOCUMENT_ROOT__RESOURCE_CONFIG, resourceConfig)); } @Override public void run() { super.run(); if (this.provider != null) { SmooksResourceListType resourceList = SmooksUIUtils.getSmooks11ResourceListType(provider.getSmooksModel()); if (taskID.equals(TaskTypeManager.TASK_ID_FREEMARKER_XML_TEMPLATE) || taskID.equals(TaskTypeManager.TASK_ID_FREEMARKER_CSV_TEMPLATE)) { // open wizard TemplateMessageTypeWizard wizard = new TemplateMessageTypeWizard(); WizardDialog dialog = new WizardDialog(editorPart.getSite().getShell(), wizard); if (dialog.open() == Dialog.OK) { // init freemarker model IWizard currentWizard = wizard.getWizard(); addFreemarkerTemplateTask(currentWizard, resourceList); } else { return; } } else { TaskType parentTask = this.getCurrentSelectedTask().get(0); TaskType childTask = ProcessFactory.eINSTANCE.createTaskType(); childTask.setId(taskID); childTask.setName(TaskTypeManager.getTaskLabel(childTask)); parentTask.addTask(childTask); } } } protected TaskType createTaskType() { return ProcessFactory.eINSTANCE.createTaskType(); } @Override public void update() { super.update(); if (this.isEnabled()) { TaskType testTaskType = ProcessFactory.eINSTANCE.createTaskType(); testTaskType.setId(taskID); setEnabled(rules.isNextTask(this.getCurrentSelectedTask().get(0), testTaskType)); } } }