1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski package util.db; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski import com.sun.star.beans.PropertyValue; 27*b1cdbd2cSJim Jagielski import com.sun.star.beans.XPropertySet; 28*b1cdbd2cSJim Jagielski import com.sun.star.container.NoSuchElementException; 29*b1cdbd2cSJim Jagielski import com.sun.star.frame.XModel; 30*b1cdbd2cSJim Jagielski import com.sun.star.frame.XStorable; 31*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiServiceFactory; 32*b1cdbd2cSJim Jagielski import com.sun.star.sdb.XDocumentDataSource; 33*b1cdbd2cSJim Jagielski import com.sun.star.sdb.XOfficeDatabaseDocument; 34*b1cdbd2cSJim Jagielski import com.sun.star.sdbc.XDataSource; 35*b1cdbd2cSJim Jagielski import com.sun.star.uno.Exception; 36*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime; 37*b1cdbd2cSJim Jagielski import com.sun.star.uno.XNamingService; 38*b1cdbd2cSJim Jagielski import java.util.logging.Level; 39*b1cdbd2cSJim Jagielski import java.util.logging.Logger; 40*b1cdbd2cSJim Jagielski import lib.StatusException; 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski /** wraps a com.sun.star.sdb.DataSource 43*b1cdbd2cSJim Jagielski * 44*b1cdbd2cSJim Jagielski * @author fs93730 45*b1cdbd2cSJim Jagielski */ 46*b1cdbd2cSJim Jagielski public class DataSource 47*b1cdbd2cSJim Jagielski { DataSource( XMultiServiceFactory _orb, DataSourceDescriptor _descriptor )48*b1cdbd2cSJim Jagielski protected DataSource( XMultiServiceFactory _orb, DataSourceDescriptor _descriptor ) 49*b1cdbd2cSJim Jagielski { 50*b1cdbd2cSJim Jagielski m_orb = _orb; 51*b1cdbd2cSJim Jagielski try 52*b1cdbd2cSJim Jagielski { 53*b1cdbd2cSJim Jagielski m_dataSource = (XDataSource)UnoRuntime.queryInterface( XDataSource.class, 54*b1cdbd2cSJim Jagielski m_orb.createInstance( "com.sun.star.sdb.DataSource" ) ); 55*b1cdbd2cSJim Jagielski m_properties = (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, 56*b1cdbd2cSJim Jagielski m_dataSource ); 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski Object[] descriptorProperties = new Object[] { 59*b1cdbd2cSJim Jagielski _descriptor.Name, _descriptor.URL, _descriptor.Info, _descriptor.User, _descriptor.Password, 60*b1cdbd2cSJim Jagielski _descriptor.IsPasswordRequired }; 61*b1cdbd2cSJim Jagielski String[] propertyNames = new String[] { 62*b1cdbd2cSJim Jagielski "Name", "URL", "Info", "User", "Password", "IsPasswordRequired" }; 63*b1cdbd2cSJim Jagielski for ( int i=0; i < descriptorProperties.length; ++i ) 64*b1cdbd2cSJim Jagielski if ( descriptorProperties[i] != null ) 65*b1cdbd2cSJim Jagielski m_properties.setPropertyValue( propertyNames[i], descriptorProperties[i] ); 66*b1cdbd2cSJim Jagielski } 67*b1cdbd2cSJim Jagielski catch ( Exception e ) 68*b1cdbd2cSJim Jagielski { 69*b1cdbd2cSJim Jagielski throw new StatusException( "could not create/fill a css.sdb.DataSource object", e ); 70*b1cdbd2cSJim Jagielski } 71*b1cdbd2cSJim Jagielski } 72*b1cdbd2cSJim Jagielski getDataSource()73*b1cdbd2cSJim Jagielski public XDataSource getDataSource() 74*b1cdbd2cSJim Jagielski { 75*b1cdbd2cSJim Jagielski return m_dataSource; 76*b1cdbd2cSJim Jagielski } 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski /** 79*b1cdbd2cSJim Jagielski * retrieves the css.sdb.OfficeDatabaseDocument associated with the data source 80*b1cdbd2cSJim Jagielski * @return 81*b1cdbd2cSJim Jagielski */ getDatabaseDocument()82*b1cdbd2cSJim Jagielski public DatabaseDocument getDatabaseDocument() 83*b1cdbd2cSJim Jagielski { 84*b1cdbd2cSJim Jagielski synchronized ( this ) 85*b1cdbd2cSJim Jagielski { 86*b1cdbd2cSJim Jagielski if ( m_document == null ) 87*b1cdbd2cSJim Jagielski m_document = new DatabaseDocument( m_orb, this ); 88*b1cdbd2cSJim Jagielski } 89*b1cdbd2cSJim Jagielski return m_document; 90*b1cdbd2cSJim Jagielski } 91*b1cdbd2cSJim Jagielski revokeRegistration()92*b1cdbd2cSJim Jagielski public void revokeRegistration() 93*b1cdbd2cSJim Jagielski { 94*b1cdbd2cSJim Jagielski String dataSourceName = ""; 95*b1cdbd2cSJim Jagielski try 96*b1cdbd2cSJim Jagielski { 97*b1cdbd2cSJim Jagielski dataSourceName = (String)m_properties.getPropertyValue( "Name" ); 98*b1cdbd2cSJim Jagielski XNamingService dbContext = (XNamingService)UnoRuntime.queryInterface( XNamingService.class, 99*b1cdbd2cSJim Jagielski m_orb.createInstance( "com.sun.star.sdb.DatabaseContext" ) ); 100*b1cdbd2cSJim Jagielski dbContext.revokeObject( dataSourceName ); 101*b1cdbd2cSJim Jagielski } 102*b1cdbd2cSJim Jagielski catch ( Exception e ) 103*b1cdbd2cSJim Jagielski { 104*b1cdbd2cSJim Jagielski throw new StatusException( "DataSource.revokeRegistration: could not revoke the object (" + dataSourceName + ")", e ); 105*b1cdbd2cSJim Jagielski } 106*b1cdbd2cSJim Jagielski } 107*b1cdbd2cSJim Jagielski registerAs( final String _registrationName, final boolean _revokeIfRegistered )108*b1cdbd2cSJim Jagielski public void registerAs( final String _registrationName, final boolean _revokeIfRegistered ) 109*b1cdbd2cSJim Jagielski { 110*b1cdbd2cSJim Jagielski String doing = null; 111*b1cdbd2cSJim Jagielski try 112*b1cdbd2cSJim Jagielski { 113*b1cdbd2cSJim Jagielski doing = "creating database context"; 114*b1cdbd2cSJim Jagielski XNamingService dbContext = UnoRuntime.queryInterface( XNamingService.class, 115*b1cdbd2cSJim Jagielski m_orb.createInstance( "com.sun.star.sdb.DatabaseContext" ) ); 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski if ( _revokeIfRegistered ) 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski doing = "revoking previously registered data source"; 120*b1cdbd2cSJim Jagielski try 121*b1cdbd2cSJim Jagielski { 122*b1cdbd2cSJim Jagielski dbContext.revokeObject( _registrationName ); 123*b1cdbd2cSJim Jagielski } 124*b1cdbd2cSJim Jagielski catch( NoSuchElementException e ) 125*b1cdbd2cSJim Jagielski { /* allowed here */ } 126*b1cdbd2cSJim Jagielski } 127*b1cdbd2cSJim Jagielski 128*b1cdbd2cSJim Jagielski // if the document associated with the database document has not yet been saved, then we need to do so 129*b1cdbd2cSJim Jagielski DatabaseDocument doc = getDatabaseDocument(); 130*b1cdbd2cSJim Jagielski String docURL = doc.getURL(); 131*b1cdbd2cSJim Jagielski if ( docURL.length() == 0 ) 132*b1cdbd2cSJim Jagielski { 133*b1cdbd2cSJim Jagielski final java.io.File tempFile = java.io.File.createTempFile( _registrationName + "_", ".odb" ); 134*b1cdbd2cSJim Jagielski if ( tempFile.exists() ) 135*b1cdbd2cSJim Jagielski // we did not really want to create that file, we just wanted its local name, but 136*b1cdbd2cSJim Jagielski // createTempFile actually creates it => throw it away 137*b1cdbd2cSJim Jagielski // (This is necessary since some JVM/platform combinations seem to actually lock the file) 138*b1cdbd2cSJim Jagielski tempFile.delete(); 139*b1cdbd2cSJim Jagielski String localPart = tempFile.toURI().toURL().toString(); 140*b1cdbd2cSJim Jagielski localPart = localPart.substring( localPart.lastIndexOf( '/' ) + 1 ); 141*b1cdbd2cSJim Jagielski docURL = util.utils.getOfficeTemp( m_orb ) + localPart; 142*b1cdbd2cSJim Jagielski doing = "storing database document to temporary location (" + docURL + ")"; 143*b1cdbd2cSJim Jagielski doc.storeAsURL( docURL ); 144*b1cdbd2cSJim Jagielski } 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski // register the data soource 147*b1cdbd2cSJim Jagielski doing = "registering the data source at the database context"; 148*b1cdbd2cSJim Jagielski dbContext.registerObject( _registrationName, m_dataSource ); 149*b1cdbd2cSJim Jagielski } 150*b1cdbd2cSJim Jagielski catch( final java.lang.Exception e ) 151*b1cdbd2cSJim Jagielski { 152*b1cdbd2cSJim Jagielski throw new StatusException( "DataSource.registerAs: error during " + doing, e ); 153*b1cdbd2cSJim Jagielski } 154*b1cdbd2cSJim Jagielski } 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski private XMultiServiceFactory m_orb = null; 157*b1cdbd2cSJim Jagielski private XDataSource m_dataSource = null; 158*b1cdbd2cSJim Jagielski private XPropertySet m_properties = null; 159*b1cdbd2cSJim Jagielski private DatabaseDocument m_document = null; 160*b1cdbd2cSJim Jagielski } 161