diff options
Diffstat (limited to 'qadevOOo/runner/util/db/DataSource.java')
-rw-r--r-- | qadevOOo/runner/util/db/DataSource.java | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/qadevOOo/runner/util/db/DataSource.java b/qadevOOo/runner/util/db/DataSource.java new file mode 100644 index 000000000..b9f41c332 --- /dev/null +++ b/qadevOOo/runner/util/db/DataSource.java @@ -0,0 +1,146 @@ +/* + * 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 util.db; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.NoSuchElementException; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdbc.XDataSource; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XNamingService; +import lib.StatusException; + +/** wraps a com.sun.star.sdb.DataSource + */ +public class DataSource +{ + protected DataSource( XMultiServiceFactory _orb, DataSourceDescriptor _descriptor ) + { + m_orb = _orb; + try + { + m_dataSource = UnoRuntime.queryInterface( XDataSource.class, + m_orb.createInstance( "com.sun.star.sdb.DataSource" ) ); + m_properties = UnoRuntime.queryInterface( XPropertySet.class, + m_dataSource ); + + Object[] descriptorProperties = new Object[] { + null, _descriptor.URL, _descriptor.Info, _descriptor.User, _descriptor.Password, + _descriptor.IsPasswordRequired }; + String[] propertyNames = new String[] { + "Name", "URL", "Info", "User", "Password", "IsPasswordRequired" }; + for ( int i=0; i < descriptorProperties.length; ++i ) + if ( descriptorProperties[i] != null ) + m_properties.setPropertyValue( propertyNames[i], descriptorProperties[i] ); + } + catch ( Exception e ) + { + throw new StatusException( "could not create/fill a css.sdb.DataSource object", e ); + } + } + + public XDataSource getDataSource() + { + return m_dataSource; + } + + /** + * retrieves the css.sdb.OfficeDatabaseDocument associated with the data source + */ + public synchronized DatabaseDocument getDatabaseDocument() + { + if ( m_document == null ) + m_document = new DatabaseDocument( this ); + return m_document; + } + + public void revokeRegistration() + { + String dataSourceName = ""; + try + { + dataSourceName = (String)m_properties.getPropertyValue( "Name" ); + XNamingService dbContext = UnoRuntime.queryInterface( XNamingService.class, + m_orb.createInstance( "com.sun.star.sdb.DatabaseContext" ) ); + dbContext.revokeObject( dataSourceName ); + } + catch ( Exception e ) + { + throw new StatusException( "DataSource.revokeRegistration: could not revoke the object (" + dataSourceName + ")", e ); + } + } + + public void registerAs( final String _registrationName, final boolean _revokeIfRegistered ) + { + String doing = null; + try + { + doing = "creating database context"; + XNamingService dbContext = UnoRuntime.queryInterface( XNamingService.class, + m_orb.createInstance( "com.sun.star.sdb.DatabaseContext" ) ); + + if ( _revokeIfRegistered ) + { + doing = "revoking previously registered data source"; + try + { + dbContext.revokeObject( _registrationName ); + } + catch( NoSuchElementException e ) + { /* allowed here */ } + } + + // if the document associated with the database document has not yet been saved, then we need to do so + DatabaseDocument doc = getDatabaseDocument(); + String docURL = doc.getURL(); + if ( docURL.length() == 0 ) + { + final java.io.File tempFile = java.io.File.createTempFile( _registrationName + "_", ".odb" ); + if ( tempFile.exists() ) { + // we did not really want to create that file, we just wanted its local name, but + // createTempFile actually creates it => throw it away + // (This is necessary since some JVM/platform combinations seem to actually lock the file) + boolean bDeleteOk = tempFile.delete(); + if (!bDeleteOk) { + System.out.println("delete failed"); + } + } + String localPart = tempFile.toURI().toURL().toString(); + localPart = localPart.substring( localPart.lastIndexOf( '/' ) + 1 ); + docURL = util.utils.getOfficeTemp( m_orb ) + localPart; + doing = "storing database document to temporary location (" + docURL + ")"; + doc.storeAsURL( docURL ); + } + + // register the data source + doing = "registering the data source at the database context"; + dbContext.registerObject( _registrationName, m_dataSource ); + } + catch( final java.lang.Exception e ) + { + throw new StatusException( "DataSource.registerAs: error during " + doing, e ); + } + } + + private final XMultiServiceFactory m_orb; + private final XDataSource m_dataSource; + private final XPropertySet m_properties; + private DatabaseDocument m_document = null; +} |