/*******************************************************************************
* 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.Iterator;
import java.util.List;
import org.jboss.tools.smooks.configuration.editors.IXMLStructuredObject;
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.templating.model.ModelBuilder;
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.Element;
import org.w3c.dom.Node;
/**
* @author Dart
*
*/
public class FreemarkerTemplateXMLModel extends TagObject implements IFreemarkerTemplateModel {
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.configuration.editors.xml.TagObject#addChildTag
* (org.jboss.tools.smooks.configuration.editors.xml.TagObject)
*/
@Override
public void addChildTag(TagObject tag) {
if (FreemarkerModelAnalyzer.isChoiceElement(tag.getReferenceElement())) {
this.getXMLNodeChildren().add(tag);
if (tag != null)
tag.setParent(this);
return;
}
super.addChildTag(tag);
}
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.smooks.configuration.editors.xml.TagObject#removeChildTag
* (org.jboss.tools.smooks.configuration.editors.xml.TagObject)
*/
@Override
public void removeChildTag(TagObject tag) {
// TODO Auto-generated method stub
super.removeChildTag(tag);
}
public boolean isRequired() {
Element element = this.getReferenceElement();
if (!this.getXMLNodeChildren().isEmpty()) {
return false;
}
if (element != null) {
return ModelBuilder.isRequired(element);
}
return false;
}
public boolean isManyOccurs() {
Element refElement = this.getReferenceElement();
if (refElement != null) {
return ModelBuilder.isCollection(refElement);
}
return false;
}
public boolean isHidden(TemplateBuilder builder) {
AbstractXMLObject parent = this.getParent();
if (parent instanceof FreemarkerTemplateXMLModel) {
if (((FreemarkerTemplateXMLModel) parent).isHidden(builder)) {
return true;
}
}
List<Mapping> mappings = builder.getMappings();
for (Iterator<?> iterator = mappings.iterator(); iterator.hasNext();) {
Mapping mapping = (Mapping) iterator.next();
List<Node> hiddenNodes = mapping.getHideNodes();
if (hiddenNodes != null) {
for (Iterator<?> iterator2 = hiddenNodes.iterator(); iterator2.hasNext();) {
Node node = (Node) iterator2.next();
if (node == this.getReferenceElement()) {
return true;
}
}
}
}
return false;
// Element refElement = this.getReferenceElement();
// if (refElement != null) {
// NamedNodeMap nodeMap = refElement.getAttributes();
// for (int i = 0; i < nodeMap.getLength(); i++) {
// Attr attr = (Attr) nodeMap.item(i);
// if (attr != null) {
// if
// (FreemarkerModelAnalyzer.SPECIAL_ELEMENT_UIR.equals(attr.getNamespaceURI()))
// {
// String name = attr.getLocalName();
// if (name == null) {
// name = attr.getNodeName();
// }
// if (FreemarkerModelAnalyzer.HIDDEN.equals(name)) {
// String value = attr.getValue();
// try {
// boolean booleanValue = Boolean.parseBoolean(value);
// return booleanValue;
// } catch (Exception e) {
// return false;
// }
// }
// }
// }
// }
//
// if (graphRoot != null &&
// FreemarkerModelAnalyzer.isChoiceElement(refElement)) {
// Node parent = refElement.getParentNode();
// NodeList nodeList = parent.getChildNodes();
// for (int i = 0; i < nodeList.getLength(); i++) {
// Node child = nodeList.item(i);
// if (child == refElement)
// continue;
// FreemarkerTemplateXMLModel model = localBrotherModel(child);
// if (model != null) {
// AbstractSmooksGraphicalModel cgm =
// SmooksGraphUtil.findSmooksGraphModel(graphRoot, model);
// if (!cgm.getTargetConnections().isEmpty()) {
// return true;
// }
// }
// }
// }
// }
// return false;
}
public Node getModelNode() {
return getReferenceElement();
}
private FreemarkerTemplateXMLModel localBrotherModel(Node refNode) {
AbstractXMLObject parent = this.getParent();
List<IXMLStructuredObject> children = parent.getChildren();
for (Iterator<?> iterator = children.iterator(); iterator.hasNext();) {
IXMLStructuredObject ixmlStructuredObject = (IXMLStructuredObject) iterator.next();
if (ixmlStructuredObject instanceof TagObject) {
if (((TagObject) ixmlStructuredObject).getReferenceElement() == refNode) {
return (FreemarkerTemplateXMLModel) ixmlStructuredObject;
}
}
if (ixmlStructuredObject instanceof TagPropertyObject) {
if (((TagPropertyObject) ixmlStructuredObject).getReferenceAttibute() == refNode) {
return (FreemarkerTemplateXMLModel) ixmlStructuredObject;
}
}
}
return null;
}
}