/*******************************************************************************
* 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.editors;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.jboss.tools.smooks.SmooksModelUtils;
import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils;
import org.jboss.tools.smooks.graphical.editors.process.ProcessFactory;
import org.jboss.tools.smooks.graphical.editors.process.ProcessType;
import org.jboss.tools.smooks.graphical.editors.process.TaskType;
import org.jboss.tools.smooks.model.freemarker.Freemarker;
import org.jboss.tools.smooks.model.javabean12.BeanType;
import org.jboss.tools.smooks.model.smooks.AbstractResourceConfig;
import org.jboss.tools.smooks.model.smooks.ParamType;
import org.jboss.tools.smooks.model.smooks.SmooksFactory;
import org.jboss.tools.smooks.model.smooks.SmooksResourceListType;
/**
* @author Dart
*
*/
public class ProcessAnalyzer {
protected IEditingDomainProvider domainProvider;
public ProcessAnalyzer(IEditingDomainProvider domainProvider) {
this.domainProvider = domainProvider;
Assert.isNotNull(this.domainProvider);
}
public List<TaskType> analyzeTaskID(SmooksResourceListType resourceList) {
List<String> taskIDs = new ArrayList<String>();
List<TaskType> tasks = new ArrayList<TaskType>();
List<AbstractResourceConfig> resourceConfigList = resourceList.getAbstractResourceConfig();
for (Iterator<?> iterator = resourceConfigList.iterator(); iterator.hasNext();) {
AbstractResourceConfig abstractResourceConfig = (AbstractResourceConfig) iterator.next();
// for java-mapping
if (abstractResourceConfig instanceof BeanType) {
if (taskIDs.contains(TaskTypeManager.TASK_ID_JAVA_MAPPING)) {
continue;
}
taskIDs.add(TaskTypeManager.TASK_ID_JAVA_MAPPING);
TaskType task = ProcessFactory.eINSTANCE.createTaskType();
task.setId(TaskTypeManager.TASK_ID_JAVA_MAPPING);
task.setName(TaskTypeManager.getTaskLabel(task));
tasks.add(task);
}
// for freemarker template
if (abstractResourceConfig instanceof Freemarker) {
TaskType task = toTaskType((Freemarker) abstractResourceConfig);
tasks.add(task);
String refid = SmooksModelUtils.getParamValue(((Freemarker) abstractResourceConfig).getParam(),
SmooksModelUtils.KEY_OBJECT_ID);
if (refid == null) {
refid = SmooksModelUtils.generateTaskID(resourceList, Freemarker.class, "freemarker"); //$NON-NLS-1$
ParamType idParam = SmooksFactory.eINSTANCE.createParamType();
idParam.setName(SmooksModelUtils.KEY_OBJECT_ID);
idParam.setStringValue(refid);
((Freemarker) abstractResourceConfig).getParam().add(idParam);
}
if (refid != null) {
ParamType idParam = SmooksFactory.eINSTANCE.createParamType();
idParam.setName(SmooksModelUtils.KEY_TASK_ID_REF);
idParam.setStringValue(refid);
// SmooksModelUtils.addParam(task, idParam);
}
taskIDs.add(task.getId());
}
}
return tasks;
}
public static TaskType toTaskType(Freemarker freeMarker) {
String messageType = SmooksModelUtils.getParamValue(freeMarker.getParam(), SmooksModelUtils.KEY_TEMPLATE_TYPE);
TaskType task = ProcessFactory.eINSTANCE.createTaskType();
task.setType(messageType);
if(SmooksModelUtils.FREEMARKER_TEMPLATE_TYPE_XML.equals(messageType)) {
task.setId(TaskTypeManager.TASK_ID_FREEMARKER_XML_TEMPLATE);
} else if(SmooksModelUtils.FREEMARKER_TEMPLATE_TYPE_CSV.equals(messageType)) {
task.setId(TaskTypeManager.TASK_ID_FREEMARKER_CSV_TEMPLATE);
}
task.setName(TaskTypeManager.getTaskLabel(task));
task.addTaskResource(freeMarker);
return task;
}
// private SmooksGraphicsExtType getSmooksGraphicsType(SmooksResourceListType resouceList) {
// List<AbstractResourceConfig> resourceConfigList = resouceList.getAbstractResourceConfig();
// for (Iterator<?> iterator = resourceConfigList.iterator(); iterator.hasNext();) {
// AbstractResourceConfig abstractResourceConfig = (AbstractResourceConfig) iterator.next();
// if (abstractResourceConfig instanceof SmooksGraphicsExtType) {
// return (SmooksGraphicsExtType) abstractResourceConfig;
// }
// }
// return null;
// }
private void fillAllTask(TaskType task, List<TaskType> taskList) {
SmooksUIUtils.fillAllTask(task, taskList);
}
public boolean analyzeSmooksModels(ProcessType process , SmooksResourceListType resourceList) {
boolean modelWasChanged = false;
// CompoundCommand compoundCommand = new CompoundCommand();
// SmooksGraphicsExtType ext = this.getSmooksGraphicsType(resourceList);
// if (ext == null)
// throw new RuntimeException("Can't find the smooks-graph-ext element");
//
// ProcessesType processes = ext.getProcesses();
// if (processes == null) {
// processes = GraphFactory.eINSTANCE.createProcessesType();
// Command c = SetCommand.create(domainProvider.getEditingDomain(), ext,
// GraphPackage.Literals.SMOOKS_GRAPHICS_EXT_TYPE__PROCESSES, processes);
// compoundCommand.append(c);
// // ext.setProcesses(processes);
// modelWasChanged = true;
// }
// ProcessType process = null;
// if (processes != null) {
// process = processes.getProcess();
// }
// if (process == null) {
// process = GraphFactory.eINSTANCE.createProcessType();
// Command c = SetCommand.create(domainProvider.getEditingDomain(), processes,
// GraphPackage.Literals.PROCESSES_TYPE__PROCESS, process);
// compoundCommand.append(c);
// modelWasChanged = true;
// }
List<TaskType> currentList = process.getTask();
List<TaskType> taskList = new ArrayList<TaskType>();
for (Iterator<?> iterator = currentList.iterator(); iterator.hasNext();) {
TaskType taskType = (TaskType) iterator.next();
this.fillAllTask(taskType, taskList);
}
if (taskList.isEmpty()) {
// TaskType inputTask = GraphFactory.eINSTANCE.createTaskType();
// inputTask.setId(TaskTypeManager.TASK_ID_INPUT);
// inputTask.setName(TaskTypeManager.getTaskLabel(TaskTypeManager.TASK_ID_INPUT));
//
// Command command = AddCommand.create(domainProvider.getEditingDomain(), process,
// GraphPackage.Literals.PROCESS_TYPE__TASK, inputTask);
// compoundCommand.append(command);
// taskList.add(inputTask);
modelWasChanged = true;
}
List<TaskType> tasks = analyzeTaskID(resourceList);
for (Iterator<?> iterator = tasks.iterator(); iterator.hasNext();) {
TaskType taskType = (TaskType) iterator.next();
if (canAdd(taskList, taskType)) {
taskList.add(taskType);
}
}
// for (Iterator<String> iterator = taskIDs.iterator();
// iterator.hasNext();) {
// String taskId = (String) iterator.next();
// if (!taskIDIsExist(taskId, taskList)) {
// TaskType task = GraphFactory.eINSTANCE.createTaskType();
// task.setId(taskId);
// task.setName(TaskTypeManager.getTaskLabel(taskId));
// taskList.add(task);
// }
// }
List<TaskType> dummyTasks = new ArrayList<TaskType>();
// modelWasChanged = linkTask(taskList, dummyTasks, compoundCommand);
// compoundCommand.execute();
return modelWasChanged;
}
/**
* @deprecated
* @param resourceList
* @return If the smooks-resource-list was changed in this method return
* <code>true</code>
*/
public boolean analyzeSmooksModels(SmooksResourceListType resourceList) {
boolean modelWasChanged = false;
// CompoundCommand compoundCommand = new CompoundCommand();
// SmooksGraphicsExtType ext = this.getSmooksGraphicsType(resourceList);
// if (ext == null)
// throw new RuntimeException("Can't find the smooks-graph-ext element");
//
// ProcessesType processes = ext.getProcesses();
// if (processes == null) {
// processes = GraphFactory.eINSTANCE.createProcessesType();
// Command c = SetCommand.create(domainProvider.getEditingDomain(), ext,
// GraphPackage.Literals.SMOOKS_GRAPHICS_EXT_TYPE__PROCESSES, processes);
// compoundCommand.append(c);
// // ext.setProcesses(processes);
// modelWasChanged = true;
// }
// ProcessType process = null;
// if (processes != null) {
// process = processes.getProcess();
// }
//
// if (process == null) {
// process = GraphFactory.eINSTANCE.createProcessType();
// Command c = SetCommand.create(domainProvider.getEditingDomain(), processes,
// GraphPackage.Literals.PROCESSES_TYPE__PROCESS, process);
// compoundCommand.append(c);
// modelWasChanged = true;
// }
//
// List<TaskType> currentList = process.getTask();
// List<TaskType> taskList = new ArrayList<TaskType>();
// for (Iterator<?> iterator = currentList.iterator(); iterator.hasNext();) {
// TaskType taskType = (TaskType) iterator.next();
// this.fillAllTask(taskType, taskList);
// }
//
// if (taskList.isEmpty()) {
// TaskType inputTask = GraphFactory.eINSTANCE.createTaskType();
// inputTask.setId(TaskTypeManager.TASK_ID_INPUT);
// inputTask.setName(TaskTypeManager.getTaskLabel(TaskTypeManager.TASK_ID_INPUT));
//
// Command command = AddCommand.create(domainProvider.getEditingDomain(), process,
// GraphPackage.Literals.PROCESS_TYPE__TASK, inputTask);
// compoundCommand.append(command);
//
// taskList.add(inputTask);
// modelWasChanged = true;
// }
//
// List<TaskType> tasks = analyzeTaskID(resourceList);
// for (Iterator<?> iterator = tasks.iterator(); iterator.hasNext();) {
// TaskType taskType = (TaskType) iterator.next();
// if (canAdd(taskList, taskType)) {
// taskList.add(taskType);
// }
// }
// // for (Iterator<String> iterator = taskIDs.iterator();
// // iterator.hasNext();) {
// // String taskId = (String) iterator.next();
// // if (!taskIDIsExist(taskId, taskList)) {
// // TaskType task = GraphFactory.eINSTANCE.createTaskType();
// // task.setId(taskId);
// // task.setName(TaskTypeManager.getTaskLabel(taskId));
// // taskList.add(task);
// // }
// // }
// List<TaskType> dummyTasks = new ArrayList<TaskType>();
// modelWasChanged = linkTask(taskList, dummyTasks, compoundCommand);
// compoundCommand.execute();
return modelWasChanged;
}
public static void main(String[] args){
// Properties pros = System.getProperties();
// Enumeration eee = pros.keys();
// while(eee.hasMoreElements()){
// Object key = eee.nextElement();
// System.out.println(key + " : " + pros.getProperty(key.toString()));
// }
}
private boolean canAdd(List<TaskType> list, TaskType taskType) {
if (TaskTypeManager.TASK_ID_JAVA_MAPPING.equals(taskType.getId())) {
for (Iterator<?> iterator = list.iterator(); iterator.hasNext();) {
TaskType taskType1 = (TaskType) iterator.next();
if (TaskTypeManager.TASK_ID_JAVA_MAPPING.equals(taskType1.getId())) {
return false;
}
}
}
return true;
}
private List<TaskType> getTaskTypes(String id, List<TaskType> taskList) {
List<TaskType> tasks = new ArrayList<TaskType>();
for (Iterator<?> iterator = taskList.iterator(); iterator.hasNext();) {
TaskType taskType = (TaskType) iterator.next();
if (id.equals(taskType.getId())) {
tasks.add(taskType);
}
}
return tasks;
}
private TaskType getTaskType(String id, List<TaskType> taskList) {
for (Iterator<?> iterator = taskList.iterator(); iterator.hasNext();) {
TaskType taskType = (TaskType) iterator.next();
if (id.equals(taskType.getId())) {
return taskType;
}
}
return null;
}
private boolean linkTask(List<TaskType> taskList, List<TaskType> dummyTasks, CompoundCommand compoundCommand) {
TaskType first = getTaskType(TaskTypeManager.TASK_ID_INPUT, taskList);
if (first != null) {
taskList.remove(first);
return linkTask(first, taskList, dummyTasks, compoundCommand);
}
return false;
}
private boolean linkTask(TaskType taskType, List<TaskType> taskList, List<TaskType> dummyTasks,
CompoundCommand compoundCommand) {
String id = taskType.getId();
String[] childrenIds = TaskTypeManager.getChildTaskIDs(id);
boolean changed = false;
// if (childrenIds != null) {
// for (int i = 0; i < childrenIds.length; i++) {
// String childId = childrenIds[i];
// List<TaskType> tasks = getTaskTypes(childId, taskList);
// for (Iterator<?> iterator = tasks.iterator(); iterator.hasNext();) {
// TaskType childTask = (TaskType) iterator.next();
// if (childTask != null) {
// EList<TaskType> exsitedTasks = taskType.getTask();
// boolean duplited = false;
// boolean canAdd = true;
// for (Iterator<?> iterator2 = exsitedTasks.iterator(); iterator2.hasNext();) {
// TaskType taskType2 = (TaskType) iterator2.next();
// String refid = SmooksModelUtils.getParamValue(taskType2, SmooksModelUtils.KEY_TASK_ID_REF);
// String refid2 = SmooksModelUtils.getParamValue(childTask, SmooksModelUtils.KEY_TASK_ID_REF);
// if (refid != null && refid2 != null && refid.equals(refid2)) {
// canAdd = false;
// duplited = true;
// break;
// }
// if (refid == null && refid2 == null) {
// canAdd = false;
// duplited = true;
// break;
// }
// }
// if (canAdd
// && !taskType.getTask().contains(childTask)
// && ((childTask.eContainer() == null) || (childTask.eContainer() instanceof ProcessType))) {
// Command c = AddCommand.create(domainProvider.getEditingDomain(), taskType,
// GraphPackage.Literals.TASK_TYPE__TASK, childTask);
// compoundCommand.append(c);
// // taskType.getTask().add(childTask);
// changed = true;
// }
// if (!duplited) {
// dummyTasks.add(childTask);
// }
// taskList.remove(childTask);
// boolean cchange = linkTask(childTask, taskList, dummyTasks, compoundCommand);
// changed = (changed || cchange);
// }
// }
//
// }
// }
return changed;
}
// private boolean taskIDIsExist(String taskId, List<TaskType> taskList) {
// for (Iterator<?> iterator = taskList.iterator(); iterator.hasNext();) {
// TaskType task = (TaskType) iterator.next();
// if (task.getId().equals(taskId)) {
// return true;
// }
// }
// return false;
// }
//
// private boolean taskIsExist(TaskType task , List<String> taskIDs){
// for (Iterator<?> iterator = taskIDs.iterator(); iterator.hasNext();) {
// String id = (String) iterator.next();
// if(task.getId().equals(id)){
// return true;
// }
// }
// return false;
// }
}