xref: /AOO41X/main/dbaccess/source/filter/xml/xmlTable.cxx (revision 96de54900b79e13b861fbc62cbf36018b54e21b7)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_dbaccess.hxx"
26 #ifndef DBA_XMLTABLE_HXX
27 #include "xmlTable.hxx"
28 #endif
29 #ifndef DBA_XMLFILTER_HXX
30 #include "xmlfilter.hxx"
31 #endif
32 #ifndef _XMLOFF_XMLTOKEN_HXX
33 #include <xmloff/xmltoken.hxx>
34 #endif
35 #ifndef _XMLOFF_XMLNMSPE_HXX
36 #include <xmloff/xmlnmspe.hxx>
37 #endif
38 #ifndef _XMLOFF_NMSPMAP_HXX
39 #include <xmloff/nmspmap.hxx>
40 #endif
41 #ifndef DBA_XMLENUMS_HXX
42 #include "xmlEnums.hxx"
43 #endif
44 #ifndef DBA_XMLSTYLEIMPORT_HXX
45 #include "xmlStyleImport.hxx"
46 #endif
47 #ifndef DBA_XMLHIERARCHYCOLLECTION_HXX
48 #include "xmlHierarchyCollection.hxx"
49 #endif
50 #ifndef DBACCESS_SHARED_XMLSTRINGS_HRC
51 #include "xmlstrings.hrc"
52 #endif
53 #ifndef _UCBHELPER_CONTENT_HXX
54 #include <ucbhelper/content.hxx>
55 #endif
56 #ifndef _COM_SUN_STAR_UCB_XCOMMANDENVIRONMENT_HPP_
57 #include <com/sun/star/ucb/XCommandEnvironment.hpp>
58 #endif
59 #ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
60 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
61 #endif
62 #ifndef _COMPHELPER_NAMECONTAINER_HXX_
63 #include <comphelper/namecontainer.hxx>
64 #endif
65 #ifndef _TOOLS_DEBUG_HXX
66 #include <tools/debug.hxx>
67 #endif
68 
69 namespace dbaxml
70 {
71     using namespace ::com::sun::star;
72     using namespace ::com::sun::star::uno;
73     using namespace ::com::sun::star::sdbcx;
74     using namespace ::com::sun::star::xml::sax;
DBG_NAME(OXMLTable)75 DBG_NAME(OXMLTable)
76 
77 OXMLTable::OXMLTable( ODBFilter& _rImport
78                 ,sal_uInt16 nPrfx
79                 ,const ::rtl::OUString& _sLocalName
80                 ,const uno::Reference< XAttributeList > & _xAttrList
81                 ,const uno::Reference< ::com::sun::star::container::XNameAccess >& _xParentContainer
82                 ,const ::rtl::OUString& _sServiceName
83                 )
84     :SvXMLImportContext( _rImport, nPrfx, _sLocalName )
85     ,m_xParentContainer(_xParentContainer)
86     ,m_sServiceName(_sServiceName)
87     ,m_bApplyFilter(sal_False)
88     ,m_bApplyOrder(sal_False)
89 {
90     DBG_CTOR(OXMLTable,NULL);
91 
92     OSL_ENSURE(_xAttrList.is(),"Attribute list is NULL!");
93     const SvXMLNamespaceMap& rMap = GetOwnImport().GetNamespaceMap();
94     const SvXMLTokenMap& rTokenMap = GetOwnImport().GetQueryElemTokenMap();
95 
96     sal_Int16 nLength = (_xAttrList.is()) ? _xAttrList->getLength() : 0;
97     for(sal_Int16 i = 0; i < nLength; ++i)
98     {
99         ::rtl::OUString sLocalName;
100         rtl::OUString sAttrName = _xAttrList->getNameByIndex( i );
101         sal_uInt16 nPrefix = rMap.GetKeyByAttrName( sAttrName,&sLocalName );
102         rtl::OUString sValue = _xAttrList->getValueByIndex( i );
103 
104         switch( rTokenMap.Get( nPrefix, sLocalName ) )
105         {
106             case XML_TOK_QUERY_NAME:
107                 m_sName = sValue;
108                 break;
109             case XML_TOK_CATALOG_NAME:
110                 m_sCatalog = sValue;
111                 break;
112             case XML_TOK_SCHEMA_NAME:
113                 m_sSchema = sValue;
114                 break;
115             case XML_TOK_STYLE_NAME:
116                 m_sStyleName = sValue;
117                 break;
118             case XML_TOK_APPLY_FILTER:
119                 m_bApplyFilter = sValue.equalsAscii("true");
120                 break;
121             case XML_TOK_APPLY_ORDER:
122                 m_bApplyOrder = sValue.equalsAscii("true");
123                 break;
124         }
125     }
126     Sequence< Any > aArguments(2);
127     PropertyValue aValue;
128     // set as folder
129     aValue.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Name"));
130     aValue.Value <<= m_sName;
131     aArguments[0] <<= aValue;
132     //parent
133     aValue.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Parent"));
134     aValue.Value <<= m_xParentContainer;
135     aArguments[1] <<= aValue;
136     m_xTable.set(GetOwnImport().getORB()->createInstanceWithArguments(m_sServiceName,aArguments),UNO_QUERY);
137 }
138 // -----------------------------------------------------------------------------
139 
~OXMLTable()140 OXMLTable::~OXMLTable()
141 {
142 
143     DBG_DTOR(OXMLTable,NULL);
144 }
145 // -----------------------------------------------------------------------------
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const uno::Reference<XAttributeList> & xAttrList)146 SvXMLImportContext* OXMLTable::CreateChildContext(
147         sal_uInt16 nPrefix,
148         const ::rtl::OUString& rLocalName,
149         const uno::Reference< XAttributeList > & xAttrList )
150 {
151     SvXMLImportContext *pContext = 0;
152     const SvXMLTokenMap&    rTokenMap   = GetOwnImport().GetQueryElemTokenMap();
153 
154     switch( rTokenMap.Get( nPrefix, rLocalName ) )
155     {
156         case XML_TOK_FILTER_STATEMENT:
157             {
158                 GetOwnImport().GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
159                 ::rtl::OUString s1,s2,s3;
160                 fillAttributes(nPrefix, rLocalName,xAttrList,m_sFilterStatement,s1,s2,s3);
161             }
162             break;
163         case XML_TOK_ORDER_STATEMENT:
164             {
165                 GetOwnImport().GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
166                 ::rtl::OUString s1,s2,s3;
167                 fillAttributes(nPrefix, rLocalName,xAttrList,m_sOrderStatement,s1,s2,s3);
168             }
169             break;
170 
171         case XML_TOK_COLUMNS:
172             {
173                 GetOwnImport().GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
174                 uno::Reference< XColumnsSupplier > xColumnsSup(m_xTable,UNO_QUERY);
175                 uno::Reference< XNameAccess > xColumns;
176                 if ( xColumnsSup.is() )
177                 {
178                     xColumns = xColumnsSup->getColumns();
179                 }
180                 pContext = new OXMLHierarchyCollection( GetOwnImport(), nPrefix, rLocalName ,xColumns,m_xTable);
181             }
182             break;
183     }
184 
185     if( !pContext )
186         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
187 
188     return pContext;
189 }
190 // -----------------------------------------------------------------------------
GetOwnImport()191 ODBFilter& OXMLTable::GetOwnImport()
192 {
193     return static_cast<ODBFilter&>(GetImport());
194 }
195 // -----------------------------------------------------------------------------
setProperties(uno::Reference<XPropertySet> & _xProp)196 void OXMLTable::setProperties(uno::Reference< XPropertySet > & _xProp )
197 {
198     try
199     {
200         if ( _xProp.is() )
201         {
202             _xProp->setPropertyValue(PROPERTY_APPLYFILTER,makeAny(m_bApplyFilter));
203             _xProp->setPropertyValue(PROPERTY_FILTER,makeAny(m_sFilterStatement));
204 
205             if ( _xProp->getPropertySetInfo()->hasPropertyByName(PROPERTY_APPLYORDER) )
206                 _xProp->setPropertyValue(PROPERTY_APPLYORDER,makeAny(m_bApplyOrder));
207             _xProp->setPropertyValue(PROPERTY_ORDER,makeAny(m_sOrderStatement));
208         }
209     }
210     catch(Exception&)
211     {
212         OSL_ENSURE(0,"OXMLTable::EndElement -> exception catched");
213     }
214 }
215 // -----------------------------------------------------------------------------
EndElement()216 void OXMLTable::EndElement()
217 {
218     uno::Reference<XNameContainer> xNameContainer(m_xParentContainer,UNO_QUERY);
219     if ( xNameContainer.is() )
220     {
221         try
222         {
223             if ( m_xTable.is() )
224             {
225                 setProperties(m_xTable);
226 
227                 if ( m_sStyleName.getLength() )
228                 {
229                     const SvXMLStylesContext* pAutoStyles = GetOwnImport().GetAutoStyles();
230                     if ( pAutoStyles )
231                     {
232                         OTableStyleContext* pAutoStyle = PTR_CAST(OTableStyleContext,pAutoStyles->FindStyleChildContext(XML_STYLE_FAMILY_TABLE_TABLE,m_sStyleName));
233                         if ( pAutoStyle )
234                         {
235                             pAutoStyle->FillPropertySet(m_xTable);
236                         }
237                     }
238                 }
239 
240                 xNameContainer->insertByName(m_sName,makeAny(m_xTable));
241             }
242         }
243         catch(Exception&)
244         {
245             OSL_ENSURE(0,"OXMLQuery::EndElement -> exception catched");
246         }
247     }
248 
249 }
250 // -----------------------------------------------------------------------------
fillAttributes(sal_uInt16,const::rtl::OUString &,const uno::Reference<XAttributeList> & _xAttrList,::rtl::OUString & _rsCommand,::rtl::OUString & _rsTableName,::rtl::OUString & _rsTableSchema,::rtl::OUString & _rsTableCatalog)251 void OXMLTable::fillAttributes(sal_uInt16 /*nPrfx*/
252                                 ,const ::rtl::OUString& /*_sLocalName*/
253                                 ,const uno::Reference< XAttributeList > & _xAttrList
254                                 , ::rtl::OUString& _rsCommand
255                                 ,::rtl::OUString& _rsTableName
256                                 ,::rtl::OUString& _rsTableSchema
257                                 ,::rtl::OUString& _rsTableCatalog
258                                 )
259 {
260     OSL_ENSURE(_xAttrList.is(),"Attribute list is NULL!");
261     const SvXMLNamespaceMap& rMap = GetOwnImport().GetNamespaceMap();
262     const SvXMLTokenMap& rTokenMap = GetOwnImport().GetQueryElemTokenMap();
263 
264     sal_Int16 nLength = (_xAttrList.is()) ? _xAttrList->getLength() : 0;
265     for(sal_Int16 i = 0; i < nLength; ++i)
266     {
267         ::rtl::OUString sLocalName;
268         rtl::OUString sAttrName = _xAttrList->getNameByIndex( i );
269         sal_uInt16 nPrefix = rMap.GetKeyByAttrName( sAttrName,&sLocalName );
270         rtl::OUString sValue = _xAttrList->getValueByIndex( i );
271 
272         switch( rTokenMap.Get( nPrefix, sLocalName ) )
273         {
274             case XML_TOK_COMMAND:
275                 _rsCommand = sValue;
276                 break;
277             case XML_TOK_CATALOG_NAME:
278                 _rsTableCatalog = sValue;
279                 break;
280             case XML_TOK_SCHEMA_NAME:
281                 _rsTableSchema = sValue;
282                 break;
283             case XML_TOK_QUERY_NAME:
284                 _rsTableName = sValue;
285                 break;
286         }
287     }
288 }
289 //----------------------------------------------------------------------------
290 } // namespace dbaxml
291 // -----------------------------------------------------------------------------
292