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