package org.jboss.resteasy.plugins.providers.jaxb.json;
import org.codehaus.jettison.mapped.Configuration;
import org.codehaus.jettison.mapped.MappedNamespaceConvention;
import org.jboss.resteasy.annotations.providers.jaxb.json.Mapped;
import org.jboss.resteasy.annotations.providers.jaxb.json.XmlNsMap;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.Validator;
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
@SuppressWarnings("deprecation")
public class JettisonMappedContext extends JAXBContext
{
private JAXBContext context;
private MappedNamespaceConvention convention;
public JettisonMappedContext(Class... classes)
{
this(new HashMap<String, String>(), new ArrayList<QName>(), new ArrayList<QName>(), classes);
}
public JettisonMappedContext(Mapped mapped, Class... classes)
{
createConvention(mapped);
try
{
context = JAXBContext.newInstance(classes);
}
catch (JAXBException e)
{
throw new RuntimeException(e);
}
}
public JettisonMappedContext(Mapped mapped, String contextPath)
{
createConvention(mapped);
try
{
context = JAXBContext.newInstance(contextPath);
}
catch (JAXBException e)
{
throw new RuntimeException(e);
}
}
protected void createConvention(Mapped mapped)
{
List<QName> attributesAsElements = new ArrayList<QName>();
HashMap<String, String> xmlnsToJson = new HashMap<String, String>();
if (mapped != null)
{
for (String name : mapped.attributesAsElements())
{
QName qName = new QName(name);
attributesAsElements.add(qName);
}
for (XmlNsMap j : mapped.namespaceMap())
{
xmlnsToJson.put(j.namespace(), j.jsonName());
}
}
Configuration config = new Configuration(xmlnsToJson, attributesAsElements, new ArrayList());
//convention = new MappedNamespaceConvention(config);
convention = new MappedConvention(config);
}
public JettisonMappedContext(Map<String, String> xmlnsToJson, List<QName> attributesAsElements, List<QName> ignoredElements, Class... classes)
{
Configuration config = new Configuration(xmlnsToJson, attributesAsElements, ignoredElements);
convention = new MappedNamespaceConvention(config);
try
{
context = JAXBContext.newInstance(classes);
}
catch (JAXBException e)
{
throw new RuntimeException(e);
}
}
public JettisonMappedContext(MappedNamespaceConvention convention, Class... classes)
{
this.convention = convention;
try
{
context = JAXBContext.newInstance(classes);
}
catch (JAXBException e)
{
throw new RuntimeException(e);
}
}
public Unmarshaller createUnmarshaller() throws JAXBException
{
return new JettisonMappedUnmarshaller(context, convention);
}
public Marshaller createMarshaller() throws JAXBException
{
return new JettisonMappedMarshaller(context, convention);
}
public Validator createValidator() throws JAXBException
{
return context.createValidator();
}
}