186250549SAndrew Rist /**************************************************************
286250549SAndrew Rist  *
386250549SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
486250549SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
586250549SAndrew Rist  * distributed with this work for additional information
686250549SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
786250549SAndrew Rist  * to you under the Apache License, Version 2.0 (the
886250549SAndrew Rist  * "License"); you may not use this file except in compliance
986250549SAndrew Rist  * with the License.  You may obtain a copy of the License at
1086250549SAndrew Rist  *
1186250549SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1286250549SAndrew Rist  *
1386250549SAndrew Rist  * Unless required by applicable law or agreed to in writing,
1486250549SAndrew Rist  * software distributed under the License is distributed on an
1586250549SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1686250549SAndrew Rist  * KIND, either express or implied.  See the License for the
1786250549SAndrew Rist  * specific language governing permissions and limitations
1886250549SAndrew Rist  * under the License.
1986250549SAndrew Rist  *
2086250549SAndrew Rist  *************************************************************/
2186250549SAndrew Rist 
2286250549SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir package complex.writer;
25cdf0e10cSrcweir 
26cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
27cdf0e10cSrcweir import com.sun.star.uno.AnyConverter;
28cdf0e10cSrcweir import com.sun.star.uno.XComponentContext;
29cdf0e10cSrcweir import com.sun.star.lang.WrappedTargetException;
30cdf0e10cSrcweir import com.sun.star.lang.WrappedTargetRuntimeException;
31cdf0e10cSrcweir import com.sun.star.lang.EventObject;
32cdf0e10cSrcweir import com.sun.star.lang.XMultiServiceFactory;
33cdf0e10cSrcweir import com.sun.star.lang.XComponent;
34cdf0e10cSrcweir import com.sun.star.lang.XServiceInfo;
35cdf0e10cSrcweir import com.sun.star.beans.XPropertySet;
36cdf0e10cSrcweir import com.sun.star.beans.PropertyValue;
37cdf0e10cSrcweir import com.sun.star.beans.Pair;
38cdf0e10cSrcweir import com.sun.star.util.XCloseable;
39cdf0e10cSrcweir import com.sun.star.frame.XStorable;
40cdf0e10cSrcweir import com.sun.star.document.DocumentEvent;
41cdf0e10cSrcweir import com.sun.star.document.XDocumentEventBroadcaster;
42cdf0e10cSrcweir import com.sun.star.document.XDocumentEventListener;
43cdf0e10cSrcweir import com.sun.star.text.XTextDocument;
44*f107c74eSDamjan Jovanovic import org.openoffice.test.Argument;
45*f107c74eSDamjan Jovanovic import org.openoffice.test.OfficeConnection;
46cdf0e10cSrcweir 
47*f107c74eSDamjan Jovanovic import java.net.URI;
48cdf0e10cSrcweir import java.util.List;
49cdf0e10cSrcweir import java.util.ArrayList;
50cdf0e10cSrcweir import java.io.File;
51cdf0e10cSrcweir 
52*f107c74eSDamjan Jovanovic import org.junit.After;
53*f107c74eSDamjan Jovanovic import org.junit.AfterClass;
54*f107c74eSDamjan Jovanovic import org.junit.Before;
55*f107c74eSDamjan Jovanovic import org.junit.BeforeClass;
56*f107c74eSDamjan Jovanovic import org.junit.Test;
57*f107c74eSDamjan Jovanovic import static org.junit.Assert.*;
58*f107c74eSDamjan Jovanovic 
59cdf0e10cSrcweir /**
60cdf0e10cSrcweir  * a small program to load documents from one directory (recursively)
61cdf0e10cSrcweir  * and store them in another, implemented as a complex test.
62cdf0e10cSrcweir  */
63*f107c74eSDamjan Jovanovic public class LoadSaveTest
64cdf0e10cSrcweir {
65*f107c74eSDamjan Jovanovic     private static final OfficeConnection connection = new OfficeConnection();
66*f107c74eSDamjan Jovanovic 
67cdf0e10cSrcweir     private XMultiServiceFactory m_xMSF = null;
68cdf0e10cSrcweir     private XComponentContext m_xContext = null;
69cdf0e10cSrcweir     private XDocumentEventBroadcaster m_xGEB = null;
70cdf0e10cSrcweir     private String m_TmpDir = null;
71cdf0e10cSrcweir 
72*f107c74eSDamjan Jovanovic     private static final String m_fileURL = "file://";
73*f107c74eSDamjan Jovanovic     private String m_SourceDir;
74*f107c74eSDamjan Jovanovic     private String m_TargetDir;
75*f107c74eSDamjan Jovanovic 
76*f107c74eSDamjan Jovanovic     // setup and close connections
77*f107c74eSDamjan Jovanovic     @BeforeClass
setUpConnection()78*f107c74eSDamjan Jovanovic     public static void setUpConnection()
79*f107c74eSDamjan Jovanovic         throws Exception
80*f107c74eSDamjan Jovanovic     {
81*f107c74eSDamjan Jovanovic         connection.setUp();
82*f107c74eSDamjan Jovanovic     }
83cdf0e10cSrcweir 
84*f107c74eSDamjan Jovanovic     @AfterClass
tearDownConnection()85*f107c74eSDamjan Jovanovic     public static void tearDownConnection()
86*f107c74eSDamjan Jovanovic         throws InterruptedException, com.sun.star.uno.Exception
87*f107c74eSDamjan Jovanovic     {
88*f107c74eSDamjan Jovanovic         connection.tearDown();
89*f107c74eSDamjan Jovanovic     }
90*f107c74eSDamjan Jovanovic 
getMSF()91*f107c74eSDamjan Jovanovic     private XMultiServiceFactory getMSF()
92*f107c74eSDamjan Jovanovic     {
93*f107c74eSDamjan Jovanovic         final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager());
94*f107c74eSDamjan Jovanovic         return xMSF1;
95cdf0e10cSrcweir     }
96cdf0e10cSrcweir 
97*f107c74eSDamjan Jovanovic     @Before
before()98cdf0e10cSrcweir     public void before() throws Exception
99cdf0e10cSrcweir     {
100*f107c74eSDamjan Jovanovic         m_xMSF = getMSF();
101cdf0e10cSrcweir         XPropertySet xPropertySet = (XPropertySet)
102cdf0e10cSrcweir             UnoRuntime.queryInterface(XPropertySet.class, m_xMSF);
103cdf0e10cSrcweir         Object defaultCtx = xPropertySet.getPropertyValue("DefaultContext");
104cdf0e10cSrcweir         m_xContext = (XComponentContext)
105cdf0e10cSrcweir             UnoRuntime.queryInterface(XComponentContext.class, defaultCtx);
106*f107c74eSDamjan Jovanovic         assertTrue("could not get component context.", m_xContext != null);
107cdf0e10cSrcweir         Object oGEB = m_xMSF.createInstance(
108cdf0e10cSrcweir                 "com.sun.star.frame.GlobalEventBroadcaster");
109cdf0e10cSrcweir         m_xGEB = (XDocumentEventBroadcaster)
110cdf0e10cSrcweir             UnoRuntime.queryInterface(XDocumentEventBroadcaster.class, oGEB);
111*f107c74eSDamjan Jovanovic         assertTrue("could not get global event broadcaster.", m_xGEB != null);
112*f107c74eSDamjan Jovanovic         m_TmpDir = util.utils.getOfficeTemp(m_xMSF);
113*f107c74eSDamjan Jovanovic         m_SourceDir = Argument.get("tdoc");
114*f107c74eSDamjan Jovanovic         m_TargetDir = new URI(m_TmpDir).getPath() + "/sw_LoadSaveTest";
115*f107c74eSDamjan Jovanovic         System.out.println("tempdir: " + m_TmpDir);
116*f107c74eSDamjan Jovanovic         System.out.println("sourcedir: " + m_SourceDir);
117*f107c74eSDamjan Jovanovic         System.out.println("targetdir: " + m_TargetDir);
118cdf0e10cSrcweir     }
119cdf0e10cSrcweir 
120cdf0e10cSrcweir     /*
121*f107c74eSDamjan Jovanovic     @After
122cdf0e10cSrcweir     public void after()
123cdf0e10cSrcweir     {
124cdf0e10cSrcweir     }
125cdf0e10cSrcweir     */
126cdf0e10cSrcweir 
127*f107c74eSDamjan Jovanovic     @Test
testLoadStore()128cdf0e10cSrcweir     public void testLoadStore() throws Exception
129cdf0e10cSrcweir     {
130cdf0e10cSrcweir         Pair<List<String>, List<String>> dirsFiles =
131cdf0e10cSrcweir             getDirAndFileNames(m_SourceDir);
132cdf0e10cSrcweir         makeDirs(m_TargetDir, dirsFiles.First);
133cdf0e10cSrcweir         for (String fileName : dirsFiles.Second)
134cdf0e10cSrcweir         {
135cdf0e10cSrcweir             try {
136cdf0e10cSrcweir                 testDoc(fileName);
137cdf0e10cSrcweir             } catch (Exception e) {
138cdf0e10cSrcweir                 report(e);
139cdf0e10cSrcweir             }
140cdf0e10cSrcweir         }
141cdf0e10cSrcweir     }
142cdf0e10cSrcweir 
testDoc(String fileName)143cdf0e10cSrcweir     public void testDoc(String fileName) throws Exception
144cdf0e10cSrcweir     {
145cdf0e10cSrcweir         XComponent xDoc = null;
146cdf0e10cSrcweir         EventListener xListener = new EventListener();
147cdf0e10cSrcweir         try {
148cdf0e10cSrcweir             m_xGEB.addDocumentEventListener(xListener);
149cdf0e10cSrcweir 
150*f107c74eSDamjan Jovanovic             System.out.println("Loading document: " + fileName + " ...");
151cdf0e10cSrcweir 
152cdf0e10cSrcweir             PropertyValue[] loadProps = new PropertyValue[1];
153cdf0e10cSrcweir             loadProps[0] = new PropertyValue();
154cdf0e10cSrcweir             loadProps[0].Name = "ReadOnly";
155cdf0e10cSrcweir             loadProps[0].Value = new Boolean(true);
156cdf0e10cSrcweir 
157cdf0e10cSrcweir             String sourceFile = m_fileURL + m_SourceDir + fileName;
158cdf0e10cSrcweir 
159cdf0e10cSrcweir             xDoc = util.DesktopTools.loadDoc(m_xMSF, sourceFile, loadProps);
160cdf0e10cSrcweir 
161*f107c74eSDamjan Jovanovic             System.out.println("... done");
162cdf0e10cSrcweir 
163cdf0e10cSrcweir             {
164cdf0e10cSrcweir                 // apparently OnLayoutFinished is not sent for every doc???
165cdf0e10cSrcweir                 // 10 seconds is evidently not enough for large documents
166cdf0e10cSrcweir                 int time = 0;
167cdf0e10cSrcweir                 while (!xListener.IsLayoutFinished() && (time < 30000)) {
168cdf0e10cSrcweir                     Thread.sleep(100);
169cdf0e10cSrcweir                     time += 100;
170cdf0e10cSrcweir                 }
171cdf0e10cSrcweir                 if (time >= 30000) {
172*f107c74eSDamjan Jovanovic                     System.out.println("timeout: no OnLayoutFinished received!");
173cdf0e10cSrcweir                 }
174cdf0e10cSrcweir             }
175cdf0e10cSrcweir 
176*f107c74eSDamjan Jovanovic             System.out.println("Storing document: " + fileName + " ...");
177cdf0e10cSrcweir 
178cdf0e10cSrcweir             XStorable xStor = (XStorable) UnoRuntime.queryInterface(
179cdf0e10cSrcweir                         XStorable.class, xDoc);
180cdf0e10cSrcweir 
181cdf0e10cSrcweir             String targetFile = m_fileURL + m_TargetDir + fileName;
182cdf0e10cSrcweir 
183cdf0e10cSrcweir             xStor.storeToURL(targetFile, new PropertyValue[0]);
184cdf0e10cSrcweir 
185*f107c74eSDamjan Jovanovic             System.out.println("... done");
186cdf0e10cSrcweir 
187cdf0e10cSrcweir         } finally {
188cdf0e10cSrcweir             if (xDoc != null) {
189cdf0e10cSrcweir                 util.DesktopTools.closeDoc(xDoc);
190cdf0e10cSrcweir             }
191cdf0e10cSrcweir             if (xListener != null) {
192cdf0e10cSrcweir                 m_xGEB.removeDocumentEventListener(xListener);
193cdf0e10cSrcweir             }
194cdf0e10cSrcweir         }
195cdf0e10cSrcweir     }
196cdf0e10cSrcweir 
197cdf0e10cSrcweir     class EventListener implements XDocumentEventListener
198cdf0e10cSrcweir     {
199cdf0e10cSrcweir         boolean m_isLayoutFinished = false;
IsLayoutFinished()200cdf0e10cSrcweir         boolean IsLayoutFinished() { return m_isLayoutFinished; }
documentEventOccured(DocumentEvent Event)201cdf0e10cSrcweir         public void documentEventOccured(DocumentEvent Event)
202cdf0e10cSrcweir         {
203*f107c74eSDamjan Jovanovic //            System.out.println("event: " + Event.EventName);
204cdf0e10cSrcweir             if ("OnLayoutFinished".equals(Event.EventName))
205cdf0e10cSrcweir             {
206cdf0e10cSrcweir                 // we only have one doc at any time, so no need to check
207cdf0e10cSrcweir                 m_isLayoutFinished = true;
208*f107c74eSDamjan Jovanovic //                System.out.println("received OnLayoutFinished");
209cdf0e10cSrcweir             }
210cdf0e10cSrcweir         }
disposing(EventObject Event)211cdf0e10cSrcweir         public void disposing(EventObject Event) { }
212cdf0e10cSrcweir     }
213cdf0e10cSrcweir 
report2(Exception e)214cdf0e10cSrcweir     void report2(Exception e)
215cdf0e10cSrcweir     {
216cdf0e10cSrcweir         if (e instanceof WrappedTargetException)
217cdf0e10cSrcweir         {
218*f107c74eSDamjan Jovanovic             System.err.println("Cause:");
219cdf0e10cSrcweir             Exception cause = (Exception)
220cdf0e10cSrcweir                 (((WrappedTargetException)e).TargetException);
221*f107c74eSDamjan Jovanovic             System.err.println(cause.toString());
222cdf0e10cSrcweir             report2(cause);
223cdf0e10cSrcweir         } else if (e instanceof WrappedTargetRuntimeException) {
224*f107c74eSDamjan Jovanovic             System.err.println("Cause:");
225cdf0e10cSrcweir             Exception cause = (Exception)
226cdf0e10cSrcweir                 (((WrappedTargetRuntimeException)e).TargetException);
227*f107c74eSDamjan Jovanovic             System.err.println(cause.toString());
228cdf0e10cSrcweir             report2(cause);
229cdf0e10cSrcweir         }
230cdf0e10cSrcweir     }
231cdf0e10cSrcweir 
report(Exception e)232cdf0e10cSrcweir     void report(Exception e) {
233*f107c74eSDamjan Jovanovic         System.err.println("Exception occurred:");
234*f107c74eSDamjan Jovanovic         System.err.println(e.toString());
235*f107c74eSDamjan Jovanovic         e.printStackTrace(System.err);
236cdf0e10cSrcweir         report2(e);
237cdf0e10cSrcweir //        failed();
238cdf0e10cSrcweir     }
239cdf0e10cSrcweir 
getDirAndFileNames(String dir)240cdf0e10cSrcweir     Pair<List<String>, List<String>> getDirAndFileNames(String dir)
241cdf0e10cSrcweir     {
242cdf0e10cSrcweir         List<String> dirs = new ArrayList<String>();
243cdf0e10cSrcweir         List<String> files = new ArrayList<String>();
244cdf0e10cSrcweir         File root = new File(dir);
245cdf0e10cSrcweir         getDirAndFileNames(root, "", dirs, files);
246cdf0e10cSrcweir         return new Pair<List<String>, List<String>>(dirs, files);
247cdf0e10cSrcweir     }
248cdf0e10cSrcweir 
getDirAndFileNames(File file, String relPath, List<String> dirs, List<String> files)249cdf0e10cSrcweir     void getDirAndFileNames(File file, String relPath,
250cdf0e10cSrcweir             List<String> dirs, List<String> files)
251cdf0e10cSrcweir     {
252*f107c74eSDamjan Jovanovic         assertTrue("does not exist: " + relPath, file.exists());
253cdf0e10cSrcweir         if (file.isDirectory()) {
254cdf0e10cSrcweir             dirs.add(relPath);
255cdf0e10cSrcweir             File[] subfiles = file.listFiles();
256cdf0e10cSrcweir             for (File subfile : subfiles)
257cdf0e10cSrcweir             {
258cdf0e10cSrcweir                 String subfileName =
259cdf0e10cSrcweir                     relPath + File.separator + subfile.getName();
260cdf0e10cSrcweir                 getDirAndFileNames(subfile, subfileName, dirs, files);
261cdf0e10cSrcweir             }
262cdf0e10cSrcweir         }
263cdf0e10cSrcweir         else if (file.isFile()) {
264cdf0e10cSrcweir             if (file.getName().endsWith(".odt")) {
265cdf0e10cSrcweir                 files.add(relPath);
266cdf0e10cSrcweir             }
267cdf0e10cSrcweir         }
268cdf0e10cSrcweir     }
269cdf0e10cSrcweir 
makeDirs(String target, List<String> dirs)270cdf0e10cSrcweir     void makeDirs(String target, List<String> dirs) throws Exception
271cdf0e10cSrcweir     {
272cdf0e10cSrcweir         for (String dir : dirs) {
273cdf0e10cSrcweir             File f = new File(target + dir);
274cdf0e10cSrcweir             if (!f.exists()) {
275cdf0e10cSrcweir                 if (!f.mkdir()) {
276cdf0e10cSrcweir                     throw new Exception("cannot mkdir: " + target + dir);
277cdf0e10cSrcweir                 }
278cdf0e10cSrcweir             }
279cdf0e10cSrcweir         }
280cdf0e10cSrcweir     }
281cdf0e10cSrcweir }
282cdf0e10cSrcweir 
283