1 /*
2 * Redistribution and use of this software and associated documentation
3 * ("Software"), with or without modification, are permitted provided
4 * that the following conditions are met:
5 *
6 * 1. Redistributions of source code must retain copyright
7 * statements and notices. Redistributions must also contain a
8 * copy of this document.
9 *
10 * 2. Redistributions in binary form must reproduce the
11 * above copyright notice, this list of conditions and the
12 * following disclaimer in the documentation and/or other
13 * materials provided with the distribution.
14 *
15 * 3. The name "Exolab" must not be used to endorse or promote
16 * products derived from this Software without prior written
17 * permission of Intalio, Inc. For written permission,
18 * please contact info@exolab.org.
19 *
20 * 4. Products derived from this Software may not be called "Exolab"
21 * nor may "Exolab" appear in their names without prior written
22 * permission of Intalio, Inc. Exolab is a registered
23 * trademark of Intalio, Inc.
24 *
25 * 5. Due credit should be given to the Exolab Project
26 * (http://www.exolab.org/).
27 *
28 * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
32 * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39 * OF THE POSSIBILITY OF SUCH DAMAGE.
40 *
41 * Copyright 1999,2000 (C) Intalio, Inc. All Rights Reserved.
42 *
43 * Contribution(s):
44 *
45 * - Frank Thelen, frank.thelen@poet.de
46 * - Moved creation of access methods into an appropriate
47 * set of separate methods, for extensibility
48 *
49 * $Id$
50 */
51 package org.exolab.castor.builder.info;
52
53 import org.exolab.castor.builder.SourceGeneratorConstants;
54 import org.exolab.castor.builder.factory.FieldMemberAndAccessorFactory;
55 import org.exolab.castor.builder.info.nature.XMLInfoNature;
56 import org.exolab.castor.builder.types.XSCollectionFactory;
57 import org.exolab.castor.builder.types.XSListType;
58 import org.exolab.castor.builder.types.XSType;
59
60 /**
61 * A helper used for generating source that deals with Collections.
62 * @author <a href="mailto:kvisco@intalio.com">Keith Visco</a>
63 * @version $Revision$ $Date: 2006-02-23 01:08:24 -0700 (Thu, 23 Feb 2006) $
64 */
65 public class CollectionInfo extends FieldInfo {
66
67 /** Default suffix for the setter/getter by reference method names. */
68 public static final String DEFAULT_REFERENCE_SUFFIX = "AsReference";
69
70 /**
71 * The property used to overwrite the reference suffix for extra collection
72 * methods.
73 */
74 public static final String REFERENCE_SUFFIX_PROPERTY =
75 "org.exolab.castor.builder.collections.reference.suffix";
76
77 /**
78 * A flag indicating that "extra" accessor methods should be created for
79 * returning and setting a reference to the underlying collection.
80 */
81 private boolean _extraMethods;
82 /** The reference suffix to use. */
83 private String _referenceSuffix = DEFAULT_REFERENCE_SUFFIX;
84
85 /** Element type name converted to a method suffix. */
86 private final String _methodSuffix;
87 /** Element type name converted to a parameter prefix. */
88 private final String _parameterPrefix;
89 /** FieldInfo describing the _content (i.e. the elements) of this collection. */
90 private final FieldInfo _content;
91 /** The name to be used when referring to the elements of this collection. */
92 private final String _elementName;
93
94 /**
95 * Creates a new CollectionInfo.
96 *
97 * @param contentType
98 * the _content type of the collection, ie. the type of objects
99 * that the collection will contain
100 * @param name
101 * the name of the Collection
102 * @param elementName
103 * the element name for each element in collection
104 * @param useJava50
105 * true if source code is supposed to be generated for Java 5
106 * @param memberAndAccessorFactory
107 * the FieldMemberAndAccessorFactory to be used
108 * @param contentMemberAndAccessorFactory
109 * the FieldMemberAndAccessorFactory for the content
110 */
111 public CollectionInfo(final XSType contentType, final String name,
112 final String elementName, final boolean useJava50,
113 final FieldMemberAndAccessorFactory memberAndAccessorFactory,
114 final FieldMemberAndAccessorFactory contentMemberAndAccessorFactory) {
115 super(XSCollectionFactory.createCollection(SourceGeneratorConstants.FIELD_INFO_VECTOR,
116 contentType, useJava50), name, memberAndAccessorFactory);
117
118 if (elementName.charAt(0) == '_') {
119 this._elementName = elementName.substring(1);
120 } else {
121 this._elementName = elementName;
122 }
123
124 this._methodSuffix = memberAndAccessorFactory.getJavaNaming().toJavaClassName(
125 this.getElementName());
126 this._parameterPrefix = memberAndAccessorFactory.getJavaNaming().toJavaMemberName(
127 this.getElementName());
128 this._content = new FieldInfo(contentType, "v" + this.getMethodSuffix(),
129 contentMemberAndAccessorFactory);
130
131 // indicates that - per definition - we are dealing with multi-valuedness
132 new XMLInfoNature(this).setMultivalued(true);
133 } // -- CollectionInfo
134
135
136 /**
137 * Return the contents of the collection.
138 * @return the contents of the collection.
139 */
140 public final FieldInfo getContent() {
141 return this._content;
142 }
143
144 /**
145 * Returns the variable name for the content of the collection.
146 * @return the variable name for the content of the collection.
147 */
148 public final String getContentName() {
149 return this.getContent().getName();
150 }
151
152 /**
153 * Returns the type of content in this collection.
154 * @return the type of content in this collection.
155 */
156 public final XSType getContentType() {
157 return new XMLInfoNature(this.getContent()).getSchemaType();
158 }
159
160 /**
161 * Returns the name to be used when referring to the elements of this
162 * collection.
163 *
164 * @return the name to be used when referring to the elements of this
165 * collection.
166 */
167 public final String getElementName() {
168 return this._elementName;
169 }
170
171 /**
172 * Returns the schema type represented by this collection.
173 * @return the schema type represented by this collection.
174 */
175 public final XSListType getXSList() {
176 return (XSListType) new XMLInfoNature(this).getSchemaType();
177 }
178
179 /**
180 * Sets whether or not to create extra collection methods for accessing the
181 * actual collection.
182 *
183 * @param extraMethods
184 * a boolean that when true indicates that extra collection
185 * accessor methods should be created. False by default.
186 * @see #setReferenceMethodSuffix
187 */
188 public final void setCreateExtraMethods(final boolean extraMethods) {
189 this._extraMethods = extraMethods;
190 } // -- setCreateExtraMethods
191
192 /**
193 * Sets the method suffix (ending) to use when creating the extra collection
194 * methods.
195 *
196 * @param suffix
197 * the method suffix to use when creating the extra collection
198 * methods. If null or emtpty the default value, as specified by
199 * DEFAULT_REFERENCE_SUFFIX will used.
200 * @see #setCreateExtraMethods
201 */
202 public final void setReferenceMethodSuffix(final String suffix) {
203 if (suffix == null || suffix.length() == 0) {
204 this._referenceSuffix = DEFAULT_REFERENCE_SUFFIX;
205 } else {
206 this._referenceSuffix = suffix;
207 }
208 } // -- setReferenceMethodSuffix
209
210 /**
211 * {@inheritDoc}
212 *
213 * @see org.exolab.castor.builder.info.FieldInfo#getMethodSuffix()
214 */
215 public final String getMethodSuffix() {
216 return this._methodSuffix;
217 }
218
219 /**
220 * Returns the suffix (ending) that should be used when creating the extra
221 * collection methods.
222 *
223 * @return the suffix for the reference methods
224 */
225 public final String getReferenceMethodSuffix() {
226 return this._referenceSuffix;
227 } // -- getReferenceMethodSuffix
228
229 /**
230 * Indicates whether extra collection methods should be created.
231 * @return True if extra collection methods will be created.
232 */
233 public boolean isExtraMethods() {
234 return _extraMethods;
235 }
236
237 /**
238 * Returns the element type name converted to a parameter prefix.
239 * @return the element type name converted to a parameter prefix.
240 */
241 public String getParameterPrefix() {
242 return _parameterPrefix;
243 }
244
245
246 /**
247 * Returns the reference suffix to use for 'reference style' methods.
248 * @return the reference suffix to use
249 */
250 public String getReferenceSuffix() {
251 return _referenceSuffix;
252 }
253
254 }