1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef _DBA_COREDATAACCESS_DATABASECONTEXT_HXX_
29 #define _DBA_COREDATAACCESS_DATABASECONTEXT_HXX_
30 
31 #include "ModelImpl.hxx"
32 
33 /** === begin UNO includes === **/
34 #include <com/sun/star/container/ElementExistException.hpp>
35 #include <com/sun/star/container/XContainer.hpp>
36 #include <com/sun/star/container/XEnumerationAccess.hpp>
37 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
38 #include <com/sun/star/container/XNameAccess.hpp>
39 #include <com/sun/star/lang/XEventListener.hpp>
40 #include <com/sun/star/lang/XServiceInfo.hpp>
41 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
42 #include <com/sun/star/lang/XUnoTunnel.hpp>
43 #include <com/sun/star/sdb/XDatabaseEnvironment.hpp>
44 #include <com/sun/star/sdb/XDatabaseRegistrations.hpp>
45 #include <com/sun/star/uno/XNamingService.hpp>
46 #include <com/sun/star/uno/XAggregation.hpp>
47 /** === end UNO includes === **/
48 
49 #include <basic/basicmanagerrepository.hxx>
50 #include <comphelper/componentcontext.hxx>
51 #include <comphelper/stl_types.hxx>
52 #include <cppuhelper/compbase8.hxx>
53 #include <cppuhelper/interfacecontainer.hxx>
54 
55 #include <boost/shared_ptr.hpp>
56 
57 // needed for registration
58 namespace com { namespace sun { namespace star {
59 	namespace lang
60 	{
61 		class XMultiServiceFactory;
62 		class IllegalArgumentException;
63 	}
64 } } }
65 
66 //........................................................................
67 namespace dbaccess
68 {
69 //........................................................................
70 class DatabaseDocumentLoader;
71 //============================================================
72 //= ODatabaseContext
73 //============================================================
74 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
75 	ODatabaseContext_CreateInstance(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >&);
76 
77 typedef ::cppu::WeakComponentImplHelper8	<	::com::sun::star::lang::XServiceInfo
78 											,	::com::sun::star::container::XEnumerationAccess
79 											,	::com::sun::star::container::XNameAccess
80 											,	::com::sun::star::uno::XNamingService
81 											,	::com::sun::star::container::XContainer
82 											,	::com::sun::star::lang::XSingleServiceFactory
83 											,	::com::sun::star::lang::XUnoTunnel
84 											,	::com::sun::star::sdb::XDatabaseRegistrations
85 											>	DatabaseAccessContext_Base;
86 
87 class ODatabaseContext  :public DatabaseAccessContext_Base
88                         ,public ::basic::BasicManagerCreationListener
89 {
90 private:
91     /** loads the given object from the given URL
92     @throws WrappedTargetException
93         if an error occurs accessing the URL via the UCB
94 
95     */
96 	::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > loadObjectFromURL(const ::rtl::OUString& _rName,const ::rtl::OUString& _sURL);
97 	::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > getObject( const ::rtl::OUString& _rURL );
98 
99     /** sets all properties which were transient at the data source. e.g. password
100         @param  _sURL       The file URL of the data source
101         @param  _xObject    The data source itself.
102     */
103     void setTransientProperties(const ::rtl::OUString& _sURL, ODatabaseModelImpl& _rDataSourceModel );
104 
105     /** creates a new data source
106     */
107     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
108             impl_createNewDataSource();
109 
110 protected:
111 	::osl::Mutex	                m_aMutex;
112     ::comphelper::ComponentContext  m_aContext;
113 
114     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation >
115                                     m_xDBRegistrationAggregate;
116     ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XDatabaseRegistrations >
117                                     m_xDatabaseRegistrations;
118 
119 	DECLARE_STL_USTRINGACCESS_MAP( ODatabaseModelImpl*, ObjectCache );
120 	ObjectCache		m_aDatabaseObjects;
121 
122 	DECLARE_STL_USTRINGACCESS_MAP( ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >, PropertyCache );
123 	PropertyCache	m_aDatasourceProperties;
124 		// as we hold our data sources weak, we have to cache all properties on the data sources which are
125 		// transient but stored as long as the session lasts. The database context is the session (as it lives
126 		// as long as the session does), but the data sources may die before the session does, and then be
127 		// recreated afterwards. So it's our (the context's) responsibility to store the session-persistent
128 		// properties.
129 
130 	::cppu::OInterfaceContainerHelper		m_aContainerListeners;
131     DatabaseDocumentLoader*                 m_pDatabaseDocumentLoader;
132 
133 public:
134 	ODatabaseContext( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& );
135 	virtual ~ODatabaseContext();
136 
137 
138     // OComponentHelper
139 	virtual void SAL_CALL disposing(void);
140 
141     // XSingleServiceFactory
142     virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstance(  ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
143     virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstanceWithArguments( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& _rArguments ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
144 
145     // XServiceInfo
146     virtual ::rtl::OUString SAL_CALL getImplementationName(  ) throw(::com::sun::star::uno::RuntimeException);
147     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException);
148     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException);
149 
150     // XServiceInfo - static methods
151 	static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_static(void) throw( ::com::sun::star::uno::RuntimeException );
152 	static ::rtl::OUString getImplementationName_static(void) throw( ::com::sun::star::uno::RuntimeException );
153 	static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
154 		SAL_CALL Create(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >&);
155 
156     // XElementAccess
157     virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
158     virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);
159 
160     // XEnumerationAccess
161 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createEnumeration(  ) throw(::com::sun::star::uno::RuntimeException);
162 
163     // XNameAccess
164 	virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
165     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames(  ) throw(::com::sun::star::uno::RuntimeException);
166     virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw(::com::sun::star::uno::RuntimeException);
167 
168     // XNamingService
169 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getRegisteredObject( const ::rtl::OUString& Name ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
170     virtual void SAL_CALL registerObject( const ::rtl::OUString& Name, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& Object ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
171     virtual void SAL_CALL revokeObject( const ::rtl::OUString& Name ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
172 
173     // XDatabaseRegistrations
174     virtual ::sal_Bool SAL_CALL hasRegisteredDatabase( const ::rtl::OUString& Name ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
175     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getRegistrationNames() throw (::com::sun::star::uno::RuntimeException);
176     virtual ::rtl::OUString SAL_CALL getDatabaseLocation( const ::rtl::OUString& Name ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);
177     virtual void SAL_CALL registerDatabaseLocation( const ::rtl::OUString& Name, const ::rtl::OUString& Location ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException);
178     virtual void SAL_CALL revokeDatabaseLocation( const ::rtl::OUString& Name ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException);
179     virtual void SAL_CALL changeDatabaseLocation( const ::rtl::OUString& Name, const ::rtl::OUString& NewLocation ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException);
180     virtual ::sal_Bool SAL_CALL isDatabaseRegistrationReadOnly( const ::rtl::OUString& Name ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);
181     virtual void SAL_CALL addDatabaseRegistrationsListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XDatabaseRegistrationsListener >& Listener ) throw (::com::sun::star::uno::RuntimeException);
182     virtual void SAL_CALL removeDatabaseRegistrationsListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XDatabaseRegistrationsListener >& Listener ) throw (::com::sun::star::uno::RuntimeException);
183 
184     // XContainer
185     virtual void SAL_CALL addContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerListener >& xListener ) throw(::com::sun::star::uno::RuntimeException);
186     virtual void SAL_CALL removeContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerListener >& xListener ) throw(::com::sun::star::uno::RuntimeException);
187 
188 	// com::sun::star::lang::XUnoTunnel
189     virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);
190 	static ::com::sun::star::uno::Sequence< sal_Int8 > getUnoTunnelImplementationId();
191 
192 	void registerDatabaseDocument( ODatabaseModelImpl& _rModelImpl);
193 	void revokeDatabaseDocument( const ODatabaseModelImpl& _rModelImpl);
194 	void databaseDocumentURLChange(const ::rtl::OUString& _sOldName, const ::rtl::OUString& _sNewName);
195     void storeTransientProperties( ODatabaseModelImpl& _rModelImpl);
196     void appendAtTerminateListener(const ODatabaseModelImpl& _rDataSourceModel);
197     void removeFromTerminateListener(const ODatabaseModelImpl& _rDataSourceModel);
198 
199 private:
200     // BasicManagerCreationListener
201     virtual void onBasicManagerCreated(
202         const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& _rxForDocument,
203         BasicManager& _rBasicManager
204     );
205 };
206 
207 //........................................................................
208 }	// namespace dbaccess
209 //........................................................................
210 
211 #endif // _DBA_COREDATAACCESS_DATABASECONTEXT_HXX_
212 
213 
214