PageRenderTime 37ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/docx4j-core-tests/src/test/java/org/docx4j/ParentFixTest.java

http://github.com/plutext/docx4j
Java | 330 lines | 196 code | 79 blank | 55 comment | 16 complexity | 117e78c2e222caf5f0362564971f16df MD5 | raw file
Possible License(s): Apache-2.0
  1. package org.docx4j;
  2. import static org.junit.Assert.*;
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.IOException;
  6. import java.math.BigInteger;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import javax.xml.bind.JAXBElement;
  10. import javax.xml.bind.JAXBException;
  11. import junit.framework.Assert;
  12. import org.docx4j.TraversalUtil.CallbackImpl;
  13. import org.docx4j.finders.ClassFinder;
  14. import org.docx4j.openpackaging.exceptions.Docx4JException;
  15. import org.docx4j.openpackaging.exceptions.InvalidFormatException;
  16. import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
  17. import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
  18. import org.docx4j.wml.Body;
  19. import org.docx4j.wml.CTBookmark;
  20. import org.docx4j.wml.CTMarkupRange;
  21. import org.docx4j.wml.Document;
  22. import org.docx4j.wml.FldChar;
  23. import org.docx4j.wml.P;
  24. import org.docx4j.wml.R;
  25. import org.docx4j.wml.Text;
  26. import org.junit.Test;
  27. import org.jvnet.jaxb2_commons.ppp.Child;
  28. /**
  29. * See also org.docx4j.wml.ParentTest
  30. *
  31. */
  32. public class ParentFixTest {
  33. @Test
  34. public void testBodyCreated() throws InvalidFormatException {
  35. WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
  36. MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();
  37. mdp.addParagraphOfText("hello world");
  38. Document doc = mdp.getJaxbElement();
  39. Body body = doc.getBody();
  40. // Set explicitly in Document
  41. Assert.assertEquals(doc, body.getParent());
  42. // Now, check that traversing doesn't change anything
  43. (new TestCallback()).walkJAXBElements(doc);
  44. // No change
  45. Assert.assertEquals(doc, body.getParent());
  46. }
  47. @Test
  48. public void testBodyLoaded() throws Docx4JException, IOException {
  49. WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
  50. MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();
  51. mdp.addParagraphOfText("hello world");
  52. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  53. Docx4J.save(wordMLPackage, baos);
  54. byte[] bytes = baos.toByteArray();
  55. // Now load it
  56. wordMLPackage
  57. = Docx4J.load(
  58. new ByteArrayInputStream(bytes));
  59. mdp = wordMLPackage.getMainDocumentPart();
  60. Document doc = mdp.getJaxbElement();
  61. Body body = doc.getBody();
  62. // Expect it to be set
  63. Assert.assertEquals(doc, body.getParent());
  64. // Now, check that traversing doesn't change anything
  65. (new TestCallback()).walkJAXBElements(doc);
  66. // No change
  67. Assert.assertEquals(doc, body.getParent());
  68. }
  69. @Test
  70. public void testBodyChildrenCreated() throws InvalidFormatException {
  71. WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
  72. MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();
  73. mdp.addParagraphOfText("hello world");
  74. Document doc = mdp.getJaxbElement();
  75. Body body = doc.getBody();
  76. P p = (P)body.getContent().get(0);
  77. Assert.assertEquals(body, p.getParent());
  78. // Now, check that traversing doesn't change anything
  79. (new TestCallback()).walkJAXBElements(doc);
  80. Assert.assertEquals(body, p.getParent());
  81. }
  82. @Test
  83. public void testBodyChildrenLoaded() throws Docx4JException, IOException {
  84. WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
  85. MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();
  86. mdp.addParagraphOfText("hello world");
  87. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  88. Docx4J.save(wordMLPackage, baos);
  89. byte[] bytes = baos.toByteArray();
  90. // Now load it
  91. wordMLPackage
  92. = Docx4J.load(
  93. new ByteArrayInputStream(bytes));
  94. mdp = wordMLPackage.getMainDocumentPart();
  95. Document doc = mdp.getJaxbElement();
  96. Body body = doc.getBody();
  97. P p = (P)body.getContent().get(0);
  98. Assert.assertEquals(body, p.getParent());
  99. // Now, check that traversing doesn't change anything
  100. (new TestCallback()).walkJAXBElements(doc);
  101. Assert.assertEquals(body, p.getParent());
  102. }
  103. /**
  104. * Prior to 3.3.1, unmarshalling a String does set parent properly, except in the known case of JAXBElement,
  105. * which a traverse fixes
  106. *
  107. * With 3.3.1, ArrayListWml gets this right first time
  108. *
  109. * @throws JAXBException
  110. */
  111. @Test
  112. public void testUnmarshalString() throws JAXBException {
  113. String openXML = "<w:p xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\">"
  114. + "<w:r>"
  115. + "<w:t>some text</w:t>"
  116. +"</w:r>"
  117. + "<w:bookmarkStart w:id=\"0\" w:name=\"mybm\"/>"
  118. + "<w:bookmarkEnd w:id=\"0\"/>"
  119. +"</w:p>";
  120. P p = (P)XmlUtils.unmarshalString(openXML);
  121. R r = (R)p.getContent().get(0);
  122. // Parent of run is set correctly
  123. if (r.getParent()==null) {
  124. System.out.println("null parent");
  125. Assert.fail("null parent");
  126. } else {
  127. System.out.println(r.getParent().getClass());
  128. Assert.assertEquals(P.class, r.getParent().getClass());
  129. }
  130. // Parent of a JAXBElement?
  131. Child o2 = (Child)XmlUtils.unwrap(p.getContent().get(1));
  132. if (o2.getParent()==null) {
  133. System.out.println("null parent");
  134. Assert.fail("null parent");
  135. } else if (o2.getParent() instanceof JAXBElement) {
  136. // 3.3.0: Sad but true
  137. // <= 3.3.0: org.docx4j.wml.CTBookmark has parent class javax.xml.bind.JAXBElement - NOT GOOD
  138. Assert.assertEquals(JAXBElement.class, o2.getParent().getClass() );
  139. // Traverse to fix
  140. // org.docx4j.wml.CTBookmark has parent class org.docx4j.wml.P - GOOD
  141. List foo = new ArrayList();
  142. foo.add(p);
  143. ClassFinder finder = new ClassFinder(FldChar.class); // whatever
  144. new TraversalUtil(foo, finder);
  145. o2 = (Child)XmlUtils.unwrap(p.getContent().get(1));
  146. if (o2.getParent()==null) {
  147. System.out.println("null parent");
  148. Assert.fail("null parent");
  149. } else {
  150. System.out.println(o2.getClass().getName() + " has CORRECTED parent " + o2.getParent().getClass());
  151. Assert.assertEquals(o2.getParent().getClass(), P.class);
  152. }
  153. } else /* since 3.3.1 */ {
  154. System.out.println(o2.getClass().getName() + " has parent " + o2.getParent().getClass());
  155. Assert.assertEquals(P.class, o2.getParent().getClass() );
  156. }
  157. }
  158. /**
  159. * Prior to 3.3.1, Objects added manually don't have their parent set automatically.
  160. * But traversal fixes this.
  161. *
  162. * With 3.3.1, ArrayListWml gets this right first time
  163. *
  164. */
  165. @Test
  166. public void testCreatedViaFactory() {
  167. org.docx4j.wml.ObjectFactory wmlObjectFactory = new org.docx4j.wml.ObjectFactory();
  168. P p = wmlObjectFactory.createP();
  169. // Create object for r
  170. R r = wmlObjectFactory.createR();
  171. p.getContent().add( r);
  172. // Create object for t (wrapped in JAXBElement)
  173. Text text = wmlObjectFactory.createText();
  174. JAXBElement<org.docx4j.wml.Text> textWrapped = wmlObjectFactory.createRT(text);
  175. r.getContent().add( textWrapped);
  176. text.setValue( "some text");
  177. // Create object for bookmarkStart (wrapped in JAXBElement)
  178. CTBookmark bookmark = wmlObjectFactory.createCTBookmark();
  179. JAXBElement<org.docx4j.wml.CTBookmark> bookmarkWrapped = wmlObjectFactory.createPBookmarkStart(bookmark);
  180. p.getContent().add( bookmarkWrapped);
  181. bookmark.setName( "mybm");
  182. bookmark.setId( BigInteger.valueOf( 0) );
  183. // Create object for bookmarkEnd (wrapped in JAXBElement)
  184. CTMarkupRange markuprange = wmlObjectFactory.createCTMarkupRange();
  185. JAXBElement<org.docx4j.wml.CTMarkupRange> markuprangeWrapped = wmlObjectFactory.createPBookmarkEnd(markuprange);
  186. p.getContent().add( markuprangeWrapped);
  187. markuprange.setId( BigInteger.valueOf( 0) );
  188. // Its not set automatically
  189. // if (r.getParent()==null) {
  190. // System.out.println("null parent");
  191. // Assert.fail("null parent");
  192. // } else
  193. {
  194. System.out.println(r.getParent().getClass());
  195. Assert.assertEquals(P.class, r.getParent().getClass());
  196. }
  197. // Traverse to fix: uncomment for 3.3.0
  198. // List foo = new ArrayList();
  199. // foo.add(p);
  200. // ClassFinder finder = new ClassFinder(FldChar.class); // whatever
  201. // new TraversalUtil(foo, finder);
  202. // Test bookmark
  203. Child o2 = (Child)XmlUtils.unwrap(p.getContent().get(1));
  204. if (o2.getParent()==null) {
  205. System.out.println("null parent");
  206. Assert.fail("null parent");
  207. } else {
  208. System.out.println(o2.getClass().getName() + " has parent " + o2.getParent().getClass());
  209. Assert.assertEquals(o2.getParent().getClass(), P.class);
  210. }
  211. // Test run
  212. o2 = (Child)XmlUtils.unwrap(p.getContent().get(0)); // run
  213. if (o2.getParent()==null) {
  214. System.out.println("null parent");
  215. Assert.fail("null parent");
  216. } else {
  217. System.out.println(o2.getClass().getName() + " has parent " + o2.getParent().getClass());
  218. Assert.assertEquals(o2.getParent().getClass(), P.class);
  219. }
  220. // Traverse: shouldn't change anything
  221. List foo = new ArrayList();
  222. foo.add(p);
  223. ClassFinder finder = new ClassFinder(FldChar.class); // whatever
  224. new TraversalUtil(foo, finder);
  225. // Test bookmark
  226. o2 = (Child)XmlUtils.unwrap(p.getContent().get(1));
  227. if (o2.getParent()==null) {
  228. System.out.println("null parent");
  229. Assert.fail("null parent");
  230. } else {
  231. System.out.println(o2.getClass().getName() + " has parent " + o2.getParent().getClass());
  232. Assert.assertEquals(o2.getParent().getClass(), P.class);
  233. }
  234. // Test run
  235. o2 = (Child)XmlUtils.unwrap(p.getContent().get(0)); // run
  236. if (o2.getParent()==null) {
  237. System.out.println("null parent");
  238. Assert.fail("null parent");
  239. } else {
  240. System.out.println(o2.getClass().getName() + " has parent " + o2.getParent().getClass());
  241. Assert.assertEquals(o2.getParent().getClass(), P.class);
  242. }
  243. }
  244. class TestCallback extends CallbackImpl {
  245. @Override
  246. public List<Object> apply(Object o) {
  247. // TODO Auto-generated method stub
  248. return null;
  249. }
  250. }
  251. }