/*
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.xml.internal.xsom.impl.util;
import com.sun.xml.internal.xsom.XSAnnotation;
import com.sun.xml.internal.xsom.XSAttGroupDecl;
import com.sun.xml.internal.xsom.XSAttributeDecl;
import com.sun.xml.internal.xsom.XSAttributeUse;
import com.sun.xml.internal.xsom.XSComplexType;
import com.sun.xml.internal.xsom.XSContentType;
import com.sun.xml.internal.xsom.XSElementDecl;
import com.sun.xml.internal.xsom.XSFacet;
import com.sun.xml.internal.xsom.XSIdentityConstraint;
import com.sun.xml.internal.xsom.XSListSimpleType;
import com.sun.xml.internal.xsom.XSModelGroup;
import com.sun.xml.internal.xsom.XSModelGroupDecl;
import com.sun.xml.internal.xsom.XSNotation;
import com.sun.xml.internal.xsom.XSParticle;
import com.sun.xml.internal.xsom.XSRestrictionSimpleType;
import com.sun.xml.internal.xsom.XSSchema;
import com.sun.xml.internal.xsom.XSSchemaSet;
import com.sun.xml.internal.xsom.XSSimpleType;
import com.sun.xml.internal.xsom.XSType;
import com.sun.xml.internal.xsom.XSUnionSimpleType;
import com.sun.xml.internal.xsom.XSWildcard;
import com.sun.xml.internal.xsom.XSXPath;
import com.sun.xml.internal.xsom.impl.Const;
import com.sun.xml.internal.xsom.visitor.XSSimpleTypeVisitor;
import com.sun.xml.internal.xsom.visitor.XSTermVisitor;
import com.sun.xml.internal.xsom.visitor.XSVisitor;
import org.xml.sax.Locator;
import javax.swing.Box;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.math.BigInteger;
import java.text.MessageFormat;
import java.util.Iterator;
Generates approximated tree model for XML from a schema component. This is
not intended to be a fully-fledged round-trippable tree model.
Usage of this class
- Create a new instance.
- Call
visit(XSSchemaSet)
function on your schema set.
- Retrieve the model using
getModel()
.
Every node in the resulting tree is a SchemaTreeNode
, and the model itself is SchemaTreeModel
. You can use SchemaTreeCellRenderer
as a cell renderer for your tree. Author: Kirill Grouchnikov (kirillcool@yahoo.com)
/**
* Generates approximated tree model for XML from a schema component. This is
* not intended to be a fully-fledged round-trippable tree model.
*
* <h2>Usage of this class</h2>
*
* <ol> <li>Create a new instance.</li> <li>Call {@link #visit(XSSchemaSet)}
* function on your schema set.</li>
* <li>Retrieve the model using {@link #getModel()}. </li></ol>
*
* Every node in the resulting tree is a {@link SchemaTreeTraverser.SchemaTreeNode},
* and the model itself is {@link SchemaTreeTraverser.SchemaTreeModel}. You can
* use {@link SchemaTreeTraverser.SchemaTreeCellRenderer} as a cell renderer for
* your tree.
*
* @author Kirill Grouchnikov (kirillcool@yahoo.com)
*/
public class SchemaTreeTraverser implements XSVisitor, XSSimpleTypeVisitor {
The associated tree model.
/**
* The associated tree model.
*/
private SchemaTreeModel model;
The current node in the tree.
/**
* The current node in the tree.
*/
private SchemaTreeNode currNode;
Tree model for schema hierarchy tree.
Author: Kirill Grouchnikov
/**
* Tree model for schema hierarchy tree.
*
* @author Kirill Grouchnikov
*/
public static final class SchemaTreeModel extends DefaultTreeModel {
A simple constructor. Is made private to allow creating the root node
first.
Params: - root – The root node.
/**
* A simple constructor. Is made private to allow creating the root node
* first.
*
* @param root The root node.
*/
private SchemaTreeModel(SchemaRootNode root) {
super(root);
}
A factory method for creating a new empty tree.
Returns: New empty tree model.
/**
* A factory method for creating a new empty tree.
*
* @return New empty tree model.
*/
public static SchemaTreeModel getInstance() {
SchemaRootNode root = new SchemaRootNode();
return new SchemaTreeModel(root);
}
public void addSchemaNode(SchemaTreeNode node) {
((SchemaRootNode) this.root).add(node);
}
}
The node of the schema hierarchy tree.
Author: Kirill Grouchnikov
/**
* The node of the schema hierarchy tree.
*
* @author Kirill Grouchnikov
*/
public static class SchemaTreeNode extends DefaultMutableTreeNode {
File name of the corresponding schema artifact.
/**
* File name of the corresponding schema artifact.
*/
private String fileName;
Line number of the corresponding schema artifact.
/**
* Line number of the corresponding schema artifact.
*/
private int lineNumber;
The caption of the corresponding artifact.
/**
* The caption of the corresponding artifact.
*/
private String artifactName;
Simple constructor.
Params: - artifactName – Artifact name.
- locator – Artifact locator.
/**
* Simple constructor.
*
* @param artifactName Artifact name.
* @param locator Artifact locator.
*/
public SchemaTreeNode(String artifactName, Locator locator) {
this.artifactName = artifactName;
if (locator == null) {
this.fileName = null;
}
else {
String filename = locator.getSystemId();
filename = filename.replaceAll("\u002520", " ");
// strip leading protocol
if (filename.startsWith("file:/")) {
filename = filename.substring(6);
}
this.fileName = filename;
this.lineNumber = locator.getLineNumber() - 1;
}
}
Returns the caption for this
node.
Returns: The caption for this
node.
/**
* Returns the caption for <code>this</code> node.
*
* @return The caption for <code>this</code> node.
*/
public String getCaption() {
return this.artifactName;
}
Returns: Returns the file name of the corresponding schema artifact.
/**
* @return Returns the file name of the corresponding schema artifact.
*/
public String getFileName() {
return fileName;
}
Params: - fileName – The file name of the corresponding schema artifact to
set.
/**
* @param fileName The file name of the corresponding schema artifact to
* set.
*/
public void setFileName(String fileName) {
this.fileName = fileName;
}
Returns: Returns the line number of the corresponding schema
artifact.
/**
* @return Returns the line number of the corresponding schema
* artifact.
*/
public int getLineNumber() {
return lineNumber;
}
Params: - lineNumber – The line number of the corresponding schema
artifact to set.
/**
* @param lineNumber The line number of the corresponding schema
* artifact to set.
*/
public void setLineNumber(int lineNumber) {
this.lineNumber = lineNumber;
}
}
The root node of the schema hierarchy tree.
Author: Kirill Grouchnikov
/**
* The root node of the schema hierarchy tree.
*
* @author Kirill Grouchnikov
*/
public static class SchemaRootNode extends SchemaTreeNode {
A simple constructor.
/**
* A simple constructor.
*/
public SchemaRootNode() {
super("Schema set", null);
}
}
Sample cell renderer for the schema tree.
Author: Kirill Grouchnikov
/**
* Sample cell renderer for the schema tree.
*
* @author Kirill Grouchnikov
*/
public static class SchemaTreeCellRenderer extends JPanel implements
TreeCellRenderer {
The icon label.
/**
* The icon label.
*/
protected final JLabel iconLabel;
The text label
/**
* The text label
*/
protected final JLabel nameLabel;
The selection indicator.
/**
* The selection indicator.
*/
private boolean isSelected;
Background color for selected cells (light brown).
/**
* Background color for selected cells (light brown).
*/
public final Color selectedBackground = new Color(255, 244, 232);
Foreground color for selected cells, both text and border (dark
brown).
/**
* Foreground color for selected cells, both text and border (dark
* brown).
*/
public final Color selectedForeground = new Color(64, 32, 0);
Default font for the text label.
/**
* Default font for the text label.
*/
public final Font nameFont = new Font("Arial", Font.BOLD, 12);
Simple constructor.
/**
* Simple constructor.
*/
public SchemaTreeCellRenderer() {
FlowLayout fl = new FlowLayout(FlowLayout.LEFT, 1, 1);
this.setLayout(fl);
this.iconLabel = new JLabel();
this.iconLabel.setOpaque(false);
this.iconLabel.setBorder(null);
this.add(this.iconLabel);
// add some space
this.add(Box.createHorizontalStrut(5));
this.nameLabel = new JLabel();
this.nameLabel.setOpaque(false);
this.nameLabel.setBorder(null);
this.nameLabel.setFont(nameFont);
this.add(this.nameLabel);
this.isSelected = false;
this.setOpaque(false);
this.setBorder(null);
}
/*
* (non-Javadoc)
*
* @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
*/
public final void paintComponent(Graphics g) {
int width = this.getWidth();
int height = this.getHeight();
if (this.isSelected) {
g.setColor(selectedBackground);
g.fillRect(0, 0, width - 1, height - 1);
g.setColor(selectedForeground);
g.drawRect(0, 0, width - 1, height - 1);
}
super.paintComponent(g);
}
Sets values for the icon and text of this
renderer.
Params: - icon – Icon to show.
- caption – Text to show.
- selected – Selection indicator. If
true
, the
renderer will be shown with different background and
border settings.
/**
* Sets values for the icon and text of <code>this</code> renderer.
*
* @param icon Icon to show.
* @param caption Text to show.
* @param selected Selection indicator. If <code>true</code>, the
* renderer will be shown with different background and
* border settings.
*/
protected final void setValues(Icon icon, String caption,
boolean selected) {
this.iconLabel.setIcon(icon);
this.nameLabel.setText(caption);
this.isSelected = selected;
if (selected) {
this.nameLabel.setForeground(selectedForeground);
}
else {
this.nameLabel.setForeground(Color.black);
}
}
/* (non-Javadoc)
* @see javax.swing.tree.TreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean)
*/
public final Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
if (value instanceof SchemaTreeNode) {
SchemaTreeNode stn = (SchemaTreeNode) value;
this.setValues(null, stn.getCaption(), selected);
return this;
}
throw new IllegalStateException("Unknown node");
}
}
Simple constructor.
/**
* Simple constructor.
*/
public SchemaTreeTraverser() {
this.model = SchemaTreeModel.getInstance();
this.currNode = (SchemaTreeNode) this.model.getRoot();
}
Retrieves the tree model of this
traverser.
Returns: Tree model of this
traverser.
/**
* Retrieves the tree model of <code>this</code> traverser.
*
* @return Tree model of <code>this</code> traverser.
*/
public SchemaTreeModel getModel() {
return model;
}
Visits the root schema set.
Params: - s – Root schema set.
/**
* Visits the root schema set.
*
* @param s Root schema set.
*/
public void visit(XSSchemaSet s) {
for (XSSchema schema : s.getSchemas()) {
schema(schema);
}
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSVisitor#schema(com.sun.xml.internal.xsom.XSSchema)
*/
public void schema(XSSchema s) {
// QUICK HACK: don't print the built-in components
if (s.getTargetNamespace().equals(Const.schemaNamespace)) {
return;
}
SchemaTreeNode newNode = new SchemaTreeNode("Schema "
+ s.getLocator().getSystemId(), s.getLocator());
this.currNode = newNode;
this.model.addSchemaNode(newNode);
for (XSAttGroupDecl groupDecl : s.getAttGroupDecls().values()) {
attGroupDecl(groupDecl);
}
for (XSAttributeDecl attrDecl : s.getAttributeDecls().values()) {
attributeDecl(attrDecl);
}
for (XSComplexType complexType : s.getComplexTypes().values()) {
complexType(complexType);
}
for (XSElementDecl elementDecl : s.getElementDecls().values()) {
elementDecl(elementDecl);
}
for (XSModelGroupDecl modelGroupDecl : s.getModelGroupDecls().values()) {
modelGroupDecl(modelGroupDecl);
}
for (XSSimpleType simpleType : s.getSimpleTypes().values()) {
simpleType(simpleType);
}
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSVisitor#attGroupDecl(com.sun.xml.internal.xsom.XSAttGroupDecl)
*/
public void attGroupDecl(XSAttGroupDecl decl) {
SchemaTreeNode newNode = new SchemaTreeNode("Attribute group \""
+ decl.getName() + "\"", decl.getLocator());
this.currNode.add(newNode);
this.currNode = newNode;
Iterator itr;
itr = decl.iterateAttGroups();
while (itr.hasNext()) {
dumpRef((XSAttGroupDecl) itr.next());
}
itr = decl.iterateDeclaredAttributeUses();
while (itr.hasNext()) {
attributeUse((XSAttributeUse) itr.next());
}
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
Creates node of attribute group decalration reference.
Params: - decl – Attribute group decalration reference.
/**
* Creates node of attribute group decalration reference.
*
* @param decl Attribute group decalration reference.
*/
public void dumpRef(XSAttGroupDecl decl) {
SchemaTreeNode newNode = new SchemaTreeNode("Attribute group ref \"{"
+ decl.getTargetNamespace() + "}" + decl.getName() + "\"", decl
.getLocator());
this.currNode.add(newNode);
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSVisitor#attributeUse(com.sun.xml.internal.xsom.XSAttributeUse)
*/
public void attributeUse(XSAttributeUse use) {
XSAttributeDecl decl = use.getDecl();
String additionalAtts = "";
if (use.isRequired()) {
additionalAtts += " use=\"required\"";
}
if (use.getFixedValue() != null
&& use.getDecl().getFixedValue() == null) {
additionalAtts += " fixed=\"" + use.getFixedValue() + "\"";
}
if (use.getDefaultValue() != null
&& use.getDecl().getDefaultValue() == null) {
additionalAtts += " default=\"" + use.getDefaultValue() + "\"";
}
if (decl.isLocal()) {
// this is anonymous attribute use
dump(decl, additionalAtts);
}
else {
// reference to a global one
String str = MessageFormat.format(
"Attribute ref \"'{'{0}'}'{1}{2}\"", new Object[]{
decl.getTargetNamespace(), decl.getName(),
additionalAtts});
SchemaTreeNode newNode = new SchemaTreeNode(str, decl.getLocator());
this.currNode.add(newNode);
}
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSVisitor#attributeDecl(com.sun.xml.internal.xsom.XSAttributeDecl)
*/
public void attributeDecl(XSAttributeDecl decl) {
dump(decl, "");
}
Creates node for attribute declaration with additional attributes.
Params: - decl – Attribute declaration.
- additionalAtts – Additional attributes.
/**
* Creates node for attribute declaration with additional attributes.
*
* @param decl Attribute declaration.
* @param additionalAtts Additional attributes.
*/
private void dump(XSAttributeDecl decl, String additionalAtts) {
XSSimpleType type = decl.getType();
String str = MessageFormat.format("Attribute \"{0}\"{1}{2}{3}{4}",
new Object[]{
decl.getName(),
additionalAtts,
type.isLocal() ? "" : MessageFormat.format(
" type=\"'{'{0}'}'{1}\"", new Object[]{
type.getTargetNamespace(),
type.getName()}),
decl.getFixedValue() == null ? "" : " fixed=\""
+ decl.getFixedValue() + "\"",
decl.getDefaultValue() == null ? "" : " default=\""
+ decl.getDefaultValue() + "\""});
SchemaTreeNode newNode = new SchemaTreeNode(str, decl.getLocator());
this.currNode.add(newNode);
this.currNode = newNode;
if (type.isLocal()) {
simpleType(type);
}
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSContentTypeVisitor#simpleType(com.sun.xml.internal.xsom.XSSimpleType)
*/
public void simpleType(XSSimpleType type) {
String str = MessageFormat.format("Simple type {0}",
new Object[]{type.isLocal() ? "" : " name=\""
+ type.getName() + "\""});
SchemaTreeNode newNode = new SchemaTreeNode(str, type.getLocator());
this.currNode.add(newNode);
this.currNode = newNode;
type.visit((XSSimpleTypeVisitor) this);
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSSimpleTypeVisitor#listSimpleType(com.sun.xml.internal.xsom.XSListSimpleType)
*/
public void listSimpleType(XSListSimpleType type) {
XSSimpleType itemType = type.getItemType();
if (itemType.isLocal()) {
SchemaTreeNode newNode = new SchemaTreeNode("List", type
.getLocator());
this.currNode.add(newNode);
this.currNode = newNode;
simpleType(itemType);
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
else {
// global type
String str = MessageFormat.format("List itemType=\"'{'{0}'}'{1}\"",
new Object[]{itemType.getTargetNamespace(),
itemType.getName()});
SchemaTreeNode newNode = new SchemaTreeNode(str, itemType
.getLocator());
this.currNode.add(newNode);
}
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSSimpleTypeVisitor#unionSimpleType(com.sun.xml.internal.xsom.XSUnionSimpleType)
*/
public void unionSimpleType(XSUnionSimpleType type) {
final int len = type.getMemberSize();
StringBuffer ref = new StringBuffer();
for (int i = 0; i < len; i++) {
XSSimpleType member = type.getMember(i);
if (member.isGlobal()) {
ref.append(MessageFormat.format(" '{'{0}'}'{1}",
new Object[]{
member.getTargetNamespace(),
member.getName()}));
}
}
String name = (ref.length() == 0) ? "Union" : ("Union memberTypes=\""
+ ref + "\"");
SchemaTreeNode newNode = new SchemaTreeNode(name, type.getLocator());
this.currNode.add(newNode);
this.currNode = newNode;
for (int i = 0; i < len; i++) {
XSSimpleType member = type.getMember(i);
if (member.isLocal()) {
simpleType(member);
}
}
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSSimpleTypeVisitor#restrictionSimpleType(com.sun.xml.internal.xsom.XSRestrictionSimpleType)
*/
public void restrictionSimpleType(XSRestrictionSimpleType type) {
if (type.getBaseType() == null) {
// don't print anySimpleType
if (!type.getName().equals("anySimpleType")) {
throw new InternalError();
}
if (!Const.schemaNamespace.equals(type.getTargetNamespace())) {
throw new InternalError();
}
return;
}
XSSimpleType baseType = type.getSimpleBaseType();
String str = MessageFormat.format("Restriction {0}",
new Object[]{baseType.isLocal() ? "" : " base=\"{"
+ baseType.getTargetNamespace() + "}"
+ baseType.getName() + "\""});
SchemaTreeNode newNode = new SchemaTreeNode(str, baseType.getLocator());
this.currNode.add(newNode);
this.currNode = newNode;
if (baseType.isLocal()) {
simpleType(baseType);
}
Iterator itr = type.iterateDeclaredFacets();
while (itr.hasNext()) {
facet((XSFacet) itr.next());
}
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSVisitor#facet(com.sun.xml.internal.xsom.XSFacet)
*/
public void facet(XSFacet facet) {
SchemaTreeNode newNode = new SchemaTreeNode(MessageFormat.format(
"{0} value=\"{1}\"", new Object[]{facet.getName(),
facet.getValue(), }),
facet.getLocator());
this.currNode.add(newNode);
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSVisitor#notation(com.sun.xml.internal.xsom.XSNotation)
*/
public void notation(XSNotation notation) {
SchemaTreeNode newNode = new SchemaTreeNode(MessageFormat.format(
"Notation name='\"0}\" public =\"{1}\" system=\"{2}\"",
new Object[]{notation.getName(), notation.getPublicId(),
notation.getSystemId()}), notation.getLocator());
this.currNode.add(newNode);
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSVisitor#complexType(com.sun.xml.internal.xsom.XSComplexType)
*/
public void complexType(XSComplexType type) {
SchemaTreeNode newNode = new SchemaTreeNode(MessageFormat.format(
"ComplexType {0}", new Object[]{type.isLocal() ? ""
: " name=\"" + type.getName() + "\""}), type
.getLocator());
this.currNode.add(newNode);
this.currNode = newNode;
// TODO: wildcard
if (type.getContentType().asSimpleType() != null) {
// simple content
SchemaTreeNode newNode2 = new SchemaTreeNode("Simple content", type
.getContentType().getLocator());
this.currNode.add(newNode2);
this.currNode = newNode2;
XSType baseType = type.getBaseType();
if (type.getDerivationMethod() == XSType.RESTRICTION) {
// restriction
String str = MessageFormat.format(
"Restriction base=\"<{0}>{1}\"", new Object[]{
baseType.getTargetNamespace(),
baseType.getName()});
SchemaTreeNode newNode3 = new SchemaTreeNode(str, baseType
.getLocator());
this.currNode.add(newNode3);
this.currNode = newNode3;
dumpComplexTypeAttribute(type);
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
else {
// extension
String str = MessageFormat.format(
"Extension base=\"<{0}>{1}\"", new Object[]{
baseType.getTargetNamespace(),
baseType.getName()});
SchemaTreeNode newNode3 = new SchemaTreeNode(str, baseType
.getLocator());
this.currNode.add(newNode3);
this.currNode = newNode3;
// check if have redefine tag
if ((type.getTargetNamespace().compareTo(
baseType.getTargetNamespace()) ==
0)
&& (type.getName().compareTo(baseType.getName()) == 0)) {
SchemaTreeNode newNodeRedefine = new SchemaTreeNode(
"redefine", type
.getLocator());
this.currNode.add(newNodeRedefine);
this.currNode = newNodeRedefine;
baseType.visit(this);
this.currNode =
(SchemaTreeNode) newNodeRedefine.getParent();
}
dumpComplexTypeAttribute(type);
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
else {
// complex content
SchemaTreeNode newNode2 = new SchemaTreeNode("Complex content",
type.getContentType().getLocator());
this.currNode.add(newNode2);
this.currNode = newNode2;
XSComplexType baseType = type.getBaseType().asComplexType();
if (type.getDerivationMethod() == XSType.RESTRICTION) {
// restriction
String str = MessageFormat.format(
"Restriction base=\"<{0}>{1}\"", new Object[]{
baseType.getTargetNamespace(),
baseType.getName()});
SchemaTreeNode newNode3 = new SchemaTreeNode(str,
baseType.getLocator());
this.currNode.add(newNode3);
this.currNode = newNode3;
type.getContentType().visit(this);
dumpComplexTypeAttribute(type);
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
else {
// extension
String str = MessageFormat.format(
"Extension base=\"'{'{0}'}'{1}\"", new Object[]{
baseType.getTargetNamespace(),
baseType.getName()});
SchemaTreeNode newNode3 = new SchemaTreeNode(str,
baseType.getLocator());
this.currNode.add(newNode3);
this.currNode = newNode3;
// check if have redefine tag
if ((type.getTargetNamespace().compareTo(
baseType.getTargetNamespace()) ==
0)
&& (type.getName().compareTo(baseType.getName()) == 0)) {
SchemaTreeNode newNodeRedefine = new SchemaTreeNode(
"redefine", type
.getLocator());
this.currNode.add(newNodeRedefine);
this.currNode = newNodeRedefine;
baseType.visit(this);
this.currNode =
(SchemaTreeNode) newNodeRedefine.getParent();
}
type.getExplicitContent().visit(this);
dumpComplexTypeAttribute(type);
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
Creates node for complex type.
Params: - type – Complex type.
/**
* Creates node for complex type.
*
* @param type Complex type.
*/
private void dumpComplexTypeAttribute(XSComplexType type) {
Iterator itr;
itr = type.iterateAttGroups();
while (itr.hasNext()) {
dumpRef((XSAttGroupDecl) itr.next());
}
itr = type.iterateDeclaredAttributeUses();
while (itr.hasNext()) {
attributeUse((XSAttributeUse) itr.next());
}
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSTermVisitor#elementDecl(com.sun.xml.internal.xsom.XSElementDecl)
*/
public void elementDecl(XSElementDecl decl) {
elementDecl(decl, "");
}
Creates node for element declaration with additional attributes.
Params: - decl – Element declaration.
- extraAtts – Additional attributes.
/**
* Creates node for element declaration with additional attributes.
*
* @param decl Element declaration.
* @param extraAtts Additional attributes.
*/
private void elementDecl(XSElementDecl decl, String extraAtts) {
XSType type = decl.getType();
// TODO: various other attributes
String str = MessageFormat.format("Element name=\"{0}\"{1}{2}",
new Object[]{
decl.getName(),
type.isLocal() ? "" : " type=\"{"
+ type.getTargetNamespace() + "}"
+ type.getName() + "\"", extraAtts});
SchemaTreeNode newNode = new SchemaTreeNode(str, decl.getLocator());
this.currNode.add(newNode);
this.currNode = newNode;
if (type.isLocal()) {
if (type.isLocal()) {
type.visit(this);
}
}
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSTermVisitor#modelGroupDecl(com.sun.xml.internal.xsom.XSModelGroupDecl)
*/
public void modelGroupDecl(XSModelGroupDecl decl) {
SchemaTreeNode newNode = new SchemaTreeNode(MessageFormat.format(
"Group name=\"{0}\"", new Object[]{decl.getName()}),
decl.getLocator());
this.currNode.add(newNode);
this.currNode = newNode;
modelGroup(decl.getModelGroup());
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSTermVisitor#modelGroup(com.sun.xml.internal.xsom.XSModelGroup)
*/
public void modelGroup(XSModelGroup group) {
modelGroup(group, "");
}
Creates node for model group with additional attributes.
Params: - group – Model group.
- extraAtts – Additional attributes.
/**
* Creates node for model group with additional attributes.
*
* @param group Model group.
* @param extraAtts Additional attributes.
*/
private void modelGroup(XSModelGroup group, String extraAtts) {
SchemaTreeNode newNode = new SchemaTreeNode(MessageFormat.format(
"{0}{1}", new Object[]{group.getCompositor(), extraAtts}),
group.getLocator());
this.currNode.add(newNode);
this.currNode = newNode;
final int len = group.getSize();
for (int i = 0; i < len; i++) {
particle(group.getChild(i));
}
this.currNode = (SchemaTreeNode) this.currNode.getParent();
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSContentTypeVisitor#particle(com.sun.xml.internal.xsom.XSParticle)
*/
public void particle(XSParticle part) {
BigInteger i;
StringBuffer buf = new StringBuffer();
i = part.getMaxOccurs();
if (i.equals(BigInteger.valueOf(XSParticle.UNBOUNDED))) {
buf.append(" maxOccurs=\"unbounded\"");
}
else {
if (!i.equals(BigInteger.ONE)) {
buf.append(" maxOccurs=\"" + i + "\"");
}
}
i = part.getMinOccurs();
if (!i.equals(BigInteger.ONE)) {
buf.append(" minOccurs=\"" + i + "\"");
}
final String extraAtts = buf.toString();
part.getTerm().visit(new XSTermVisitor() {
public void elementDecl(XSElementDecl decl) {
if (decl.isLocal()) {
SchemaTreeTraverser.this.elementDecl(decl, extraAtts);
}
else {
// reference
SchemaTreeNode newNode = new SchemaTreeNode(MessageFormat
.format("Element ref=\"'{'{0}'}'{1}\"{2}",
new Object[]{decl.getTargetNamespace(),
decl.getName(), extraAtts}),
decl.getLocator());
currNode.add(newNode);
}
}
public void modelGroupDecl(XSModelGroupDecl decl) {
// reference
SchemaTreeNode newNode = new SchemaTreeNode(MessageFormat
.format("Group ref=\"'{'{0}'}'{1}\"{2}", new Object[]{
decl.getTargetNamespace(), decl.getName(),
extraAtts}), decl.getLocator());
currNode.add(newNode);
}
public void modelGroup(XSModelGroup group) {
SchemaTreeTraverser.this.modelGroup(group, extraAtts);
}
public void wildcard(XSWildcard wc) {
SchemaTreeTraverser.this.wildcard(wc, extraAtts);
}
});
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSTermVisitor#wildcard(com.sun.xml.internal.xsom.XSWildcard)
*/
public void wildcard(XSWildcard wc) {
wildcard(wc, "");
}
Creates node for wild card with additional attributes.
Params: - wc – Wild card.
- extraAtts – Additional attributes.
/**
* Creates node for wild card with additional attributes.
*
* @param wc Wild card.
* @param extraAtts Additional attributes.
*/
private void wildcard(XSWildcard wc, String extraAtts) {
// TODO
SchemaTreeNode newNode = new SchemaTreeNode(MessageFormat.format(
"Any ", new Object[]{extraAtts}), wc.getLocator());
currNode.add(newNode);
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSVisitor#annotation(com.sun.xml.internal.xsom.XSAnnotation)
*/
public void annotation(XSAnnotation ann) {
// TODO: it would be nice even if we just put <xs:documentation>
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSContentTypeVisitor#empty(com.sun.xml.internal.xsom.XSContentType)
*/
public void empty(XSContentType t) {
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSVisitor#identityConstraint(com.sun.xml.internal.xsom.XSIdentityConstraint)
*/
public void identityConstraint(XSIdentityConstraint ic) {
}
/* (non-Javadoc)
* @see com.sun.xml.internal.xsom.visitor.XSVisitor#xpath(com.sun.xml.internal.xsom.XSXPath)
*/
public void xpath(XSXPath xp) {
}
}