/******************************************************************************* * 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.model.freemarker; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.jboss.tools.smooks.SmooksModelUtils; import org.jboss.tools.smooks.templating.model.ModelBuilderException; import org.jboss.tools.smooks.templating.model.csv.CSVModelBuilder; import org.jboss.tools.smooks.templating.template.csv.CSVFreeMarkerTemplateBuilder; import org.jboss.tools.smooks.templating.template.exception.InvalidMappingException; import org.jboss.tools.smooks.templating.template.exception.TemplateBuilderException; import org.jboss.tools.smooks.configuration.editors.IXMLStructuredObject; import org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel; import org.jboss.tools.smooks.gef.tree.model.TreeNodeConnection; import org.jboss.tools.smooks.graphical.editors.model.javamapping.JavaBeanChildGraphModel; import org.jboss.tools.smooks.graphical.editors.model.javamapping.JavaBeanGraphModel; import org.jboss.tools.smooks.model.freemarker.Freemarker; import org.jboss.tools.smooks.model.javabean12.BeanType; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * @author Dart * */ public class FreemarkerCSVContentGenerator { public FreemarkerCSVContentGenerator() { //empty constructor } public String generateCSVContents(FreemarkerCSVNodeGraphicalModel csvRecordGraphicalModel) throws TemplateBuilderException, ModelBuilderException { // CSVNodeModel csvRecordModel = (CSVNodeModel) // csvRecordGraphicalModel.getData(); String collectionName = null; List<TreeNodeConnection> recordConnections = csvRecordGraphicalModel.getTargetConnections(); if (recordConnections.size() > 1 || recordConnections.isEmpty()) { return null; } TreeNodeConnection recordRootConnection = recordConnections.get(0); AbstractSmooksGraphicalModel javabeanModel = recordRootConnection.getSourceNode(); List<AbstractSmooksGraphicalModel> javabeanChildren = javabeanModel.getChildrenWithoutDynamic(); for (Iterator<?> iterator = javabeanChildren.iterator(); iterator.hasNext();) { AbstractSmooksGraphicalModel abstractSmooksGraphicalModel = (AbstractSmooksGraphicalModel) iterator.next(); Object javabean = abstractSmooksGraphicalModel.getData(); javabean = AdapterFactoryEditingDomain.unwrap(javabean); if (javabean instanceof org.jboss.tools.smooks.model.javabean12.WiringType) { collectionName = ((org.jboss.tools.smooks.model.javabean12.WiringType) javabean).getBeanIdRef(); } } if (collectionName == null) return null; AbstractSmooksGraphicalModel freemarkerTemplateGraphmodel = csvRecordGraphicalModel.getParent(); if (!(freemarkerTemplateGraphmodel instanceof FreemarkerTemplateGraphicalModel)) { return null; } Object freemarker = ((FreemarkerTemplateGraphicalModel) freemarkerTemplateGraphmodel).getData(); freemarker = AdapterFactoryEditingDomain.unwrap(freemarker); if (!(freemarker instanceof Freemarker)) { return null; } char sperator = SmooksModelUtils.getFreemarkerCSVSeperator((Freemarker) freemarker); char quote = SmooksModelUtils.getFreemarkerCSVQuote((Freemarker) freemarker); boolean includeFieldNames = SmooksModelUtils.getFreemarkerCSVIncludeFieldNames((Freemarker) freemarker); List<AbstractSmooksGraphicalModel> childrenGraphModel = csvRecordGraphicalModel.getChildren(); List<String> fieldsName = new ArrayList<String>(); for (Iterator<?> iterator = childrenGraphModel.iterator(); iterator.hasNext();) { AbstractSmooksGraphicalModel abstractSmooksGraphicalModel = (AbstractSmooksGraphicalModel) iterator.next(); Object cd = abstractSmooksGraphicalModel.getData(); cd = AdapterFactoryEditingDomain.unwrap(cd); if (cd instanceof IXMLStructuredObject) { fieldsName.add(((IXMLStructuredObject) cd).getNodeName()); } } CSVModelBuilder modelBuilder = new CSVModelBuilder(fieldsName.toArray(new String[] {})); CSVFreeMarkerTemplateBuilder builder; Document model; builder = new CSVFreeMarkerTemplateBuilder(modelBuilder, sperator, quote, includeFieldNames); model = builder.getModel(); List<TreeNodeConnection> connections = csvRecordGraphicalModel.getTargetConnections(); if (!connections.isEmpty() && connections.size() == 1) { TreeNodeConnection recordConnection = connections.get(0); AbstractSmooksGraphicalModel sourceGraphModel = recordConnection.getSourceNode(); if (sourceGraphModel instanceof JavaBeanGraphModel) { Object data = ((JavaBeanGraphModel) sourceGraphModel).getData(); data = AdapterFactoryEditingDomain.unwrap(data); String beanName = null; if (data instanceof BeanType) { beanName = ((BeanType) data).getBeanId(); } if (beanName != null) builder.addCollectionMapping(beanName, getRecordElement(model), collectionName); List<AbstractSmooksGraphicalModel> graphChildren = csvRecordGraphicalModel.getChildren(); for (Iterator<?> iterator = graphChildren.iterator(); iterator.hasNext();) { AbstractSmooksGraphicalModel abstractSmooksGraphicalModel = (AbstractSmooksGraphicalModel) iterator .next(); addValueMapping(builder, (FreemarkerCSVNodeGraphicalModel) abstractSmooksGraphicalModel, model, collectionName, (JavaBeanGraphModel) sourceGraphModel); } } } return builder.buildTemplate(); } protected void addValueMapping(CSVFreeMarkerTemplateBuilder builder, FreemarkerCSVNodeGraphicalModel filedNode, Document model, String recordName, JavaBeanGraphModel recordRootNode) throws InvalidMappingException { CSVNodeModel csvFieldNode = (CSVNodeModel) filedNode.getData(); String elementName = csvFieldNode.getName(); List<TreeNodeConnection> connections = filedNode.getTargetConnections(); if (!connections.isEmpty() && connections.size() == 1) { TreeNodeConnection recordConnection = connections.get(0); AbstractSmooksGraphicalModel sourceGraphModel = recordConnection.getSourceNode(); String mappingString = generateJavaSourcePathWithoutRootNode(sourceGraphModel, recordRootNode); // if (mappingString != null) { // mappingString = recordName + "." + mappingString; // } if (mappingString == null || mappingString.length() == 0) { return; } builder.addValueMapping(mappingString, getFieldElement(model, elementName)); } } public static String generateFullJavaSourcePathString(AbstractSmooksGraphicalModel sourceGraphModel,JavaBeanGraphModel recordRootNode) { AbstractSmooksGraphicalModel parentModel = sourceGraphModel; Object sourceModel = sourceGraphModel.getData(); sourceModel = AdapterFactoryEditingDomain.unwrap(sourceModel); String s = null; if (sourceModel instanceof org.jboss.tools.smooks.model.javabean12.ValueType) { s = ((org.jboss.tools.smooks.model.javabean12.ValueType) sourceModel).getProperty(); } List<Object> nodesList = new ArrayList<Object>(); fillParentList(nodesList, parentModel, recordRootNode); String mappingString = ""; //$NON-NLS-1$ for (int i = 0; i < nodesList.size(); i++) { Object node = nodesList.get(i); String beanName = null; if (node instanceof BeanType) { beanName = ((BeanType) node).getBeanId(); } if (beanName != null) { mappingString += (beanName + "."); //$NON-NLS-1$ } } if (s != null) { mappingString += s; } return mappingString; } public static String generateJavaSourcePathWithoutRootNode(AbstractSmooksGraphicalModel sourceGraphModel, JavaBeanGraphModel recordRootNode) { AbstractSmooksGraphicalModel parentModel = sourceGraphModel; Object sourceModel = sourceGraphModel.getData(); sourceModel = AdapterFactoryEditingDomain.unwrap(sourceModel); String s = null; if (sourceModel instanceof org.jboss.tools.smooks.model.javabean12.ValueType) { s = ((org.jboss.tools.smooks.model.javabean12.ValueType) sourceModel).getProperty(); } List<Object> nodesList = new ArrayList<Object>(); fillParentList(nodesList, parentModel, recordRootNode); if(!nodesList.isEmpty()){ nodesList.remove(0); } String mappingString = ""; //$NON-NLS-1$ for (int i = 0; i < nodesList.size(); i++) { Object node = nodesList.get(i); String beanName = null; if (node instanceof BeanType) { beanName = ((BeanType) node).getBeanId(); } if (beanName != null) { mappingString += (beanName + "."); //$NON-NLS-1$ } } if (s != null) { mappingString += s; } return mappingString; } private static boolean fillParentList(List<Object> list, AbstractSmooksGraphicalModel node, JavaBeanGraphModel recordRootNode) { if (node instanceof JavaBeanChildGraphModel) { node = node.getParent(); } if(node == recordRootNode){ list.add(recordRootNode.getData()); return true; }else{ if (node instanceof JavaBeanGraphModel) { Object parent = node.getData(); List<TreeNodeConnection> connections = ((JavaBeanGraphModel) node).getTargetConnections(); for (Iterator<?> iterator = connections.iterator(); iterator.hasNext();) { TreeNodeConnection connection = (TreeNodeConnection) iterator.next(); AbstractSmooksGraphicalModel sourcenode = connection.getSourceNode(); if (fillParentList(list, sourcenode, recordRootNode)) { parent = AdapterFactoryEditingDomain.unwrap(parent); list.add(parent); return true; } } } } return false; } private Element getRecordElement(Document model) { return model.getDocumentElement(); } private Element getFieldElement(Document model, String fieldName) { return (Element) model.getElementsByTagName(fieldName).item(0); } }