1ef39d40dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3ef39d40dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4ef39d40dSAndrew Rist * or more contributor license agreements. See the NOTICE file
5ef39d40dSAndrew Rist * distributed with this work for additional information
6ef39d40dSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7ef39d40dSAndrew Rist * to you under the Apache License, Version 2.0 (the
8ef39d40dSAndrew Rist * "License"); you may not use this file except in compliance
9ef39d40dSAndrew Rist * with the License. You may obtain a copy of the License at
10ef39d40dSAndrew Rist *
11ef39d40dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12ef39d40dSAndrew Rist *
13ef39d40dSAndrew Rist * Unless required by applicable law or agreed to in writing,
14ef39d40dSAndrew Rist * software distributed under the License is distributed on an
15ef39d40dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16ef39d40dSAndrew Rist * KIND, either express or implied. See the License for the
17ef39d40dSAndrew Rist * specific language governing permissions and limitations
18ef39d40dSAndrew Rist * under the License.
19ef39d40dSAndrew Rist *
20ef39d40dSAndrew Rist *************************************************************/
21ef39d40dSAndrew Rist
22ef39d40dSAndrew Rist
23cdf0e10cSrcweir package helper;
24cdf0e10cSrcweir
25cdf0e10cSrcweir //import com.sun.star.bridge.UnoUrlResolver;
26cdf0e10cSrcweir import com.sun.star.beans.XFastPropertySet;
27cdf0e10cSrcweir import com.sun.star.bridge.XUnoUrlResolver;
28cdf0e10cSrcweir import com.sun.star.container.XEnumeration;
29cdf0e10cSrcweir import com.sun.star.container.XEnumerationAccess;
30cdf0e10cSrcweir import com.sun.star.frame.XDesktop;
31cdf0e10cSrcweir import com.sun.star.lang.XMultiComponentFactory;
32cdf0e10cSrcweir import com.sun.star.lang.XMultiServiceFactory;
33cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
34cdf0e10cSrcweir import com.sun.star.uno.XComponentContext;
35cdf0e10cSrcweir import com.sun.star.util.XCloseable;
36cdf0e10cSrcweir import com.sun.star.util.XStringSubstitution;
37cdf0e10cSrcweir
38cdf0e10cSrcweir import java.io.File;
39cdf0e10cSrcweir import java.io.PrintWriter;
40cdf0e10cSrcweir import java.util.StringTokenizer;
41cdf0e10cSrcweir
42cdf0e10cSrcweir import lib.TestParameters;
43cdf0e10cSrcweir
44cdf0e10cSrcweir import share.DescEntry;
45cdf0e10cSrcweir import share.LogWriter;
46cdf0e10cSrcweir
47cdf0e10cSrcweir import util.DynamicClassLoader;
48cdf0e10cSrcweir import util.PropertyName;
49cdf0e10cSrcweir import util.utils;
50cdf0e10cSrcweir
51cdf0e10cSrcweir /**
52cdf0e10cSrcweir * This class will connect the office and start it if possible
53cdf0e10cSrcweir *
54cdf0e10cSrcweir */
55cdf0e10cSrcweir public class OfficeProvider implements AppProvider
56cdf0e10cSrcweir {
57cdf0e10cSrcweir
58cdf0e10cSrcweir private static boolean debug = false;
59cdf0e10cSrcweir
60cdf0e10cSrcweir /**
61*bb6af6bcSPedro Giffuni * copy the user layer to a safe place, usually to $TMP/user_backup$USER
62cdf0e10cSrcweir * @param param
63cdf0e10cSrcweir * @param msf
64cdf0e10cSrcweir */
backupUserLayer(TestParameters param, XMultiServiceFactory msf)65cdf0e10cSrcweir public void backupUserLayer(TestParameters param, XMultiServiceFactory msf)
66cdf0e10cSrcweir {
67cdf0e10cSrcweir try
68cdf0e10cSrcweir {
69cdf0e10cSrcweir final XStringSubstitution sts = createStringSubstitution(msf);
70cdf0e10cSrcweir debug = param.getBool(PropertyName.DEBUG_IS_ACTIVE);
71cdf0e10cSrcweir
72cdf0e10cSrcweir String userLayer = sts.getSubstituteVariableValue("$(user)");
73cdf0e10cSrcweir userLayer = getDirSys(userLayer);
74cdf0e10cSrcweir param.put("userLayer", userLayer);
75cdf0e10cSrcweir
76cdf0e10cSrcweir final String copyLayer = util.utils.getUsersTempDir() + System.getProperty("file.separator") +
77cdf0e10cSrcweir "user_backup" +
78cdf0e10cSrcweir System.getProperty("user.name");
79cdf0e10cSrcweir param.put("copyLayer", copyLayer);
80cdf0e10cSrcweir
81cdf0e10cSrcweir
82cdf0e10cSrcweir dbg(" copy '" + userLayer + "' ->" + copyLayer + "'");
83cdf0e10cSrcweir // Slow machines the copy job could spend some time. To avoid activating of OfficeWatcher it must be pinged
84cdf0e10cSrcweir OfficeWatcherPing owp = new OfficeWatcherPing((OfficeWatcher) param.get(PropertyName.OFFICE_WATCHER));
85cdf0e10cSrcweir owp.start();
86cdf0e10cSrcweir
87cdf0e10cSrcweir deleteFilesAndDirector (new File(copyLayer));
88cdf0e10cSrcweir FileTools.copyDirectory(new File(userLayer), new File(copyLayer), new String[]
89cdf0e10cSrcweir {
90cdf0e10cSrcweir "temp"
91cdf0e10cSrcweir });
92cdf0e10cSrcweir
93cdf0e10cSrcweir owp.finish();
94cdf0e10cSrcweir
95cdf0e10cSrcweir }
96cdf0e10cSrcweir catch (com.sun.star.container.NoSuchElementException e)
97cdf0e10cSrcweir {
98cdf0e10cSrcweir System.out.println("User Variable '$(user)' not defined.");
99cdf0e10cSrcweir }
100cdf0e10cSrcweir catch (java.io.IOException e)
101cdf0e10cSrcweir {
102cdf0e10cSrcweir System.out.println("Couldn't backup user layer");
103cdf0e10cSrcweir e.printStackTrace();
104cdf0e10cSrcweir }
105cdf0e10cSrcweir }
106cdf0e10cSrcweir
107cdf0e10cSrcweir /**
108cdf0e10cSrcweir * Dispose the office.
109cdf0e10cSrcweir * This method can only be used, if the office was connected in the first
110cdf0e10cSrcweir * place: getManager() was called first.
111cdf0e10cSrcweir * @param param
112cdf0e10cSrcweir * @return return true if desktop is terminates, else false
113cdf0e10cSrcweir */
disposeManager(lib.TestParameters param)114cdf0e10cSrcweir public boolean disposeManager(lib.TestParameters param)
115cdf0e10cSrcweir {
116cdf0e10cSrcweir
117cdf0e10cSrcweir XMultiServiceFactory msf = (XMultiServiceFactory) param.getMSF();
118cdf0e10cSrcweir
119cdf0e10cSrcweir if (msf == null)
120cdf0e10cSrcweir {
121cdf0e10cSrcweir return true;
122cdf0e10cSrcweir }
123cdf0e10cSrcweir else
124cdf0e10cSrcweir {
125cdf0e10cSrcweir XDesktop desk = null;
126cdf0e10cSrcweir
127cdf0e10cSrcweir try
128cdf0e10cSrcweir {
129cdf0e10cSrcweir desk = UnoRuntime.queryInterface(XDesktop.class, msf.createInstance("com.sun.star.frame.Desktop"));
130cdf0e10cSrcweir }
131cdf0e10cSrcweir catch (com.sun.star.uno.Exception ue)
132cdf0e10cSrcweir {
133cdf0e10cSrcweir return false;
134cdf0e10cSrcweir }
135cdf0e10cSrcweir
136cdf0e10cSrcweir msf = null;
137cdf0e10cSrcweir
138cdf0e10cSrcweir if (desk != null)
139cdf0e10cSrcweir {
140cdf0e10cSrcweir desk.terminate();
141cdf0e10cSrcweir
142cdf0e10cSrcweir return true;
143cdf0e10cSrcweir }
144cdf0e10cSrcweir else
145cdf0e10cSrcweir {
146cdf0e10cSrcweir return false;
147cdf0e10cSrcweir }
148cdf0e10cSrcweir }
149cdf0e10cSrcweir }
150cdf0e10cSrcweir
151cdf0e10cSrcweir /**
152cdf0e10cSrcweir * Method to get the ServiceManager of an Office
153cdf0e10cSrcweir * @param param
154cdf0e10cSrcweir * @return
155cdf0e10cSrcweir */
getManager(lib.TestParameters param)156cdf0e10cSrcweir public Object getManager(lib.TestParameters param)
157cdf0e10cSrcweir {
158cdf0e10cSrcweir String errorMessage = null;
159cdf0e10cSrcweir boolean bAppExecutionHasWarning = false;
160cdf0e10cSrcweir debug = param.getBool(PropertyName.DEBUG_IS_ACTIVE);
161cdf0e10cSrcweir
162cdf0e10cSrcweir String additionalArgs = (String) param.get(
163cdf0e10cSrcweir "AdditionalConnectionArguments");
164cdf0e10cSrcweir
165cdf0e10cSrcweir if (additionalArgs == null)
166cdf0e10cSrcweir {
167cdf0e10cSrcweir additionalArgs = ";";
168cdf0e10cSrcweir }
169cdf0e10cSrcweir else
170cdf0e10cSrcweir {
171cdf0e10cSrcweir additionalArgs = "," + additionalArgs + ";";
172cdf0e10cSrcweir }
173cdf0e10cSrcweir
174cdf0e10cSrcweir final String cncstr = "uno:" + param.get("ConnectionString") + ";urp" +
175cdf0e10cSrcweir additionalArgs + "StarOffice.ServiceManager";
176cdf0e10cSrcweir
177cdf0e10cSrcweir System.out.println("Connecting the Office with " + cncstr);
178cdf0e10cSrcweir
179cdf0e10cSrcweir XMultiServiceFactory msf = connectOffice(cncstr);
180cdf0e10cSrcweir
181cdf0e10cSrcweir // if the office is running and the office crashes while testing it could
182cdf0e10cSrcweir // be usesfull to restart the office if possible and continuing the tests.
183cdf0e10cSrcweir // Example: The UNO-API-Tests in the projects will be executed by calling
184cdf0e10cSrcweir // 'damke'. This connects to an existing office. If the office crashes
185*bb6af6bcSPedro Giffuni // it is useful to restart the office and continuing the tests.
186cdf0e10cSrcweir if ((param.getBool(util.PropertyName.AUTO_RESTART)) && (msf != null))
187cdf0e10cSrcweir {
188cdf0e10cSrcweir makeAppExecCommand(msf, param);
189cdf0e10cSrcweir }
190cdf0e10cSrcweir
191cdf0e10cSrcweir if (msf == null)
192cdf0e10cSrcweir {
193cdf0e10cSrcweir String exc = "";
194cdf0e10cSrcweir Exception exConnectFailed = null;
195cdf0e10cSrcweir boolean isExecutable = false;
196cdf0e10cSrcweir boolean isAppKnown = ((cncstr.indexOf("host=localhost") > 0) || (cncstr.indexOf("pipe,name=") > 0));
197cdf0e10cSrcweir isAppKnown &= !((String) param.get("AppExecutionCommand")).equals("");
198cdf0e10cSrcweir
199cdf0e10cSrcweir if (isAppKnown)
200cdf0e10cSrcweir {
201cdf0e10cSrcweir dbg("Local Connection trying to start the Office");
202cdf0e10cSrcweir
203cdf0e10cSrcweir //ensure that a pending officewatcher gets finished before a new
204cdf0e10cSrcweir //office is started
205cdf0e10cSrcweir final OfficeWatcher ow_old = (OfficeWatcher) param.get("Watcher");
206cdf0e10cSrcweir
207cdf0e10cSrcweir if (ow_old != null)
208cdf0e10cSrcweir {
209cdf0e10cSrcweir ow_old.finish = true;
210cdf0e10cSrcweir }
211cdf0e10cSrcweir
212cdf0e10cSrcweir final String cmd = (String) param.get("AppExecutionCommand");
213cdf0e10cSrcweir dbg("AppExecutionCommand: " + cmd);
214cdf0e10cSrcweir // validate the AppExecutionCommand, but try it out anyway.
215cdf0e10cSrcweir // keep the error message for later.
216cdf0e10cSrcweir errorMessage =
217cdf0e10cSrcweir util.utils.validateAppExecutionCommand(cmd, (String) param.get("OperatingSystem"));
218cdf0e10cSrcweir if (errorMessage.startsWith("Error"))
219cdf0e10cSrcweir {
220cdf0e10cSrcweir System.out.println(errorMessage);
221cdf0e10cSrcweir return null;
222cdf0e10cSrcweir }
223cdf0e10cSrcweir bAppExecutionHasWarning = !errorMessage.equals("OK");
224cdf0e10cSrcweir
225cdf0e10cSrcweir final DynamicClassLoader dcl = new DynamicClassLoader();
226cdf0e10cSrcweir final LogWriter log = (LogWriter) dcl.getInstance(
227cdf0e10cSrcweir (String) param.get("LogWriter"));
228cdf0e10cSrcweir
229cdf0e10cSrcweir //create empty entry
230cdf0e10cSrcweir final DescEntry Entry = new DescEntry();
231cdf0e10cSrcweir Entry.entryName = "office";
232cdf0e10cSrcweir Entry.longName = "office";
233cdf0e10cSrcweir Entry.EntryType = "placebo";
234cdf0e10cSrcweir Entry.isOptional = false;
235cdf0e10cSrcweir Entry.isToTest = false;
236cdf0e10cSrcweir Entry.SubEntryCount = 0;
237cdf0e10cSrcweir Entry.hasErrorMsg = false;
238cdf0e10cSrcweir Entry.State = "non possible";
239cdf0e10cSrcweir Entry.UserDefinedParams = param;
240cdf0e10cSrcweir
241cdf0e10cSrcweir log.initialize(Entry, debug);
242cdf0e10cSrcweir
243cdf0e10cSrcweir final ProcessHandler ph = new ProcessHandler(cmd, (PrintWriter) log);
244cdf0e10cSrcweir isExecutable = ph.executeAsynchronously();
245cdf0e10cSrcweir
246cdf0e10cSrcweir if (isExecutable)
247cdf0e10cSrcweir {
248cdf0e10cSrcweir param.put("AppProvider", ph);
249cdf0e10cSrcweir final OfficeWatcher ow = new OfficeWatcher(param);
250cdf0e10cSrcweir param.put("Watcher", ow);
251cdf0e10cSrcweir ow.start();
252cdf0e10cSrcweir ow.ping();
253cdf0e10cSrcweir }
254cdf0e10cSrcweir
255cdf0e10cSrcweir int k = 0;
256cdf0e10cSrcweir
257cdf0e10cSrcweir // wait up to 21 seconds to get an office connection
258cdf0e10cSrcweir while ((k < 42) && (msf == null))
259cdf0e10cSrcweir {
260cdf0e10cSrcweir try
261cdf0e10cSrcweir {
262cdf0e10cSrcweir msf = connect(cncstr);
263cdf0e10cSrcweir }
264cdf0e10cSrcweir catch (com.sun.star.uno.Exception ue)
265cdf0e10cSrcweir {
266cdf0e10cSrcweir exConnectFailed = ue;
267cdf0e10cSrcweir exc = ue.getMessage();
268cdf0e10cSrcweir }
269cdf0e10cSrcweir catch (java.lang.Exception je)
270cdf0e10cSrcweir {
271cdf0e10cSrcweir exConnectFailed = je;
272cdf0e10cSrcweir exc = je.getMessage();
273cdf0e10cSrcweir }
274cdf0e10cSrcweir if (msf == null)
275cdf0e10cSrcweir {
276cdf0e10cSrcweir try
277cdf0e10cSrcweir {
278cdf0e10cSrcweir Thread.sleep(k * 500);
279cdf0e10cSrcweir }
280cdf0e10cSrcweir catch (InterruptedException ex)
281cdf0e10cSrcweir {
282cdf0e10cSrcweir }
283cdf0e10cSrcweir }
284cdf0e10cSrcweir k++;
285cdf0e10cSrcweir }
286cdf0e10cSrcweir
287cdf0e10cSrcweir if (msf == null)
288cdf0e10cSrcweir {
289cdf0e10cSrcweir System.out.println("Exception while connecting.\n" + exConnectFailed);
290cdf0e10cSrcweir if (exc != null)
291cdf0e10cSrcweir {
292cdf0e10cSrcweir System.out.println(exc);
293cdf0e10cSrcweir }
294cdf0e10cSrcweir if (bAppExecutionHasWarning)
295cdf0e10cSrcweir {
296cdf0e10cSrcweir System.out.println(errorMessage);
297cdf0e10cSrcweir }
298cdf0e10cSrcweir }
299cdf0e10cSrcweir else if (isExecutable)
300cdf0e10cSrcweir {
301cdf0e10cSrcweir if (!param.getBool(util.PropertyName.DONT_BACKUP_USERLAYER))
302cdf0e10cSrcweir {
303cdf0e10cSrcweir backupUserLayer(param, msf);
304cdf0e10cSrcweir }
305cdf0e10cSrcweir }
306cdf0e10cSrcweir }
307cdf0e10cSrcweir else
308cdf0e10cSrcweir {
309cdf0e10cSrcweir System.out.println("Could not connect an Office and cannot start one.\n".concat("please start an office with following parameter:\n").
310cdf0e10cSrcweir concat("\nsoffice -accept=").concat((String) param.get("ConnectionString")).concat(";urp;\n"));
311cdf0e10cSrcweir if (bAppExecutionHasWarning)
312cdf0e10cSrcweir {
313cdf0e10cSrcweir System.out.println(errorMessage);
314cdf0e10cSrcweir }
315cdf0e10cSrcweir }
316cdf0e10cSrcweir }
317cdf0e10cSrcweir
318cdf0e10cSrcweir return msf;
319cdf0e10cSrcweir }
320cdf0e10cSrcweir
321cdf0e10cSrcweir /**
322cdf0e10cSrcweir * Connect an Office
323cdf0e10cSrcweir * @param connectStr
324cdf0e10cSrcweir * @return
325cdf0e10cSrcweir * @throws com.sun.star.uno.Exception
326cdf0e10cSrcweir * @throws com.sun.star.uno.RuntimeException
327cdf0e10cSrcweir * @throws com.sun.star.connection.NoConnectException
328cdf0e10cSrcweir * @throws Exception
329cdf0e10cSrcweir */
connect(String connectStr)330cdf0e10cSrcweir protected static XMultiServiceFactory connect(String connectStr)
331cdf0e10cSrcweir throws com.sun.star.uno.Exception,
332cdf0e10cSrcweir com.sun.star.uno.RuntimeException,
333cdf0e10cSrcweir com.sun.star.connection.NoConnectException,
334cdf0e10cSrcweir Exception
335cdf0e10cSrcweir {
336cdf0e10cSrcweir
337cdf0e10cSrcweir // Get component context
338cdf0e10cSrcweir final XComponentContext xcomponentcontext = com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(null);
339cdf0e10cSrcweir
340cdf0e10cSrcweir // initial serviceManager
341cdf0e10cSrcweir final XMultiComponentFactory xLocalServiceManager = xcomponentcontext.getServiceManager();
342cdf0e10cSrcweir
343cdf0e10cSrcweir // create a connector, so that it can contact the office
344cdf0e10cSrcweir // XUnoUrlResolver urlResolver = UnoUrlResolver.create(xcomponentcontext);
345cdf0e10cSrcweir final Object xUrlResolver = xLocalServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", xcomponentcontext);
346cdf0e10cSrcweir final XUnoUrlResolver urlResolver = UnoRuntime.queryInterface(XUnoUrlResolver.class, xUrlResolver);
347cdf0e10cSrcweir
348cdf0e10cSrcweir final Object rInitialObject = urlResolver.resolve(connectStr);
349cdf0e10cSrcweir
350cdf0e10cSrcweir XMultiServiceFactory xMSF = null;
351cdf0e10cSrcweir
352cdf0e10cSrcweir if (rInitialObject != null)
353cdf0e10cSrcweir {
354cdf0e10cSrcweir // debug = true;
355cdf0e10cSrcweir dbg("resolved url");
356cdf0e10cSrcweir
357cdf0e10cSrcweir xMSF = UnoRuntime.queryInterface(XMultiServiceFactory.class, rInitialObject);
358cdf0e10cSrcweir }
359cdf0e10cSrcweir
360cdf0e10cSrcweir return xMSF;
361cdf0e10cSrcweir }
362cdf0e10cSrcweir
363cdf0e10cSrcweir /**
364cdf0e10cSrcweir * Close an office.
365cdf0e10cSrcweir * @param param The test parameters.
366cdf0e10cSrcweir * @param closeIfPossible If true, close even if
367cdf0e10cSrcweir * it was running before the test
368cdf0e10cSrcweir */
closeExistingOffice(lib.TestParameters param, boolean closeIfPossible)369cdf0e10cSrcweir public boolean closeExistingOffice(lib.TestParameters param, boolean closeIfPossible)
370cdf0e10cSrcweir {
371cdf0e10cSrcweir
372cdf0e10cSrcweir XMultiServiceFactory msf = (XMultiServiceFactory) param.getMSF();
373cdf0e10cSrcweir final boolean alreadyConnected = (msf != null);
374cdf0e10cSrcweir debug = param.getBool(PropertyName.DEBUG_IS_ACTIVE);
375cdf0e10cSrcweir
376cdf0e10cSrcweir if (alreadyConnected)
377cdf0e10cSrcweir {
378cdf0e10cSrcweir dbg("try to get ProcessHandler");
379cdf0e10cSrcweir
380cdf0e10cSrcweir final ProcessHandler ph = (ProcessHandler) param.get("AppProvider");
381cdf0e10cSrcweir
382cdf0e10cSrcweir if (ph != null)
383cdf0e10cSrcweir {
384cdf0e10cSrcweir dbg("ProcessHandler != null");
385cdf0e10cSrcweir
386cdf0e10cSrcweir disposeOffice(msf, param);
387cdf0e10cSrcweir
388cdf0e10cSrcweir // dispose watcher in case it's still running.
389cdf0e10cSrcweir dbg("try to get OfficeWatcher");
390cdf0e10cSrcweir
391cdf0e10cSrcweir final OfficeWatcher ow = (OfficeWatcher) param.get("Watcher");
392cdf0e10cSrcweir
393cdf0e10cSrcweir if ((ow != null) && ow.isAlive())
394cdf0e10cSrcweir {
395cdf0e10cSrcweir dbg("OfficeWatcher will be finished");
396cdf0e10cSrcweir ow.finish = true;
397cdf0e10cSrcweir }
398cdf0e10cSrcweir else
399cdf0e10cSrcweir {
400cdf0e10cSrcweir dbg("OfficeWatcher seems to be finished");
401cdf0e10cSrcweir }
402cdf0e10cSrcweir
403cdf0e10cSrcweir return true;
404cdf0e10cSrcweir }
405cdf0e10cSrcweir else
406cdf0e10cSrcweir {
407cdf0e10cSrcweir if (closeIfPossible)
408cdf0e10cSrcweir {
409cdf0e10cSrcweir return disposeOffice(msf, param);
410cdf0e10cSrcweir }
411cdf0e10cSrcweir }
412cdf0e10cSrcweir }
413cdf0e10cSrcweir else
414cdf0e10cSrcweir {
415cdf0e10cSrcweir final String cncstr = "uno:" + param.get("ConnectionString") +
416cdf0e10cSrcweir ";urp;StarOffice.ServiceManager";
417cdf0e10cSrcweir dbg("try to connect office");
418cdf0e10cSrcweir msf = connectOffice(cncstr);
419cdf0e10cSrcweir
420cdf0e10cSrcweir if (closeIfPossible)
421cdf0e10cSrcweir {
422cdf0e10cSrcweir return disposeOffice(msf, param);
423cdf0e10cSrcweir }
424cdf0e10cSrcweir }
425cdf0e10cSrcweir dbg("closeExistingOffice finished");
426cdf0e10cSrcweir return true;
427cdf0e10cSrcweir }
428cdf0e10cSrcweir
connectOffice(String cncstr)429cdf0e10cSrcweir private XMultiServiceFactory connectOffice(String cncstr)
430cdf0e10cSrcweir {
431cdf0e10cSrcweir XMultiServiceFactory msf = null;
432cdf0e10cSrcweir String exc = "";
433cdf0e10cSrcweir // debug = true;
434cdf0e10cSrcweir
435cdf0e10cSrcweir dbg("trying to connect to " + cncstr);
436cdf0e10cSrcweir
437cdf0e10cSrcweir try
438cdf0e10cSrcweir {
439cdf0e10cSrcweir msf = connect(cncstr);
440cdf0e10cSrcweir }
441cdf0e10cSrcweir catch (com.sun.star.uno.Exception ue)
442cdf0e10cSrcweir {
443cdf0e10cSrcweir exc = ue.getMessage();
444cdf0e10cSrcweir }
445cdf0e10cSrcweir catch (java.lang.Exception je)
446cdf0e10cSrcweir {
447cdf0e10cSrcweir exc = je.getMessage();
448cdf0e10cSrcweir }
449cdf0e10cSrcweir
450cdf0e10cSrcweir if (debug && exc != null && exc.length() != 0)
451cdf0e10cSrcweir {
452cdf0e10cSrcweir if (exc == null)
453cdf0e10cSrcweir {
454cdf0e10cSrcweir exc = "";
455cdf0e10cSrcweir }
456cdf0e10cSrcweir dbg("Could not connect an Office. " + exc);
457cdf0e10cSrcweir }
458cdf0e10cSrcweir
459cdf0e10cSrcweir return msf;
460cdf0e10cSrcweir }
461cdf0e10cSrcweir
disposeOffice(XMultiServiceFactory msf, TestParameters param)462cdf0e10cSrcweir private synchronized boolean disposeOffice(XMultiServiceFactory msf,
463cdf0e10cSrcweir TestParameters param)
464cdf0e10cSrcweir {
465cdf0e10cSrcweir XDesktop desk = null;
466cdf0e10cSrcweir
467cdf0e10cSrcweir debug = param.getBool(PropertyName.DEBUG_IS_ACTIVE);
468cdf0e10cSrcweir
469cdf0e10cSrcweir boolean result = true;
470cdf0e10cSrcweir
471cdf0e10cSrcweir if (msf != null)
472cdf0e10cSrcweir {
473cdf0e10cSrcweir
474cdf0e10cSrcweir // disable QuickStarter
475cdf0e10cSrcweir try
476cdf0e10cSrcweir {
477cdf0e10cSrcweir Object quickStarter = msf.createInstance("com.sun.star.office.Quickstart");
478cdf0e10cSrcweir XFastPropertySet fps = UnoRuntime.queryInterface(XFastPropertySet.class, quickStarter);
479cdf0e10cSrcweir fps.setFastPropertyValue(0, false);
480cdf0e10cSrcweir }
481cdf0e10cSrcweir catch (com.sun.star.uno.Exception ex)
482cdf0e10cSrcweir {
483cdf0e10cSrcweir dbg("ERROR: Could not disable QuickStarter: " + ex.toString());
484cdf0e10cSrcweir }
485cdf0e10cSrcweir
486cdf0e10cSrcweir try
487cdf0e10cSrcweir {
488cdf0e10cSrcweir desk = UnoRuntime.queryInterface(XDesktop.class, msf.createInstance("com.sun.star.frame.Desktop"));
489cdf0e10cSrcweir msf = null;
490cdf0e10cSrcweir
491cdf0e10cSrcweir if (desk != null)
492cdf0e10cSrcweir {
493cdf0e10cSrcweir final boolean allClosed = closeAllWindows(desk);
494cdf0e10cSrcweir
495cdf0e10cSrcweir if (!allClosed)
496cdf0e10cSrcweir {
497cdf0e10cSrcweir dbg("Couldn't close all office windows!");
498cdf0e10cSrcweir }
499cdf0e10cSrcweir
500cdf0e10cSrcweir dbg("Trying to terminate the desktop");
501cdf0e10cSrcweir
502cdf0e10cSrcweir desk.terminate();
503cdf0e10cSrcweir dbg("Desktop terminated");
504cdf0e10cSrcweir
505cdf0e10cSrcweir try
506cdf0e10cSrcweir {
507cdf0e10cSrcweir final int closeTime = param.getInt(util.PropertyName.OFFICE_CLOSE_TIME_OUT);
508cdf0e10cSrcweir dbg("the Office has " + closeTime / 1000 + " seconds for closing...");
509cdf0e10cSrcweir Thread.sleep(closeTime);
510cdf0e10cSrcweir }
511cdf0e10cSrcweir catch (java.lang.InterruptedException e)
512cdf0e10cSrcweir {
513cdf0e10cSrcweir }
514cdf0e10cSrcweir }
515cdf0e10cSrcweir }
516cdf0e10cSrcweir catch (com.sun.star.uno.Exception ue)
517cdf0e10cSrcweir {
518cdf0e10cSrcweir result = false;
519cdf0e10cSrcweir }
520cdf0e10cSrcweir catch (com.sun.star.lang.DisposedException ue)
521cdf0e10cSrcweir {
522cdf0e10cSrcweir result = false;
523cdf0e10cSrcweir }
524cdf0e10cSrcweir }
525cdf0e10cSrcweir
526cdf0e10cSrcweir final String AppKillCommand = (String) param.get(util.PropertyName.APP_KILL_COMMAND);
527cdf0e10cSrcweir if (AppKillCommand != null)
528cdf0e10cSrcweir {
529cdf0e10cSrcweir String sAppKillCommand = StringHelper.removeSurroundQuoteIfExists(AppKillCommand);
530cdf0e10cSrcweir final StringTokenizer aKillCommandToken = new StringTokenizer(sAppKillCommand, ";");
531cdf0e10cSrcweir while (aKillCommandToken.hasMoreTokens())
532cdf0e10cSrcweir {
533cdf0e10cSrcweir final String sKillCommand = aKillCommandToken.nextToken();
534cdf0e10cSrcweir dbg("User defined an application to destroy the started process. Trying to execute: " + sKillCommand);
535cdf0e10cSrcweir
536cdf0e10cSrcweir final ProcessHandler pHdl = new ProcessHandler(sKillCommand, 1000); // 3000 seems to be too long
537cdf0e10cSrcweir pHdl.runCommand();
538cdf0e10cSrcweir
539cdf0e10cSrcweir pHdl.kill();
540cdf0e10cSrcweir }
541cdf0e10cSrcweir }
542cdf0e10cSrcweir
543cdf0e10cSrcweir final ProcessHandler ph = (ProcessHandler) param.get("AppProvider");
544cdf0e10cSrcweir
545cdf0e10cSrcweir if (ph != null)
546cdf0e10cSrcweir {
547cdf0e10cSrcweir // dispose watcher in case it's still running.
548cdf0e10cSrcweir final OfficeWatcher ow = (OfficeWatcher) param.get("Watcher");
549cdf0e10cSrcweir
550cdf0e10cSrcweir if ((ow != null) && ow.isAlive())
551cdf0e10cSrcweir {
552cdf0e10cSrcweir ow.finish = true;
553cdf0e10cSrcweir }
554cdf0e10cSrcweir
555cdf0e10cSrcweir ph.kill();
556cdf0e10cSrcweir }
557cdf0e10cSrcweir
558cdf0e10cSrcweir param.remove("AppProvider");
559cdf0e10cSrcweir param.remove("ServiceFactory");
560cdf0e10cSrcweir
561cdf0e10cSrcweir if (!param.getBool(util.PropertyName.DONT_BACKUP_USERLAYER))
562cdf0e10cSrcweir {
563cdf0e10cSrcweir //copy user_backup into user layer
564cdf0e10cSrcweir try
565cdf0e10cSrcweir {
566cdf0e10cSrcweir final String userLayer = (String) param.get("userLayer");
567cdf0e10cSrcweir final String copyLayer = (String) param.get("copyLayer");
568cdf0e10cSrcweir if (userLayer != null && copyLayer != null)
569cdf0e10cSrcweir {
570cdf0e10cSrcweir deleteFilesAndDirector(new File(userLayer));
571cdf0e10cSrcweir final File copyFile = new File(copyLayer);
572cdf0e10cSrcweir dbg("copy '" + copyFile + "' -> '" + userLayer + "'");
573cdf0e10cSrcweir FileTools.copyDirectory(copyFile, new File(userLayer), new String[]
574cdf0e10cSrcweir {
575cdf0e10cSrcweir "temp"
576cdf0e10cSrcweir });
577cdf0e10cSrcweir dbg("copy '" + copyFile + "' -> '" + userLayer + "' finished");
578cdf0e10cSrcweir
579cdf0e10cSrcweir // remove all user_backup folder in temp dir
580cdf0e10cSrcweir // this is for the case the runner was killed and some old backup folder still stay in temp dir
581cdf0e10cSrcweir
582cdf0e10cSrcweir
583cdf0e10cSrcweir }
584cdf0e10cSrcweir else
585cdf0e10cSrcweir {
586cdf0e10cSrcweir System.out.println("Cannot copy layer: '" + copyLayer + "' back to user layer: '" + userLayer + "'");
587cdf0e10cSrcweir }
588cdf0e10cSrcweir }
589cdf0e10cSrcweir catch (java.io.IOException e)
590cdf0e10cSrcweir {
591cdf0e10cSrcweir dbg("Couldn't recover from backup\n" + e.getMessage());
592cdf0e10cSrcweir }
593cdf0e10cSrcweir }
594cdf0e10cSrcweir return result;
595cdf0e10cSrcweir }
596cdf0e10cSrcweir
closeAllWindows(XDesktop desk)597cdf0e10cSrcweir protected boolean closeAllWindows(XDesktop desk)
598cdf0e10cSrcweir {
599cdf0e10cSrcweir final XEnumerationAccess compEnumAccess = desk.getComponents();
600cdf0e10cSrcweir final XEnumeration compEnum = compEnumAccess.createEnumeration();
601cdf0e10cSrcweir boolean res = true;
602cdf0e10cSrcweir
603cdf0e10cSrcweir try
604cdf0e10cSrcweir {
605cdf0e10cSrcweir while (compEnum.hasMoreElements())
606cdf0e10cSrcweir {
607cdf0e10cSrcweir final XCloseable closer = UnoRuntime.queryInterface(XCloseable.class, compEnum.nextElement());
608cdf0e10cSrcweir
609cdf0e10cSrcweir if (closer != null)
610cdf0e10cSrcweir {
611cdf0e10cSrcweir closer.close(true);
612cdf0e10cSrcweir }
613cdf0e10cSrcweir }
614cdf0e10cSrcweir }
615cdf0e10cSrcweir catch (com.sun.star.util.CloseVetoException cve)
616cdf0e10cSrcweir {
617cdf0e10cSrcweir res = false;
618cdf0e10cSrcweir }
619cdf0e10cSrcweir catch (com.sun.star.container.NoSuchElementException nsee)
620cdf0e10cSrcweir {
621cdf0e10cSrcweir res = false;
622cdf0e10cSrcweir }
623cdf0e10cSrcweir catch (com.sun.star.lang.WrappedTargetException wte)
624cdf0e10cSrcweir {
625cdf0e10cSrcweir res = false;
626cdf0e10cSrcweir }
627cdf0e10cSrcweir
628cdf0e10cSrcweir return res;
629cdf0e10cSrcweir }
630cdf0e10cSrcweir
createStringSubstitution(XMultiServiceFactory xMSF)631cdf0e10cSrcweir public static XStringSubstitution createStringSubstitution(XMultiServiceFactory xMSF)
632cdf0e10cSrcweir {
633cdf0e10cSrcweir Object xPathSubst = null;
634cdf0e10cSrcweir
635cdf0e10cSrcweir try
636cdf0e10cSrcweir {
637cdf0e10cSrcweir xPathSubst = xMSF.createInstance(
638cdf0e10cSrcweir "com.sun.star.util.PathSubstitution");
639cdf0e10cSrcweir }
640cdf0e10cSrcweir catch (com.sun.star.uno.Exception e)
641cdf0e10cSrcweir {
642cdf0e10cSrcweir e.printStackTrace();
643cdf0e10cSrcweir }
644cdf0e10cSrcweir
645cdf0e10cSrcweir if (xPathSubst != null)
646cdf0e10cSrcweir {
647cdf0e10cSrcweir return UnoRuntime.queryInterface(XStringSubstitution.class, xPathSubst);
648cdf0e10cSrcweir }
649cdf0e10cSrcweir else
650cdf0e10cSrcweir {
651cdf0e10cSrcweir return null;
652cdf0e10cSrcweir }
653cdf0e10cSrcweir }
654cdf0e10cSrcweir
655cdf0e10cSrcweir /**
656cdf0e10cSrcweir * converts directory without 'file:///' prefix.
657cdf0e10cSrcweir * and System dependend file separator
658cdf0e10cSrcweir * @param dir
659cdf0e10cSrcweir * @return
660cdf0e10cSrcweir */
getDirSys(String dir)661cdf0e10cSrcweir public static String getDirSys(String dir)
662cdf0e10cSrcweir {
663cdf0e10cSrcweir String sysDir = "";
664cdf0e10cSrcweir
665cdf0e10cSrcweir final int idx = dir.indexOf("file://");
666cdf0e10cSrcweir
667cdf0e10cSrcweir final int idx2 = dir.indexOf("file:///");
668cdf0e10cSrcweir
669cdf0e10cSrcweir // remove leading 'file://'
670cdf0e10cSrcweir if (idx < 0)
671cdf0e10cSrcweir {
672cdf0e10cSrcweir sysDir = dir;
673cdf0e10cSrcweir }
674cdf0e10cSrcweir else
675cdf0e10cSrcweir {
676cdf0e10cSrcweir sysDir = dir.substring("file://".length());
677cdf0e10cSrcweir }
678cdf0e10cSrcweir
679cdf0e10cSrcweir sysDir = utils.replaceAll13(sysDir, "%20", " ");
680cdf0e10cSrcweir
681cdf0e10cSrcweir // append '/' if not there (e.g. linux)
682cdf0e10cSrcweir if (sysDir.charAt(sysDir.length() - 1) != '/')
683cdf0e10cSrcweir {
684cdf0e10cSrcweir sysDir += "/";
685cdf0e10cSrcweir }
686cdf0e10cSrcweir
687cdf0e10cSrcweir // remove leading '/' and replace others with '\' on windows machines
688cdf0e10cSrcweir final String sep = System.getProperty("file.separator");
689cdf0e10cSrcweir
690cdf0e10cSrcweir if (sep.equalsIgnoreCase("\\"))
691cdf0e10cSrcweir {
692cdf0e10cSrcweir if (!(idx2 < 0))
693cdf0e10cSrcweir {
694cdf0e10cSrcweir sysDir = sysDir.substring(1);
695cdf0e10cSrcweir }
696cdf0e10cSrcweir else
697cdf0e10cSrcweir {
698cdf0e10cSrcweir //network path
699cdf0e10cSrcweir sysDir = "//" + sysDir;
700cdf0e10cSrcweir }
701cdf0e10cSrcweir sysDir = sysDir.replace('/', '\\');
702cdf0e10cSrcweir }
703cdf0e10cSrcweir
704cdf0e10cSrcweir return sysDir;
705cdf0e10cSrcweir }
706cdf0e10cSrcweir
707cdf0e10cSrcweir /**
708cdf0e10cSrcweir * If the office is connected but the <CODE>AppExecutionCommand</CODE> is not set,
709cdf0e10cSrcweir * this function asks the office for its location and fill the
710cdf0e10cSrcweir * <CODE>AppExecutionCommand</CODE> with valid contet.
711cdf0e10cSrcweir * This function was only called if parameter <CODE>AutoRestart</CODE> is set.
712cdf0e10cSrcweir * @param msf the <CODE>MultiServiceFactory</CODE>
713cdf0e10cSrcweir * @param param the <CODE>TestParameters</CODE>
714cdf0e10cSrcweir */
makeAppExecCommand(XMultiServiceFactory msf, TestParameters param)715cdf0e10cSrcweir private static void makeAppExecCommand(XMultiServiceFactory msf, TestParameters param)
716cdf0e10cSrcweir {
717cdf0e10cSrcweir debug = param.getBool(PropertyName.DEBUG_IS_ACTIVE);
718cdf0e10cSrcweir
719cdf0e10cSrcweir // get existing AppExecutionCommand if available, else empty string
720cdf0e10cSrcweir String command = (String) param.get(util.PropertyName.APP_EXECUTION_COMMAND);
721cdf0e10cSrcweir
722cdf0e10cSrcweir String connectionString;
723cdf0e10cSrcweir if (param.getBool(util.PropertyName.USE_PIPE_CONNECTION) == true)
724cdf0e10cSrcweir {
725cdf0e10cSrcweir // This is the default behaviour
726cdf0e10cSrcweir connectionString = (String) param.get(util.PropertyName.PIPE_CONNECTION_STRING);
727cdf0e10cSrcweir }
728cdf0e10cSrcweir else
729cdf0e10cSrcweir {
730cdf0e10cSrcweir // is used if UsePipeConnection=false
731cdf0e10cSrcweir connectionString = (String) param.get(util.PropertyName.CONNECTION_STRING);
732cdf0e10cSrcweir }
733cdf0e10cSrcweir
734cdf0e10cSrcweir String sysBinDir = "";
735cdf0e10cSrcweir
736cdf0e10cSrcweir try
737cdf0e10cSrcweir {
738cdf0e10cSrcweir sysBinDir = utils.getSystemURL(utils.expandMacro(msf, "$SYSBINDIR"));
739cdf0e10cSrcweir }
740cdf0e10cSrcweir catch (java.lang.Exception e)
741cdf0e10cSrcweir {
742cdf0e10cSrcweir dbg("could not get system binary directory");
743cdf0e10cSrcweir return;
744cdf0e10cSrcweir }
745cdf0e10cSrcweir
746cdf0e10cSrcweir // does the existing command show to the connected office?
747cdf0e10cSrcweir if (command.indexOf(sysBinDir) == -1)
748cdf0e10cSrcweir {
749cdf0e10cSrcweir command = sysBinDir + System.getProperty("file.separator") + "soffice" +
750cdf0e10cSrcweir " -norestore -accept=" + connectionString + ";urp;";
751cdf0e10cSrcweir }
752cdf0e10cSrcweir
753cdf0e10cSrcweir dbg("update AppExecutionCommand: " + command);
754cdf0e10cSrcweir
755cdf0e10cSrcweir param.put(util.PropertyName.APP_EXECUTION_COMMAND, command);
756cdf0e10cSrcweir }
757cdf0e10cSrcweir
dbg(String message)758cdf0e10cSrcweir private static void dbg(String message)
759cdf0e10cSrcweir {
760cdf0e10cSrcweir if (debug)
761cdf0e10cSrcweir {
762cdf0e10cSrcweir System.out.println(utils.getDateTime() + "OfficeProvider: " + message);
763cdf0e10cSrcweir }
764cdf0e10cSrcweir
765cdf0e10cSrcweir }
766cdf0e10cSrcweir
767cdf0e10cSrcweir private class OfficeWatcherPing extends Thread
768cdf0e10cSrcweir {
769cdf0e10cSrcweir
770cdf0e10cSrcweir private final OfficeWatcher ow;
771cdf0e10cSrcweir private boolean bStop = false;
772cdf0e10cSrcweir
OfficeWatcherPing(OfficeWatcher ow)773cdf0e10cSrcweir public OfficeWatcherPing(OfficeWatcher ow)
774cdf0e10cSrcweir {
775cdf0e10cSrcweir this.ow = ow;
776cdf0e10cSrcweir }
777cdf0e10cSrcweir
778cdf0e10cSrcweir @Override
run()779cdf0e10cSrcweir public void run()
780cdf0e10cSrcweir {
781cdf0e10cSrcweir System.out.println(utils.getDateTime() + "OfficeProvider:Owp: start ");
782cdf0e10cSrcweir
783cdf0e10cSrcweir while (!bStop)
784cdf0e10cSrcweir {
785cdf0e10cSrcweir System.out.println(utils.getDateTime() + "OfficeProvider:Owp: ping ");
786cdf0e10cSrcweir ow.ping();
787cdf0e10cSrcweir try
788cdf0e10cSrcweir {
789cdf0e10cSrcweir System.out.println(utils.getDateTime() + "OfficeProvider:Owp: sleep ");
790cdf0e10cSrcweir OfficeWatcherPing.sleep(1000); // 5000
791cdf0e10cSrcweir }
792cdf0e10cSrcweir catch (InterruptedException ex)
793cdf0e10cSrcweir {
794cdf0e10cSrcweir ex.printStackTrace();
795cdf0e10cSrcweir }
796cdf0e10cSrcweir }
797cdf0e10cSrcweir
798cdf0e10cSrcweir }
799cdf0e10cSrcweir
finish()800cdf0e10cSrcweir public void finish()
801cdf0e10cSrcweir {
802cdf0e10cSrcweir synchronized(this)
803cdf0e10cSrcweir {
804cdf0e10cSrcweir bStop = true;
805cdf0e10cSrcweir System.out.println(utils.getDateTime() + "OfficeProvider:Owp: stop ");
806cdf0e10cSrcweir
807cdf0e10cSrcweir notify();
808cdf0e10cSrcweir }
809cdf0e10cSrcweir }
810cdf0e10cSrcweir }
811cdf0e10cSrcweir
deleteFilesAndDirector(File file)812cdf0e10cSrcweir private void deleteFilesAndDirector(File file)
813cdf0e10cSrcweir {
814cdf0e10cSrcweir File f = file;
815cdf0e10cSrcweir if(f.isDirectory())
816cdf0e10cSrcweir {
817cdf0e10cSrcweir File files[] = f.listFiles();
818cdf0e10cSrcweir for(int i = 0; i < files.length; i++)
819cdf0e10cSrcweir {
820cdf0e10cSrcweir deleteFilesAndDirector(files[i]);
821cdf0e10cSrcweir }
822cdf0e10cSrcweir f.delete();
823cdf0e10cSrcweir }
824cdf0e10cSrcweir else if (f.isFile())
825cdf0e10cSrcweir {
826cdf0e10cSrcweir f.delete();
827cdf0e10cSrcweir }
828cdf0e10cSrcweir }
829cdf0e10cSrcweir }
830