| /* |
| * Copyright (c) 1998, 2020 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 |
| * @return |
| */ |
| public boolean isNillable() { |
| return nillable; |
| } |
| |
| /** |
| * Set if the global element should be marked as nillable |
| * @param 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; |
| } |
| |
| } |