package org.docx4j.wml; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.List; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import org.docx4j.TraversalUtil.CallbackImpl; import org.docx4j.XmlUtils; import org.docx4j.jaxb.Context; import org.docx4j.openpackaging.exceptions.InvalidFormatException; import org.junit.Test; public class ParentTest { /** * Unmarshalling sets sdtcontentblock.getParent() correctly. * * @throws InvalidFormatException * @throws JAXBException */ @Test public void testUnmarshalledSdtContentBlockParent() throws InvalidFormatException, JAXBException { String openXML = "<w:document mc:Ignorable=\"w14 wp14\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\">" + "<w:body>" + "<w:sdt>" // SdtBlock + "<w:sdtPr>" + "<w:id w:val=\"-738631422\"/>" + "</w:sdtPr>" + "<w:sdtContent>" // SdtContentBlock + "<w:p>" + "<w:r>" + "<w:t>Some content</w:t>" + "</w:r>" + "</w:p>" + "</w:sdtContent>" + "</w:sdt>" + "</w:body>" + "</w:document>" ; Document document = (Document)XmlUtils.unmarshalString(openXML); SdtBlock sdtblock = (SdtBlock)document.getContent().get(0); SdtContentBlock sdtcontentblock = (SdtContentBlock)sdtblock.getSdtContent(); assertEquals(sdtblock, sdtcontentblock.getParent()); // same for sdtpr SdtPr sdtPr = sdtblock.getSdtPr(); assertEquals(sdtblock, sdtPr.getParent()); // Now, check that traversing doesn't change anything (new TestCallback()).walkJAXBElements(document); assertEquals(sdtblock, sdtcontentblock.getParent()); assertEquals(sdtblock, sdtPr.getParent()); } @Test public void testJAXBElementInSdtContentBlock() throws InvalidFormatException, JAXBException { String openXML = "<w:document mc:Ignorable=\"w14 wp14\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\">" + "<w:body>" + "<w:sdt>" // SdtBlock + "<w:sdtPr>" + "<w:id w:val=\"-738631422\"/>" + "</w:sdtPr>" + "<w:sdtContent>" // SdtContentBlock + "<w:p>" + "<w:r>" + "<w:t>Some content</w:t>" + "</w:r>" + "</w:p>" + "</w:sdtContent>" + "</w:sdt>" + "</w:body>" + "</w:document>" ; Document document = (Document)XmlUtils.unmarshalString(openXML); SdtBlock sdtblock = (SdtBlock)document.getContent().get(0); SdtContentBlock sdtcontentblock = (SdtContentBlock)sdtblock.getSdtContent(); JAXBElement<CTBookmark> myBookmark = Context.getWmlObjectFactory().createSdtContentBlockBookmarkStart(new CTBookmark()); sdtcontentblock.getContent().add(myBookmark); assertEquals(sdtcontentblock, myBookmark.getValue().getParent()); // Now, check that traversing doesn't change anything (new TestCallback()).walkJAXBElements(document); assertEquals(sdtcontentblock, myBookmark.getValue().getParent()); } @Test public void testJAXBElementInBody() throws InvalidFormatException, JAXBException { Document doc = new Document(); Body body = new Body(); doc.setBody(body); JAXBElement<CTBookmark> myBookmark = Context.getWmlObjectFactory().createSdtContentBlockBookmarkStart(new CTBookmark()); body.getContent().add(myBookmark); assertEquals(body, myBookmark.getValue().getParent()); // Now, check that traversing doesn't change anything (new TestCallback()).walkJAXBElements(doc); assertEquals(body, myBookmark.getValue().getParent()); } @Test public void testJAXBElement() throws InvalidFormatException, JAXBException { CTBookmark myBookmark = new CTBookmark(); JAXBElement<CTBookmark> myJAXBElement = Context.getWmlObjectFactory().createSdtContentBlockBookmarkStart(myBookmark); assertNull(myBookmark.getParent()); R r = new R(); r.getContent().add(myJAXBElement); assertEquals(r, myBookmark.getParent()); } @Test public void testSdtContentBlockParent() throws InvalidFormatException, JAXBException { SdtBlock sdtBlock = Context.getWmlObjectFactory().createSdtBlock(); SdtContentBlock sdtContentBlock = Context.getWmlObjectFactory() .createSdtContentBlock(); sdtBlock.setSdtContent(sdtContentBlock); SdtPr sdtpr = Context.getWmlObjectFactory().createSdtPr(); sdtBlock.setSdtPr(sdtpr); // P p = Context.getWmlObjectFactory().createP(); // sdtContentBlock.getContent().add(p); assertEquals(sdtBlock, sdtContentBlock.getParent()); // same for sdtpr SdtPr sdtPr = sdtBlock.getSdtPr(); assertEquals(sdtBlock, sdtPr.getParent()); } @Test public void testRunParent() throws InvalidFormatException, JAXBException { P p = Context.getWmlObjectFactory().createP(); R r = Context.getWmlObjectFactory().createR(); p.getContent().add(r); assertEquals(p, r.getParent()); String result = XmlUtils.marshaltoString(p, true); P p2 = (P) XmlUtils.unmarshalString(result); R r2 = (R) p2.getContent().get(0); assertEquals(p2, r2.getParent()); } class TestCallback extends CallbackImpl { @Override public List<Object> apply(Object o) { // TODO Auto-generated method stub return null; } } }