001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.geronimo.deployment.tools; 019 020 import java.util.ArrayList; 021 import java.util.HashMap; 022 import java.util.Iterator; 023 import java.util.List; 024 import java.util.Map; 025 026 import javax.enterprise.deploy.model.DDBean; 027 import javax.enterprise.deploy.model.DDBeanRoot; 028 import javax.enterprise.deploy.model.XpathListener; 029 030 import org.apache.xmlbeans.XmlCursor; 031 032 /** 033 * 034 * 035 * @version $Rev: 476049 $ $Date: 2006-11-16 23:35:17 -0500 (Thu, 16 Nov 2006) $ 036 */ 037 public class DDBeanImpl implements DDBean { 038 protected final DDBeanRoot root; 039 protected final String xpath; 040 protected final Map children; 041 protected final String content; 042 protected final Map attributeMap; 043 protected final DDBean parent; 044 045 public DDBeanImpl(DDBeanRoot root, DDBean parent, String xpath, XmlCursor c) { 046 this.root = root; 047 this.parent = parent; 048 this.xpath = xpath; 049 this.children = new HashMap(); 050 this.attributeMap = new HashMap(); 051 content = c.getTextValue(); 052 c.push(); 053 if (c.toFirstAttribute()) { 054 do { 055 attributeMap.put(c.getName().getLocalPart(), c.getTextValue()); 056 } while (c.toNextAttribute()); 057 } 058 c.pop(); 059 c.push(); 060 if (c.toFirstChild()) { 061 do { 062 String name = c.getName().getLocalPart(); 063 List nodes = (List) children.get(name); 064 if (nodes == null) { 065 nodes = new ArrayList(); 066 children.put(name, nodes); 067 } 068 nodes.add(new DDBeanImpl(root, this, xpath + "/" + name, c)); 069 } while (c.toNextSibling()); 070 } 071 c.pop(); 072 } 073 074 DDBeanImpl(DDBeanImpl source, String xpath) { 075 this.xpath = xpath; 076 this.root = source.root; 077 this.parent = source.parent; 078 this.children = source.children; 079 this.content = source.content; 080 this.attributeMap = source.attributeMap; 081 } 082 083 public DDBeanRoot getRoot() { 084 return root; 085 } 086 087 public String getXpath() { 088 return xpath; 089 } 090 091 public String getText() { 092 return content; 093 } 094 095 public String getId() { 096 return getAttributeValue("id"); 097 } 098 099 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 }