View Javadoc

1   /**
2    *
3    * Copyright 2003-2004 The Apache Software Foundation
4    *
5    *  Licensed under the Apache License, Version 2.0 (the "License");
6    *  you may not use this file except in compliance with the License.
7    *  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   */
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  /**
33   *
34   *
35   * @version $Rev: 355877 $ $Date: 2005-12-10 18:48:27 -0800 (Sat, 10 Dec 2005) $
36   */
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 }