| /************************************************************** |
| * |
| * 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 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| import com.sun.star.beans.PropertyValue; |
| import com.sun.star.beans.XPropertySet; |
| import com.sun.star.container.XNameAccess; |
| import com.sun.star.frame.XStorable; |
| import com.sun.star.frame.XModel; |
| import com.sun.star.sdb.XOfficeDatabaseDocument; |
| import com.sun.star.sdbc.SQLException; |
| import com.sun.star.sdbc.XCloseable; |
| import com.sun.star.sdbc.XConnection; |
| import com.sun.star.sdbc.XStatement; |
| import com.sun.star.uno.UnoRuntime; |
| import com.sun.star.io.IOException; |
| import com.sun.star.sdb.XDocumentDataSource; |
| import com.sun.star.sdbc.XDataSource; |
| import com.sun.star.uno.XComponentContext; |
| import java.io.File; |
| |
| import com.sun.star.util.CloseVetoException; |
| import java.io.File; |
| |
| /** |
| * |
| * @author fs93730 |
| */ |
| public class HsqlDatabase |
| { |
| XComponentContext m_context; |
| // the URL of the temporary file used for the database document |
| String m_databaseDocumentFile; |
| // the database document |
| XOfficeDatabaseDocument m_databaseDocument; |
| // the data source belonging to the database document |
| // the default connection |
| XConnection m_connection; |
| |
| // -------------------------------------------------------------------------------------------------------- |
| public HsqlDatabase( XComponentContext _context ) throws Exception |
| { |
| m_context = _context; |
| createDBDocument(); |
| } |
| |
| // -------------------------------------------------------------------------------------------------------- |
| public HsqlDatabase( XComponentContext _context, String _existingDocumentURL ) throws Exception |
| { |
| m_context = _context; |
| createDBDocument( _existingDocumentURL ); |
| } |
| |
| // -------------------------------------------------------------------------------------------------------- |
| private void createDBDocument( String _docURL ) throws Exception |
| { |
| m_databaseDocumentFile = _docURL; |
| |
| XNameAccess dbContext = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class, |
| m_context.getServiceManager().createInstanceWithContext( "com.sun.star.sdb.DatabaseContext", m_context ) ); |
| XDocumentDataSource dataSource = (XDocumentDataSource)UnoRuntime.queryInterface( XDocumentDataSource.class, |
| dbContext.getByName( _docURL ) ); |
| |
| m_databaseDocument = dataSource.getDatabaseDocument(); |
| } |
| |
| /** creates an empty database document in a temporary location |
| */ |
| private void createDBDocument() throws Exception |
| { |
| File documentFile = File.createTempFile("testdb",".odb"); |
| documentFile.deleteOnExit(); |
| m_databaseDocumentFile = URLHelper.getFileURLFromSystemPath( documentFile ); |
| |
| m_databaseDocument = (XOfficeDatabaseDocument)UnoRuntime.queryInterface( |
| XOfficeDatabaseDocument.class, m_context.getServiceManager().createInstanceWithContext( |
| "com.sun.star.sdb.OfficeDatabaseDocument", m_context ) ); |
| |
| XPropertySet dsProperties = (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, m_databaseDocument.getDataSource() ); |
| dsProperties.setPropertyValue("URL", "sdbc:embedded:hsqldb"); |
| |
| XStorable storable = (XStorable)UnoRuntime.queryInterface( XStorable.class, m_databaseDocument ); |
| storable.storeAsURL( m_databaseDocumentFile, new PropertyValue[]{} ); |
| } |
| |
| /** returns a connection to the database |
| * |
| * Multiple calls to this method return the same connection. The HsqlDatabase object keeps |
| * the ownership of the connection, so you don't need to (and should not) dispose/close it. |
| * |
| */ |
| public XConnection defaultConnection() throws SQLException |
| { |
| if ( m_connection != null ) |
| return m_connection; |
| m_connection = m_databaseDocument.getDataSource().getConnection(new String(),new String()); |
| return m_connection; |
| } |
| |
| /** executes the given SQL statement via the defaultConnection |
| */ |
| public void executeSQL( String statementString ) throws SQLException |
| { |
| XStatement statement = defaultConnection().createStatement(); |
| statement.execute( statementString ); |
| } |
| |
| /** stores the database document |
| */ |
| public void store() throws IOException |
| { |
| if ( m_databaseDocument != null ) |
| { |
| XStorable storeDoc = (XStorable)UnoRuntime.queryInterface( XStorable.class, |
| m_databaseDocument ); |
| storeDoc.store(); |
| } |
| } |
| |
| /** closes the database document |
| * |
| * Any CloseVetoExceptions fired by third parties are ignored, and any reference to the |
| * database document is released. |
| */ |
| public void close() |
| { |
| // close connection |
| XCloseable closeConn = (XCloseable)UnoRuntime.queryInterface( XCloseable.class, |
| m_connection ); |
| if ( closeConn != null ) |
| { |
| try |
| { |
| closeConn.close(); |
| } |
| catch( SQLException e ) |
| { |
| } |
| } |
| m_connection = null; |
| |
| // close document |
| com.sun.star.util.XCloseable closeDoc = (com.sun.star.util.XCloseable)UnoRuntime.queryInterface( |
| com.sun.star.util.XCloseable.class, m_databaseDocument ); |
| if ( closeDoc != null ) |
| { |
| try |
| { |
| closeDoc.close( true ); |
| } |
| catch( CloseVetoException e ) |
| { |
| } |
| } |
| m_databaseDocument = null; |
| } |
| |
| /** closes the document, and deletes the underlying file |
| */ |
| public void closeAndDelete() |
| { |
| close(); |
| |
| if ( m_databaseDocumentFile != null ) |
| { |
| try |
| { |
| File file = new File(m_databaseDocumentFile); |
| file.delete(); |
| } |
| catch(Exception e) |
| { |
| } |
| m_databaseDocumentFile = null; |
| } |
| } |
| |
| /** returns the underlying database document |
| */ |
| public XOfficeDatabaseDocument getDatabaseDocument() |
| { |
| return m_databaseDocument; |
| } |
| |
| /** returns the associated data source |
| */ |
| public XDataSource getDataSource() |
| { |
| return m_databaseDocument.getDataSource(); |
| } |
| |
| /** returns the model interface of the underlying database document |
| */ |
| XModel getModel() |
| { |
| return (XModel)UnoRuntime.queryInterface( XModel.class, m_databaseDocument ); |
| } |
| |
| /** drops the table with a given name |
| |
| @param _name |
| the name of the table to drop |
| @param _ifExists |
| TRUE if it should be dropped only when it exists. |
| */ |
| public void dropTable( String _name, boolean _ifExists ) throws SQLException |
| { |
| String dropStatement = "DROP TABLE \"" + _name; |
| if ( _ifExists ) |
| dropStatement += "\" IF EXISTS"; |
| executeSQL( dropStatement ); |
| } |
| |
| /** returns the URL of the ODB document represented by this instance |
| */ |
| public String getDocumentURL() |
| { |
| return m_databaseDocumentFile; |
| } |
| |
| /** creates a row set operating the database, with a given command/type |
| */ |
| public RowSet createRowSet( int _commandType, String _command ) |
| { |
| return new RowSet( m_context, getDocumentURL(), _commandType, _command ); |
| } |
| |
| protected void finalize() throws Throwable |
| { |
| closeAndDelete(); |
| super.finalize(); |
| } |
| } |