package org.jboss.resteasy.test.providers;
import com.sun.istack.NotNull;
import com.sun.istack.Nullable;
import com.sun.xml.bind.api.ClassResolver;
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jboss.resteasy.plugins.providers.atom.Content;
import org.jboss.resteasy.plugins.providers.atom.Entry;
import org.jboss.resteasy.plugins.providers.atom.Feed;
import org.jboss.resteasy.plugins.providers.atom.Link;
import org.jboss.resteasy.plugins.providers.atom.Person;
import org.jboss.resteasy.plugins.providers.atom.Text;
import org.jboss.resteasy.test.providers.resource.AtomProviderModelCustomerAtom;
import org.junit.Test;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URI;
import java.util.Date;
/**
* @tpSubChapter Providers
* @tpChapter Unit tests
* @tpTestCaseDetails Test for atom provider model
* @tpSince RESTEasy 3.0.16
*/
public class AtomProviderModelTest {
protected final Logger logger = LogManager.getLogger(AtomProviderModelTest.class.getName());
private static final String XML = "<content xmlns=\"http://www.w3.org/2005/Atom\" language=\"en\">Text\n" +
"</content>";
private static final String RFC_COMPLEX_XML =
" <feed xmlns=\"http://www.w3.org/2005/Atom\">\n" +
" <title type=\"text\">dive into mark</title>\n" +
" <subtitle type=\"html\">\n" +
" A <em>lot</em> of effort\n" +
" went into making this effortless\n" +
" </subtitle>\n" +
" <updated>2005-07-31T12:29:29Z</updated>\n" +
" <id>tag:example.org,2003:3</id>\n" +
" <link rel=\"alternate\" type=\"text/html\"\n" +
" hreflang=\"en\" href=\"http://example.org/\"/>\n" +
" <link rel=\"self\" type=\"application/atom+xml\"\n" +
" href=\"http://example.org/feed.atom\"/>\n" +
" <rights>Copyright (c) 2003, Mark Pilgrim</rights>\n" +
" <generator uri=\"http://www.example.com/\" version=\"1.0\">\n" +
" Example Toolkit\n" +
" </generator>\n" +
" <entry>\n" +
" <title>Atom draft-07 snapshot</title>\n" +
" <link rel=\"alternate\" type=\"text/html\"\n" +
" href=\"http://example.org/2005/04/02/atom\"/>\n" +
" <link rel=\"enclosure\" type=\"audio/mpeg\" length=\"1337\"\n" +
" href=\"http://example.org/audio/ph34r_my_podcast.mp3\"/>\n" +
" <id>tag:example.org,2003:3.2397</id>\n" +
" <updated>2005-07-31T12:29:29Z</updated>\n" +
" <published>2003-12-13T08:29:29-04:00</published>\n" +
" <author>\n" +
" <name>Mark Pilgrim</name>\n" +
" <uri>http://example.org/</uri>\n" +
" <email>f8dy@example.com</email>\n" +
" </author>\n" +
" <contributor>\n" +
" <name>Sam Ruby</name>\n" +
" </contributor>\n" +
" <contributor>\n" +
" <name>Joe Gregorio</name>\n" +
" </contributor>\n" +
" <content type=\"xhtml\" xml:lang=\"en\"\n" +
" xml:base=\"http://diveintomark.org/\">\n" +
" <div xmlns=\"http://www.w3.org/1999/xhtml\">\n" +
" <p><i>[Update: The Atom draft is finished.]</i></p>\n" +
" </div>\n" +
" </content>\n" +
" </entry>\n" +
" </feed>";
/**
* @tpTestDetails Test JAXB content - text form
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testContentText() throws Exception {
JAXBContext ctx = JAXBContext.newInstance(Content.class);
Content content = (Content) ctx.createUnmarshaller().unmarshal(new StringReader(XML));
logger.info(content.getText());
logger.info(content.getLanguage());
}
/**
* @tpTestDetails Regression test for RESTEASY-242
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testContentSetElement() throws Exception {
Content c = new Content();
c.setElement(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument().createElement("Test"));
}
/**
* @tpTestDetails Check JAXB content
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testContent() throws Exception {
Content content = new Content();
content.setJAXBObject(new AtomProviderModelCustomerAtom("bill"));
JAXBContext ctx = JAXBContext.newInstance(Content.class, AtomProviderModelCustomerAtom.class);
Marshaller marshaller = ctx.createMarshaller();
marshaller.setProperty("com.sun.xml.bind.indentString", " ");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
StringWriter writer = new StringWriter();
NamespacePrefixMapper mapper = new NamespacePrefixMapper() {
public String getPreferredPrefix(String namespace, String s1, boolean b) {
if (namespace.equals("http://www.w3.org/2005/Atom")) {
return "atom";
} else {
return s1;
}
}
};
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper);
marshaller.marshal(content, writer);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
marshaller.marshal(content, ps);
if (logger.isDebugEnabled()) {
logger.debug("Result: " + ps.toString());
logger.debug("**********");
logger.debug(writer.toString());
}
content = (Content) ctx.createUnmarshaller().unmarshal(new StringReader(writer.toString()));
AtomProviderModelCustomerAtom cust = content.getJAXBObject(AtomProviderModelCustomerAtom.class);
logger.info(cust.getName());
}
/**
* @tpTestDetails Check Atom Provider Binding
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testBinding() throws Exception {
Feed feed = new Feed();
feed.setId(new URI("http://example.com/42"));
feed.setTitle("Yo");
feed.setUpdated(new Date());
Link link = new Link();
link.setHref(new URI("http://localhost"));
link.setRel("edit");
feed.getLinks().add(link);
feed.getAuthors().add(new Person("Bill Burke"));
Entry entry = new Entry();
Text summary = new Text("<h1>Ho ho ho</h1>", "html");
entry.setSummaryElement(summary);
Text rights = new Text("(c) no rights");
entry.setRightsElement(rights);
entry.setTitle("<p>This is the <i>title</i></p>");
entry.getTitleElement().setType(MediaType.APPLICATION_XHTML_XML_TYPE);
feed.getEntries().add(entry);
JAXBContext ctx = JAXBContext.newInstance(Feed.class);
Marshaller marshaller = ctx.createMarshaller();
NamespacePrefixMapper mapper = new NamespacePrefixMapper() {
public String getPreferredPrefix(String namespace, String s1, boolean b) {
if (namespace.equals("http://www.w3.org/2005/Atom")) {
return "atom";
} else {
return s1;
}
}
};
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper);
marshaller.setProperty("com.sun.xml.bind.indentString", " ");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
StringWriter writer = new StringWriter();
marshaller.marshal(feed, writer);
feed = (Feed) ctx.createUnmarshaller().unmarshal(new StringReader(writer.toString()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
marshaller.marshal(feed, ps);
logger.info("Result: " + ps.toString());
}
/**
* @tpTestDetails Check RFC
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testRFC() throws Exception {
JAXBContext ctx = JAXBContext.newInstance(Feed.class);
Feed feed = (Feed) ctx.createUnmarshaller().unmarshal(new StringReader(RFC_COMPLEX_XML));
Marshaller marshaller = ctx.createMarshaller();
NamespacePrefixMapper mapper = new NamespacePrefixMapper() {
public String getPreferredPrefix(String namespace, String s1, boolean b) {
if (namespace.equals("http://www.w3.org/2005/Atom")) {
return "atom";
} else {
return s1;
}
}
};
//marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper);
marshaller.setProperty("com.sun.xml.bind.indentString", " ");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
marshaller.marshal(feed, ps);
logger.info("Result: " + ps.toString());
}
}