/** * Resolve dependencies between model items * * @param query support for querying other items in model */ private void resolveDependencies(ModelQuery query, NamespaceDAO namespaceDAO) { NamespacePrefixResolver prefixResolver = createLocalPrefixResolver(model, namespaceDAO); for (DataTypeDefinition def : dataTypes.values()) { ((M2DataTypeDefinition) def).resolveDependencies(query); } for (ClassDefinition def : classes.values()) { ((M2ClassDefinition) def).resolveDependencies(query, prefixResolver, constraints); } }
/** * Resolve class feature inheritence * * @param query support for querying other items in model */ private void resolveInheritance( ModelQuery query, NamespacePrefixResolver prefixResolver, Map<QName, ConstraintDefinition> modelConstraints) { // Calculate order of class processing (root to leaf) Map<Integer, List<ClassDefinition>> order = new TreeMap<Integer, List<ClassDefinition>>(); for (ClassDefinition def : classes.values()) { // Calculate class depth in hierarchy int depth = 0; QName parentName = def.getParentName(); while (parentName != null) { ClassDefinition parentClass = getClass(parentName); if (parentClass == null) { break; } depth = depth + 1; parentName = parentClass.getParentName(); } // Map class to depth List<ClassDefinition> classes = order.get(depth); if (classes == null) { classes = new ArrayList<ClassDefinition>(); order.put(depth, classes); } classes.add(def); if (logger.isTraceEnabled()) { logger.trace("Resolving inheritance: class " + def.getName() + " found at depth " + depth); } } // Resolve inheritance of each class for (int depth = 0; depth < order.size(); depth++) { for (ClassDefinition def : order.get(depth)) { ((M2ClassDefinition) def).resolveInheritance(query, prefixResolver, modelConstraints); } } }