blob: 7436c29474a9ddf12427486788042fa2f77ded8e [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// mmacivor - June 05/2008 - 1.0 - Initial implementation
package org.eclipse.persistence.jaxb.compiler;
import jakarta.xml.bind.annotation.XmlElementDecl;
import javax.xml.namespace.QName;
import org.eclipse.persistence.jaxb.TypeMappingInfo;
import org.eclipse.persistence.jaxb.javamodel.JavaClass;
import java.util.List;
import java.util.ArrayList;
/**
* <p>An ElementDeclaration object is used to represent the information that is
* associated with a global element in XML.</p>
*
* <p>ElementDeclarations will be created for classes with an XMLRootElement annotation,
* for TypeMappingInfo objects which have an xml tag name specified.</p>
*/
public class ElementDeclaration {
private QName elementName;
private QName substitutionHead;
private String javaTypeName;
private JavaClass javaType;
private JavaClass adaptedJavaType;
private String adaptedJavaTypeName;
private List<ElementDeclaration> substitutableElements;
private boolean isXmlRootElement = false;
private boolean isList = false;
private Class javaTypeAdapterClass;
private Class scopeClass;
private String defaultValue;
private TypeMappingInfo typeMappingInfo;
private boolean xmlAttachmentRef;
private String xmlMimeType;
private boolean nillable;
/**
* Create a new ElementDeclaration. By default the scope of this ElementDeclaration
* will be XmlElementDecl.GLOBAL
*
* @param name The QName of this element
* @param javaType The JavaClass of this element
* @param javaTypeName The String name of the javaType
* @param isList A boolean representing if this corresponds to an xsd:list
*/
public ElementDeclaration(QName name, JavaClass javaType, String javaTypeName, boolean isList) {
this.elementName = name;
this.javaTypeName = javaTypeName;
this.javaType = javaType;
this.substitutableElements = new ArrayList<ElementDeclaration>();
this.isList = isList;
this.scopeClass = XmlElementDecl.GLOBAL.class;
}
/**
* Create a new ElementDeclaration and set the scope.
* @param name The QName of this element
* @param javaType The JavaClass of this element
* @param javaTypeName The String name of the javaType
* @param isList A boolean representing if this corresponds to an xsd:list
* @param scopeClass The class representing the scope of this element
*/
public ElementDeclaration(QName name, JavaClass javaType, String javaTypeName, boolean isList, Class scopeClass) {
this(name, javaType, javaTypeName, isList);
this.scopeClass = scopeClass;
}
/**
* Get the QName representing this element
* @return the QName associated with this element.
*/
public QName getElementName() {
return elementName;
}
/**
* Get the name of the java type associated with this global element.
* This may be set through the constructor or will be set when setJavaType(JavaClass) is called.
* @return the name of the java type that corresponds to this element
*/
public String getJavaTypeName() {
return javaTypeName;
}
/**
* The list of elements which can be substituted for this element (ie: has this element in their substitutionGroup)
* @return the list of element declarations which can be substituted for this element
*/
public List<ElementDeclaration> getSubstitutableElements() {
return substitutableElements;
}
/**
* Add an element to the list of elements which can be substituted for this element (ie: has this element in their substitutionGroup)
*/
public void addSubstitutableElement(ElementDeclaration element) {
if (element != this && element != null) {
QName elementName = element.getElementName();
for (ElementDeclaration substitutableElement : substitutableElements) {
if (substitutableElement.getElementName().equals(elementName)) {
return;
}
}
this.substitutableElements.add(element);
}
}
/**
* If this element has a substitutionGroup this will be set.
* @param rootElement the QName value of the substitutionGroup
*/
public void setSubstitutionHead(QName rootElement) {
this.substitutionHead = rootElement;
}
/**
* If this element has a substitutionGroup this will be set.
* @return the value of the substitutionGroup
*/
public QName getSubstitutionHead() {
return substitutionHead;
}
/**
* Track if this element had an @XmlRootElement annotation
* @return if the element has an @XmlRootElement
*/
public boolean isXmlRootElement() {
return this.isXmlRootElement;
}
/**
* Mark if this element had an @XmlRootElement annotation
* @param isXmlRoot if the element has an @XmlRootElement
*/
public void setIsXmlRootElement(boolean isXmlRoot) {
this.isXmlRootElement = isXmlRoot;
}
/**
* Return if the global element will be marked as nillable
*/
public boolean isNillable() {
return nillable;
}
/**
* Set if the global element should be marked as nillable
*/
public void setNillable(boolean nillable) {
this.nillable = nillable;
}
/**
* The javaType associated with this element. Maybe set by the constructor
* or by setJavaType.
* @return the javaType associated with this element.
*/
public JavaClass getJavaType() {
return this.javaType;
}
/**
* Set the javaType associated with this element.
* This will also set the java type name associated with this element to type.getQualifiedName()
* @param type the javaType associated with this element.
*/
public void setJavaType(JavaClass type) {
this.javaType = type;
this.javaTypeName = type.getQualifiedName();
}
/**
* Return if this element is a list
* @return isList true if the element is a list
*/
public boolean isList() {
return isList;
}
/**
* Mark if this element is a list
* @param isList true if the element is a list
*/
public void setList(boolean isList) {
this.isList = isList;
}
/**
* Get the java type adapter class associated with the element
* @return the java type adapater class associated with this element. May return null.
*/
public Class getJavaTypeAdapterClass() {
return javaTypeAdapterClass;
}
/**
* Set the java type adapter class associated with this element if applicable.
* @param javaTypeAdapterClass Class of the java type adapter associated with this element.
*/
public void setJavaTypeAdapterClass(Class javaTypeAdapterClass) {
this.javaTypeAdapterClass = javaTypeAdapterClass;
}
/**
* Get the adapted java type.
* Only set when an XmlJavaTypeAdapter is present.
* @return the JavaClass of the adapted java type. May return null.
*/
public JavaClass getAdaptedJavaType() {
return adaptedJavaType;
}
/**
* Set the adapted java type if there is an XmlJavaTypeAdapter associated with this element
* This will also set the adaptedJavaTypeName (getAdaptedJavaTypeName)
* @param adaptedJavaType set the JavaClass representing the adapted Java type
*/
public void setAdaptedJavaType(JavaClass adaptedJavaType) {
this.adaptedJavaType = adaptedJavaType;
this.adaptedJavaTypeName = adaptedJavaType.getQualifiedName();
}
/**
* Get the adapted java type name.
* Only set when an XmlJavaTypeAdapter is present.
* Will be set to adaptedJavaType.getQualifiedName when setAdaptedJavaType is called
* @return the name of the class of the adapted java type. May return null.
*/
public String getAdaptedJavaTypeName() {
return adaptedJavaTypeName;
}
/**
* Get the scope class associated with this element.
* By default the scope of this ElementDeclaration
* will be XmlElementDecl.GLOBAL
* @return the scope class associated with this element
*/
public Class getScopeClass() {
return scopeClass;
}
/**
* Set the scope class associated with this element.
* Default setting is XmlElementDecl.GLOBAL
* @param scopeClass associated with this element.
*/
public void setScopeClass(Class scopeClass) {
this.scopeClass = scopeClass;
}
/**
* This will be set if XmlElementDecl has a defaultValue specified
* @return the default value associated with this element. May return null.
*/
public String getDefaultValue() {
return this.defaultValue;
}
/**
* Set the default value associated with this element.
* @param value the default value that corresponds to this element.
*/
public void setDefaultValue(String value) {
this.defaultValue = value;
}
/**
* Get the TypeMappingInfo object if this ElementDeclaration was created from a TypeMappingInfo
* @return the corresponding TypeMappingInfo. May return null.
*/
public TypeMappingInfo getTypeMappingInfo() {
return this.typeMappingInfo;
}
/**
* Set the TypeMappingInfo object if this ElementDeclaration was created from a TypeMappingInfo
* @param info The TypeMappingInfo object used to create this ElementDeclaration
*/
public void setTypeMappingInfo(TypeMappingInfo info) {
this.typeMappingInfo = info;
}
/**
* Return the mimeType specified on this element.
* @return the mimeType specified on this element. May return null.
*/
public String getXmlMimeType() {
return xmlMimeType;
}
/**
* Set of this element has an XmlMimeType annotation
* @param xmlMimeType set the name of the mime type if specified for this element
*/
public void setXmlMimeType(String xmlMimeType) {
this.xmlMimeType = xmlMimeType;
}
/**
* Return if this element is associated with an XmlAttachmentRef annotation
* @return if this element is associated with an XmlAttachmentRef annotation
*/
public boolean isXmlAttachmentRef() {
return xmlAttachmentRef;
}
/**
* Set if there is an XmlAttachmentRef annotations associated with this element.
* @param xmlAttachmentRef true if there is an XmlAttachmentRef annotation
*/
public void setXmlAttachmentRef(boolean xmlAttachmentRef) {
this.xmlAttachmentRef = xmlAttachmentRef;
}
}