/************************************************************************* * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: utils.java,v $ * * $Revision: 1.15 $ * * last change: $Author: ihi $ $Date: 2008-01-14 13:22:21 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. * * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2005 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * ************************************************************************/ package util; import com.sun.star.frame.XController; import com.sun.star.frame.XDispatch; import com.sun.star.frame.XDispatchProvider; import com.sun.star.frame.XModel; import com.sun.star.lang.XComponent; import java.lang.System; import java.util.StringTokenizer; import java.io.*; import java.util.ArrayList; import java.io.RandomAccessFile; import java.net.Socket; import java.net.ServerSocket; import com.sun.star.beans.XPropertySet; import com.sun.star.beans.Property; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.uno.UnoRuntime; import com.sun.star.ucb.XSimpleFileAccess; import com.sun.star.lang.XServiceInfo; import com.sun.star.util.URL; import com.sun.star.util.XURLTransformer; import com.sun.star.uno.AnyConverter; import com.sun.star.uno.Type; import com.sun.star.uno.XComponentContext; import com.sun.star.util.XMacroExpander; import java.text.DecimalFormat; import java.util.Calendar; import java.util.Collections; import java.util.GregorianCalendar; public class utils { /** * * This method adds the DOCPTH to a given file * */ public static String getFullTestDocName( String sDocName ) { String docpth = System.getProperty("DOCPTH"); if (docpth.endsWith("\\") || docpth.endsWith("/")) docpth = docpth.substring(0, docpth.length() - 1) ; if (docpth.startsWith("http:")) { return docpth+"/"+sDocName; } String testdocPth = ""; String pthSep = System.getProperty("file.separator"); if (docpth == null ) { String objdscPth = System.getProperty("OBJDSCS"); int i = objdscPth.indexOf("objdsc"); String arcPth = objdscPth.substring(0,i-1); testdocPth = arcPth + pthSep + "doc" + pthSep + "java" + pthSep + "testdocs" + pthSep + sDocName; } else { testdocPth = docpth + pthSep + sDocName; } return testdocPth; } /** * * This method adds the DOCPTH to a given file * and changes the format to an file URL * */ public static String getFullTestURL( String sDocName ) { String fullDocPath = getFullTestDocName(sDocName); if (fullDocPath.startsWith("http:")) { return fullDocPath; } if (fullDocPath.startsWith("file:")) { return fullDocPath; } String prefix = null; // Windows: \\\\margritte\\qaapi\\workspace\\qadev\\testdocs/emptyChart.sds if (fullDocPath.startsWith("\\\\")) prefix = "file:"; fullDocPath = fullDocPath.replace('\\','/'); if (prefix == null){ if (fullDocPath.startsWith("//")) prefix="file:/"; else if (fullDocPath.startsWith("/")) prefix="file://"; else prefix="file:///"; } if (!fullDocPath.endsWith("/")) { File aFile = new File(fullDocPath); if (aFile.isDirectory()) { fullDocPath +="/"; } } String fulldocURL = prefix+fullDocPath; return fulldocURL; } /** * * This method changes a given URL to a valid file URL * */ public static String getFullURL( String sDocName ) { String fullDocPath = sDocName; fullDocPath = fullDocPath.replace('\\','/'); if (fullDocPath.startsWith("http:")) { return fullDocPath; } if (fullDocPath.startsWith("ftp:")) { return fullDocPath; } String prefix = ""; if (! fullDocPath.startsWith("file:///")){ if (fullDocPath.startsWith("//")) { prefix="file:"; } else { if (fullDocPath.startsWith("/")) prefix="file://"; else prefix="file:///"; } } if (!fullDocPath.endsWith("/")) { File aFile = new File(fullDocPath); if (aFile.isDirectory()) { fullDocPath +="/"; } } String fulldocURL = prefix+fullDocPath; return fulldocURL; } /** * * This method creates folders needed * */ public static void make_Directories(String first, String path) { String already_done = null; String fs = System.getProperty("file.separator"); StringTokenizer path_tokenizer = new StringTokenizer(path,fs,false); already_done = first; while (path_tokenizer.hasMoreTokens()) { String part = path_tokenizer.nextToken(); File new_dir = new File(already_done + File.separatorChar + part); already_done = new_dir.toString(); //create the directory new_dir.mkdirs(); } return; } /** * * This method get the version for a given TestBase/platform combination * */ public static String getVersion(String aFile, String aPlatform, String aTestbase) { if ( (aFile == null) || (aPlatform == null) || (aTestbase == null) ){ return "/"; } File the_file = new File (aFile); try { RandomAccessFile raf = new RandomAccessFile(the_file, "r"); String res=""; while (!res.equals("["+aTestbase.toUpperCase()+"]")) { res = raf.readLine(); } res="=/"; while ( (!res.startsWith(aPlatform)) || (res.startsWith("[")) ) { res = raf.readLine(); } raf.close(); if (res.startsWith("[")) res="/"; return res.substring(res.indexOf("=")+1); } catch (Exception e) { System.out.println("Couldn't find version"); return "/"; } } /** * * This method get's the user dir of the connected office * */ public static String getOfficeUserPath(XMultiServiceFactory msf) { String userPath = null; // get a folder wich is located in the user dir try{ userPath = (String) getOfficeSettingsValue(msf, "UserConfig"); } catch (Exception e) { System.out.println("Couldn't get Office User Path"); e.printStackTrace(); } // strip the returned folder to the user dir if (userPath.charAt(userPath.length() - 1) == '/') userPath = userPath.substring(0, userPath.length() - 1); int index = userPath.lastIndexOf('/'); if (index != -1) userPath = userPath.substring(0, index); return userPath; } /** * In the office there are some sttetings available. This function * returns the value of the given setting name. For Example the setting name "Temp" * "Temp" returns the temp folder of the office instance. * @param msf a XMultiServiceFactory * @param setting the name of the setting the value should be returned. * For example "Temp" reutrns the temp folder of the current office instance. * @see com.sun.star.util.PathSettings * @return the value as String */ public static String getOfficeSettingsValue(XMultiServiceFactory msf, String setting){ String settingPath = null; try { Object settings = msf.createInstance("com.sun.star.comp.framework.PathSettings"); XPropertySet pthSettings = null; try{ pthSettings = (XPropertySet) AnyConverter.toObject( new Type(XPropertySet.class),settings); } catch (com.sun.star.lang.IllegalArgumentException iae) { System.out.println("### couldn't get Office Settings"); } settingPath = (String) pthSettings.getPropertyValue(setting); } catch (Exception e) { System.out.println("Couldn't get stting value for " + setting); e.printStackTrace(); } return settingPath; } public static void setOfficeSettingsValue(XMultiServiceFactory msf, String setting, String value){ String settingPath = null; try { Object settings = msf.createInstance("com.sun.star.comp.framework.PathSettings"); XPropertySet pthSettings = null; try{ pthSettings = (XPropertySet) AnyConverter.toObject( new Type(XPropertySet.class),settings); } catch (com.sun.star.lang.IllegalArgumentException iae) { System.out.println("### couldn't get Office Settings"); } pthSettings.setPropertyValue(setting, value); } catch (Exception e) { System.out.println("Couldn't set '" + setting +"' to value '" + value + "'"); e.printStackTrace(); } } /** * This method returns the temp dicrectory of the user. * Since Java 1.4 it is not possible to read environment variables. To workaround * this, the Java parameter -D could be used. */ public static String getUsersTempDir(){ String tempDir = System.getProperty("my.temp"); if (tempDir == null){ tempDir = System.getProperty("my.tmp"); if (tempDir == null) tempDir = System.getProperty("java.io.tmpdir") ; } // remove ending file separator if (tempDir.endsWith(System.getProperty("file.separator"))){ tempDir = tempDir.substring(0,tempDir.length()-1); } return tempDir; } /** * * This method get's the temp dir of the connected office * */ public static String getOfficeTemp (XMultiServiceFactory msf) { String tmpDir = util.utils.getUsersTempDir(); try { String tmp = (String) getOfficeSettingsValue(msf, "Temp"); if (! tmp.endsWith(System.getProperty("file.separator"))){ tmp += System.getProperty("file.separator"); } tmpDir = getFullURL(tmp); } catch (Exception e) { System.out.println("Couldn't get Office TEMP"); e.printStackTrace(); } return tmpDir; } /** * Gets StarOffice temp directory without 'file:///' prefix. * For example is usefull for Registry URL specifying. * @msf Office factory for accessing its settings. * @return SOffice temporary directory in form for example * 'd:/Office60/user/temp/'. */ public static String getOfficeTempDir (XMultiServiceFactory msf) { String dir = getOfficeTemp(msf) ; int idx = dir.indexOf("file:///") ; if (idx < 0) return dir ; dir = dir.substring("file:///".length()) ; idx = dir.indexOf(":") ; // is the last character a '/' or a '\'? boolean lastCharSet = dir.endsWith("/") || dir.endsWith("\\"); if (idx < 0) { // linux or solaris dir = "/"+dir ; dir += lastCharSet?"":"/"; } else { // windows dir += lastCharSet?"":"\\"; } return dir; } /** * Gets StarOffice temp directory without 'file:///' prefix. * and System dependend file separator */ public static String getOfficeTempDirSys (XMultiServiceFactory msf) { String dir = getOfficeTemp(msf) ; String sysDir = ""; int idx = dir.indexOf("file://") ; // remove leading 'file://' if (idx < 0) sysDir = dir; else sysDir = dir.substring("file://".length()); // append '/' if not there (e.g. linux) if ( sysDir.charAt(sysDir.length()-1) != '/' ) sysDir += "/"; // remove leading '/' and replace others with '\' on windows machines if (sysDir.indexOf(":") != -1){ sysDir = sysDir.substring(1); sysDir = sysDir.replace('/','\\'); } return sysDir; } /** * converts a fileURL to a system URL * @param a file URL * @return a system URL */ public static String getSystemURL(String fileURL){ String sysDir = ""; int idx = fileURL.indexOf("file://") ; // remove leading 'file://' if (idx < 0) sysDir = fileURL; else sysDir = fileURL.substring("file://".length()); // remove leading '/' and replace others with '\' on windows machines if (sysDir.indexOf(":") != -1){ sysDir = sysDir.substring(1); sysDir = sysDir.replace('/','\\'); } return sysDir; } /** * This method check via Office the existance of the given file URL * @param msf the multiservice factory * @param fileURL the file which existance should be checked * @return true if the file exists, else false */ public static boolean fileExists(XMultiServiceFactory msf, String fileURL){ boolean exists = false; try { Object fileacc = msf.createInstance("com.sun.star.comp.ucb.SimpleFileAccess"); XSimpleFileAccess simpleAccess = (XSimpleFileAccess) UnoRuntime.queryInterface(XSimpleFileAccess.class,fileacc); if (simpleAccess.exists(fileURL)) exists = true; } catch (Exception e) { System.out.println("Couldn't access file '" + fileURL + "'"); e.printStackTrace(); exists = false; } return exists; } /** * This method deletes via office the given file URL. It checks the existance * of fileURL. If exists it will be deletet. * @param msf the multiservice factory * @param fileURL the file to delete * @return true if the file could be deletet or the file does not exist */ public static boolean deleteFile(XMultiServiceFactory xMsf, String fileURL){ boolean delete = true; try { Object fileacc = xMsf.createInstance("com.sun.star.comp.ucb.SimpleFileAccess"); XSimpleFileAccess simpleAccess = (XSimpleFileAccess) UnoRuntime.queryInterface(XSimpleFileAccess.class,fileacc); if (simpleAccess.exists(fileURL)) simpleAccess.kill(fileURL); } catch (Exception e) { System.out.println("Couldn't delete file '" + fileURL + "'"); e.printStackTrace(); delete = false; } return delete; } /** * This method copies via office a given file to a new one * @param msf the multi service factory * @param oldF the source file * @param newF the destination file * @return true at success */ public static boolean copyFile (XMultiServiceFactory xMsf, String source, String destinaion) { boolean res = false; try { Object fileacc = xMsf.createInstance("com.sun.star.comp.ucb.SimpleFileAccess"); XSimpleFileAccess simpleAccess = (XSimpleFileAccess) UnoRuntime.queryInterface(XSimpleFileAccess.class,fileacc); if (!simpleAccess.exists(destinaion)) simpleAccess.copy(source,destinaion); res = true; } catch (Exception e) { System.out.println("Couldn't copy file '" + source + "' -> '" + destinaion + "'"); e.printStackTrace(); res = false; } return res; } /** * Copies file to a new location using SOffice features. If the target * file already exists, the file is deleted. * * @returns true if the file was successfully copied, * false if some errors occured (e.g. file is locked, used * by another process). */ public static boolean overwriteFile(XMultiServiceFactory xMsf, String oldF, String newF) { boolean res = false; try { Object fileacc = xMsf.createInstance("com.sun.star.comp.ucb.SimpleFileAccess"); XSimpleFileAccess simpleAccess = (XSimpleFileAccess) UnoRuntime.queryInterface(XSimpleFileAccess.class,fileacc); if (simpleAccess.exists(newF)) simpleAccess.kill(newF); simpleAccess.copy(oldF,newF); res = true; } catch (com.sun.star.ucb.InteractiveAugmentedIOException e) { return false ; } catch (com.sun.star.uno.Exception e) { System.out.println("Couldn't create a service."); e.printStackTrace(); } return res; } public static boolean hasPropertyByName(XPropertySet props, String aName) { Property[] list = props.getPropertySetInfo().getProperties(); boolean res = false; for (int i=0;i server: occupied port " + port); continue; } try { // now trying to establish a client-socket // fails if there is no server on any connectable machine Socket sock = new Socket("localhost", port); System.out.println(" -> socket: occupied port: " + port); } catch (IOException e) { System.out.println(" -> free port"); return port; } } return 65535; } public static URL parseURL(XMultiServiceFactory xMSF, String url){ URL[] rUrl = new URL[1]; rUrl[0] = new URL(); rUrl[0].Complete = url; XURLTransformer xTrans = null; try { Object inst = xMSF.createInstance ("com.sun.star.util.URLTransformer"); xTrans = (XURLTransformer) UnoRuntime.queryInterface (XURLTransformer.class, inst); } catch (com.sun.star.uno.Exception e) {} xTrans.parseStrict(rUrl); return rUrl[0]; } public static String getOfficeURL(XMultiServiceFactory msf) { try { Object settings = msf.createInstance("com.sun.star.util.PathSettings"); XPropertySet settingProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, settings); String path = (String) settingProps.getPropertyValue("Module"); return path; } catch (Exception e) { System.out.println("Couldn't get Office Settings "); e.printStackTrace(); } return null; } /** returns the path to the office binary folder * * @param msf The XMultiSeriveFactory * @return the path to the office binrary or an empty string on any error */ public static String getOfficeBinPath(XMultiServiceFactory msf) { String sysBinDir = ""; try{ sysBinDir = utils.getSystemURL(utils.expandMacro(msf, "$SYSBINDIR")); } catch (java.lang.Exception e){} return sysBinDir; } /** * Get an array of all property names from the property set. With the include * and exclude parameters the properties can be filtered.
* Set excludePropertyAttribute = 0 and includePropertyAttribute = 0 * to include all and exclude none. * @param props The instance of XPropertySet * @param includePropertyAttribute Properties without these attributes are filtered and will not be returned. * @param excludePropertyAttribute Properties with these attributes are filtered and will not be returned. * @return A String array with all property names. * @see com.sun.star.beans.XPropertySet * @see com.sun.star.beans.Property * @see com.sun.star.beans.PropertyAttribute */ public static String[] getFilteredPropertyNames(XPropertySet props, short includePropertyAttribute, short excludePropertyAttribute) { Property[] the_props = props.getPropertySetInfo().getProperties(); ArrayList l = new ArrayList(); for (int i=0;i${$ORIGIN/bootstrap.ini:UserInstallation} or * $_OS * @param xMSF the MultiServiceFactory * @param expand the string to expand * @throws java.lang.Exception was thrown on any exception * @return return the expanded string * @see com.sun.star.util.theMacroExpander */ public static String expandMacro(XMultiServiceFactory xMSF, String expand) throws java.lang.Exception{ try { XPropertySet xPS = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xMSF); XComponentContext xContext = (XComponentContext) UnoRuntime.queryInterface(XComponentContext.class, xPS.getPropertyValue("DefaultContext")); XMacroExpander xME = (XMacroExpander) UnoRuntime.queryInterface(XMacroExpander.class, xContext.getValueByName("/singletons/com.sun.star.util.theMacroExpander")); return xME.expandMacros(expand); } catch(Exception e) { throw new Exception("could not expand macro: " + e.toString(),e); } } /** * returns the platform of the office.
* Since the runner and the office could run on different platform this function delivers the * platform the office is running. * @param xMSF the XMultiServiceFactory * @return unxsols, unxsoli, unxlngi, wntmsci */ public static String getOfficeOS(XMultiServiceFactory xMSF){ String platform = "unkown"; try { String theOS= expandMacro(xMSF, "$_OS"); if (theOS.equals("Windows")) platform = "wntmsci"; else if (theOS.equals("Linux")) platform = "unxlngi"; else{ if (theOS.equals("Solaris")){ String theArch = expandMacro(xMSF, "$_ARCH"); if (theArch.equals("SPARC")) platform = "unxsols"; else if (theArch.equals("x86")) platform = "unxsoli"; } } } catch (Exception ex) {} return platform; } /** * dispatches given URL to the document XComponent * @param xMSF the XMultiServiceFactory * @param xDoc the document where to dispatch * @param URL the URL to dispatch * @throws java.lang.Exception throws java.lang.Exception on any error */ public static void dispatchURL(XMultiServiceFactory xMSF, XComponent xDoc, String URL)throws java.lang.Exception{ XModel aModel = (XModel) UnoRuntime.queryInterface(XModel.class, xDoc); XController xCont = aModel.getCurrentController(); dispatchURL(xMSF, xCont, URL); } /** * dispatches given URL to the XController * @param xMSF the XMultiServiceFactory * @param xComp the XController to query for a XDispatchProvider * @param URL the URL to dispatch * @throws java.lang.Exception throws java.lang.Exception on any error */ public static void dispatchURL(XMultiServiceFactory xMSF, XController xCont, String URL)throws java.lang.Exception{ try { XDispatchProvider xDispProv = (XDispatchProvider) UnoRuntime.queryInterface( XDispatchProvider.class, xCont ); XURLTransformer xParser = (com.sun.star.util.XURLTransformer) UnoRuntime.queryInterface(XURLTransformer.class, xMSF.createInstance("com.sun.star.util.URLTransformer")); // Because it's an in/out parameter we must use an array of URL objects. URL[] aParseURL = new URL[1]; aParseURL[0] = new URL(); aParseURL[0].Complete = URL; xParser.parseStrict(aParseURL); URL aURL = aParseURL[0]; XDispatch xDispatcher = xDispProv.queryDispatch( aURL,"",0); xDispatcher.dispatch( aURL, null ); utils.shortWait(3000); } catch(Exception e) { throw new Exception("ERROR: could not dispatch URL '" + URL + "': " + e.toString()); } } /** returns a String which contains the current date and time
* format: DD.MM.YYYY - HH:MM:SS * ** @return a String which contains the current date and time */ public static String getDateTime(){ Calendar cal = new GregorianCalendar(); DecimalFormat dfmt = new DecimalFormat("00"); String dateTime = dfmt.format(cal.get(Calendar.DAY_OF_MONTH)) + "." + dfmt.format(cal.get(Calendar.MONTH)) + "." + dfmt.format(cal.get(Calendar.YEAR)) + " - " + dfmt.format(cal.get(Calendar.HOUR_OF_DAY)) + ":" + dfmt.format(cal.get(Calendar.MINUTE)) + ":" + dfmt.format(cal.get(Calendar.SECOND)); return dateTime; } }