001package co.codewizards.cloudstore.core.dto.jaxb;
002
003import java.util.HashSet;
004import java.util.Iterator;
005import java.util.ServiceLoader;
006import java.util.Set;
007
008import javax.xml.bind.JAXBContext;
009import javax.xml.bind.JAXBException;
010
011public class CloudStoreJaxbContext {
012
013        private static class JaxbContextHolder {
014                private static final JAXBContext jaxbContext;
015                static {
016                        final Set<Class<?>> collectedClassesToBeBound = new HashSet<Class<?>>();
017                        final ServiceLoader<CloudStoreJaxbContextProvider> serviceLoader = ServiceLoader.load(CloudStoreJaxbContextProvider.class);
018                        for (final Iterator<CloudStoreJaxbContextProvider> it = serviceLoader.iterator(); it.hasNext(); ) {
019                                final CloudStoreJaxbContextProvider provider = it.next();
020                                final Class<?>[] classesToBeBound = provider.getClassesToBeBound();
021                                if (classesToBeBound != null) {
022                                        for (final Class<?> clazz : classesToBeBound)
023                                                collectedClassesToBeBound.add(clazz);
024                                }
025                        }
026                        try {
027                                final Class<?>[] ca = collectedClassesToBeBound.toArray(new Class[collectedClassesToBeBound.size()]);
028                                jaxbContext = JAXBContext.newInstance(ca);
029                        } catch (JAXBException x) {
030                                throw new RuntimeException(x);
031                        }
032                }
033        }
034
035        public static JAXBContext getJaxbContext() {
036                return JaxbContextHolder.jaxbContext;
037        }
038}