static DDLTable[] parseDDL(DatabaseProvider provider, NameConverters nameConverters, Class<? extends RawEntity<?>>... classes) { final Map<Class<? extends RawEntity<?>>, Set<Class<? extends RawEntity<?>>>> deps = new HashMap<Class<? extends RawEntity<?>>, Set<Class<? extends RawEntity<?>>>>(); final Set<Class<? extends RawEntity<?>>> roots = new LinkedHashSet<Class<? extends RawEntity<?>>>(); for (Class<? extends RawEntity<?>> cls : classes) { parseDependencies(nameConverters.getFieldNameConverter(), deps, roots, cls); } ArrayList<DDLTable> parsedTables = new ArrayList<DDLTable>(); parseDDLRoots(provider, nameConverters, deps, roots, parsedTables); if (!deps.isEmpty()) { throw new RuntimeException("Circular dependency detected"); } return parsedTables.toArray(new DDLTable[parsedTables.size()]); }
static DDLTable[] parseDDL(DatabaseProvider provider, NameConverters nameConverters, Class<? extends RawEntity<?>>... classes) { final Map<Class<? extends RawEntity<?>>, Set<Class<? extends RawEntity<?>>>> deps = new HashMap<Class<? extends RawEntity<?>>, Set<Class<? extends RawEntity<?>>>>(); final Set<Class<? extends RawEntity<?>>> roots = new LinkedHashSet<Class<? extends RawEntity<?>>>(); for (Class<? extends RawEntity<?>> cls : classes) { parseDependencies(nameConverters.getFieldNameConverter(), deps, roots, cls); } ArrayList<DDLTable> parsedTables = new ArrayList<DDLTable>(); parseDDLRoots(provider, nameConverters, deps, roots, parsedTables); if (!deps.isEmpty()) { throw new RuntimeException("Circular dependency detected"); } return parsedTables.toArray(new DDLTable[parsedTables.size()]); }
private static void parseDependencies( final FieldNameConverter fieldConverter, final Map<Class<? extends RawEntity<?>>, Set<Class<? extends RawEntity<?>>>> deps, final Set<Class<? extends RawEntity<?>>> roots, Class<? extends RawEntity<?>> clazz) { if (deps.containsKey(clazz)) { return; } final Set<Class<? extends RawEntity<?>>> individualDeps = new LinkedHashSet<Class<? extends RawEntity<?>>>(); for (final Method method : clazz.getMethods()) { final Class<?> type = Common.getAttributeTypeFromMethod(method); validateManyToManyAnnotation(method); validateOneToOneAnnotation(method); validateOneToManyAnnotation(method); if (fieldConverter.getName(method) != null && type != null && !type.equals(clazz) && RawEntity.class.isAssignableFrom(type) && !individualDeps.contains(type)) { individualDeps.add((Class<? extends RawEntity<?>>) type); addDeps(deps, clazz, individualDeps); parseDependencies(fieldConverter, deps, roots, (Class<? extends RawEntity<?>>) type); } } if (individualDeps.size() == 0) { roots.add(clazz); } else { addDeps(deps, clazz, individualDeps); } }
private static void parseDependencies( final FieldNameConverter fieldConverter, final Map<Class<? extends RawEntity<?>>, Set<Class<? extends RawEntity<?>>>> deps, final Set<Class<? extends RawEntity<?>>> roots, Class<? extends RawEntity<?>> clazz) { if (deps.containsKey(clazz)) { return; } final Set<Class<? extends RawEntity<?>>> individualDeps = new LinkedHashSet<Class<? extends RawEntity<?>>>(); for (final Method method : clazz.getMethods()) { final Class<?> type = Common.getAttributeTypeFromMethod(method); validateManyToManyAnnotation(method); validateOneToOneAnnotation(method); validateOneToManyAnnotation(method); if (fieldConverter.getName(method) != null && type != null && !type.equals(clazz) && RawEntity.class.isAssignableFrom(type) && !individualDeps.contains(type)) { individualDeps.add((Class<? extends RawEntity<?>>) type); addDeps(deps, clazz, individualDeps); parseDependencies(fieldConverter, deps, roots, (Class<? extends RawEntity<?>>) type); } } if (individualDeps.size() == 0) { roots.add(clazz); } else { addDeps(deps, clazz, individualDeps); } }