From 8b1c81f00a3c96c0b3b8091a1c1c6c41d5457dc8 Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Mon, 3 Aug 2015 19:54:00 +0100 Subject: [PATCH] Ignore Libre/OpenOffice exceptions if we are closing it. --- .../plugins/songs/lib/importers/openoffice.py | 27 ++++++- .../openlp_plugins/songs/test_openoffice.py | 74 +++++++++++++++++++ 2 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 tests/functional/openlp_plugins/songs/test_openoffice.py diff --git a/openlp/plugins/songs/lib/importers/openoffice.py b/openlp/plugins/songs/lib/importers/openoffice.py index 050693443..98ceda6af 100644 --- a/openlp/plugins/songs/lib/importers/openoffice.py +++ b/openlp/plugins/songs/lib/importers/openoffice.py @@ -38,6 +38,7 @@ if is_win(): else: import uno from com.sun.star.connection import NoConnectException + from com.sun.star.beans import PropertyValue try: from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH except ImportError: @@ -54,7 +55,7 @@ class OpenOfficeImport(SongImport): """ Initialise the class. Requires a songmanager class which is passed to SongImport for writing song to disk """ - SongImport.__init__(self, manager, **kwargs) + super(OpenOfficeImport, self).__init__(manager, **kwargs) self.document = None self.process_started = False @@ -151,6 +152,7 @@ class OpenOfficeImport(SongImport): else: url = uno.systemPathToFileUrl(file_path) properties = [] + properties.append(self.create_property('Hidden', True)) properties = tuple(properties) try: self.document = self.desktop.loadComponentFromURL(url, '_blank', 0, properties) @@ -163,11 +165,27 @@ class OpenOfficeImport(SongImport): log.exception("open_ooo_file failed: %s", url) return + def create_property(self, name, value): + """ + Create an OOo style property object which are passed into some Uno methods. + """ + log.debug('create property OpenOffice') + if is_win(): + property_object = self.controller.manager.Bridge_GetStruct('com.sun.star.beans.PropertyValue') + else: + property_object = PropertyValue() + property_object.Name = name + property_object.Value = value + return property_object + def close_ooo_file(self): """ Close file. """ - self.document.close(True) + try: + self.document.close(True) + except: + log.exception('Exception in close_ooo_file - trying to ignore it.') self.document = None def close_ooo(self): @@ -175,7 +193,10 @@ class OpenOfficeImport(SongImport): Close OOo. But only if we started it and not on windows """ if self.process_started: - self.desktop.terminate() + try: + self.desktop.terminate() + except: + log.exception('Exception in close_ooo - trying to ignore it.') def process_presentation(self): """ diff --git a/tests/functional/openlp_plugins/songs/test_openoffice.py b/tests/functional/openlp_plugins/songs/test_openoffice.py new file mode 100644 index 000000000..a23a5a749 --- /dev/null +++ b/tests/functional/openlp_plugins/songs/test_openoffice.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2015 OpenLP Developers # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program 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 General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### +""" +This module contains tests for the OpenOffice/LibreOffice importer. +""" +from unittest import TestCase + +from openlp.core.common import Registry +from openlp.plugins.songs.lib.importers.openoffice import OpenOfficeImport + +from tests.functional import MagicMock, patch +from tests.helpers.testmixin import TestMixin + + +class TestOpenOfficeImport(TestCase, TestMixin): + """ + Test the :class:`~openlp.plugins.songs.lib.importer.openoffice.OpenOfficeImport` class + """ + + def setUp(self): + """ + Create the registry + """ + Registry.create() + + @patch('openlp.plugins.songs.lib.importers.openoffice.SongImport') + def create_importer_test(self, mocked_songimport): + """ + Test creating an instance of the OpenOfficeImport file importer + """ + # GIVEN: A mocked out SongImport class, and a mocked out "manager" + mocked_manager = MagicMock() + + # WHEN: An importer object is created + importer = OpenOfficeImport(mocked_manager, filenames=[]) + + # THEN: The importer object should not be None + self.assertIsNotNone(importer, 'Import should not be none') + + @patch('openlp.plugins.songs.lib.importers.openoffice.SongImport') + def close_ooo_file_test(self, mocked_songimport): + """ + Test that close_ooo_file catches raised exceptions + """ + # GIVEN: A mocked out SongImport class, a mocked out "manager" and a document that raises an exception + mocked_manager = MagicMock() + importer = OpenOfficeImport(mocked_manager, filenames=[]) + importer.document = MagicMock() + importer.document.close = MagicMock(side_effect=Exception()) + + # WHEN: Calling close_ooo_file + importer.close_ooo_file() + + # THEN: The document attribute should be None even if an exception is raised') + self.assertIsNone(importer.document, 'Document should be None even if an exception is raised')