/* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ package graphical; import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertySet; import com.sun.star.container.XNameAccess; import com.sun.star.frame.FrameSearchFlag; import com.sun.star.frame.XComponentLoader; import com.sun.star.frame.XDesktop; import com.sun.star.frame.XModel; import com.sun.star.frame.XStorable; import com.sun.star.lang.XComponent; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.XServiceInfo; import com.sun.star.sdb.XOfficeDatabaseDocument; import com.sun.star.sdb.XReportDocumentsSupplier; import com.sun.star.sdb.application.XDatabaseDocumentUI; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XInterface; import com.sun.star.util.XCloseable; import complexlib.Assurance; import helper.PropertyHelper; import helper.URLHelper; import java.io.File; import java.util.ArrayList; class PropertySetHelper { XPropertySet m_xPropertySet; public PropertySetHelper(Object _aObj) { m_xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, _aObj); } /** get a property and don't convert it @param _sName the string name of the property @return the object value of the property without any conversion */ public Object getPropertyValueAsObject(String _sName) { Object aObject = null; if (m_xPropertySet != null) { try { aObject = m_xPropertySet.getPropertyValue(_sName); } catch (com.sun.star.beans.UnknownPropertyException e) { System.out.println("ERROR: UnknownPropertyException caught. '" + _sName + "'"); System.out.println("Message: " + e.getMessage()); } catch (com.sun.star.lang.WrappedTargetException e) { System.out.println("ERROR: WrappedTargetException caught."); System.out.println("Message: " + e.getMessage()); } } return aObject; } } public class OpenOfficeDatabaseReportExtractor extends Assurance { private ParameterHelper m_aParameterHelper; public OpenOfficeDatabaseReportExtractor(ParameterHelper _aParameter) { m_aParameterHelper = _aParameter; } private XDesktop m_xDesktop = null; private XDesktop getXDesktop() { if (m_xDesktop == null) { try { XInterface xInterface = (XInterface) getMultiServiceFactory().createInstance( "com.sun.star.frame.Desktop" ); m_xDesktop = UnoRuntime.queryInterface(XDesktop.class, xInterface); } catch (com.sun.star.uno.Exception e) { GlobalLogWriter.println("ERROR: uno.Exception caught"); GlobalLogWriter.println("Message: " + e.getMessage()); } } return m_xDesktop; } private void showElements(XNameAccess _xNameAccess) { if (_xNameAccess != null) { String[] sElementNames = _xNameAccess.getElementNames(); for(int i=0;i load(String _sDocument /*, int _nType*/) { // We need to copy the database file to a place where we have write access, NEVER use the docpool for this String sOutputPath = m_aParameterHelper.getOutputPath(); File aOutputPath = new File(sOutputPath); aOutputPath.mkdirs(); String sFilename = FileHelper.getBasename(_sDocument); String sDestinationFile = FileHelper.appendPath(sOutputPath, sFilename); FileHelper.copy(_sDocument, sDestinationFile); // now the fix reference of the AbsoluteReferenceFile should exist. assure("There exists no file: " + sDestinationFile, FileHelper.exists(sDestinationFile)); String sFileURL = URLHelper.getFileURLFromSystemPath(sDestinationFile); GlobalLogWriter.println("File URL: " + sFileURL); ArrayList aPropertyList = new ArrayList(); XComponent xDocComponent = loadComponent(sFileURL, getXDesktop(), aPropertyList); GlobalLogWriter.println("Load done"); ArrayList aList = null; try { XOfficeDatabaseDocument xOfficeDBDoc = UnoRuntime.queryInterface(XOfficeDatabaseDocument.class, xDocComponent); assure("can't access DatabaseDocument", xOfficeDBDoc != null); XModel xDBSource = UnoRuntime.queryInterface(XModel.class, xOfficeDBDoc); Object aController = xDBSource.getCurrentController(); assure("Controller of xOfficeDatabaseDocument is empty!", aController != null); XDatabaseDocumentUI aDBDocUI = UnoRuntime.queryInterface(XDatabaseDocumentUI.class, aController); aDBDocUI.connect(); boolean isConnect = aDBDocUI.isConnected(); if (isConnect) { GlobalLogWriter.println("Connection is true"); } else { GlobalLogWriter.println("Connection is false"); } XReportDocumentsSupplier xSupplier = UnoRuntime.queryInterface(XReportDocumentsSupplier.class, xOfficeDBDoc); XNameAccess xNameAccess = xSupplier.getReportDocuments(); assure("xOfficeDatabaseDocument returns no Report Document", xNameAccess != null); showElements(xNameAccess); Object aActiveConnectionObj = aDBDocUI.getActiveConnection(); assure("ActiveConnection is empty", aActiveConnectionObj != null); ArrayList aPropertyList2 = new ArrayList(); PropertyValue aActiveConnection = new PropertyValue(); aActiveConnection.Name = "ActiveConnection"; aActiveConnection.Value = aActiveConnectionObj; aPropertyList2.add(aActiveConnection); aList = loadAndStoreReports(xNameAccess, aPropertyList2); createDBEntry(); } catch(Exception e) { GlobalLogWriter.println("ERROR: Exception caught"); GlobalLogWriter.println("Message: " + e.getMessage()); } closeComponent(xDocComponent); return aList; } private String getDocumentPoolName() { return "AutogenReportDesignTest"; } private void createDBEntry() { // try to connect the database String sDBConnection = (String)m_aParameterHelper.getTestParameters().get( convwatch.PropertyName.DB_CONNECTION_STRING ); if (sDBConnection != null && sDBConnection.length() > 0) { GlobalLogWriter.println("DBConnection: " + sDBConnection); getOutputPath(); getDocumentPoolName(); TimeHelper.waitInSeconds(1, "wait for DB."); } } private ArrayList loadAndStoreReports(XNameAccess _xNameAccess, ArrayList _aPropertyList) { ArrayList aList = new ArrayList(); if (_xNameAccess != null) { String[] sElementNames = _xNameAccess.getElementNames(); for(int i=0;i aPropertyList = new ArrayList(); // set some properties for storeAsURL PropertyValue aOverwrite = new PropertyValue(); // always overwrite already exist files aOverwrite.Name = "Overwrite"; aOverwrite.Value = Boolean.TRUE; aPropertyList.add(aOverwrite); // store the document in an other directory XStorable aStorable = UnoRuntime.queryInterface( XStorable.class, _xComponent); if (aStorable != null) { GlobalLogWriter.println("store document as URL: '" + sOutputURL + "'"); try { aStorable.storeAsURL(sOutputURL, PropertyHelper.createPropertyValueArrayFormArrayList(aPropertyList)); } catch (com.sun.star.io.IOException e) { GlobalLogWriter.println("ERROR: Exception caught"); GlobalLogWriter.println("Can't write document URL: '" + sOutputURL + "'"); GlobalLogWriter.println("Message: " + e.getMessage()); } } return sBackPathName; } private XComponent loadComponent(String _sName, Object _xComponent, ArrayList _aPropertyList) { XComponent xDocComponent = null; XComponentLoader xComponentLoader = UnoRuntime.queryInterface( XComponentLoader.class, _xComponent ); try { PropertyValue[] aLoadProperties = PropertyHelper.createPropertyValueArrayFormArrayList(_aPropertyList); GlobalLogWriter.println("Load component: '" + _sName + "'"); xDocComponent = xComponentLoader.loadComponentFromURL(_sName, "_blank", FrameSearchFlag.ALL, aLoadProperties); GlobalLogWriter.println("Load component: '" + _sName + "' done"); } catch (com.sun.star.io.IOException e) { GlobalLogWriter.println("ERROR: Exception caught"); GlobalLogWriter.println("Can't load document '" + _sName + "'"); GlobalLogWriter.println("Message: " + e.getMessage()); } catch (com.sun.star.lang.IllegalArgumentException e) { GlobalLogWriter.println("ERROR: Exception caught"); GlobalLogWriter.println("Illegal Arguments given to loadComponentFromURL."); GlobalLogWriter.println("Message: " + e.getMessage()); } return xDocComponent; } private void closeComponent(XComponent _xDoc) { // Close the document XCloseable xCloseable = UnoRuntime.queryInterface(XCloseable.class, _xDoc); try { xCloseable.close(true); } catch (com.sun.star.util.CloseVetoException e) { GlobalLogWriter.println("ERROR: CloseVetoException caught"); GlobalLogWriter.println("CloseVetoException occurred Can't close document."); GlobalLogWriter.println("Message: " + e.getMessage()); } } }