package com.rayo.core.xml; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.dom4j.Element; import org.dom4j.Namespace; import com.rayo.core.validation.Messages; import com.rayo.core.validation.ValidationException; import static com.voxeo.utils.Objects.assertion; public class DefaultXmlProviderManager implements XmlProviderManager { private List<XmlProvider> providers = new CopyOnWriteArrayList<XmlProvider>(); @Override public Element toXML(Object object) { assertion(object != null, "Cannot serialize null reference"); for (XmlProvider provider : providers) { if (provider.handles(object.getClass())) { Element element = provider.toXML(object); if (element != null) { return element; } } } return null; } @Override @SuppressWarnings("unchecked") public <T> T fromXML(Element element) { assertion(element != null, "Cannot deserialize null reference"); for (XmlProvider provider : providers) { if (provider.handles(element)) { T object = (T)provider.fromXML(element); if (object != null) { return object; } } } throw new ValidationException(Messages.UNKNOWN_NAMESPACE_ELEMENT); } @Override public boolean handles(Element element) { for (XmlProvider provider : providers) { if (provider.handles(element)) { return true; } } return false; } @Override public boolean handles(Class<?> clazz) { for (XmlProvider provider : providers) { if (provider.handles(clazz)) { return true; } } return false; } @Override public boolean handles(Namespace namespace) { return findProvider(namespace) != null; } @Override public XmlProvider findProvider(Namespace namespace) { for (XmlProvider provider : providers) { if (provider.handles(namespace)) { return provider; } } return null; } @Override public void register(XmlProvider provider) { providers.add(provider); provider.setManager(this); } @Override public void unregister(XmlProvider provider) { providers.remove(provider); } @Override public XmlProviderManager getManager() { return this; } @Override public void setManager(XmlProviderManager manager) { throw new UnsupportedOperationException("This is already a root manager"); } }