/*******************************************************************************
* 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.template;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
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.configuration.editors.xml.AbstractXMLObject;
import org.jboss.tools.smooks.configuration.editors.xml.TagObject;
import org.jboss.tools.smooks.configuration.editors.xml.TagPropertyObject;
import org.jboss.tools.smooks.editor.ISmooksModelProvider;
import org.jboss.tools.smooks.gef.common.RootModel;
import org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel;
import org.jboss.tools.smooks.gef.tree.model.TreeNodeConnection;
import org.jboss.tools.smooks.graphical.editors.ConnectionModelFactoryImpl;
import org.jboss.tools.smooks.graphical.editors.editparts.SmooksGraphUtil;
import org.jboss.tools.smooks.graphical.editors.model.AbstractResourceConfigChildNodeGraphModel;
import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerTemplateConnection;
import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerTemplateGraphicalModel;
import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerTemplateNodeGraphicalModel;
import org.jboss.tools.smooks.model.freemarker.Freemarker;
import org.jboss.tools.smooks.model.freemarker.Template;
import org.jboss.tools.smooks.model.javabean12.BeanType;
import org.jboss.tools.smooks.model.smooks.SmooksResourceListType;
import org.jboss.tools.smooks.templating.template.Mapping;
import org.jboss.tools.smooks.templating.template.ValueMapping;
import org.jboss.tools.smooks.templating.template.TemplateBuilder;
import org.w3c.dom.Node;
/**
* @author Dart
*
*/
public class FreemarkerTemplateConnectionModelFactory extends ConnectionModelFactoryImpl {
private List<Mapping> mappingList = null;
private ISmooksModelProvider smooksModelProvider;
private IEditorPart editorPart;
public FreemarkerTemplateConnectionModelFactory(ISmooksModelProvider smooksModelProvider, IEditorPart editorPart) {
super();
this.smooksModelProvider = smooksModelProvider;
this.editorPart = editorPart;
}
/*
* (non-Javadoc)
*
* @see org.jboss.tools.smooks.graphical.editors.ConnectionModelFactoryImpl
* #hasBeanIDConnection
* (org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel)
*/
@Override
public boolean hasBeanIDConnection(AbstractSmooksGraphicalModel model) {
return true;
}
/*
* (non-Javadoc)
*
* @see org.jboss.tools.smooks.graphical.editors.ConnectionModelFactoryImpl
* #hasSelectorConnection
* (org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel)
*/
@Override
public boolean hasSelectorConnection(AbstractSmooksGraphicalModel model) {
return false;
}
/*
* (non-Javadoc)
*
* @see org.jboss.tools.smooks.graphical.editors.ConnectionModelFactoryImpl
* #createConnection(java.util.List, org.eclipse.emf.ecore.EObject,
* org.jboss.tools.smooks.gef.common.RootModel,
* org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel)
*/
@Override
public Collection<TreeNodeConnection> createConnection(List<Object> inputDataList, EObject rootModel,
RootModel root, AbstractSmooksGraphicalModel model) {
List<TreeNodeConnection> collections = new ArrayList<TreeNodeConnection>();
if (model instanceof FreemarkerTemplateNodeGraphicalModel) {
AbstractXMLObject data = (AbstractXMLObject) model.getData();
Node mynode = null;
if (data instanceof TagPropertyObject) {
mynode = ((TagPropertyObject) data).getReferenceAttibute();
}
if (data instanceof TagObject) {
mynode = ((TagObject) data).getReferenceElement();
}
AbstractSmooksGraphicalModel freemarkerGraphModel = model.getParent();
if (!(freemarkerGraphModel instanceof FreemarkerTemplateGraphicalModel)) {
freemarkerGraphModel = freemarkerGraphModel.getParent();
}
if (mappingList == null && freemarkerGraphModel instanceof FreemarkerTemplateGraphicalModel) {
fillMapping((FreemarkerTemplateGraphicalModel) freemarkerGraphModel);
}
AbstractSmooksGraphicalModel sourceNode = null;
AbstractSmooksGraphicalModel targetNode = model;
SmooksResourceListType listType = SmooksUIUtils.getSmooks11ResourceListType(smooksModelProvider
.getSmooksModel());
List<EObject> beanidModels = new ArrayList<EObject>();
if (listType != null) {
SmooksUIUtils.fillBeanIdModelList(listType, beanidModels);
}
for (Iterator<?> iterator = mappingList.iterator(); iterator.hasNext();) {
Mapping mapping = (Mapping) iterator.next();
String path = mapping.getSrcPath();
Node node = mapping.getMappingNode();
if (node != mynode)
continue;
for (Iterator<?> iterator2 = beanidModels.iterator(); iterator2.hasNext();) {
EObject eObject = (EObject) iterator2.next();
EStructuralFeature feature = SmooksUIUtils.getBeanIDFeature(eObject);
if (feature != null) {
String beanid = (String) eObject.eGet(feature);
if (path.equals(beanid)) {
sourceNode = SmooksGraphUtil.findSmooksGraphModel((RootModel) root, eObject);
} else {
String[] subpath = path.split("\\."); //$NON-NLS-1$
if (subpath.length >= 2) {
String[] temppath = new String[2];
System.arraycopy(subpath, subpath.length - 2, temppath, 0, 2);
Object beanModel = findJavaBeanModel(temppath[0], beanidModels);
if (beanModel != null) {
Object targetModel = findJavaGraphModel(temppath[1], beanModel);
sourceNode = SmooksGraphUtil.findSmooksGraphModel((RootModel) root, targetModel);
}
}
}
if (sourceNode != null && targetNode != null) {
TreeNodeConnection connection = new FreemarkerTemplateConnection();
connection.setSourceNode(sourceNode);
connection.setTargetNode(targetNode);
connection.connectSource();
targetNode.getTargetConnections().add(connection);
targetNode.fireConnectionChanged();
collections.add(connection);
connection.setData(mapping);
if(sourceNode instanceof AbstractResourceConfigChildNodeGraphModel && mapping instanceof ValueMapping) {
((AbstractResourceConfigChildNodeGraphModel)sourceNode).addMappingTypeInfo((ValueMapping) mapping);
}
break;
}
}
}
}
}
Collection<TreeNodeConnection> cs = super.createConnection(inputDataList, rootModel, root, model);
if (cs != null) {
collections.addAll(cs);
}
return collections;
}
private Object findJavaGraphModel(String propertyName, Object bean) {
if (bean instanceof BeanType) {
List<?> values = ((BeanType) bean).getValue();
for (Iterator<?> iterator = values.iterator(); iterator.hasNext();) {
org.jboss.tools.smooks.model.javabean12.ValueType value = (org.jboss.tools.smooks.model.javabean12.ValueType) iterator
.next();
if (propertyName.equals(value.getProperty())) {
return value;
}
}
}
// if (bean instanceof BindingsType) {
// List<?> values = ((BindingsType) bean).getValue();
// for (Iterator<?> iterator = values.iterator();
// iterator.hasNext();) {
// ValueType value = (ValueType) iterator.next();
// if (propertyName.equals(value.getProperty())) {
// return value;
// }
// }
// }
return null;
}
private Object findJavaBeanModel(String beanid, List<EObject> beans) {
for (Iterator<?> iterator = beans.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
if (object instanceof BeanType) {
if (beanid.equals(((BeanType) object).getBeanId())) {
return object;
}
}
}
return null;
}
private void fillMapping(FreemarkerTemplateGraphicalModel freemarkerGraph) {
if (mappingList == null) {
mappingList = new ArrayList<Mapping>();
} else {
mappingList.clear();
}
Object data = freemarkerGraph.getData();
data = AdapterFactoryEditingDomain.unwrap(data);
Freemarker freemarker = null;
if (data instanceof Freemarker) {
freemarker = (Freemarker) data;
}
Template template = freemarker.getTemplate();
String contents = SmooksModelUtils.getAnyTypeCDATA(template);
try {
if (contents != null) {
TemplateBuilder builder = freemarkerGraph.getTemplateBuilder();
if (builder != null) {
List<Mapping> mappings = builder.getMappings();
mappingList.addAll(mappings);
}
}
} catch (Exception e) {
// ignore exception
// e.printStackTrace();
}
}
/*
* (non-Javadoc)
*
* @see org.jboss.tools.smooks.graphical.editors.ConnectionModelFactoryImpl
* #hasConnection
* (org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel)
*/
@Override
public boolean hasConnection(AbstractSmooksGraphicalModel model) {
if (model instanceof FreemarkerTemplateNodeGraphicalModel) {
return true;
}
return super.hasConnection(model);
}
}