1 17 18 package org.apache.geronimo.deployment.tools; 19 20 import java.util.ArrayList ; 21 import java.util.HashMap ; 22 import java.util.Iterator ; 23 import java.util.List ; 24 import java.util.Map ; 25 26 import javax.enterprise.deploy.model.DDBean ; 27 import javax.enterprise.deploy.model.DDBeanRoot ; 28 import javax.enterprise.deploy.model.XpathListener ; 29 30 import org.apache.xmlbeans.XmlCursor; 31 32 37 public class DDBeanImpl implements DDBean { 38 protected final DDBeanRoot root; 39 protected final String xpath; 40 protected final Map children; 41 protected final String content; 42 protected final Map attributeMap; 43 protected final DDBean parent; 44 45 public DDBeanImpl(DDBeanRoot root, DDBean parent, String xpath, XmlCursor c) { 46 this.root = root; 47 this.parent = parent; 48 this.xpath = xpath; 49 this.children = new HashMap (); 50 this.attributeMap = new HashMap (); 51 content = c.getTextValue(); 52 c.push(); 53 if (c.toFirstAttribute()) { 54 do { 55 attributeMap.put(c.getName().getLocalPart(), c.getTextValue()); 56 } while (c.toNextAttribute()); 57 } 58 c.pop(); 59 c.push(); 60 if (c.toFirstChild()) { 61 do { 62 String name = c.getName().getLocalPart(); 63 List nodes = (List ) children.get(name); 64 if (nodes == null) { 65 nodes = new ArrayList (); 66 children.put(name, nodes); 67 } 68 nodes.add(new DDBeanImpl(root, this, xpath + "/" + name, c)); 69 } while (c.toNextSibling()); 70 } 71 c.pop(); 72 } 73 74 DDBeanImpl(DDBeanImpl source, String xpath) { 75 this.xpath = xpath; 76 this.root = source.root; 77 this.parent = source.parent; 78 this.children = source.children; 79 this.content = source.content; 80 this.attributeMap = source.attributeMap; 81 } 82 83 public DDBeanRoot getRoot() { 84 return root; 85 } 86 87 public String getXpath() { 88 return xpath; 89 } 90 91 public String getText() { 92 return content; 93 } 94 95 public String getId() { 96 return getAttributeValue("id"); 97 } 98 99 public String getAttributeValue(String attrName) { 100 String value = (String ) attributeMap.get(attrName); 101 if (value == null || value.length() == 0) { 102 return null; 103 } 104 return value; 105 } 106 107 public String [] getText(String xpath) { 108 DDBean [] beans = getChildBean(xpath); 109 if (beans == null) { 110 return null; 111 } 112 113 String [] text = new String [beans.length]; 114 for (int i = 0; i < beans.length; i++) { 115 text[i] = beans[i].getText(); 116 } 117 return text; 118 } 119 120 public DDBean [] getChildBean(String xpath) { 121 if (xpath.startsWith("/")) { 122 return getRoot().getChildBean(xpath.substring(1)); 123 } else if(xpath.equals(".")) { 124 return new DDBean []{this}; 125 } else if(xpath.startsWith("./")) { 126 return getChildBean(xpath.substring(2)); 127 } else if(xpath.startsWith("..")) { 128 if(xpath.length() == 2) { 129 return new DDBean []{parent}; 130 } else { 131 return parent.getChildBean(xpath.substring(3)); 132 } 133 } 134 int index = xpath.indexOf('/'); 135 if (index == -1) { 136 List beans = (List ) children.get(xpath); 137 if (beans == null) { 138 return null; 139 } 140 DDBean [] newDDBeans = (DDBean []) beans.toArray(new DDBean [beans.size()]); 141 for (int i = 0; i < newDDBeans.length; i++) { 142 newDDBeans[i] = new DDBeanImpl((DDBeanImpl) newDDBeans[i], xpath); 143 } 144 return newDDBeans; 145 } else { 146 List childBeans = (List ) children.get(xpath.substring(0, index)); 147 if (childBeans == null) { 148 return null; 149 } 150 String path = xpath.substring(index + 1); 151 List beans = new ArrayList (); 152 for (Iterator i = childBeans.iterator(); i.hasNext();) { 153 DDBean bean = (DDBean ) i.next(); 154 DDBean [] childs = bean.getChildBean(path); 155 if (childs != null) { 156 for (int j = 0; j < childs.length; j++) { 157 beans.add(new DDBeanImpl((DDBeanImpl) childs[j], xpath)); 158 } 159 } 160 } 161 return beans.size() > 0 ? (DDBean []) beans.toArray(new DDBean [beans.size()]) : null; 162 } 163 } 164 165 public String [] getAttributeNames() { 166 return (String []) attributeMap.keySet().toArray(new String [attributeMap.size()]); 167 } 168 169 public void addXpathListener(String xpath, XpathListener xpl) { 170 } 171 172 public void removeXpathListener(String xpath, XpathListener xpl) { 173 } 174 175 public boolean equals(Object other) { 176 if (other.getClass() != DDBeanImpl.class) { 177 return false; 178 } 179 DDBeanImpl otherdd = (DDBeanImpl) other; 180 return xpath.equals(otherdd.xpath) 181 && children.equals(otherdd.children) 182 && attributeMap.equals(otherdd.attributeMap) 183 && root.equals(otherdd.root); 184 } 185 186 public int hashCode() { 187 return xpath.hashCode() ^ attributeMap.hashCode() ^ root.hashCode(); 188 } 189 } 190 | Popular Tags |