package de.lessvoid.xml.lwxs.elements;
import de.lessvoid.xml.lwxs.Schema;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collection;
public class Type {
@Nonnull
private final ArrayList < SubstitutionGroup > substitutionGroups = new ArrayList < SubstitutionGroup >();
@Nonnull
private final ArrayList < Element > elements = new ArrayList < Element >();
@Nonnull
private final String className;
@Nullable
private final String extendsName;
public Type(@Nonnull final String classNameParam, @Nullable final String extendsNameParam) {
className = classNameParam;
extendsName = extendsNameParam;
}
public void addElement(final Element child) {
elements.add(child);
}
public void addSubstitutionGroup(final SubstitutionGroup substitutionGroup) {
substitutionGroups.add(substitutionGroup);
}
@Nonnull
public XmlProcessorType createXmlProcessor(@Nonnull final Schema schema) throws Exception {
ArrayList < SubstitutionGroup > substitutionGroups = new ArrayList < SubstitutionGroup >();
ArrayList < Element > elements = new ArrayList < Element >();
Type typeParent = getTypeParent(schema);
if (typeParent != null) {
substitutionGroups.addAll(typeParent.getSubstituitionGroup());
elements.addAll(typeParent.getElements());
}
substitutionGroups.addAll(this.substitutionGroups);
elements.addAll(this.elements);
return schema.getInstance(className, elements, substitutionGroups);
}
@Nonnull
private Collection < ? extends Element > getElements() {
return elements;
}
@Nonnull
private Collection < ? extends SubstitutionGroup > getSubstituitionGroup() {
return substitutionGroups;
}
@Nonnull
public XmlProcessorType createXmlProcessorFromType(@Nonnull final Schema schema, @Nonnull final Type typeParent) throws Exception {
return schema.getInstance(typeParent.className, elements, substitutionGroups);
}
@Nullable
public Type getTypeParent(@Nonnull final Schema schema) throws Exception {
if (extendsName == null) {
return null;
}
if (schema.isTypeAvailable(extendsName)) {
return schema.getType(extendsName);
} else {
return null;
}
}
public void addChildren(
@Nonnull final Schema schema,
@Nonnull final XmlProcessorType processor,
@Nonnull final String tagName,
final String tagType,
@Nonnull final OccursEnum occurs) throws Exception {
childElement(schema, processor, tagName, occurs);
}
private void childElement(
@Nonnull final Schema schema,
@Nonnull final XmlProcessorType processor,
@Nonnull final String tagName,
@Nonnull final OccursEnum occurs) throws Exception {
XmlProcessorElement child = new XmlProcessorElement(
createXmlProcessor(schema),
tagName,
occurs);
processor.addElementProcessor(child);
}
@Nonnull
public String getClassName() {
return className;
}
}