/*******************************************************************************
* 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.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.swt.graphics.Image;
import org.jboss.tools.smooks.SmooksModelUtils;
import org.jboss.tools.smooks.configuration.SmooksConfigurationActivator;
import org.jboss.tools.smooks.configuration.editors.GraphicsConstants;
import org.jboss.tools.smooks.editor.ISmooksModelProvider;
import org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel;
import org.jboss.tools.smooks.gef.tree.model.TreeNodeModel;
import org.jboss.tools.smooks.graphical.editors.model.AbstractResourceConfigGraphModel;
import org.jboss.tools.smooks.graphical.editors.template.FreemarkerTemplateContentGraphModelProviderImpl;
import org.jboss.tools.smooks.graphical.editors.template.IFreemarkerTemplateContentGraphModelProvider;
import org.jboss.tools.smooks.model.freemarker.Freemarker;
import org.jboss.tools.smooks.model.freemarker.Template;
import org.jboss.tools.smooks.templating.model.ModelBuilderException;
import org.jboss.tools.smooks.templating.template.TemplateBuilder;
import org.jboss.tools.smooks.templating.template.exception.TemplateBuilderException;
import org.w3c.dom.Node;
/**
* @author Dart
*
*/
public class FreemarkerTemplateGraphicalModel extends AbstractResourceConfigGraphModel {
public static final int TYPE_CSV = 1;
public static final int TYPE_EDI = 2;
public static final int TYPE_XML = 3;
public static final int TYPE_XSD = 4;
public static final int TYPE_UNKNOWN = -1;
private ISmooksModelProvider smooksModelProvider;
private boolean firstLoadChildren = true;
private IFreemarkerTemplateContentGraphModelProvider graphModelProvider = null;
private TemplateBuilder templateBuilder = null;
public FreemarkerTemplateGraphicalModel(Object data, ITreeContentProvider contentProvider,
ILabelProvider labelProvider, ISmooksModelProvider domainProvider) {
super(data, contentProvider, labelProvider, domainProvider);
this.smooksModelProvider = domainProvider;
graphModelProvider = createFreemarkerTemplateContentGraphModelProvider();
try {
templateBuilder = graphModelProvider.getTemplateBuilder(this);
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ModelBuilderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TemplateBuilderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @return the templateBuilder
*/
public TemplateBuilder getTemplateBuilder() {
return templateBuilder;
}
public void changeFreemarkerContents() {
Template template = null;
if (data instanceof Freemarker) {
template = ((Freemarker) data).getTemplate();
}
if (template == null) {
return;
}
if (templateBuilder != null) {
String content = null;
try {
content = templateBuilder.buildTemplate();
} catch (Exception e) {
e.printStackTrace();
}
SmooksModelUtils.setCDATAToSmooksType(domainProvider.getEditingDomain(), template, content);
}
}
protected IFreemarkerTemplateContentGraphModelProvider createFreemarkerTemplateContentGraphModelProvider() {
return new FreemarkerTemplateContentGraphModelProviderImpl();
}
protected void initChildrenNodes() {
Object data = getData();
data = AdapterFactoryEditingDomain.unwrap(data);
Freemarker freemarker = (Freemarker) data;
if (freemarker != null) {
List<AbstractSmooksGraphicalModel> graphModels = graphModelProvider.getFreemarkerTemplateContentGraphModel(
this, getContentProvider(), getLabelProvider(), smooksModelProvider);
for (Iterator<?> iterator = graphModels.iterator(); iterator.hasNext();) {
AbstractSmooksGraphicalModel abstractSmooksGraphicalModel = (AbstractSmooksGraphicalModel) iterator
.next();
this.getChildrenWithoutDynamic().add(abstractSmooksGraphicalModel);
abstractSmooksGraphicalModel.setParent(this);
}
}
Template template = freemarker.getTemplate();
String templateData = template.getCDATA();
if(templateData == null) {
SmooksModelUtils.setCDATAToSmooksType(domainProvider.getEditingDomain(), template, "<noMappings/>"); //$NON-NLS-1$
}
}
@Override
protected TreeNodeModel createChildModel(Object model, ITreeContentProvider contentProvider,
ILabelProvider labelProvider) {
if (getTemplateType() == TYPE_CSV) {
return new FreemarkerCSVNodeGraphicalModel(model, contentProvider, labelProvider, domainProvider);
}
return null;
}
@Override
public Image getImage() {
ImageRegistry registry = SmooksConfigurationActivator.getDefault().getImageRegistry();
if (getTemplateType() == TYPE_CSV) {
return registry.get(GraphicsConstants.IMAGE_CSV_FILE);
}
if (getTemplateType() == TYPE_XML) {
return registry.get(GraphicsConstants.IMAGE_XML_FILE);
}
return registry.get(GraphicsConstants.IMAGE_UNKNOWN_OBJ);
}
/*
* (non-Javadoc)
*
* @see org.jboss.tools.smooks.gef.tree.model.TreeNodeModel#getText()
*/
@Override
public String getText() {
if (getTemplateType() == TYPE_CSV) {
return Messages.FreemarkerTemplateGraphicalModel_CSV_Template_Name;
}
if (getTemplateType() == TYPE_XML) {
return Messages.FreemarkerTemplateGraphicalModel_XML_Template_Name;
}
return super.getText();
}
/*
* (non-Javadoc)
*
* @see org.jboss.tools.smooks.gef.tree.model.TreeNodeModel#getChildren()
*/
@Override
public List<AbstractSmooksGraphicalModel> getChildren() {
if (firstLoadChildren) {
try {
initChildrenNodes();
} catch (Exception e) {
e.printStackTrace();
}
firstLoadChildren = false;
}
return this.getChildrenWithoutDynamic();
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel#addChild
* (org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel)
*/
@Override
public void addChild(AbstractSmooksGraphicalModel node) {
super.addChild(node);
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel#addChild
* (int, org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel)
*/
@Override
public void addChild(int index, AbstractSmooksGraphicalModel node) {
super.addChild(index, node);
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.tree.model.TreeNodeModel#canLinkWithSource
* (java.lang.Object)
*/
@Override
public boolean canLinkWithSource(Object model) {
return false;
// return super.canLinkWithSource(model);
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.gef.tree.model.TreeNodeModel#canLinkWithTarget
* (java.lang.Object)
*/
@Override
public boolean canLinkWithTarget(Object model) {
return false;
// return super.canLinkWithTarget(model);
}
/**
* @return the templateType
*/
public int getTemplateType() {
Object data = getData();
data = AdapterFactoryEditingDomain.unwrap(data);
Freemarker freemarker = (Freemarker) data;
if (freemarker != null) {
String type = SmooksModelUtils.getTemplateType(freemarker);
if(SmooksModelUtils.FREEMARKER_TEMPLATE_TYPE_CSV.equals(type)){
return TYPE_CSV;
}
if(SmooksModelUtils.FREEMARKER_TEMPLATE_TYPE_XML.equals(type)){
return TYPE_XML;
}
}
return TYPE_UNKNOWN;
}
}