/*
* Copyright (c) 2010 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.rdfbean.object;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import javax.annotation.Nullable;
import com.mysema.rdfbean.model.UID;
import com.mysema.rdfbean.xsd.ConverterRegistry;
import com.mysema.rdfbean.xsd.ConverterRegistryImpl;
/**
* @author tiwe
*
*/
public class ConfigurationBuilder {
private final Map<Class<?>, MappedClass> mappedClasses = new HashMap<Class<?>, MappedClass>();
@Nullable
private ConverterRegistry converterRegistry;
public Configuration build() {
if (converterRegistry == null) {
converterRegistry = new ConverterRegistryImpl();
}
// populate mappedSuperClasses
for (MappedClass mappedClass : mappedClasses.values()) {
if (!mappedClass.getJavaClass().getSuperclass().equals(Object.class)) {
MappedClass mappedSuperClass = mappedClasses.get(mappedClass.getJavaClass().getSuperclass());
if (mappedSuperClass != null) {
mappedClass.getMappedSuperClasses().add(mappedSuperClass);
}
}
}
// merge data
for (MappedClass mappedClass : mappedClasses.values()) {
Deque<MappedClass> supers = new ArrayDeque<MappedClass>(mappedClass.getMappedSuperClasses());
while (!supers.isEmpty()) {
MappedClass mappedSuperClass = supers.pop();
supers.addAll(mappedSuperClass.getMappedSuperClasses());
for (MappedPath path : mappedSuperClass.getProperties()) {
MappedProperty<?> property = (MappedProperty<?>) path.getMappedProperty().clone();
property.resolve(mappedClass);
mappedClass.addMappedPath(new MappedPath(property,
path.getPredicatePath(), !mappedClass.equals(property.getDeclaringClass())));
}
}
}
return new SimpleConfiguration(converterRegistry, new HashSet<MappedClass>(mappedClasses.values()));
}
public MappedClassBuilder addClass(Class<?> clazz) {
return addClass("java:" + clazz.getName().replace('$', '.') + "#", clazz);
}
public MappedClassBuilder addClass(String ns, Class<?> clazz) {
return addClass(new UID(ns, clazz.getSimpleName()), clazz);
}
public MappedClassBuilder addClass(UID uid, Class<?> clazz) {
return addClass(uid, null, clazz);
}
public MappedClassBuilder addClass(UID uid, @Nullable UID context, Class<?> clazz) {
MappedClass mappedClass = new MappedClass(clazz, uid, context, new ArrayList<MappedClass>());
mappedClasses.put(clazz, mappedClass);
return new MappedClassBuilder(mappedClass);
}
public void setConverterRegistry(ConverterRegistry converterRegistry) {
this.converterRegistry = converterRegistry;
}
}