/*
* Copyright 2008 Lukas Lang
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.exolab.castor.builder.info.nature;
import java.util.List;
import org.castor.core.nature.BaseNature;
import org.castor.core.nature.PropertyHolder;
import org.exolab.castor.builder.info.GroupInfo;
import org.exolab.castor.builder.info.NodeType;
import org.exolab.castor.builder.types.XSType;
/**
* A XML specific view of a {@link PropertyHolder}, which can be a {@link ClassInfo} or a
* {@link FieldInfo}. Property based implementation.
*
* @author Lukas Lang
* @since 1.2.1
*/
public final class XMLInfoNature extends BaseNature {
/**
* Property namespace prefix.
*/
private static final String NAMESPACE_PREFIX = "namespaceprefix";
/**
* Property namespace URI.
*/
private static final String NAMESPACE_URI = "namespaceuri";
/**
* Property node name.
*/
private static final String NODE_NAME = "nodename";
/**
* Property node type.
*/
private static final String NODE_TYPE = "nodetype";
/**
* Property schema type.
*/
private static final String SCHEMA_TYPE = "schematype";
/**
* Indicates XML schema definition is global element or element with
* anonymous type.
*/
private static final String ELEMENT_DEFINITION = "elementdefinition";
/**
* A flag indicating if the object described by this XML info can appear
* more than once.
*/
private static final String MULTIVALUED = "multivalued";
/**
* Indicates the XML object must appear at least once.
*/
private static final String REQUIRED = "required";
/**
* Property substitution groups.
*/
private static final String SUBSTITUTION_GROUP = "substitutionGroup";
/**
* Property container.
*/
private static final String IS_CONTAINER = "isContainer";
/**
* Property group info.
*/
private static final String GROUP_INFO = "groupInfo";
/**
* Constructor taking a PropertyHolder.
*
* @param holder
* in focus.
*/
public XMLInfoNature(final PropertyHolder holder) {
super(holder);
}
/**
* Implementation returns the fully qualified class name.
*
* @return the Nature id.
* @see org.exolab.castor.builder.info.nature.Nature#getId()
*/
public String getId() {
return this.getClass().getName();
}
/**
* Returns the namespace prefix of the object described by this XMLInfo.
*
* @return the namespace prefix of the object described by this XMLInfo
*/
public String getNamespacePrefix() {
return (String) this.getProperty(NAMESPACE_PREFIX);
}
/**
* Returns the namespace URI of the object described by this XMLInfo.
*
* @return the namespace URI of the object described by this XMLInfo
*/
public String getNamespaceURI() {
return (String) this.getProperty(NAMESPACE_URI);
}
/**
* Returns the XML name for the object described by this XMLInfo.
*
* @return the XML name for the object described by this XMLInfo, or null if
* no name has been set
*/
public String getNodeName() {
return (String) this.getProperty(NODE_NAME);
}
/**
* Returns the node type for the object described by this XMLInfo.
* <code>XMLInfo.ELEMENT_TYPE</code> if property is not set.
*
* @return the node type for the object described by this XMLInfo
*/
public NodeType getNodeType() {
NodeType nodeType = (NodeType) this.getProperty(NODE_TYPE);
if (nodeType == null) {
return NodeType.ELEMENT;
}
return nodeType;
}
/**
* Returns the string name of the nodeType, either "attribute", "element" or
* "text".
*
* @return the name of the node-type of the object described by this
* XMLInfo.
*/
public String getNodeTypeName() {
NodeType nodeType = getNodeType();
switch (nodeType) {
case ATTRIBUTE:
return "attribute";
case ELEMENT:
return "element";
case TEXT:
return "text";
default:
return "unknown";
}
}
/**
* Returns the XML Schema type for the described object.
*
* @return the XML Schema type.
*/
public XSType getSchemaType() {
return (XSType) this.getProperty(SCHEMA_TYPE);
}
/**
* Returns true if XSD is global element or element with anonymous type or
* false if property is not set.
*
* @return true if xsd is element, false if not or null.
*/
public boolean isElementDefinition() {
return getBooleanPropertyDefaultFalse(ELEMENT_DEFINITION);
}
/**
* Returns whether or not the object described by this XMLInfo is
* multi-valued (appears more than once in the XML document). Returns false
* if the property was not set.
*
* @return true if this object can appear more than once, false if not or
* not set.
*/
public boolean isMultivalued() {
return getBooleanPropertyDefaultFalse(MULTIVALUED);
}
/**
* Return true if the XML object described by this XMLInfo must appear at
* least once in the XML document (or object model). Returns false if the
* property was not set.
*
* @return true if the XML object must appear at least once, false if not or
* not set.
*/
public boolean isRequired() {
return getBooleanPropertyDefaultFalse(REQUIRED);
}
/**
* Sets whether or not XSD is element or not.
*
* @param elementDef
* The flag indicating whether or not XSD is global element,
* element with anonymous type or not.
*/
public void setElementDefinition(final boolean elementDef) {
this.setProperty(ELEMENT_DEFINITION, new Boolean(elementDef));
}
/**
* Sets whether the XML object can appear more than once in the XML
* document.
*
* @param multivalued
* The boolean indicating whether or not the object can appear
* more than once.
*/
public void setMultivalued(final boolean multivalued) {
this.setProperty(MULTIVALUED, new Boolean(multivalued));
}
/**
* Sets the desired namespace prefix for this XMLInfo There is no guarantee
* that this prefix will be used.
*
* @param nsPrefix
* the desired namespace prefix
*/
public void setNamespacePrefix(final String nsPrefix) {
this.setProperty(NAMESPACE_PREFIX, nsPrefix);
}
/**
* Sets the Namespace URI for this XMLInfo.
*
* @param nsURI
* the Namespace URI for this XMLInfo
*/
public void setNamespaceURI(final String nsURI) {
this.setProperty(NAMESPACE_URI, nsURI);
}
/**
* Sets the XML name of the object described by this XMLInfo.
*
* @param name
* the XML node name of the described object.
*/
public void setNodeName(final String name) {
this.setProperty(NODE_NAME, name);
}
/**
* Sets the nodeType for this XMLInfo.
*
* @param nodeType
* the node type of the described object
*/
public void setNodeType(final NodeType nodeType) {
this.setProperty(NODE_TYPE, nodeType);
}
/**
* Sets whether or not the XML object must appear at least once.
*
* @param required
* the flag indicating whether or not this XML object is required
*/
public void setRequired(final boolean required) {
Boolean b = new Boolean(required);
this.setProperty(REQUIRED, b);
}
/**
* Sets the XML Schema type for this XMLInfo.
*
* @param xsType
* the XML Schema type
*/
public void setSchemaType(final XSType xsType) {
this.setProperty(SCHEMA_TYPE, xsType);
}
/**
* Returns the possible substitution groups.
*
* @return the possible substitution groups.
*/
@SuppressWarnings("unchecked")
public List<String> getSubstitutionGroups() {
return getPropertyAsList(SUBSTITUTION_GROUP);
}
/**
* Sets the possible substitution groups.
*
* @param substitutionGroups
* Possible substitution groups.
*/
public void setSubstitutionGroups(final List<String> substitutionGroups) {
this.setProperty(SUBSTITUTION_GROUP, substitutionGroups);
}
/**
* Returns true if this ClassInfo describes a container class. A container
* class is a class which should not be marshalled as XML, but whose members
* should be.
*
* @return true if this ClassInfo describes a container class.
*/
public boolean isContainer() {
return this.getBooleanPropertyDefaultFalse(IS_CONTAINER);
}
/**
* Sets whether or not this ClassInfo describes a container class. A
* container class is a class which should not be marshalled as XML, but
* whose members should be. By default this is false.
*
* @param isContainer the boolean value when true indicates this class
* should be a container class.
*/
public void setContainer(final boolean isContainer) {
this.setProperty(IS_CONTAINER, new Boolean(isContainer));
}
/**
* Returns the {@link GroupInfo} for this XML nature.
*
* @return the {@link GroupInfo} instance.
*/
public GroupInfo getGroupInfo() {
return (GroupInfo) this.getProperty(GROUP_INFO);
}
/**
* Sets the {@link GroupInfo} for this XML nature.
*
* @param groupInfo the {@link GroupInfo} instance.
*/
public void setGroupInfo(final GroupInfo groupInfo) {
this.setProperty(GROUP_INFO, groupInfo);
}
/**
* Returns true if the compositor of this GroupInfo is a choice.
*
* @return true if the compositor of this GroupInfo is a choice
*/
public boolean isChoice() {
return getGroupInfo().isChoice();
}
/**
* Returns true if the compositor of this GroupInfo is a sequence.
*
* @return true if the compositor of this GroupInfo is a sequence
*/
public boolean isSequence() {
return getGroupInfo().isSequence();
}
}