Commit 8f3d6526 authored by Boris Kocherov's avatar Boris Kocherov

close file opened in uno, use only one service_manager by process

parent d1a52dd5
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
# #
############################################################################## ##############################################################################
import os
import sys import sys
import csv import csv
import codecs import codecs
...@@ -75,19 +76,23 @@ Options: ...@@ -75,19 +76,23 @@ Options:
class UnoConverter(object): class UnoConverter(object):
"""A module to easily work with OpenOffice.org.""" """A module to easily work with OpenOffice.org."""
def __init__(self, hostname, port, document_url, source_format, uno_path, def __init__(self, service_manager, document_url, source_format, refresh):
office_binary_path, refresh):
""" """ """ """
self.hostname = hostname self.service_manager = service_manager
self.port = port
self.document_url = document_url self.document_url = document_url
self.document_dir_path = dirname(document_url) self.document_dir_path = dirname(document_url)
self.source_format = source_format self.source_format = source_format
self.refresh = refresh self.refresh = refresh
self.uno_path = uno_path
self.office_binary_path = office_binary_path
self._load() self._load()
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
if traceback:
sys.stderr.write(str(traceback))
self.document_loaded.close(True)
def _createProperty(self, name, value): def _createProperty(self, name, value):
"""Create property""" """Create property"""
from com.sun.star.beans import PropertyValue from com.sun.star.beans import PropertyValue
...@@ -171,9 +176,7 @@ class UnoConverter(object): ...@@ -171,9 +176,7 @@ class UnoConverter(object):
refresh argument tells to uno environment to refresh argument tells to uno environment to
replace dynamic properties of document before conversion replace dynamic properties of document before conversion
""" """
service_manager = helper_util.getServiceManager(self.hostname, self.port, service_manager = self.service_manager
self.uno_path,
self.office_binary_path)
desktop = service_manager.createInstance("com.sun.star.frame.Desktop") desktop = service_manager.createInstance("com.sun.star.frame.Desktop")
uno_url = self.systemPathToFileUrl(self.document_url) uno_url = self.systemPathToFileUrl(self.document_url)
uno_document = desktop.loadComponentFromURL( uno_document = desktop.loadComponentFromURL(
...@@ -210,11 +213,8 @@ class UnoConverter(object): ...@@ -210,11 +213,8 @@ class UnoConverter(object):
dir=self.document_dir_path) dir=self.document_dir_path)
property_list = self._getPropertyToExport(output_format) property_list = self._getPropertyToExport(output_format)
try: self.document_loaded.storeToURL(self.systemPathToFileUrl(output_url),
self.document_loaded.storeToURL(self.systemPathToFileUrl(output_url), tuple(property_list))
tuple(property_list))
finally:
self.document_loaded.dispose()
return output_url return output_url
def getMetadata(self): def getMetadata(self):
...@@ -242,9 +242,7 @@ class UnoConverter(object): ...@@ -242,9 +242,7 @@ class UnoConverter(object):
except AttributeError: except AttributeError:
pass pass
service_manager = helper_util.getServiceManager(self.hostname, self.port, service_manager = self.service_manager
self.uno_path,
self.office_binary_path)
type_detection = service_manager.createInstance("com.sun.star.document.TypeDetection") type_detection = service_manager.createInstance("com.sun.star.document.TypeDetection")
uno_file_access = service_manager.createInstance("com.sun.star.ucb.SimpleFileAccess") uno_file_access = service_manager.createInstance("com.sun.star.ucb.SimpleFileAccess")
doc = uno_file_access.openFileRead(self.systemPathToFileUrl(self.document_url)) doc = uno_file_access.openFileRead(self.systemPathToFileUrl(self.document_url))
...@@ -286,7 +284,6 @@ class UnoConverter(object): ...@@ -286,7 +284,6 @@ class UnoConverter(object):
user_defined_properties.addProperty(prop, 0, '') user_defined_properties.addProperty(prop, 0, '')
user_defined_properties.setPropertyValue(prop, value) user_defined_properties.setPropertyValue(prop, value)
self.document_loaded.store() self.document_loaded.store()
self.document_loaded.dispose()
def help(): def help():
...@@ -317,7 +314,6 @@ def main(): ...@@ -317,7 +314,6 @@ def main():
import json import json
except ImportError: except ImportError:
import simplejson as json import simplejson as json
refresh = None
hostname = port = document_url = office_binary_path = uno_path =\ hostname = port = document_url = office_binary_path = uno_path =\
destination_format = source_format = refresh = metadata = mimemapper = None destination_format = source_format = refresh = metadata = mimemapper = None
for opt, arg in iter(opt_list): for opt, arg in iter(opt_list):
...@@ -345,28 +341,28 @@ def main(): ...@@ -345,28 +341,28 @@ def main():
elif opt == '--mimemapper': elif opt == '--mimemapper':
mimemapper = json.loads(arg) mimemapper = json.loads(arg)
service_manager = helper_util.getServiceManager(hostname, port,
unoconverter = UnoConverter(hostname, port, document_url, source_format, uno_path, office_binary_path)
uno_path, office_binary_path, refresh) if '--getmetadata' in param_list and '--convert' in param_list:
if "--convert" in param_list and not '--getmetadata' in param_list \ with UnoConverter(service_manager, document_url, source_format, refresh) as unoconverter:
and not destination_format: document_url = unoconverter.convert()
output = unoconverter.convert() # Instanciate new UnoConverter instance with new url
elif '--convert' in param_list and destination_format: with UnoConverter(service_manager, document_url, source_format, refresh) as unoconverter:
output = unoconverter.convert(destination_format) metadata_dict = unoconverter.getMetadata()
elif '--getmetadata' in param_list and not '--convert' in param_list: metadata_dict['document_url'] = document_url
metadata_dict = unoconverter.getMetadata() output = encodestring(json.dumps(metadata_dict).encode('utf-8')).decode('utf-8')
output = encodestring(json.dumps(metadata_dict).encode('utf-8')).decode('utf-8') else:
elif '--getmetadata' in param_list and '--convert' in param_list: with UnoConverter(service_manager, document_url, source_format, refresh) as unoconverter:
document_url = unoconverter.convert() if "--convert" in param_list and not destination_format:
# Instanciate new UnoConverter instance with new url output = unoconverter.convert()
unoconverter = UnoConverter(hostname, port, document_url, source_format, elif '--convert' in param_list and destination_format:
uno_path, office_binary_path, refresh) output = unoconverter.convert(destination_format)
metadata_dict = unoconverter.getMetadata() elif '--getmetadata' in param_list:
metadata_dict['document_url'] = document_url metadata_dict = unoconverter.getMetadata()
output = encodestring(json.dumps(metadata_dict).encode('utf-8')).decode('utf-8') output = encodestring(json.dumps(metadata_dict).encode('utf-8')).decode('utf-8')
elif '--setmetadata' in param_list: elif '--setmetadata' in param_list:
unoconverter.setMetadata(metadata) unoconverter.setMetadata(metadata)
output = document_url output = document_url
sys.stdout.write(output) sys.stdout.write(output)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment