package org.jboss.resteasy.plugins.providers.jaxb.json;
import org.codehaus.jettison.json.JSONObject;
import org.codehaus.jettison.json.JSONTokener;
import org.codehaus.jettison.mapped.Configuration;
import org.codehaus.jettison.mapped.MappedNamespaceConvention;
import org.codehaus.jettison.mapped.MappedXMLStreamReader;
import org.jboss.resteasy.plugins.providers.jaxb.json.i18n.Messages;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.PropertyException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.UnmarshallerHandler;
import javax.xml.bind.ValidationEventHandler;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.attachment.AttachmentUnmarshaller;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.util.List;
import java.util.Map;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class JettisonMappedUnmarshaller implements Unmarshaller
{
private Unmarshaller unmarshaller;
private MappedNamespaceConvention convention;
public JettisonMappedUnmarshaller(JAXBContext context, Map<String, String> xmlToJSON, List<String> attributeMapping, List<String> ignoredElements) throws JAXBException
{
unmarshaller = context.createUnmarshaller();
Configuration config = new Configuration(xmlToJSON, attributeMapping, ignoredElements);
convention = new MappedNamespaceConvention(config);
}
public JettisonMappedUnmarshaller(JAXBContext context, MappedNamespaceConvention convention) throws JAXBException
{
unmarshaller = context.createUnmarshaller();
this.convention = convention;
}
public Object unmarshal(File file)
throws JAXBException
{
try
{
return unmarshal(new FileInputStream(file));
}
catch (FileNotFoundException e)
{
throw new JAXBException(e);
}
}
public Object unmarshal(InputStream inputStream)
throws JAXBException
{
return unmarshal(new InputStreamReader(inputStream));
}
public Object unmarshal(Reader reader)
throws JAXBException
{
MappedXMLStreamReader badger = null;
badger = getXmlStreamReader(reader);
return unmarshaller.unmarshal(badger);
}
protected MappedXMLStreamReader getXmlStreamReader(Reader reader)
throws JAXBException
{
MappedXMLStreamReader badger;
char[] buffer = new char[100];
StringBuffer buf = new StringBuffer();
BufferedReader bufferedReader = new BufferedReader(reader);
try
{
int wasRead = 0;
do
{
wasRead = bufferedReader.read(buffer, 0, 100);
if (wasRead > 0) buf.append(buffer, 0, wasRead);
} while (wasRead > -1);
badger = new MappedXMLStreamReader(new JSONObject(new JSONTokener(buf.toString())), convention);
}
catch (Exception e)
{
throw new JAXBException(e);
}
return badger;
}
public Object unmarshal(URL url)
throws JAXBException
{
try
{
return unmarshal(url.openStream());
}
catch (IOException e)
{
throw new JAXBException(e);
}
}
public Object unmarshal(InputSource inputSource)
throws JAXBException
{
return unmarshaller.unmarshal(inputSource);
}
public Object unmarshal(Node node)
throws JAXBException
{
return unmarshaller.unmarshal(node);
}
public <T> JAXBElement<T> unmarshal(Node node, Class<T> tClass)
throws JAXBException
{
return unmarshaller.unmarshal(node, tClass);
}
public Object unmarshal(Source source)
throws JAXBException
{
if (!(source instanceof StreamSource)) throw new UnsupportedOperationException(Messages.MESSAGES.expectingStreamSource());
StreamSource stream = (StreamSource) source;
XMLStreamReader reader = getXmlStreamReader(new InputStreamReader(stream.getInputStream()));
return unmarshal(reader);
}
public <T> JAXBElement<T> unmarshal(Source source, Class<T> tClass)
throws JAXBException
{
if (!(source instanceof StreamSource)) throw new UnsupportedOperationException(Messages.MESSAGES.expectingStreamSource());
StreamSource stream = (StreamSource) source;
XMLStreamReader reader = getXmlStreamReader(new InputStreamReader(stream.getInputStream()));
return unmarshal(reader, tClass);
}
public Object unmarshal(XMLStreamReader xmlStreamReader)
throws JAXBException
{
return unmarshaller.unmarshal(xmlStreamReader);
}
public <T> JAXBElement<T> unmarshal(XMLStreamReader xmlStreamReader, Class<T> tClass)
throws JAXBException
{
return unmarshaller.unmarshal(xmlStreamReader, tClass);
}
public Object unmarshal(XMLEventReader xmlEventReader)
throws JAXBException
{
return unmarshaller.unmarshal(xmlEventReader);
}
public <T> JAXBElement<T> unmarshal(XMLEventReader xmlEventReader, Class<T> tClass)
throws JAXBException
{
return unmarshaller.unmarshal(xmlEventReader, tClass);
}
public UnmarshallerHandler getUnmarshallerHandler()
{
return unmarshaller.getUnmarshallerHandler();
}
@SuppressWarnings("deprecation")
public void setValidating(boolean b)
throws JAXBException
{
unmarshaller.setValidating(b);
}
@SuppressWarnings("deprecation")
public boolean isValidating()
throws JAXBException
{
return unmarshaller.isValidating();
}
public void setEventHandler(ValidationEventHandler validationEventHandler)
throws JAXBException
{
unmarshaller.setEventHandler(validationEventHandler);
}
public ValidationEventHandler getEventHandler()
throws JAXBException
{
return unmarshaller.getEventHandler();
}
public void setProperty(String s, Object o)
throws PropertyException
{
unmarshaller.setProperty(s, o);
}
public Object getProperty(String s)
throws PropertyException
{
return unmarshaller.getProperty(s);
}
public void setSchema(Schema schema)
{
unmarshaller.setSchema(schema);
}
public Schema getSchema()
{
return unmarshaller.getSchema();
}
public void setAdapter(XmlAdapter xmlAdapter)
{
unmarshaller.setAdapter(xmlAdapter);
}
public <A extends XmlAdapter> void setAdapter(Class<A> aClass, A a)
{
unmarshaller.setAdapter(aClass, a);
}
public <A extends XmlAdapter> A getAdapter(Class<A> aClass)
{
return unmarshaller.getAdapter(aClass);
}
public void setAttachmentUnmarshaller(AttachmentUnmarshaller attachmentUnmarshaller)
{
unmarshaller.setAttachmentUnmarshaller(attachmentUnmarshaller);
}
public AttachmentUnmarshaller getAttachmentUnmarshaller()
{
return unmarshaller.getAttachmentUnmarshaller();
}
public void setListener(Listener listener)
{
unmarshaller.setListener(listener);
}
public Listener getListener()
{
return unmarshaller.getListener();
}
}