/*******************************************************************************
* 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.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.jboss.tools.smooks.SmooksModelUtils;
import org.jboss.tools.smooks.configuration.editors.IXMLStructuredObject;
import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils;
import org.jboss.tools.smooks.configuration.editors.xml.TagList;
import org.jboss.tools.smooks.configuration.editors.xml.TagObject;
import org.jboss.tools.smooks.editor.ISmooksModelProvider;
import org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel;
import org.jboss.tools.smooks.graphical.editors.TaskTypeManager;
import org.jboss.tools.smooks.graphical.editors.model.freemarker.CSVNodeModel;
import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerCSVNodeGraphicalModel;
import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerModelAnalyzer;
import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerTemplateGraphicalModel;
import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerTemplateXMLModel;
import org.jboss.tools.smooks.graphical.editors.model.freemarker.FreemarkerXMLNodeGraphicalModel;
import org.jboss.tools.smooks.model.freemarker.Freemarker;
import org.jboss.tools.smooks.templating.model.ModelBuilder;
import org.jboss.tools.smooks.templating.model.ModelBuilderException;
import org.jboss.tools.smooks.templating.model.csv.CSVModelBuilder;
import org.jboss.tools.smooks.templating.model.xml.XMLSampleModelBuilder;
import org.jboss.tools.smooks.templating.model.xml.XSDModelBuilder;
import org.jboss.tools.smooks.templating.template.TemplateBuilder;
import org.jboss.tools.smooks.templating.template.csv.CSVFreeMarkerTemplateBuilder;
import org.jboss.tools.smooks.templating.template.exception.TemplateBuilderException;
import org.jboss.tools.smooks.templating.template.freemarker.FreeMarkerTemplateBuilder;
import org.jboss.tools.smooks.templating.template.xml.XMLFreeMarkerTemplateBuilder;
import org.w3c.dom.Document;
/**
* @author Dart
*
*/
public class FreemarkerTemplateContentGraphModelProviderImpl implements IFreemarkerTemplateContentGraphModelProvider {
private FreeMarkerTemplateBuilder templateBuilder = null;
/*
* (non-Javadoc)
*
* @seeorg.jboss.tools.smooks.graphical.editors.template.
* IFreemarkerTemplateContentGraphModelProvider
* #getFreemarkerTemplateContentGraphModel
* (org.jboss.tools.smooks.graphical.editors
* .model.freemarker.FreemarkerTemplateGraphicalModel)
*/
public List<AbstractSmooksGraphicalModel> getFreemarkerTemplateContentGraphModel(
FreemarkerTemplateGraphicalModel freemarkerGraphModel, ITreeContentProvider contentProvider,
ILabelProvider labelProvider, ISmooksModelProvider smooksModelProvider) {
Freemarker freemarker = (Freemarker) freemarkerGraphModel.getData();
if (freemarker != null) {
String type = SmooksModelUtils.getTemplateType(freemarker);
try {
TemplateBuilder builder = getModelBuilder(freemarker);
if(builder == null) return null;
Document rootDocument = builder.getModel();
Class<? extends TagObject> tagModelClass = null;
if(SmooksModelUtils.FREEMARKER_TEMPLATE_TYPE_CSV.equals(type)){
tagModelClass = CSVNodeModel.class;
}
if(SmooksModelUtils.FREEMARKER_TEMPLATE_TYPE_XML.equals(type)){
tagModelClass = FreemarkerTemplateXMLModel.class;
}
TagList tagList = new FreemarkerModelAnalyzer().analyze(rootDocument, null,tagModelClass);
return createGraphModel(type, tagList.getChildren(), contentProvider, labelProvider,
smooksModelProvider, null);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ModelBuilderException e) {
e.printStackTrace();
} catch (TemplateBuilderException e) {
e.printStackTrace();
}
}
return null;
}
protected List<AbstractSmooksGraphicalModel> createGraphModel(String type, List<IXMLStructuredObject> datas,
ITreeContentProvider contentProvider, ILabelProvider labelProvider,
ISmooksModelProvider smooksModelProvider, AbstractSmooksGraphicalModel parentModel) {
List<AbstractSmooksGraphicalModel> graphList = new ArrayList<AbstractSmooksGraphicalModel>();
if (datas != null) {
for (Iterator<?> iterator = datas.iterator(); iterator.hasNext();) {
Object data = (Object) iterator.next();
AbstractSmooksGraphicalModel graphModel = createFreemarkerTemplateGraphModel(type, data,
contentProvider, labelProvider, smooksModelProvider);
if (graphModel == null)
continue;
if (parentModel != null) {
parentModel.getChildrenWithoutDynamic().add(graphModel);
graphModel.setParent(parentModel);
} else {
graphList.add(graphModel);
}
if (data instanceof TagObject) {
createGraphModel(type, ((TagObject) data).getChildren(), contentProvider, labelProvider,
smooksModelProvider, graphModel);
}
}
}
return graphList;
}
public TemplateBuilder getModelBuilder(Freemarker freemarker) throws InvocationTargetException, IOException,
ModelBuilderException, TemplateBuilderException {
if (templateBuilder == null) {
String contents = SmooksModelUtils.getAnyTypeCDATA(freemarker.getTemplate());
String type = SmooksModelUtils.getTemplateType(freemarker);
if (SmooksModelUtils.FREEMARKER_TEMPLATE_TYPE_CSV.equals(type)) {
String[] fields = SmooksModelUtils.getFreemarkerCSVFileds(freemarker);
CSVModelBuilder modelBuilder = new CSVModelBuilder(fields);
CSVFreeMarkerTemplateBuilder builder1 = null;
try {
builder1 = new CSVFreeMarkerTemplateBuilder(modelBuilder, SmooksModelUtils
.getFreemarkerCSVSeperator(freemarker), SmooksModelUtils.getFreemarkerCSVQuote(freemarker),
SmooksModelUtils.getFreemarkerCSVIncludeFieldNames(freemarker),
contents);
} catch (Exception e) {
builder1 = new CSVFreeMarkerTemplateBuilder(modelBuilder, SmooksModelUtils
.getFreemarkerCSVSeperator(freemarker), SmooksModelUtils.getFreemarkerCSVQuote(freemarker),
SmooksModelUtils.getFreemarkerCSVIncludeFieldNames(freemarker));
}
templateBuilder = builder1;
}
if (SmooksModelUtils.FREEMARKER_TEMPLATE_TYPE_XML.equals(type)) {
String fileType = SmooksModelUtils.getFreemarkerXMLFileType(freemarker);
String filePath = SmooksModelUtils.getFreemarkerXMLFilePath(freemarker);
String rootName = SmooksModelUtils.getFreemarkerXMLRootName(freemarker);
String newFilePath = SmooksUIUtils.parseFilePath(filePath);
ModelBuilder builder;
if (SmooksModelUtils.KEY_XML_FILE_TYPE_XSD.equals(fileType)) {
builder = new XSDModelBuilder(URI.createFileURI(newFilePath));
((XSDModelBuilder)builder).setRootElementName(rootName);
} else if (SmooksModelUtils.KEY_XML_FILE_TYPE_XML.equals(fileType)) {
builder = new XMLSampleModelBuilder(URI.createFileURI(newFilePath));
} else {
throw new IOException(Messages.FreemarkerTemplateContentGraphModelProviderImpl_IOExceptionMessage + fileType + "'."); //$NON-NLS-1$
}
try {
templateBuilder = new XMLFreeMarkerTemplateBuilder(builder, contents);
} catch (Exception e) {
templateBuilder = new XMLFreeMarkerTemplateBuilder(builder);
}
}
String templateProvider = SmooksModelUtils.getParamValue(freemarker.getParam(), SmooksModelUtils.TEMPLATE_DATA_PROVIDER_PARAM_NAME);
if(templateProvider != null) {
templateBuilder.setNodeModelSource(templateProvider.trim().equals(TaskTypeManager.TASK_ID_INPUT));
} else {
templateBuilder.setNodeModelSource(false);
}
}
return templateBuilder;
}
public AbstractSmooksGraphicalModel createFreemarkerTemplateGraphModel(String type, Object data,
ITreeContentProvider contentProvider, ILabelProvider labelProvider, ISmooksModelProvider smooksModelProvider) {
if (SmooksModelUtils.FREEMARKER_TEMPLATE_TYPE_CSV.equals(type) && data instanceof TagObject) {
return new FreemarkerCSVNodeGraphicalModel(data, contentProvider, labelProvider, smooksModelProvider);
}
if (SmooksModelUtils.FREEMARKER_TEMPLATE_TYPE_XML.equals(type)) {
return new FreemarkerXMLNodeGraphicalModel(data, contentProvider, labelProvider,smooksModelProvider);
}
return null;
}
public TemplateBuilder getTemplateBuilder(FreemarkerTemplateGraphicalModel freemarkerGraphModel)
throws InvocationTargetException, IOException, ModelBuilderException, TemplateBuilderException {
Object data = freemarkerGraphModel.getData();
data = AdapterFactoryEditingDomain.unwrap(data);
Freemarker freemarker = (Freemarker) data;
return getModelBuilder(freemarker);
}
}