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