/* * citygml4j - The Open Source Java API for CityGML * https://github.com/citygml4j * * Copyright 2013-2017 Claus Nagel <claus.nagel@gmail.com> * * 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.citygml4j.xml.schema; import java.util.HashSet; import java.util.Set; import org.citygml4j.util.walker.Walker; import com.sun.xml.xsom.XSAnnotation; import com.sun.xml.xsom.XSAttGroupDecl; import com.sun.xml.xsom.XSAttributeDecl; import com.sun.xml.xsom.XSAttributeUse; import com.sun.xml.xsom.XSComplexType; import com.sun.xml.xsom.XSContentType; import com.sun.xml.xsom.XSElementDecl; import com.sun.xml.xsom.XSFacet; import com.sun.xml.xsom.XSIdentityConstraint; import com.sun.xml.xsom.XSModelGroup; import com.sun.xml.xsom.XSModelGroupDecl; import com.sun.xml.xsom.XSNotation; import com.sun.xml.xsom.XSParticle; import com.sun.xml.xsom.XSSchema; import com.sun.xml.xsom.XSSchemaSet; import com.sun.xml.xsom.XSSimpleType; import com.sun.xml.xsom.XSType; import com.sun.xml.xsom.XSWildcard; import com.sun.xml.xsom.XSXPath; import com.sun.xml.xsom.visitor.XSVisitor; public abstract class SchemaWalker implements XSVisitor, Walker { private final Set<Object> visited = new HashSet<Object>(); private volatile boolean shouldWalk = true; public void reset() { visited.clear(); shouldWalk = true; } public boolean shouldWalk() { return shouldWalk; } public void setShouldWalk(boolean shouldWalk) { this.shouldWalk = shouldWalk; } public boolean addToVisited(Object object) { return visited.add(object); } public boolean hasVisited(Object object) { return visited.contains(object); } public void visit(Schema schema) { visit(schema.schema); } public void visit(XSSchemaSet schemas) { for (XSSchema schema : schemas.getSchemas()) if (shouldWalk && visited.add(schema)) schema(schema); } public void visit(XSSchema schema) { if (shouldWalk && visited.add(schema)) schema(schema); } public void annotation(XSAnnotation ann) { } public void attGroupDecl(XSAttGroupDecl decl) { for (XSAttributeUse u : decl.getAttributeUses()) if (shouldWalk && visited.add(u)) attributeUse(u); } public void attributeDecl(XSAttributeDecl decl) { if (shouldWalk && visited.add(decl.getType())) simpleType(decl.getType()); } public void attributeUse(XSAttributeUse use) { if (shouldWalk && visited.add(use.getDecl())) attributeDecl(use.getDecl()); } public void complexType(XSComplexType type) { if (shouldWalk && visited.add(type.getContentType())) { type.getContentType().visit(this); for (XSAttributeUse u : type.getAttributeUses()) if (shouldWalk && visited.add(u)) attributeUse(u); } } public void schema(XSSchema schema) { for (XSElementDecl e : schema.getElementDecls().values()) if (shouldWalk && visited.add(e)) elementDecl(e); for (XSAttributeDecl a : schema.getAttributeDecls().values()) if (shouldWalk && visited.add(a)) attributeDecl(a); for (XSAttGroupDecl a : schema.getAttGroupDecls().values()) if (shouldWalk && visited.add(a)) attGroupDecl(a); for (XSModelGroupDecl m : schema.getModelGroupDecls().values()) if (shouldWalk && visited.add(m)) modelGroupDecl(m); for (XSType t : schema.getTypes().values()) if (shouldWalk && visited.add(t)) t.visit(this); for (XSNotation n : schema.getNotations().values()) if (shouldWalk && visited.add(n)) notation(n); } public void facet(XSFacet facet) { } public void notation(XSNotation notation) { } public void identityConstraint(XSIdentityConstraint decl) { } public void xpath(XSXPath xp) { } public void wildcard(XSWildcard wc) { } public void modelGroupDecl(XSModelGroupDecl decl) { if (shouldWalk && visited.add(decl.getModelGroup())) modelGroup(decl.getModelGroup()); } public void modelGroup(XSModelGroup group) { for (XSParticle p : group.getChildren()) if (shouldWalk && visited.add(p)) particle(p); } public void elementDecl(XSElementDecl decl) { if (shouldWalk && visited.add(decl.getType())) decl.getType().visit(this); } public void simpleType(XSSimpleType simpleType) { if (shouldWalk && visited.add(simpleType.getBaseType())) simpleType.getBaseType().visit(this); } public void particle(XSParticle particle) { if (shouldWalk && visited.add(particle.getTerm())) particle.getTerm().visit(this); } public void empty(XSContentType empty) { } }