/* * 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-2003 (C) Intalio Inc. All Rights Reserved. * * This file was originally developed by Keith Visco during the * course of employment at Intalio Inc. * All portions of this file developed by Keith Visco after Jan 19 2005 are * Copyright (C) 2005 Keith Visco. All Rights Reserved. * * $Id$ */ package org.exolab.castor.builder; import java.util.Vector; import org.exolab.castor.builder.binding.XMLBindingComponent; import org.exolab.castor.builder.info.ClassInfo; import org.exolab.castor.builder.info.FieldInfo; import org.exolab.castor.xml.schema.Annotated; import org.exolab.javasource.JClass; import org.exolab.javasource.JEnum; /** * A class used to save State information for the SourceFactory. * * @author <a href="mailto:keith AT kvisco DOT com">Keith Visco</a> */ public class FactoryState implements ClassInfoResolver { /** The JClass for which we are currently generating code. */ private final JClass _jClass; /** A ClassInfo for <code>_jClass</code>. */ private final ClassInfo _classInfo; /** A FieldInfo used to handle <code>xsd:choice</code>. */ private FieldInfo _fieldInfoForChoice = null; /** Package for the class currently being generated. */ private final String _packageName; /** Our ClassInfoResolver to keep track of ClassInfos for easy lookup. */ private ClassInfoResolver _resolver = null; /** Keeps track of which classes have been processed. */ private Vector<Annotated> _processed = null; /** SourceGenerator state. */ private SGStateInfo _sgState = null; /** If true, we are currently generating code for a group. */ private boolean _createGroupItem = false; /** * Keeps track of whether or not the BoundProperties methods have been * created. */ private boolean _bound = false; /** Keeps track of the different FactoryState. */ private FactoryState _parent = null; /** * {@link JClassRegistry} instance used for automatic class name conflict * resolution. */ private JClassRegistry _xmlInfoRegistry = null; /** * Constructs a new FactoryState. * * @param className * Class name of the class currently being generated. * @param sgState * Source Generator State object * @param packageName * package name for generated code. * @param component * TODO */ public FactoryState(final String className, final SGStateInfo sgState, final String packageName, final XMLBindingComponent component) { this(className, sgState, packageName, component, false); } /** * Constructs a factory state with the option of choosing between JClass and JEnum. * * @param className * Class name of the class currently being generated. * @param sgState * Source Generator State object * @param packageName * package name for generated code. * @param component * TODO * @param enumeration * use a JEnum instead if a JClass */ public FactoryState(final String className, final SGStateInfo sgState, final String packageName, final XMLBindingComponent component, final boolean enumeration) { if (sgState == null) { throw new IllegalArgumentException("SGStateInfo cannot be null."); } _sgState = sgState; _processed = new Vector<Annotated>(); // keep the elements and complexType already processed // if (resolver instanceof FactoryState) { // _processed = ((FactoryState)resolver)._processed; // } if (enumeration) { _jClass = new JEnum(className); } else { _jClass = new JClass(className); } // if configured, try automatic class name conflict resolution if (_sgState.getSourceGenerator().isAutomaticConflictResolution()) { _xmlInfoRegistry = sgState.getSourceGenerator() .getXMLInfoRegistry(); _xmlInfoRegistry.bind(_jClass, component, "class"); } _classInfo = new ClassInfo(_jClass); _resolver = sgState; _packageName = packageName; // -- boundProperties _bound = sgState.getSourceGenerator().boundPropertiesEnabled(); } // -- FactoryState /** * Get JClass for which we are currently generating code. * * @return JClass for which we are currently generating code. */ public final JClass getJClass() { return _jClass; } /** * Get ClassInfo for <code>_jClass</code>. * * @return ClassInfo for <code>_jClass</code>. */ public final ClassInfo getClassInfo() { return _classInfo; } /** * Get FieldInfo used to handle <code>xsd:choice</code>. * * @return FieldInfo used to handle <code>xsd:choice</code>. */ public final FieldInfo getFieldInfoForChoice() { return _fieldInfoForChoice; } /** * Set FieldInfo used to handle <code>xsd:choice</code>. * * @param fieldInfoForChoice * FieldInfo used to handle <code>xsd:choice</code>. */ public final void setFieldInfoForChoice(final FieldInfo fieldInfoForChoice) { _fieldInfoForChoice = fieldInfoForChoice; } /** * Get package for the class currently being generated. * * @return Package for the class currently being generated. */ public final String getPackageName() { return _packageName; } /** * Adds the given Reference to this ClassInfo resolver. * * @param key * the key to bind a reference to * @param classInfoRef * the ClassInfo which is being referenced */ public void bindReference(final Object key, final ClassInfo classInfoRef) { _resolver.bindReference(key, classInfoRef); } // -- bindReference /** * Returns the SGStateInfo. * * @return the SGStateInfo. */ public SGStateInfo getSGStateInfo() { return _sgState; } // -- getSGStateInfo /** * Marks the given Annotated XML Schema structure as having been processed. * * @param annotated * the Annotated XML Schema structure to mark as having been * processed. */ public void markAsProcessed(final Annotated annotated) { _processed.addElement(annotated); } // -- markAsProcessed /** * Returns true if the given Annotated XML Schema structure has been marked * as processed. * * @param annotated * the Annotated XML Schema structure to check for being marked * as processed * @return true if the given Annotated XML Schema structure has been marked * as processed */ public boolean processed(final Annotated annotated) { boolean result = _processed.contains(annotated); if (!result && _parent != null) { return _parent.processed(annotated); } return result; } // -- processed /** * Returns true if any bound properties have been found. * * @return true if any bound properties have been found. */ public boolean hasBoundProperties() { return _bound; } // -- hasBoundProperties /** * Allows setting the bound properties flag. * * @param bound * the new value of the bound properties flag * @see #hasBoundProperties */ public void setBoundProperties(final boolean bound) { _bound = bound; } // -- setBoundProperties /** * Returns the ClassInfo which has been bound to the given key. * * @param key * the object to which the ClassInfo has been bound * @return the ClassInfo which has been bound to the given key */ public ClassInfo resolve(final Object key) { return _resolver.resolve(key); } // -- resolve /** * Returns true if we are currently in the state of creating a group item * class. * * @return true if we are currently in the state of creating a group item * class. */ public boolean isCreateGroupItem() { return _createGroupItem; } /** * Sets to true if we are currently generating a class to represent items in * a group. * * @param createGroupItem * true if we are currently generating a class to represent items * in a group. */ public void setCreateGroupItem(final boolean createGroupItem) { _createGroupItem = createGroupItem; } /** * Returns the parent of this FactoryState. The parent of a factory state is * the previous item of the list that contained all the created factory * states. * * @return the parent of this FactoryState. */ FactoryState getParent() { return _parent; } /** * Sets the parent of this FactoryState. * * @param parent * the parent FactoryState * @see #getParent */ public void setParent(final FactoryState parent) { _parent = parent; } } // -- FactoryState