/* * Redistribution and use of this software and associated documentation * ("Software"), with or without modification, are permitted provided * that the following conditions are met: * * 1. Redistributions of source code must retain copyright * statements and notices. Redistributions must also contain a * copy of this document. * * 2. Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other * materials provided with the distribution. * * 3. The name "Exolab" must not be used to endorse or promote * products derived from this Software without prior written * permission of Intalio, Inc. For written permission, * please contact info@exolab.org. * * 4. Products derived from this Software may not be called "Exolab" * nor may "Exolab" appear in their names without prior written * permission of Intalio, Inc. Exolab is a registered * trademark of Intalio, Inc. * * 5. Due credit should be given to the Exolab Project * (http://www.exolab.org/). * * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright 1999-2002 (C) Intalio, Inc. All Rights Reserved. * * $Id$ */ package org.exolab.castor.builder.factory; import java.security.InvalidParameterException; import org.castor.xml.JavaNaming; import org.castor.xml.JavaNamingImpl; import org.exolab.castor.builder.SourceGeneratorConstants; import org.exolab.castor.builder.info.CollectionInfo; import org.exolab.castor.builder.info.CollectionInfoJ2; import org.exolab.castor.builder.info.CollectionInfoJ2Collection; import org.exolab.castor.builder.info.CollectionInfoJ2Set; import org.exolab.castor.builder.info.CollectionInfoJ2SortedSet; import org.exolab.castor.builder.info.CollectionInfoODMG30; import org.exolab.castor.builder.info.FieldInfo; import org.exolab.castor.builder.info.IdentityInfo; import org.exolab.castor.builder.types.XSType; /** * This class is used as a factory to create all the FieldInfo objects used by * the source generator. You may override the FieldInfo classes and this factory * for specific adaptions. * * @author <a href="mailto:frank.thelen@poet.de">Frank Thelen</a> * @author <a href="mailto:blandin@intalio.com">Arnaud Blandin</a> * @version $Revision$ $Date: 2005-03-05 06:42:06 -0700 (Sat, 05 Mar 2005) $ */ public class FieldInfoFactory { /** The default collection name. */ private String _default = null; /** A flag indicating that "extra" accessor methods should be created for * returning and setting a reference to the underlying collection. */ private boolean _extraMethods = false; /** The reference suffix to use. */ private String _referenceSuffix = null; /** If true, code for bound properties will be generated. */ private boolean _bound = false; /* The FieldMemberAndAccessorFactories */ private FieldMemberAndAccessorFactory _fieldMemberAndAccessorFactory; private CollectionMemberAndAccessorFactory _collectionMemberAndAccessorFactory; private CollectionJ2MemberAndAccessorFactory _collectionJ2MemberAndAccessorFactory; private CollectionJ2NoIndexMemberAndAccessorFactory _collectionJ2NoIndexMemberAndAccessorFactory; private CollectionODMG30MemberAndAccessorFactory _collectionODMG30MemberAndAccessorFactory; private IdentityMemberAndAccessorFactory _identityMemberAndAccessorFactory; /** * The {@link JavaNaming} to use. * @since 1.1.3 */ private JavaNaming _javaNaming; /** * Creates a new FieldInfoFactory. The default collection used will be * Java 1 type. */ public FieldInfoFactory () { this("vector"); } /** * Creates a new FieldInfoFactory of the given type. * @param collectionName The type for the FieldInfoFactory. */ public FieldInfoFactory(final String collectionName) { super(); if (!(collectionName.equals(SourceGeneratorConstants.FIELD_INFO_VECTOR) || collectionName.equals(SourceGeneratorConstants.FIELD_INFO_ARRAY_LIST) || collectionName.equals(SourceGeneratorConstants.FIELD_INFO_ODMG))) { throw new IllegalArgumentException(collectionName + " is currently not a supported Java collection."); } _default = collectionName; _javaNaming = new JavaNamingImpl(); this._fieldMemberAndAccessorFactory = new FieldMemberAndAccessorFactory( _javaNaming); this._collectionMemberAndAccessorFactory = new CollectionMemberAndAccessorFactory( _javaNaming); this._collectionJ2MemberAndAccessorFactory = new CollectionJ2MemberAndAccessorFactory( _javaNaming); this._collectionJ2NoIndexMemberAndAccessorFactory = new CollectionJ2NoIndexMemberAndAccessorFactory( _javaNaming); this._collectionODMG30MemberAndAccessorFactory = new CollectionODMG30MemberAndAccessorFactory( _javaNaming); this._identityMemberAndAccessorFactory = new IdentityMemberAndAccessorFactory( _javaNaming); } /** * Creates an {@link IdentityInfo} instance for the given name. * @param name Identity field name. * @return The {@link IdentityInfo} instance just created. */ public IdentityInfo createIdentity (final String name) { IdentityInfo idInfo = new IdentityInfo(name, this._identityMemberAndAccessorFactory); if (_bound) { idInfo.setBound(_bound); } return idInfo; } /** * Creates a {@link CollectionInfo} instance based upon the various parameters provided. * @param contentType Content type of the collection. * @param name Name of the collection member. * @param elementName Name of the (content) element. * @param javaNaming the Java naming to be used * @param usejava50 Whether we are targeting Java 5.0 or above or not * @return A {@link CollectionInfo} instance representing a collection typed member. * @see #createCollection(XSType, String, String, String, boolean) */ public CollectionInfo createCollection(final XSType contentType, final String name, final String elementName, final JavaNaming javaNaming, final boolean usejava50) { return createCollection(contentType, name, elementName, _default, javaNaming, usejava50); } /** * Creates a {@link CollectionInfo} instance based upon the various parameters provided. * @param contentType Content type of the collection. * @param name Name of the collection member. * @param elementName Name of the (content) element. * @param collectionName Name of the collection. * @param javaNaming the Java naming to be used * @param useJava50 Whether we are targeting Java 5.0 or above or not * @return A {@link CollectionInfo} instance representing a collection typed member. */ public CollectionInfo createCollection(final XSType contentType, final String name, final String elementName, final String collectionName, final JavaNaming javaNaming, final boolean useJava50) { String temp = collectionName; if (temp == null || temp.length() == 0) { temp = _default; } final CollectionInfo cInfo; if (temp.equalsIgnoreCase(SourceGeneratorConstants.FIELD_INFO_VECTOR)) { cInfo = new CollectionInfo(contentType, name, elementName, useJava50, this._collectionMemberAndAccessorFactory, this._fieldMemberAndAccessorFactory); } else if (temp.equalsIgnoreCase(SourceGeneratorConstants.FIELD_INFO_ARRAY_LIST)) { cInfo = new CollectionInfoJ2(contentType, name, elementName, "arraylist", useJava50, this._collectionJ2MemberAndAccessorFactory, this._fieldMemberAndAccessorFactory); } else if (temp.equalsIgnoreCase(SourceGeneratorConstants.FIELD_INFO_ODMG)) { cInfo = new CollectionInfoODMG30(contentType, name, elementName, useJava50, this._collectionODMG30MemberAndAccessorFactory, this._fieldMemberAndAccessorFactory); } else if (temp.equalsIgnoreCase(SourceGeneratorConstants.FIELD_INFO_COLLECTION)) { cInfo = new CollectionInfoJ2Collection(contentType, name, elementName, useJava50, this._collectionJ2NoIndexMemberAndAccessorFactory, this._fieldMemberAndAccessorFactory); } else if (temp.equalsIgnoreCase(SourceGeneratorConstants.FIELD_INFO_SET)) { cInfo = new CollectionInfoJ2Set(contentType, name, elementName, useJava50, this._collectionJ2NoIndexMemberAndAccessorFactory, this._fieldMemberAndAccessorFactory); } else if (temp.equalsIgnoreCase(SourceGeneratorConstants.FIELD_INFO_SORTED_SET)) { cInfo = new CollectionInfoJ2SortedSet(contentType, name, elementName, useJava50, this._collectionJ2NoIndexMemberAndAccessorFactory, this._fieldMemberAndAccessorFactory); } else { throw new InvalidParameterException("Unrecognized collection type: " + temp); } //--not sure it is pluggable enough, it is not really beautiful to specify //--the collection to use here cInfo.setCreateExtraMethods(_extraMethods); if (_referenceSuffix != null) { cInfo.setReferenceMethodSuffix(_referenceSuffix); } if (_bound) { cInfo.setBound(true); } return cInfo; } /** * Creates a {@link FieldInfo} instance for the given {@link XSType} and * its name. * @param type {@link XSType} of the field. * @param name Field name. * @return The {@link FieldInfo} instance just created. */ public FieldInfo createFieldInfo(final XSType type, final String name) { FieldInfo fieldInfo = new FieldInfo(type, name, this._fieldMemberAndAccessorFactory); if (_bound) { fieldInfo.setBound(true); } return fieldInfo; } /** * Sets whether or not the fields should be bound properties. * * @param bound a boolean that when true indicates the FieldInfo should have * the bound property enabled. */ public final void setBoundProperties(final boolean bound) { _bound = bound; } /** * Sets whether or not to create extra collection methods for accessing the * actual collection. * * @param extraMethods a boolean that when true indicates that extra * collection accessor methods should be created. False by default. * @see org.exolab.castor.builder.FieldInfoFactory#setReferenceMethodSuffix */ public final void setCreateExtraMethods(final boolean extraMethods) { _extraMethods = extraMethods; } /** * Sets the method suffix (ending) to use when creating the extra collection * methods. * * @param suffix the method suffix to use when creating the extra collection * methods. If null or emtpty the default value, as specified in * CollectionInfo will be used. * @see org.exolab.castor.builder.FieldInfoFactory#setCreateExtraMethods */ public final void setReferenceMethodSuffix(final String suffix) { _referenceSuffix = suffix; } }