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