package net.sf.minuteProject.configuration.bean.xml.impl.dom4j;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Element;
import org.dom4j.Node;
import net.sf.minuteProject.configuration.bean.Configuration;
import net.sf.minuteProject.configuration.bean.Package;
import net.sf.minuteProject.configuration.bean.Template;
import net.sf.minuteProject.configuration.bean.TemplateTarget;
import net.sf.minuteProject.configuration.bean.xml.impl.AbstractElement;
import net.sf.minuteProject.plugin.xml.schema.XmlSchemaUtils;
import net.sf.minuteProject.utils.FormatUtils;
public class ElementDom4j extends AbstractElement{
private Package pack;
private Element element;
private String elementName;
private net.sf.minuteProject.configuration.bean.xml.Element parentElement;
private List<net.sf.minuteProject.configuration.bean.xml.Element> nodes;
public ElementDom4j (Element element) {
this.element = element;
if (element!=null)
setElementName(element.getName());
//setName(getNameAttributeValue());
}
// method
public String getTechnicalPackage(Template template) {
TemplateTarget templateTarget = template.getTemplateTarget();
Configuration configuration = (Configuration)templateTarget.getTarget().getAbstractConfigurationRoot();
StringBuffer sb = new StringBuffer(
templateTarget.getPackageRoot()+"."+
configuration.getModel().getName()+"."+
template.getTechnicalPackage());
return sb.toString();
}
public String getAttributeValue(String attributeName) {
Attribute attribute = this.element.attribute(attributeName);
if (attribute!=null)
return attribute.getValue();
return null;
}
public String getTypeAttributeValue() {
return getAttributeValue("type");
}
public String getNameAttributeValue() {
return getAttributeValue("name");
}
public boolean isElementComplexType() {
//complexType full nested
if (getTypeAttributeValue()==null) {
List nodes = getNodes();
if (!nodes.isEmpty()) {
ElementDom4j ele = ((ElementDom4j)nodes.get(0));
if (ele.getName().equals("complexType")) {
return true;
}
}
}
// complexType by reference
boolean isComplexType = XmlSchemaUtils.isComplexType(this.getTypeAttributeValue());
//XmlSchemaUtils.isComplexType(xmlType)
return isComplexType;
}
public boolean isComplexType() {
return getElementName().equals("complexType");
}
public net.sf.minuteProject.configuration.bean.xml.Element getSequence() {
if (isComplexType()) {
// return this;
List<net.sf.minuteProject.configuration.bean.xml.Element> nodes2 = getNodes();
if (!nodes2.isEmpty()) {
for (net.sf.minuteProject.configuration.bean.xml.Element ele2 : nodes2) {
if (ele2.getName().equals("sequence")) {
return ele2;
}
}
}
}
if (getTypeAttributeValue()==null) {
List nodes = getNodes();
if (!nodes.isEmpty()) {
ElementDom4j ele = ((ElementDom4j)nodes.get(0));
if (ele.getName().equals("complexType")) {
List nodes2 = ele.getNodes();
if (!nodes2.isEmpty()) {
ElementDom4j ele2 = ((ElementDom4j)nodes2.get(0));
if (ele2.getName().equals("sequence")) {
return ele2;
}
}
}
}
}
return null;
}
private List<net.sf.minuteProject.configuration.bean.xml.Element> getComplexType() {
if (isComplexType()
&& getNameAttributeValue()!=null) {
List<net.sf.minuteProject.configuration.bean.xml.Element> list = new ArrayList<net.sf.minuteProject.configuration.bean.xml.Element>();
list.add(this);
return list;
}
if (getTypeAttributeValue()==null) {
List<net.sf.minuteProject.configuration.bean.xml.Element> nodes = getNodes();
if (!nodes.isEmpty()) {
for (net.sf.minuteProject.configuration.bean.xml.Element element1 : nodes) {
ElementDom4j ele = ((ElementDom4j)element1);
if (ele.getName().equals("complexType")) {
return ele.getNodes();
}
}
}
}
return null;
}
public List<net.sf.minuteProject.configuration.bean.xml.Element> getSeq() {
return getSequenceElement();
}
public List<net.sf.minuteProject.configuration.bean.xml.Element> getSequenceElement() {
//return getNodes();
net.sf.minuteProject.configuration.bean.xml.Element sequence = getSequence();
if (sequence!=null) {
return sequence.getNodes();
}
return null;
}
public List<net.sf.minuteProject.configuration.bean.xml.Element> getSequenceAttribute() {
List<net.sf.minuteProject.configuration.bean.xml.Element> complexType = getComplexType();
List<net.sf.minuteProject.configuration.bean.xml.Element> attributes
= new ArrayList<net.sf.minuteProject.configuration.bean.xml.Element>();
if (complexType!=null) {
if (!complexType.isEmpty()) {
for (net.sf.minuteProject.configuration.bean.xml.Element element : complexType) {
if (element.getName().equals("attribute")) {
attributes.add(element);
}
}
}
}
return attributes;
}
public String getType () {
if (isElementComplexType())
return getNameAttributeValue();
return getTypeAttributeValue();
}
public String getJavaType () {
return FormatUtils.getJavaName(getType());
}
// public String getSequenceType() {
// net.sf.minuteProject.configuration.bean.xml.Element sequence = getSequence();
// if (sequence!=null) {
// String name = sequence.getNameAttributeValue();
// if (name!=null)
// return name;
// else
// //TODO
// return ""+"list";
// }
// return null;
// }
public List<net.sf.minuteProject.configuration.bean.xml.Element> getNodes() {
if (nodes==null) {
nodes = new ArrayList<net.sf.minuteProject.configuration.bean.xml.Element> ();
for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
Node node = element.node(i);
//element.getDocument().getRootElement();
if ( node instanceof Element ) {
Element ele = (Element)node;
ElementDom4j elementDom4j = new ElementDom4j(ele);
nodes.add(elementDom4j);
}
}
}
return nodes;
}
public net.sf.minuteProject.configuration.bean.xml.Element getFirstSequenceElement () {
Element root = element.getDocument().getRootElement();
net.sf.minuteProject.configuration.bean.xml.Element rootEle = new ElementDom4j(root);
List<net.sf.minuteProject.configuration.bean.xml.Element> list = rootEle.getNodes();
if (!list.isEmpty())
return list.get(0);
return null;
}
public String getName() {
if (isComplexType()
&& getNameAttributeValue()==null) {
net.sf.minuteProject.configuration.bean.xml.Element parent = getParentElement();
if (parent!=null && parent.getElementName().equals("element"))
//return parent.getName();
return parent.getNameAttributeValue();
}
return element.getName();
}
public void setParentElement(net.sf.minuteProject.configuration.bean.xml.Element element) {
parentElement = element;
}
public net.sf.minuteProject.configuration.bean.xml.Element getParentElement() {
return parentElement;
// ElementDom4j ele = new ElementDom4j(element.getParent());
// ele.setName(getNameAttributeValue());
// return ele;
}
public void setName(String name) {
element.setName(name);
}
public Package getPackage() {
return pack;
}
public void setPackage(Package pack) {
this.pack = pack;
}
@Override
public String getText() {
return element.getText();
}
public List getAttributes() {
return element.attributes();
}
public void setNodes(List nodes) {
this.nodes = nodes;
}
public String getElementName() {
return elementName;
}
public void setElementName(String elementName) {
this.elementName = elementName;
}
public String getPath() {
return element.getPath();
}
public String getDefault() {
// TODO Auto-generated method stub
return getAttributeValue ("default");
}
// getter setter adder
}