Version 3.6.0.4, tag libreoffice-3.6.0.4
[LibreOffice.git] / qadevOOo / runner / util / utils.java
blob541ca750e36cee0f2f130c5978d81f1cf8c79091
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2000, 2010 Oracle and/or its affiliates.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * This file is part of OpenOffice.org.
11 * OpenOffice.org is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License version 3
13 * only, as published by the Free Software Foundation.
15 * OpenOffice.org is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License version 3 for more details
19 * (a copy is included in the LICENSE file that accompanied this code).
21 * You should have received a copy of the GNU Lesser General Public License
22 * version 3 along with OpenOffice.org. If not, see
23 * <http://www.openoffice.org/license.html>
24 * for a copy of the LGPLv3 License.
26 ************************************************************************/
27 package util;
29 import com.sun.star.frame.XController;
30 import com.sun.star.frame.XDispatch;
31 import com.sun.star.frame.XDispatchProvider;
32 import com.sun.star.frame.XModel;
33 import com.sun.star.lang.XComponent;
34 import java.lang.System;
35 import java.util.StringTokenizer;
36 import java.io.*;
37 import java.util.ArrayList;
38 import java.io.RandomAccessFile;
39 import java.net.Socket;
40 import java.net.ServerSocket;
41 import java.net.URI;
42 import java.net.URISyntaxException;
44 import com.sun.star.beans.XPropertySet;
45 import com.sun.star.beans.Property;
46 import com.sun.star.lang.XMultiServiceFactory;
47 import com.sun.star.uno.UnoRuntime;
48 import com.sun.star.ucb.InteractiveAugmentedIOException;
49 import com.sun.star.ucb.XSimpleFileAccess;
50 import com.sun.star.lang.XServiceInfo;
52 import com.sun.star.util.URL;
53 import com.sun.star.util.XURLTransformer;
55 import com.sun.star.uno.AnyConverter;
56 import com.sun.star.uno.Type;
57 import com.sun.star.uno.XComponentContext;
58 import com.sun.star.util.XMacroExpander;
59 import java.text.DecimalFormat;
60 import java.util.Calendar;
62 import java.util.Collections;
63 import java.util.GregorianCalendar;
65 public class utils {
67 /**
69 * This method adds the DOCPTH to a given file
71 * @param sDocName the file which should be completed to the test doc path
72 * @return $TESTDOCPATH/sDocName
74 public static String getFullTestDocName(String sDocName) {
75 String docpth = System.getProperty("DOCPTH");
76 if (docpth.endsWith("\\") || docpth.endsWith("/")) {
77 docpth = docpth.substring(0, docpth.length() - 1);
80 System.out.println("docpth:" + docpth);
82 String pthSep = System.getProperty("file.separator");
84 if (docpth.equals("unknown")) {
85 System.out.println("try to get tDoc from $SRC_ROOT/qadevOOo");
86 String srcRoot = System.getProperty(PropertyName.SRC_ROOT);
87 if (srcRoot != null) {
88 File srcR = new File(srcRoot);
89 String[] list = srcR.list(new FilenameFilter() {
91 public boolean accept(File dir, String name) {
92 return name.startsWith("qadevOOo");
94 });
96 if (list[0] != null) {
97 String tDoc = srcRoot.concat(pthSep).concat(list[0]).concat(pthSep).concat("testdocs");
99 if (new File(tDoc).exists()) {
100 docpth = tDoc;
106 if (docpth.startsWith("http:")) {
107 return docpth + "/" + sDocName;
109 String testdocPth = "";
111 if (docpth.equals("unknown")) {
112 System.out.println("try to get tDoc from OBJDSCS");
113 String objdscPth = System.getProperty("OBJDSCS");
114 if (objdscPth != null) {
115 int i = objdscPth.indexOf("objdsc");
116 String arcPth = objdscPth.substring(0, i - 1);
117 testdocPth = arcPth + pthSep + "doc" + pthSep + "java" +
118 pthSep + "testdocs" + pthSep + sDocName;
120 } else {
121 testdocPth = docpth + pthSep + sDocName;
123 return testdocPth;
128 * This method adds the DOCPTH to a given file
129 * and changes the format to an file URL
132 public static String getFullTestURL(String sDocName) {
133 String fullDocPath = getFullTestDocName(sDocName);
134 if (fullDocPath.startsWith("http:")) {
135 return fullDocPath;
137 if (fullDocPath.startsWith("file:")) {
138 return fullDocPath;
140 String prefix = null;
142 // Windows: \\\\margritte\\qaapi\\workspace\\qadev\\testdocs/emptyChart.sds
143 if (fullDocPath.startsWith("\\\\")) {
144 prefix = "file:";
147 fullDocPath = fullDocPath.replace('\\', '/');
148 if (prefix == null) {
149 if (fullDocPath.startsWith("//")) {
150 prefix = "file:/";
151 } else if (fullDocPath.startsWith("/")) {
152 prefix = "file://";
153 } else {
154 prefix = "file:///";
157 if (!fullDocPath.endsWith("/")) {
158 File aFile = new File(fullDocPath);
159 if (aFile.isDirectory()) {
160 fullDocPath += "/";
163 String fulldocURL = prefix + fullDocPath;
164 return fulldocURL;
169 * This method changes a given URL to a valid file URL
172 public static String getFullURL(String sDocName) {
173 String fullDocPath = sDocName;
174 fullDocPath = fullDocPath.replace('\\', '/');
176 if (fullDocPath.startsWith("http:")) {
177 return fullDocPath;
179 if (fullDocPath.startsWith("ftp:")) {
180 return fullDocPath;
182 String prefix = "";
183 if (!fullDocPath.startsWith("file:///")) {
184 if (fullDocPath.startsWith("//")) {
185 prefix = "file:";
186 } else {
187 if (fullDocPath.startsWith("/")) {
188 prefix = "file://";
189 // if (helper.OSHelper.isLinuxIntel())
190 // {
191 // prefix = "file:/";
192 // }
194 else
196 prefix = "file:///";
200 if (!fullDocPath.endsWith("/")) {
201 File aFile = new File(fullDocPath);
202 if (aFile.isDirectory()) {
203 fullDocPath += "/";
206 String fulldocURL = prefix + fullDocPath;
208 return fulldocURL;
213 * This method creates folders needed
216 public static void make_Directories(String first, String path) {
217 String already_done = null;
218 String fs = System.getProperty("file.separator");
219 StringTokenizer path_tokenizer = new StringTokenizer(path, fs, false);
220 already_done = first;
221 while (path_tokenizer.hasMoreTokens()) {
222 String part = path_tokenizer.nextToken();
223 File new_dir = new File(already_done + File.separatorChar + part);
224 already_done = new_dir.toString();
225 //create the directory
226 new_dir.mkdirs();
228 return;
233 * This method get the version for a given TestBase/platform combination
236 public static String getVersion(String aFile, String aPlatform, String aTestbase) {
237 if ((aFile == null) || (aPlatform == null) || (aTestbase == null)) {
238 return "/";
241 File the_file = new File(aFile);
242 try {
243 RandomAccessFile raf = new RandomAccessFile(the_file, "r");
244 String res = "";
245 while (!res.equals("[" + aTestbase.toUpperCase() + "]")) {
246 res = raf.readLine();
248 res = "=/";
249 while ((!res.startsWith(aPlatform)) || (res.startsWith("["))) {
250 res = raf.readLine();
252 raf.close();
253 if (res.startsWith("[")) {
254 res = "/";
256 return res.substring(res.indexOf("=") + 1);
258 } catch (Exception e) {
259 System.out.println("Couldn't find version");
260 return "/";
266 * This method get's the user dir of the connected office
269 public static String getOfficeUserPath(XMultiServiceFactory msf) {
270 String userPath = null;
272 // get a folder wich is located in the user dir
273 try {
274 userPath = (String) getOfficeSettingsValue(msf, "UserConfig");
275 } catch (Exception e) {
276 System.out.println("Couldn't get Office User Path");
277 e.printStackTrace();
280 // strip the returned folder to the user dir
281 if (userPath.charAt(userPath.length() - 1) == '/') {
282 userPath = userPath.substring(0, userPath.length() - 1);
284 int index = userPath.lastIndexOf('/');
285 if (index != -1) {
286 userPath = userPath.substring(0, index);
289 return userPath;
293 * In the office there are some sttetings available. This function
294 * returns the value of the given setting name. For Example the setting name "Temp"
295 * "Temp" returns the temp folder of the office instance.
296 * @param msf a XMultiServiceFactory
297 * @param setting the name of the setting the value should be returned.
298 * For example "Temp" reutrns the temp folder of the current office instance.
299 * @see com.sun.star.util.PathSettings
300 * @return the value as String
302 public static String getOfficeSettingsValue(XMultiServiceFactory msf, String setting) {
304 String settingPath = null;
305 try {
306 Object settings = msf.createInstance("com.sun.star.comp.framework.PathSettings");
307 XPropertySet pthSettings = null;
308 try {
309 pthSettings = (XPropertySet) AnyConverter.toObject(
310 new Type(XPropertySet.class), settings);
311 } catch (com.sun.star.lang.IllegalArgumentException iae) {
312 System.out.println("### couldn't get Office Settings");
314 settingPath = (String) pthSettings.getPropertyValue(setting);
316 } catch (Exception e) {
317 System.out.println("Couldn't get stting value for " + setting);
318 e.printStackTrace();
320 return settingPath;
323 public static void setOfficeSettingsValue(XMultiServiceFactory msf, String setting, String value) {
325 String settingPath = null;
326 try {
327 Object settings = msf.createInstance("com.sun.star.comp.framework.PathSettings");
328 XPropertySet pthSettings = null;
329 try {
330 pthSettings = (XPropertySet) AnyConverter.toObject(
331 new Type(XPropertySet.class), settings);
332 } catch (com.sun.star.lang.IllegalArgumentException iae) {
333 System.out.println("### couldn't get Office Settings");
335 pthSettings.setPropertyValue(setting, value);
337 } catch (Exception e) {
338 System.out.println("Couldn't set '" + setting + "' to value '" + value + "'");
339 e.printStackTrace();
344 * This method returns the temp dicrectory of the user.
345 * Since Java 1.4 it is not possible to read environment variables. To workaround
346 * this, the Java parameter -D could be used.
348 public static String getUsersTempDir() {
349 String tempDir = System.getProperty("my.temp");
350 if (tempDir == null) {
351 tempDir = System.getProperty("my.tmp");
352 if (tempDir == null) {
353 tempDir = System.getProperty("java.io.tmpdir");
356 // remove ending file separator
357 if (tempDir.endsWith(System.getProperty("file.separator"))) {
358 tempDir = tempDir.substring(0, tempDir.length() - 1);
361 return tempDir;
366 * This method get's the temp dir of the connected office
369 public static String getOfficeTemp(XMultiServiceFactory msf) {
370 String url = getOfficeUserPath(msf) + "/test-temp/";
371 try {
372 new File(new URI(url)).mkdir();
373 } catch (URISyntaxException e) {
374 throw new RuntimeException(e);
376 return url;
380 * Gets StarOffice temp directory without 'file:///' prefix.
381 * For example is usefull for Registry URL specifying.
382 * @msf Office factory for accessing its settings.
383 * @return SOffice temporary directory in form for example
384 * 'd:/Office60/user/temp/'.
386 public static String getOfficeTempDir(XMultiServiceFactory msf) {
388 String dir = getOfficeTemp(msf);
390 int idx = dir.indexOf("file:///");
392 if (idx < 0) {
393 return dir;
396 dir = dir.substring("file:///".length());
398 idx = dir.indexOf(":");
400 // is the last character a '/' or a '\'?
401 boolean lastCharSet = dir.endsWith("/") || dir.endsWith("\\");
403 if (idx < 0) { // linux or solaris
404 dir = "/" + dir;
405 dir += lastCharSet ? "" : "/";
406 } else { // windows
407 dir += lastCharSet ? "" : "\\";
410 return dir;
414 * Gets StarOffice temp directory without 'file:///' prefix.
415 * and System dependend file separator
417 public static String getOfficeTempDirSys(XMultiServiceFactory msf) {
419 String dir = getOfficeTemp(msf);
420 String sysDir = "";
422 int idx = dir.indexOf("file://");
424 // remove leading 'file://'
425 if (idx < 0) {
426 sysDir = dir;
427 } else {
428 sysDir = dir.substring("file://".length());
431 // append '/' if not there (e.g. linux)
432 if (sysDir.charAt(sysDir.length() - 1) != '/') {
433 sysDir += "/";
436 // remove leading '/' and replace others with '\' on windows machines
437 if (sysDir.indexOf(":") != -1) {
438 sysDir = sysDir.substring(1);
439 sysDir = sysDir.replace('/', '\\');
441 return sysDir;
445 * converts a fileURL to a system URL
446 * @param a file URL
447 * @return a system URL
449 public static String getSystemURL(String fileURL) {
450 String sysDir = "";
452 int idx = fileURL.indexOf("file://");
454 // remove leading 'file://'
455 if (idx < 0) {
456 sysDir = fileURL;
457 } else {
458 sysDir = fileURL.substring("file://".length());
461 // remove leading '/' and replace others with '\' on windows machines
462 if (sysDir.indexOf(":") != -1) {
463 sysDir = sysDir.substring(1);
464 sysDir = sysDir.replace('/', '\\');
466 return sysDir;
470 * This method check via Office the existance of the given file URL
471 * @param msf the multiservice factory
472 * @param fileURL the file which existance should be checked
473 * @return true if the file exists, else false
475 public static boolean fileExists(XMultiServiceFactory msf, String fileURL) {
476 boolean exists = false;
477 try {
479 Object fileacc = msf.createInstance("com.sun.star.comp.ucb.SimpleFileAccess");
480 XSimpleFileAccess simpleAccess = (XSimpleFileAccess) UnoRuntime.queryInterface(XSimpleFileAccess.class,
481 fileacc);
482 if (simpleAccess.exists(fileURL)) {
483 exists = true;
486 } catch (Exception e) {
487 System.out.println("Couldn't access file '" + fileURL + "'");
488 e.printStackTrace();
489 exists = false;
491 return exists;
495 * This method deletes via office the given file URL. It checks the existance
496 * of <CODE>fileURL</CODE>. If exists it will be deletet.
497 * @param msf the multiservice factory
498 * @param fileURL the file to delete
499 * @return true if the file could be deletet or the file does not exist
501 public static boolean deleteFile(XMultiServiceFactory xMsf, String fileURL) {
502 boolean delete = true;
503 try {
505 Object fileacc = xMsf.createInstance("com.sun.star.comp.ucb.SimpleFileAccess");
506 XSimpleFileAccess simpleAccess = (XSimpleFileAccess) UnoRuntime.queryInterface(XSimpleFileAccess.class,
507 fileacc);
508 if (simpleAccess.exists(fileURL)) {
509 simpleAccess.kill(fileURL);
512 } catch (Exception e) {
513 System.out.println("Couldn't delete file '" + fileURL + "'");
514 e.printStackTrace();
515 delete = false;
517 return delete;
521 * This method copies via office a given file to a new one
522 * @param msf the multi service factory
523 * @param oldF the source file
524 * @param newF the destination file
525 * @return true at success
527 public static boolean copyFile(XMultiServiceFactory xMsf, String source, String destinaion) {
528 boolean res = false;
529 try {
530 Object fileacc = xMsf.createInstance("com.sun.star.comp.ucb.SimpleFileAccess");
531 XSimpleFileAccess simpleAccess = (XSimpleFileAccess) UnoRuntime.queryInterface(XSimpleFileAccess.class,
532 fileacc);
533 if (!simpleAccess.exists(destinaion)) {
534 simpleAccess.copy(source, destinaion);
537 res = true;
538 } catch (Exception e) {
539 System.out.println("Couldn't copy file '" + source + "' -> '" + destinaion + "'");
540 e.printStackTrace();
541 res = false;
543 return res;
546 private static void overwriteFile_impl(
547 XMultiServiceFactory xMsf, String oldF, String newF)
548 throws InteractiveAugmentedIOException
550 try {
551 Object fileacc = xMsf.createInstance("com.sun.star.comp.ucb.SimpleFileAccess");
553 XSimpleFileAccess simpleAccess = (XSimpleFileAccess) UnoRuntime.queryInterface(XSimpleFileAccess.class,
554 fileacc);
555 if (simpleAccess.exists(newF)) {
556 simpleAccess.kill(newF);
558 simpleAccess.copy(oldF, newF);
559 } catch (InteractiveAugmentedIOException e) {
560 throw e;
561 } catch (com.sun.star.uno.Exception e) {
562 System.out.println("Couldn't copy " + oldF + " to " + newF + ":");
563 e.printStackTrace();
564 throw new RuntimeException(e);
569 * Copies file to a new location using OpenOffice.org features. If the target
570 * file already exists, the file is deleted.
572 * @returns <code>true</code> if the file was successfully copied,
573 * <code>false</code> if some errors occurred (e.g. file is locked, used
574 * by another process).
576 public static boolean tryOverwriteFile(
577 XMultiServiceFactory xMsf, String oldF, String newF)
579 try {
580 overwriteFile_impl(xMsf, oldF, newF);
581 } catch (InteractiveAugmentedIOException e) {
582 return false;
584 return true;
587 public static void doOverwriteFile(
588 XMultiServiceFactory xMsf, String oldF, String newF)
590 try {
591 overwriteFile_impl(xMsf, oldF, newF);
592 } catch (InteractiveAugmentedIOException e) {
593 throw new RuntimeException(e);
597 public static boolean hasPropertyByName(XPropertySet props, String aName) {
598 Property[] list = props.getPropertySetInfo().getProperties();
599 boolean res = false;
600 for (int i = 0; i < list.length; i++) {
601 String the_name = list[i].Name;
602 if (aName.equals(the_name)) {
603 res = true;
606 return res;
611 * This method returns the implementation name of a given object
614 public static String getImplName(Object aObject) {
615 String res = "Error getting Implementation name";
616 try {
617 XServiceInfo xSI = (XServiceInfo) UnoRuntime.queryInterface(XServiceInfo.class, aObject);
618 res = xSI.getImplementationName();
619 } catch (Exception e) {
620 res = "Error getting Implementation name ( " + e + " )";
623 return res;
628 * This method checks if an Object is void
631 public static boolean isVoid(Object aObject) {
632 if (aObject instanceof com.sun.star.uno.Any) {
633 com.sun.star.uno.Any oAny = (com.sun.star.uno.Any) aObject;
634 return (oAny.getType().getTypeName().equals("void"));
635 } else {
636 return false;
643 * This method replaces a substring with another
646 public static String replacePart(String all, String toReplace, String replacement) {
647 return replaceAll13(all, toReplace, replacement);
651 * Scan localhost for the next free port-number from a starting port
652 * on. If the starting port is smaller than 1024, port number starts with
653 * 10000 as default, because numbers < 1024 are never free on unix machines.
654 * @param startPort The port where scanning starts.
655 * @return The next free port.
657 public static int getNextFreePort(int startPort) {
658 if (startPort < 1024) {
659 startPort = 10000;
661 for (int port = startPort; port < 65536; port++) {
662 System.out.println("Scan port " + port);
663 try {
664 // first trying to establish a server-socket on localhost
665 // fails if there is already a server running
666 ServerSocket sSock = new ServerSocket(port);
667 sSock.close();
668 } catch (IOException e) {
669 System.out.println(" -> server: occupied port " + port);
670 continue;
672 try {
673 // now trying to establish a client-socket
674 // fails if there is no server on any connectable machine
675 Socket sock = new Socket("localhost", port);
676 System.out.println(" -> socket: occupied port: " + port);
677 } catch (IOException e) {
678 System.out.println(" -> free port");
679 return port;
682 return 65535;
685 public static URL parseURL(XMultiServiceFactory xMSF, String url) {
686 URL[] rUrl = new URL[1];
687 rUrl[0] = new URL();
688 rUrl[0].Complete = url;
690 XURLTransformer xTrans = null;
691 try {
692 Object inst = xMSF.createInstance("com.sun.star.util.URLTransformer");
693 xTrans = (XURLTransformer) UnoRuntime.queryInterface(XURLTransformer.class, inst);
694 } catch (com.sun.star.uno.Exception e) {
697 xTrans.parseStrict(rUrl);
699 return rUrl[0];
702 public static String getOfficeURL(XMultiServiceFactory msf) {
703 try {
704 Object settings = msf.createInstance("com.sun.star.util.PathSettings");
705 XPropertySet settingProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, settings);
706 String path = (String) settingProps.getPropertyValue("Module");
707 return path;
708 } catch (Exception e) {
709 System.out.println("Couldn't get Office Settings ");
710 e.printStackTrace();
712 return null;
715 /** returns the path to the office binary folder
717 * @param msf The XMultiSeriveFactory
718 * @return the path to the office binrary or an empty string on any error
720 public static String getOfficeBinPath(XMultiServiceFactory msf) {
721 String sysBinDir = "";
722 try {
723 sysBinDir = utils.getSystemURL(utils.expandMacro(msf, "$SYSBINDIR"));
724 } catch (java.lang.Exception e) {
727 return sysBinDir;
731 * Get an array of all property names from the property set. With the include
732 * and exclude parameters the properties can be filtered. <br>
733 * Set excludePropertyAttribute = 0 and includePropertyAttribute = 0
734 * to include all and exclude none.
735 * @param props The instance of XPropertySet
736 * @param includePropertyAttribute Properties without these attributes are filtered and will not be returned.
737 * @param excludePropertyAttribute Properties with these attributes are filtered and will not be returned.
738 * @return A String array with all property names.
739 * @see com.sun.star.beans.XPropertySet
740 * @see com.sun.star.beans.Property
741 * @see com.sun.star.beans.PropertyAttribute
743 public static String[] getFilteredPropertyNames(XPropertySet props, short includePropertyAttribute,
744 short excludePropertyAttribute) {
745 Property[] the_props = props.getPropertySetInfo().getProperties();
746 ArrayList l = new ArrayList();
747 for (int i = 0; i < the_props.length; i++) {
748 boolean exclude = ((the_props[i].Attributes & excludePropertyAttribute) != 0);
749 boolean include = (includePropertyAttribute == 0) ||
750 ((the_props[i].Attributes & includePropertyAttribute) != 0);
751 if (include && !exclude) {
752 l.add(the_props[i].Name);
755 Collections.sort(l);
756 String[] names = new String[l.size()];
757 names = (String[]) l.toArray(names);
758 return names;
761 /** Causes the thread to sleep some time.
762 * It can be used f.e. like:
763 * util.utils.shortWait(tParam.getInt("ShortWait"));
765 public static void shortWait(int milliseconds) {
766 try {
767 Thread.currentThread().sleep(milliseconds);
768 } catch (InterruptedException e) {
769 System.out.println("While waiting :" + e);
774 * Validate the AppExecutionCommand. Returned is an error message, starting
775 * with "Error:", or a warning, if the command might work.
776 * @param appExecCommand The application execution command that is checked.
777 * @param os The operating system where the check runs.
778 * @return The error message, or OK, if no error was detected.
780 public static String validateAppExecutionCommand(String appExecCommand, String os) {
781 String errorMessage = "OK";
782 appExecCommand = replaceAll13(appExecCommand, "\"", "");
783 appExecCommand = replaceAll13(appExecCommand, "'", "");
784 StringTokenizer commandTokens = new StringTokenizer(appExecCommand, " \t");
785 String officeExecutable = "";
786 String officeExecCommand = "soffice";
787 // is there a 'soffice' in the command? 2do: eliminate case sensitivity on windows
788 int index = -1;
789 while (commandTokens.hasMoreTokens() && index == -1) {
790 officeExecutable += commandTokens.nextToken() + " ";
791 index = officeExecutable.indexOf(officeExecCommand);
793 if (index == -1) {
794 errorMessage = "Error: Your 'AppExecutionCommand' parameter does not " +
795 "contain '" + officeExecCommand + "'.";
796 } else {
797 // does the directory exist?
798 officeExecutable = officeExecutable.trim();
799 String officePath = officeExecutable.substring(0, index);
800 File f = new File(officePath);
801 if (!f.exists() || !f.isDirectory()) {
802 errorMessage = "Error: Your 'AppExecutionCommand' parameter does not " +
803 "point to a valid system directory: " + officePath;
804 } else {
805 // is it an office installation?
806 f = new File(officeExecutable);
807 // one try for windows platform can't be wrong...
808 if (!f.exists() || !f.isFile()) {
809 f = new File(officeExecutable + ".exe");
811 if (!f.exists() || !f.isFile()) {
812 errorMessage = "Error: Your 'AppExecutionCommand' parameter does not " +
813 "point to a valid office installation.";
814 } else {
815 // do we have the accept parameter?
816 boolean gotNoAccept = true;
817 while (commandTokens.hasMoreElements()) {
818 String officeParam = commandTokens.nextToken();
819 if (officeParam.indexOf("--accept=") != -1) {
820 gotNoAccept = false;
821 errorMessage = validateConnectString(officeParam, true);
824 if (gotNoAccept) {
825 errorMessage = "Error: Your 'AppExecutionCommand' parameter does not " +
826 "contain a '--accept' parameter for connecting the office.";
831 return errorMessage;
835 * Validate the connection string. Returned is an error message, starting
836 * with "Error:", or a warning, if the command might work.
837 * @param connectString The connection string that is checked.
838 * @param checkAppExecutionCommand If the AppExecutionCommand is checked, the error messages willbe different.
839 * @return The error message, or OK, if no error was detected.
841 public static String validateConnectString(String connectString, boolean checkAppExecutionCommand) {
842 String acceptPrefix = "";
843 if (checkAppExecutionCommand) {
844 acceptPrefix = "--accept=";
847 String errorMessage = "OK";
848 // a warning, if an unknown connection method is used
849 if (connectString.indexOf("socket") != -1) {
850 if (connectString.indexOf(acceptPrefix + "socket,host=") == -1 ||
851 connectString.indexOf("port=") == -1) {
852 if (checkAppExecutionCommand) {
853 errorMessage = "Error: The '--accept' parameter contains a syntax error: It should be like: '--accept=socket,host=localhost,port=8100;urp;";
854 } else {
855 errorMessage = "Error: The 'ConnectionString' parameter contains a syntax error: It should be like: 'socket,host=localhost,port=8100'";
858 } else if (connectString.indexOf("pipe") != -1) {
859 if (connectString.indexOf(acceptPrefix + "pipe,name=") == -1) {
860 if (checkAppExecutionCommand) {
861 errorMessage = "Error: The '--accept' parameter contains a syntax error: It should be like: '--accept=pipe,name=myuniquename;urp;'";
862 } else {
863 errorMessage = "Error: The 'ConnectionString' parameter contains a syntax error: It should be like: 'pipe,name=myuniquename'";
866 } else {
867 if (checkAppExecutionCommand) {
868 errorMessage = "Warning: The '--accept' parameter contains an unknown connection method.";
869 } else {
870 errorMessage = "Warning: The 'ConnectionString' parameter contains an unknown connection method.";
873 return errorMessage;
877 * String.replaceAll() ist available since Java 1.4 but the runner must be buldabale with Java 1.3
878 * @param originalString
879 * @param searchString
880 * @param replaceString
881 * @return modified string
883 public static String replaceAll13(String originalString, String searchString, String replaceString) {
885 StringBuffer changeStringBuffer = new StringBuffer(originalString);
886 int searchLength = searchString.length();
887 int replaceLength = replaceString.length();
888 int index = originalString.indexOf(searchString);
889 while (index != -1) {
890 changeStringBuffer = changeStringBuffer.replace(index, index + searchLength, replaceString);
891 originalString = changeStringBuffer.toString();
892 index = originalString.indexOf(searchString, index + replaceLength);
894 return originalString;
898 * expand macrofied strings like <CODE>${$ORIGIN/bootstrap.ini:UserInstallation}</CODE> or
899 * <CODE>$_OS</CODE>
900 * @param xMSF the MultiServiceFactory
901 * @param expand the string to expand
902 * @throws java.lang.Exception was thrown on any exception
903 * @return return the expanded string
904 * @see com.sun.star.util.theMacroExpander
906 public static String expandMacro(XMultiServiceFactory xMSF, String expand) throws java.lang.Exception {
907 try {
908 XPropertySet xPS = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xMSF);
909 XComponentContext xContext = (XComponentContext) UnoRuntime.queryInterface(XComponentContext.class,
910 xPS.getPropertyValue("DefaultContext"));
911 XMacroExpander xME = (XMacroExpander) UnoRuntime.queryInterface(XMacroExpander.class,
912 xContext.getValueByName("/singletons/com.sun.star.util.theMacroExpander"));
913 return xME.expandMacros(expand);
914 } catch (Exception e) {
915 throw new Exception("could not expand macro: " + e.toString(), e);
921 * returns the platform of the office.<br>
922 * Since the runner and the office could run on different platform this function delivers the
923 * platform the office is running.
924 * @param xMSF the XMultiServiceFactory
925 * @return unxsols, unxsoli, unxlngi, wntmsci
927 public static String getOfficeOS(XMultiServiceFactory xMSF) {
928 String platform = "unknown";
930 try {
931 String theOS = expandMacro(xMSF, "$_OS");
933 if (theOS.equals("Windows")) {
934 platform = "wntmsci";
935 } else if (theOS.equals("Linux")) {
936 platform = "unxlngi";
937 } else {
938 if (theOS.equals("Solaris")) {
939 String theArch = expandMacro(xMSF, "$_ARCH");
940 if (theArch.equals("SPARC")) {
941 platform = "unxsols";
942 } else if (theArch.equals("x86")) {
943 platform = "unxsoli";
947 } catch (Exception ex) {
949 return platform;
953 * dispatches given <CODE>URL</CODE> to the document <CODE>XComponent</CODE>
954 * @param xMSF the <CODE>XMultiServiceFactory</CODE>
955 * @param xDoc the document where to dispatch
956 * @param URL the <CODE>URL</CODE> to dispatch
957 * @throws java.lang.Exception throws <CODE>java.lang.Exception</CODE> on any error
959 public static void dispatchURL(XMultiServiceFactory xMSF, XComponent xDoc, String URL) throws java.lang.Exception {
960 XModel aModel = (XModel) UnoRuntime.queryInterface(XModel.class, xDoc);
962 XController xCont = aModel.getCurrentController();
964 dispatchURL(xMSF, xCont, URL);
969 * dispatches given <CODE>URL</CODE> to the <CODE>XController</CODE>
970 * @param xMSF the <CODE>XMultiServiceFactory</CODE>
971 * @param xComp the <CODE>XController</CODE> to query for a XDispatchProvider
972 * @param URL the <CODE>URL</CODE> to dispatch
973 * @throws java.lang.Exception throws <CODE>java.lang.Exception</CODE> on any error
975 public static void dispatchURL(XMultiServiceFactory xMSF, XController xCont, String URL) throws java.lang.Exception {
976 try {
978 XDispatchProvider xDispProv = (XDispatchProvider) UnoRuntime.queryInterface(XDispatchProvider.class, xCont);
980 XURLTransformer xParser = (com.sun.star.util.XURLTransformer) UnoRuntime.queryInterface(
981 XURLTransformer.class,
982 xMSF.createInstance("com.sun.star.util.URLTransformer"));
984 // Because it's an in/out parameter we must use an array of URL objects.
985 URL[] aParseURL = new URL[1];
986 aParseURL[0] = new URL();
987 aParseURL[0].Complete = URL;
988 xParser.parseStrict(aParseURL);
990 URL aURL = aParseURL[0];
992 XDispatch xDispatcher = xDispProv.queryDispatch(aURL, "", 0);
993 xDispatcher.dispatch(aURL, null);
995 utils.shortWait(3000);
997 } catch (Exception e) {
998 throw new Exception("ERROR: could not dispatch URL '" + URL + "': " + e.toString());
1002 /** returns a String which contains the current date and time<br>
1003 * format: [DD.MM.YYYY - HH:MM:SS::mm]
1005 ** @return a String which contains the current date and time
1007 public static String getDateTime() {
1009 Calendar cal = new GregorianCalendar();
1010 DecimalFormat dfmt = new DecimalFormat("00");
1011 String dateTime = dfmt.format(cal.get(Calendar.DAY_OF_MONTH)) + "." +
1012 dfmt.format(cal.get(Calendar.MONTH) + 1) + "." +
1013 dfmt.format(cal.get(Calendar.YEAR)) + " - " +
1014 dfmt.format(cal.get(Calendar.HOUR_OF_DAY)) + ":" +
1015 dfmt.format(cal.get(Calendar.MINUTE)) + ":" +
1016 dfmt.format(cal.get(Calendar.SECOND)) + "," +
1017 dfmt.format(cal.get(Calendar.MILLISECOND));
1018 return "[" + dateTime + "]";