1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.betwixt;
18
19 /*** <p><code>XMLBeanInfo</code> represents the XML metadata information
20 * used to map a Java Bean cleanly to XML. This provides a default
21 * introspection mechansim, rather like {@link java.beans.BeanInfo}
22 * which can be customized through some mechansim, either via Java code
23 * or XSLT for example.</p>
24 *
25 * <h4><code>ID</code> and <code>IDREF</code> Attribute Names</h4>
26 * <p>These special attributes are defined in the xml specification.
27 * They are used by Betwixt to write bean graphs with cyclic references.
28 * In most cases, these will take the values 'id' and 'idref' respectively
29 * but these names can be varied in the DTD.
30 * Therefore, these names are specified by this class but default to the
31 * usual values.</p>
32 *
33 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
34 * @version $Revision: 438373 $
35 */
36 public class XMLBeanInfo {
37 /*** Descriptor for main element */
38 private ElementDescriptor elementDescriptor;
39
40 /*** the beans class that this XML info refers to */
41 private Class beanClass;
42 /*** <code>ID</code> attribute name */
43 private String idAttributeName = "id";
44 /*** <code>IDREF</code> attribute name */
45 private String idrefAttributeName = "idref";
46 /*** Have we already cached the <code>idAttributeDescriptor</code>? */
47 private boolean cachedIDAttribute = false;
48 /*** Cached <code>ID</code> attribute descriptor */
49 private AttributeDescriptor idAttributeDescriptor;
50
51 /***
52 * Base constructor
53 * @param beanClass for this Class
54 */
55 public XMLBeanInfo( Class beanClass ) {
56 this.beanClass = beanClass;
57 }
58
59 /***
60 * Gets descriptor for bean represention
61 *
62 * @return ElementDescriptor describing root element
63 */
64 public ElementDescriptor getElementDescriptor() {
65 return elementDescriptor;
66 }
67
68 /***
69 * Sets descriptor for bean represention
70 *
71 * @param elementDescriptor descriptor for bean
72 */
73 public void setElementDescriptor(ElementDescriptor elementDescriptor) {
74 this.elementDescriptor = elementDescriptor;
75 }
76
77 /***
78 * Gets the beans class that this XML info refers to
79 *
80 * @return the beans class that this XML info refers to
81 */
82 public Class getBeanClass() {
83 return beanClass;
84 }
85
86 /***
87 * Sets the beans class that this XML info refers to
88 *
89 * @param beanClass the class that this refers to
90 */
91 public void setBeanClass(Class beanClass) {
92 this.beanClass = beanClass;
93 }
94
95 /***
96 * Search attributes for one matching <code>ID</code> attribute name
97 *
98 * @return the xml ID attribute
99 */
100 public AttributeDescriptor getIDAttribute() {
101
102
103
104
105
106
107
108
109 idAttributeDescriptor = findIDAttribute();
110
111
112 return idAttributeDescriptor;
113 }
114
115 /***
116 * ID attribute search implementation
117 * @return the AttributeDescriptor for the <code>ID</code> attribute
118 */
119 private AttributeDescriptor findIDAttribute() {
120
121 if ( getElementDescriptor().hasAttributes() ) {
122 AttributeDescriptor[] attributes = getElementDescriptor().getAttributeDescriptors();
123 if ( attributes != null ) {
124 for ( int i = 0, size = attributes.length; i < size; i++ ) {
125
126 if ( getIDAttributeName().equals( attributes[i].getQualifiedName() )
127 || getIDAttributeName().equals( attributes[i].getLocalName() )) {
128
129 return attributes[i];
130
131 }
132 }
133 }
134 }
135 return null;
136 }
137
138 /***
139 * <p>Get name of <code>ID</code> attribute.
140 * This is used to write (for example) automatic <code>ID</code>
141 * attribute values.</p>
142 *
143 * <p>The default name is 'id'.</p>
144 *
145 * @return name for the special <code>ID</code> attribute
146 */
147 public String getIDAttributeName() {
148 return idAttributeName;
149 }
150
151 /***
152 * Set name of <code>ID</code> attribute
153 * This is used to write (for example) automatic <code>ID</code>
154 * attribute values.</p>
155 *
156 * <p>The default name is 'id'.</p>
157 *
158 * @param idAttributeName the attribute name for the special <code>ID</code> attribute
159 */
160 public void setIDAttributeName(String idAttributeName) {
161 this.idAttributeName = idAttributeName;
162 }
163
164 /***
165 * <p>Get <code>IDREF</code> attribute name
166 * This is used (for example) to deal with cyclic references.
167 *
168 * <p>The default name is 'idref'.</p>
169 *
170 * @return name for the special <code>IDREF</code> attribute
171 */
172 public String getIDREFAttributeName() {
173 return idrefAttributeName;
174 }
175
176 /***
177 * Set <code>IDREF</code> attribute name
178 * This is used (for example) to deal with cyclic references.
179 *
180 * <p>The default name is 'idref'.</p>
181 *
182 * @param idrefAttributeName the attribute name for the special <code>IDREF</code> attribute
183 */
184 public void setIDREFAttributeName(String idrefAttributeName) {
185 this.idrefAttributeName = idrefAttributeName;
186 }
187
188 /***
189 * Gets log-friendly string representation.
190 *
191 * @return something useful for logging
192 */
193 public String toString() {
194 return
195 "XMLBeanInfo [class=" + getBeanClass()
196 + ", descriptor=" + getElementDescriptor() + "]";
197 }
198 }