1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 package fvt.uno.sw;
23 
24 import static org.openoffice.test.common.Testspace.*;
25 
26 import java.io.File;
27 
28 import org.junit.After;
29 import org.junit.Before;
30 import org.junit.Test;
31 import org.junit.Assert;
32 import org.openoffice.test.common.FileUtil;
33 import org.openoffice.test.uno.UnoApp;
34 
35 import com.sun.star.text.XTextDocument;
36 import com.sun.star.text.XTextCursor;
37 import com.sun.star.text.XText;
38 import com.sun.star.beans.XPropertySet;
39 import com.sun.star.beans.PropertyValue;
40 import com.sun.star.frame.*;
41 import com.sun.star.uno.UnoRuntime;
42 import com.sun.star.util.XCloseable;
43 import com.sun.star.lang.XComponent;
44 import com.sun.star.container.XEnumerationAccess;
45 import com.sun.star.container.XEnumeration;
46 
47 
48 public class DocumentTest {
49 	UnoApp unoApp = new UnoApp();
50 	XTextDocument textDocument = null;
51 	File temp = null;
52 	String workingFilePath = "";
53 	String workingTemplatePath = "";
54 
55 	/**
56 	 * @throws java.lang.Exception
57 	 */
58 	@Before
59 	public void setUp() throws Exception {
60 		unoApp.start();
61 
62 		FileUtil.deleteFile(getPath("temp"));
63 		temp = new File(getPath("temp"));
64 		temp.mkdirs();
65 
66 		//copy sample file to temp folder
67 		workingFilePath = prepareData("uno/sw/DocumentTest.odt");
68 		workingTemplatePath = prepareData("uno/sw/DocumentTest.ott");
69 	}
70 
71 	@After
72 	public void tearDown() throws Exception {
73 		unoApp.close();
74 	}
75 
76 	private XComponent newDocumentFromTemplate(String templatePath) throws Exception
77 	{
78 		XComponentLoader componentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, unoApp.getDesktop());
79 		PropertyValue[] pros = new PropertyValue[1];
80 		pros[0] = new PropertyValue();
81 		pros[0].Name = "AsTemplate";
82 		pros[0].Value = new Boolean(true);
83 
84 		XComponent component = componentLoader.loadComponentFromURL(FileUtil.getUrl(workingTemplatePath), "_blank", 0,pros);
85 		return component;
86 	}
87 
88 
89 	/**
90 	 * test close document
91 	 * @throws Exception
92 	 */
93 	@Test
94 	public void testCloseDocument() throws Exception
95 	{
96 		XComponent component = unoApp.newDocument("swriter");
97 		unoApp.closeDocument(component);
98 		XModel xModel = unoApp.getDesktop().getCurrentFrame().getController().getModel();
99 		Assert.assertTrue("Document has been closed.",xModel==null);
100 	}
101 
102 	/**
103 	 * test new document
104 	 * @throws Exception
105 	 */
106 	@Test
107 	public void testNewDocument() throws Exception
108 	{
109 		XComponentLoader componentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, unoApp.getDesktop());
110 		XComponent component = componentLoader.loadComponentFromURL("private:factory/" + "swriter", "_blank", 0, new PropertyValue[0]);
111 		textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, component);
112 		XTitle xTitle = (XTitle)UnoRuntime.queryInterface(XTitle.class, textDocument);
113 		String title = xTitle.getTitle();
114 		Assert.assertEquals("New Document title start with \"Untitled\"",true, title.startsWith("Untitled"));
115 		unoApp.closeDocument(textDocument);
116 	}
117 
118 	/**
119 	 * test new document from template
120 	 * @throws Exception
121 	 */
122 	@Test
123 	public void testNewDocumentFromTemplate() throws Exception
124 	{
125 		XComponent component = this.newDocumentFromTemplate(workingTemplatePath);
126 		textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, component);
127 		XText xText = textDocument.getText();
128 		XTitle xTitle = (XTitle)UnoRuntime.queryInterface(XTitle.class, textDocument);
129 		xText = textDocument.getText();
130 		XTextCursor xTextCursor = xText.createTextCursor();
131 		xTextCursor.gotoEnd(true);
132 		XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xTextCursor);
133 		String paraStyle = (String)xPropertySet.getPropertyValue("ParaStyleName");
134 
135         Assert.assertEquals("new document from template, heading style in template is remained. ", "Heading 1", paraStyle);
136 
137         Assert.assertEquals("new document from template, title start with \"Untitled\".", true, xTitle.getTitle().startsWith("Untitled"));
138 
139         unoApp.closeDocument(textDocument);
140 	}
141 
142 	/**
143 	 * test save document as odt
144 	 * @throws Exception
145 	 */
146 	@Test
147 	public void testSaveDocument() throws Exception
148 	{
149 		XComponent component = unoApp.loadDocument(workingFilePath);
150 		textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, component);
151 		XText xText = textDocument.getText();
152 		XTextCursor xTextCursor = xText.createTextCursor();
153 		xTextCursor.gotoEnd(true);
154 		XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xTextCursor);
155 
156 		xPropertySet.setPropertyValue("ParaStyleName", "Heading 1");
157 
158 		XStorable xStorable = (XStorable)UnoRuntime.queryInterface(XStorable.class, component);
159         xStorable.store();
160         unoApp.closeDocument(textDocument);
161 
162         component = unoApp.loadDocument(workingFilePath);
163 		textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, component);
164 		xText = textDocument.getText();
165 		xTextCursor = xText.createTextCursor();
166 		xTextCursor.gotoEnd(true);
167 		xPropertySet = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xTextCursor);
168 
169         Assert.assertEquals("Modify plain text to heading 1 style. ", "Heading 1", (String)xPropertySet.getPropertyValue("ParaStyleName"));
170         unoApp.closeDocument(textDocument);
171 	}
172 
173 	/**
174 	 * test save document as doc
175 	 * @throws Exception
176 	 */
177 	@Test
178 	public void testSaveAsDocument() throws Exception
179 	{
180 		File saveAsFile = new File(workingFilePath + ".doc");
181 		XComponent component = unoApp.loadDocument(workingFilePath);
182 		textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, component);
183 		XText xText = textDocument.getText();
184 		XTextCursor xTextCursor = xText.createTextCursor();
185 		XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xTextCursor);
186 
187 		xPropertySet.setPropertyValue("ParaStyleName", "Heading 1");
188 		xText.insertString(xTextCursor, "test Save odt as doc.", false);
189 
190 		XStorable xStorable = (XStorable)UnoRuntime.queryInterface(XStorable.class, component);
191         PropertyValue[] storeProps = new PropertyValue[2];
192 
193         storeProps[0] = new PropertyValue();
194         storeProps[0].Name = "Overwrite";
195         storeProps[0].Value = new Boolean(true);
196 
197         storeProps[1] = new PropertyValue();
198         storeProps[1].Name = "FilterName";
199         storeProps[1].Value = "MS Word 97";
200 
201         xStorable.storeAsURL(FileUtil.getUrl(saveAsFile), storeProps);
202         Assert.assertTrue("Save odt document as doc the file exist: " + saveAsFile.getAbsolutePath(), saveAsFile.exists());
203         unoApp.closeDocument(textDocument);
204 	}
205 
206 	/**
207 	 * test export document as pdf
208 	 * @throws Exception
209 	 */
210 	@Test
211 	public void testExportAsPDF() throws Exception
212 	{
213 		File saveAsFile = new File(workingFilePath + ".pdf");
214 		XComponent component = unoApp.loadDocument(workingFilePath);
215 		textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, component);
216 
217 		XStorable xStorable = (XStorable)UnoRuntime.queryInterface(XStorable.class, component);
218         PropertyValue[] storeProps = new PropertyValue[3];
219 
220         storeProps[0] = new PropertyValue();
221         storeProps[0].Name = "Overwrite";
222         storeProps[0].Value = new Boolean(true);
223 
224         storeProps[1] = new PropertyValue();
225         storeProps[1].Name = "FilterName";
226         storeProps[1].Value = "writer_pdf_Export";
227 
228         storeProps[2] = new PropertyValue();
229         storeProps[2].Name = "CompressionMode";
230         storeProps[2].Value = "1";
231 
232         xStorable.storeToURL(FileUtil.getUrl(saveAsFile), storeProps);
233 
234         Assert.assertTrue("Export document as PDF.", saveAsFile.exists());
235 
236         unoApp.closeDocument(textDocument);
237 	}
238 
239 	/**
240 	 * test save document as template
241 	 * @throws Exception
242 	 */
243 	@Test
244 	public void testSaveAsTemplate() throws Exception
245 	{
246 		File saveAsFile = new File(workingFilePath + ".ott");
247 		XComponent component = unoApp.loadDocument(workingFilePath);
248 		textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, component);
249 		XText xText = textDocument.getText();
250 		XTextCursor xTextCursor = xText.createTextCursor();
251 		xTextCursor.gotoEnd(true);
252 		XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xTextCursor);
253 
254 		xPropertySet.setPropertyValue("ParaStyleName", "Heading 1");
255 
256 		XStorable xStorable = (XStorable)UnoRuntime.queryInterface(XStorable.class, component);
257         xStorable.store();
258 
259 		PropertyValue[] storeProps = new PropertyValue[3];
260 		storeProps[0] = new PropertyValue();
261 		storeProps[0].Name="TemplateName";
262 		storeProps[0].Value="MyNewCreatedTemplate";
263 
264 		storeProps[1] = new PropertyValue();
265 		storeProps[1].Name="TemplateRegionName";
266 		storeProps[1].Value="My Templates";
267 
268 		storeProps[2] = new PropertyValue();
269 		storeProps[2].Name="AsTemplate";
270 		storeProps[2].Value=new Boolean(true);
271 
272 		xStorable.storeToURL(FileUtil.getUrl(saveAsFile), storeProps);
273 		unoApp.closeDocument(textDocument);
274 
275 		component = this.newDocumentFromTemplate(saveAsFile.getAbsolutePath());
276 		textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, component);
277 		XTitle xTitle = (XTitle)UnoRuntime.queryInterface(XTitle.class, textDocument);
278 		xText = textDocument.getText();
279 		xTextCursor = xText.createTextCursor();
280 		xTextCursor.gotoEnd(true);
281 		xPropertySet = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xTextCursor);
282 		String paraStyle = (String)xPropertySet.getPropertyValue("ParaStyleName");
283 		Assert.assertEquals("Save document as template, heading style is remained. ", "Heading 1", paraStyle);
284         Assert.assertEquals("Save document as template, title start with \"Untitled\".", true, xTitle.getTitle().startsWith("Untitled"));
285         unoApp.closeDocument(textDocument);
286 	}
287 
288 }
289