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