package be.cegeka.flaris2.serialize.thirdparty;

import java.util.*;

import org.hibernate.collection.*;
import org.hibernate.proxy.*;

import com.thoughtworks.xstream.mapper.*;

public class HibernateMapper extends MapperWrapper {

	Map<Class<?>, Class<?>> collectionMap = new HashMap<Class<?>, Class<?>>();

	public void init() {
		collectionMap.put(PersistentBag.class, ArrayList.class);
		collectionMap.put(PersistentList.class, ArrayList.class);
		collectionMap.put(PersistentMap.class, HashMap.class);
		collectionMap.put(PersistentSet.class, HashSet.class);
		collectionMap.put(PersistentSortedMap.class, TreeMap.class);
		collectionMap.put(PersistentSortedSet.class, TreeSet.class);
	}

	public HibernateMapper(Mapper arg0) {
		super(arg0);
		init();
	}

	@SuppressWarnings("rawtypes")
	@Override
	public Class<?> defaultImplementationOf(Class clazz) {
		if (collectionMap.containsKey(clazz)) {
			return super.defaultImplementationOf(collectionMap.get(clazz));
		}

		return super.defaultImplementationOf(clazz);
	}

	@SuppressWarnings("rawtypes")
	@Override
	public String serializedClass(Class clazz) {
		for (int i = 0; i < clazz.getInterfaces().length; i++) {
			if (HibernateProxy.class.equals(clazz.getInterfaces()[i])) {
				return super.serializedClass(clazz.getSuperclass());
			}
		}
		if (collectionMap.containsKey(clazz)) {
			return super.serializedClass(collectionMap.get(clazz));
		}

		return super.serializedClass(clazz);
	}

}

