/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package org.geotools.xml.impl;
import org.eclipse.xsd.XSDTypeDefinition;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class TypeWalker {
/**
* Cached type hieracty
*/
HashMap /*<XSDTypeDefinition,List>*/ cache = new HashMap();
/**
* Walks from the bottom of the type hierachy to the top.
*/
public void walk(XSDTypeDefinition base, Visitor visitor) {
List types = types(base);
for (int i = 0; i < types.size(); i++) {
XSDTypeDefinition type = (XSDTypeDefinition) types.get(i);
//do the visit, if visitor returns false, break out
if (!visitor.visit(type)) {
break;
}
}
}
/**
* Walks from the top of the type hierachy to the bottom.
*
*/
public void rwalk(XSDTypeDefinition base, Visitor visitor) {
List types = types(base);
for (int i = types.size() - 1; i > -1; i--) {
XSDTypeDefinition type = (XSDTypeDefinition) types.get(i);
//do the visit, if visitor returns false, break out
if (!visitor.visit(type)) {
break;
}
}
}
private List types(XSDTypeDefinition base) {
List types = (List) cache.get(base);
if (types == null) {
types = new ArrayList();
XSDTypeDefinition type = base;
while (type != null) {
types.add(type);
//get the next type
if (type.equals(type.getBaseType())) {
break;
}
type = type.getBaseType();
}
cache.put(base, types);
}
return types;
}
public static interface Visitor {
/**
* Supplies the current type to the visitor.
*
* @param type The current type.
*
* @return True to signal that the walk should continue, false to
* signal the walk should stop.
*/
boolean visit(XSDTypeDefinition type);
}
}