1a740f2aaSAndrew Rist /**************************************************************
2a740f2aaSAndrew Rist  *
3a740f2aaSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4a740f2aaSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5a740f2aaSAndrew Rist  * distributed with this work for additional information
6a740f2aaSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7a740f2aaSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8a740f2aaSAndrew Rist  * "License"); you may not use this file except in compliance
9a740f2aaSAndrew Rist  * with the License.  You may obtain a copy of the License at
10a740f2aaSAndrew Rist  *
11a740f2aaSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12a740f2aaSAndrew Rist  *
13a740f2aaSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14a740f2aaSAndrew Rist  * software distributed under the License is distributed on an
15a740f2aaSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16a740f2aaSAndrew Rist  * KIND, either express or implied.  See the License for the
17a740f2aaSAndrew Rist  * specific language governing permissions and limitations
18a740f2aaSAndrew Rist  * under the License.
19a740f2aaSAndrew Rist  *
20a740f2aaSAndrew Rist  *************************************************************/
21a740f2aaSAndrew Rist 
22cdf0e10cSrcweir package complex.ofopxmlstorages;
23cdf0e10cSrcweir 
24cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
25cdf0e10cSrcweir import com.sun.star.uno.XInterface;
26cdf0e10cSrcweir import com.sun.star.uno.AnyConverter;
27cdf0e10cSrcweir 
28cdf0e10cSrcweir import com.sun.star.lang.*;
29cdf0e10cSrcweir import com.sun.star.embed.*;
30cdf0e10cSrcweir import com.sun.star.packages.*;
31cdf0e10cSrcweir import com.sun.star.io.*;
32cdf0e10cSrcweir import com.sun.star.beans.*;
33cdf0e10cSrcweir 
34cdf0e10cSrcweir import share.LogWriter;
35cdf0e10cSrcweir 
36cdf0e10cSrcweir public class TestHelper  {
37cdf0e10cSrcweir 
38cdf0e10cSrcweir 	LogWriter m_aLogWriter;
39cdf0e10cSrcweir 	String m_sTestPrefix;
40cdf0e10cSrcweir 
TestHelper( LogWriter aLogWriter, String sTestPrefix )41cdf0e10cSrcweir 	public TestHelper( LogWriter aLogWriter, String sTestPrefix )
42cdf0e10cSrcweir 	{
43cdf0e10cSrcweir 		m_aLogWriter = aLogWriter;
44cdf0e10cSrcweir 		m_sTestPrefix = sTestPrefix;
45cdf0e10cSrcweir 	}
46cdf0e10cSrcweir 
WriteBytesToStream( XStream xStream, String sStreamName, String sMediaType, boolean bCompressed, byte[] pBytes, StringPair[][] aRelations )47cdf0e10cSrcweir 	public boolean WriteBytesToStream( XStream xStream,
48cdf0e10cSrcweir 										String sStreamName,
49cdf0e10cSrcweir 										String sMediaType,
50cdf0e10cSrcweir 										boolean bCompressed,
51cdf0e10cSrcweir 										byte[] pBytes,
52cdf0e10cSrcweir 										StringPair[][] aRelations )
53cdf0e10cSrcweir 	{
54cdf0e10cSrcweir 		// get output stream of substream
55cdf0e10cSrcweir 		XOutputStream xOutput = xStream.getOutputStream();
56cdf0e10cSrcweir 		if ( xOutput == null )
57cdf0e10cSrcweir 		{
58cdf0e10cSrcweir 			Error( "Can't get XOutputStream implementation from substream '" + sStreamName + "'!" );
59cdf0e10cSrcweir 			return false;
60cdf0e10cSrcweir 		}
61cdf0e10cSrcweir 
62cdf0e10cSrcweir 		// get XTrucate implementation from output stream
63cdf0e10cSrcweir 		XTruncate xTruncate = (XTruncate) UnoRuntime.queryInterface( XTruncate.class, xOutput );
64cdf0e10cSrcweir 		if ( xTruncate == null )
65cdf0e10cSrcweir 		{
66cdf0e10cSrcweir 			Error( "Can't get XTruncate implementation from substream '" + sStreamName + "'!" );
67cdf0e10cSrcweir 			return false;
68cdf0e10cSrcweir 		}
69cdf0e10cSrcweir 
70cdf0e10cSrcweir 		// write requested byte sequence
71cdf0e10cSrcweir 		try
72cdf0e10cSrcweir 		{
73cdf0e10cSrcweir 			xTruncate.truncate();
74cdf0e10cSrcweir 			xOutput.writeBytes( pBytes );
75cdf0e10cSrcweir 		}
76cdf0e10cSrcweir 		catch( Exception e )
77cdf0e10cSrcweir 		{
78cdf0e10cSrcweir 			Error( "Can't write to stream '" + sStreamName + "', exception: " + e );
79cdf0e10cSrcweir 			return false;
80cdf0e10cSrcweir 		}
81cdf0e10cSrcweir 
82cdf0e10cSrcweir 		// get access to the XPropertySet interface
83cdf0e10cSrcweir 		XPropertySet xPropSet = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xStream );
84cdf0e10cSrcweir 		if ( xPropSet == null )
85cdf0e10cSrcweir 		{
86cdf0e10cSrcweir 			Error( "Can't get XPropertySet implementation from substream '" + sStreamName + "'!" );
87cdf0e10cSrcweir 			return false;
88cdf0e10cSrcweir 		}
89cdf0e10cSrcweir 
90cdf0e10cSrcweir 		// set properties to the stream
91cdf0e10cSrcweir 		try
92cdf0e10cSrcweir 		{
93cdf0e10cSrcweir 			xPropSet.setPropertyValue( "MediaType", sMediaType );
94cdf0e10cSrcweir 			xPropSet.setPropertyValue( "Compressed", new Boolean( bCompressed ) );
95cdf0e10cSrcweir 		}
96cdf0e10cSrcweir 		catch( Exception e )
97cdf0e10cSrcweir 		{
98cdf0e10cSrcweir 			Error( "Can't set properties to substream '" + sStreamName + "', exception: " + e );
99cdf0e10cSrcweir 			return false;
100cdf0e10cSrcweir 		}
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 		// check size property of the stream
103cdf0e10cSrcweir 		try
104cdf0e10cSrcweir 		{
105cdf0e10cSrcweir 			int nSize = AnyConverter.toInt( xPropSet.getPropertyValue( "Size" ) );
106cdf0e10cSrcweir 			if ( nSize != pBytes.length )
107cdf0e10cSrcweir 			{
108cdf0e10cSrcweir 				Error( "The 'Size' property of substream '" + sStreamName + "' contains wrong value!" );
109cdf0e10cSrcweir 				return false;
110cdf0e10cSrcweir 			}
111cdf0e10cSrcweir 		}
112cdf0e10cSrcweir 		catch( Exception e )
113cdf0e10cSrcweir 		{
114cdf0e10cSrcweir 			Error( "Can't get 'Size' property from substream '" + sStreamName + "', exception: " + e );
115cdf0e10cSrcweir 			return false;
116cdf0e10cSrcweir 		}
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 		// get access to the relationship information
119cdf0e10cSrcweir 		XRelationshipAccess xRelAccess = (XRelationshipAccess) UnoRuntime.queryInterface( XRelationshipAccess.class, xStream );
120cdf0e10cSrcweir 		if ( xRelAccess == null )
121cdf0e10cSrcweir 		{
122cdf0e10cSrcweir 			Error( "Can't get XRelationshipAccess implementation from substream '" + sStreamName + "'!" );
123cdf0e10cSrcweir 			return false;
124cdf0e10cSrcweir 		}
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 		// set the relationship information
127cdf0e10cSrcweir 		try
128cdf0e10cSrcweir 		{
129cdf0e10cSrcweir 			xRelAccess.insertRelationships( aRelations, false );
130cdf0e10cSrcweir 		}
131cdf0e10cSrcweir 		catch( Exception e )
132cdf0e10cSrcweir 		{
133cdf0e10cSrcweir 			Error( "Can't set relationships to substream '" + sStreamName + "', exception: " + e );
134cdf0e10cSrcweir 			return false;
135cdf0e10cSrcweir 		}
136cdf0e10cSrcweir 
137cdf0e10cSrcweir 		// free the stream resources, garbage collector may remove the object too late
138cdf0e10cSrcweir 		if ( !disposeStream( xStream, sStreamName ) )
139cdf0e10cSrcweir 			return false;
140cdf0e10cSrcweir 
141cdf0e10cSrcweir 		return true;
142cdf0e10cSrcweir 	}
143cdf0e10cSrcweir 
WriteBytesToSubstream( XStorage xStorage, String sStreamName, String sMediaType, boolean bCompressed, byte[] pBytes, StringPair[][] aRelations )144cdf0e10cSrcweir 	public boolean WriteBytesToSubstream( XStorage xStorage,
145cdf0e10cSrcweir 										  String sStreamName,
146cdf0e10cSrcweir 										  String sMediaType,
147cdf0e10cSrcweir 										  boolean bCompressed,
148cdf0e10cSrcweir 										  byte[] pBytes,
149cdf0e10cSrcweir 										  StringPair[][] aRelations )
150cdf0e10cSrcweir 	{
151cdf0e10cSrcweir 		// open substream element
152cdf0e10cSrcweir 		XStream xSubStream = null;
153cdf0e10cSrcweir 		try
154cdf0e10cSrcweir 		{
155cdf0e10cSrcweir 			Object oSubStream = xStorage.openStreamElement( sStreamName, ElementModes.WRITE );
156cdf0e10cSrcweir 			xSubStream = (XStream) UnoRuntime.queryInterface( XStream.class, oSubStream );
157cdf0e10cSrcweir 			if ( xSubStream == null )
158cdf0e10cSrcweir 			{
159cdf0e10cSrcweir 				Error( "Can't create substream '" + sStreamName + "'!" );
160cdf0e10cSrcweir 				return false;
161cdf0e10cSrcweir 			}
162cdf0e10cSrcweir 		}
163cdf0e10cSrcweir 		catch( Exception e )
164cdf0e10cSrcweir 		{
165cdf0e10cSrcweir 			Error( "Can't create substream '" + sStreamName + "', exception : " + e + "!" );
166cdf0e10cSrcweir 			return false;
167cdf0e10cSrcweir 		}
168cdf0e10cSrcweir 
169cdf0e10cSrcweir 		return WriteBytesToStream( xSubStream, sStreamName, sMediaType, bCompressed, pBytes, aRelations );
170cdf0e10cSrcweir 	}
171cdf0e10cSrcweir 
setStorageTypeAndCheckProps( XStorage xStorage, boolean bIsRoot, int nMode, StringPair[][] aRelations )172cdf0e10cSrcweir 	public boolean setStorageTypeAndCheckProps( XStorage xStorage,
173cdf0e10cSrcweir 												boolean bIsRoot,
174cdf0e10cSrcweir 												int nMode,
175cdf0e10cSrcweir 												StringPair[][] aRelations )
176cdf0e10cSrcweir 	{
177cdf0e10cSrcweir 		boolean bOk = false;
178cdf0e10cSrcweir 
179cdf0e10cSrcweir 		// get access to the XPropertySet interface
180cdf0e10cSrcweir 		XPropertySet xPropSet = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xStorage );
181cdf0e10cSrcweir 		if ( xPropSet != null )
182cdf0e10cSrcweir 		{
183cdf0e10cSrcweir 			try
184cdf0e10cSrcweir 			{
185cdf0e10cSrcweir 				// get "IsRoot" and "OpenMode" properties and control there values
186cdf0e10cSrcweir 				boolean bPropIsRoot = AnyConverter.toBoolean( xPropSet.getPropertyValue( "IsRoot" ) );
187cdf0e10cSrcweir 				int nPropMode = AnyConverter.toInt( xPropSet.getPropertyValue( "OpenMode" ) );
188cdf0e10cSrcweir 
189cdf0e10cSrcweir 				bOk = true;
190cdf0e10cSrcweir 				if ( bPropIsRoot != bIsRoot )
191cdf0e10cSrcweir 				{
192cdf0e10cSrcweir 					Error( "'IsRoot' property contains wrong value!" );
193cdf0e10cSrcweir 					bOk = false;
194cdf0e10cSrcweir 				}
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 				if ( ( bIsRoot
197cdf0e10cSrcweir 				  && ( nPropMode | ElementModes.READ ) != ( nMode | ElementModes.READ ) )
198cdf0e10cSrcweir 				  || ( !bIsRoot && ( nPropMode & nMode ) != nMode ) )
199cdf0e10cSrcweir 				{
200cdf0e10cSrcweir 					Error( "'OpenMode' property contains wrong value, expected " + nMode + ", in reality " + nPropMode + "!" );
201cdf0e10cSrcweir 					bOk = false;
202cdf0e10cSrcweir 				}
203cdf0e10cSrcweir 			}
204cdf0e10cSrcweir 			catch( Exception e )
205cdf0e10cSrcweir 			{
206cdf0e10cSrcweir 				Error( "Can't control properties of substorage, exception: " + e );
207cdf0e10cSrcweir 			}
208cdf0e10cSrcweir 		}
209cdf0e10cSrcweir 		else
210cdf0e10cSrcweir 		{
211cdf0e10cSrcweir 			Error( "Can't get XPropertySet implementation from storage!" );
212cdf0e10cSrcweir 		}
213cdf0e10cSrcweir 
214cdf0e10cSrcweir 		// get access to the relationship information
215cdf0e10cSrcweir 		XRelationshipAccess xRelAccess = (XRelationshipAccess) UnoRuntime.queryInterface( XRelationshipAccess.class, xStorage );
216cdf0e10cSrcweir 
217cdf0e10cSrcweir 		if ( xRelAccess == null )
218cdf0e10cSrcweir 		{
219cdf0e10cSrcweir 			Error( "Can't get XRelationshipAccess implementation from the storage!" );
220cdf0e10cSrcweir 			return false;
221cdf0e10cSrcweir 		}
222cdf0e10cSrcweir 
223cdf0e10cSrcweir 		// set the relationship information
224cdf0e10cSrcweir 		try
225cdf0e10cSrcweir 		{
226cdf0e10cSrcweir 			xRelAccess.insertRelationships( aRelations, false );
227cdf0e10cSrcweir 		}
228cdf0e10cSrcweir 		catch( Exception e )
229cdf0e10cSrcweir 		{
230cdf0e10cSrcweir 			Error( "Can't set relationships to the storage, exception: " + e );
231cdf0e10cSrcweir 			return false;
232cdf0e10cSrcweir 		}
233cdf0e10cSrcweir 
234cdf0e10cSrcweir 
235cdf0e10cSrcweir 		return bOk;
236cdf0e10cSrcweir 	}
237cdf0e10cSrcweir 
checkRelations( StringPair[][] aStorRels, StringPair[][] aTestRels )238cdf0e10cSrcweir 	public boolean checkRelations( StringPair[][] aStorRels, StringPair[][] aTestRels )
239cdf0e10cSrcweir 	{
240cdf0e10cSrcweir 		// Message( "StorageRels:" );
241cdf0e10cSrcweir 		// PrintRelations( aStorRels );
242cdf0e10cSrcweir 		// Message( "TestRels:" );
243cdf0e10cSrcweir 		// PrintRelations( aTestRels );
244cdf0e10cSrcweir 
245cdf0e10cSrcweir 		if ( aStorRels.length != aTestRels.length )
246cdf0e10cSrcweir 		{
247cdf0e10cSrcweir 			Error( "The provided relations sequence has different size than the storage's one!" );
248cdf0e10cSrcweir 			return false;
249cdf0e10cSrcweir 		}
250cdf0e10cSrcweir 
251cdf0e10cSrcweir 		for ( int nStorInd = 0; nStorInd < aStorRels.length; nStorInd++ )
252cdf0e10cSrcweir 		{
253cdf0e10cSrcweir 			int nStorIDInd = -1;
254cdf0e10cSrcweir 			for ( int nStorTagInd = 0; nStorTagInd < aStorRels[nStorInd].length; nStorTagInd++ )
255cdf0e10cSrcweir 			{
256cdf0e10cSrcweir 				if ( aStorRels[nStorInd][nStorTagInd].First.equals( "Id" ) )
257cdf0e10cSrcweir 				{
258cdf0e10cSrcweir 					nStorIDInd = nStorTagInd;
259cdf0e10cSrcweir 					break;
260cdf0e10cSrcweir 				}
261cdf0e10cSrcweir 			}
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 			if ( nStorIDInd == -1 )
264cdf0e10cSrcweir 			{
265cdf0e10cSrcweir 				Error( "One of the storage relations entries has no ID!" );
266cdf0e10cSrcweir 				return false;
267cdf0e10cSrcweir 			}
268cdf0e10cSrcweir 
269cdf0e10cSrcweir 			for ( int nInd = 0; nInd < aTestRels.length; nInd++ )
270cdf0e10cSrcweir 			{
271cdf0e10cSrcweir 				int nIDInd = -1;
272cdf0e10cSrcweir 				for ( int nTagInd = 0; nTagInd < aTestRels[nInd].length; nTagInd++ )
273cdf0e10cSrcweir 				{
274cdf0e10cSrcweir 					if ( aTestRels[nInd][nTagInd].First.equals( "Id" ) )
275cdf0e10cSrcweir 					{
276cdf0e10cSrcweir 						nIDInd = nTagInd;
277cdf0e10cSrcweir 						break;
278cdf0e10cSrcweir 					}
279cdf0e10cSrcweir 				}
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 				if ( nIDInd == -1 )
282cdf0e10cSrcweir 				{
283cdf0e10cSrcweir 					Error( "One of the test hardcoded entries has no ID, num = " + nInd + ", length = " + aTestRels[nInd].length + ", global length = " + aTestRels.length + "!" );
284cdf0e10cSrcweir 					return false;
285cdf0e10cSrcweir 				}
286cdf0e10cSrcweir 
287cdf0e10cSrcweir 				if ( aStorRels[nStorInd][nStorIDInd].Second.equals( aTestRels[nInd][nIDInd].Second ) )
288cdf0e10cSrcweir 				{
289cdf0e10cSrcweir 					boolean[] pRelCheckMark = new boolean[ aTestRels[nInd].length ];
290cdf0e10cSrcweir 					for ( int nCheckInd = 0; nCheckInd < pRelCheckMark.length; nCheckInd++ )
291cdf0e10cSrcweir 					{
292cdf0e10cSrcweir 						pRelCheckMark[nCheckInd] = false;
293cdf0e10cSrcweir 					}
294cdf0e10cSrcweir 
295cdf0e10cSrcweir 					for ( int nStorTagInd = 0; nStorTagInd < aStorRels[nStorInd].length; nStorTagInd++ )
296cdf0e10cSrcweir 					{
297cdf0e10cSrcweir 						boolean bFound = false;
298cdf0e10cSrcweir 						for ( int nTagInd = 0; nTagInd < aTestRels[nInd].length; nTagInd++ )
299cdf0e10cSrcweir 						{
300cdf0e10cSrcweir 							if ( aTestRels[nInd][nTagInd].First.equals( aStorRels[nStorInd][nStorTagInd].First ) )
301cdf0e10cSrcweir 							{
302cdf0e10cSrcweir 								if ( !aTestRels[nInd][nTagInd].Second.equals( aStorRels[nStorInd][nStorTagInd].Second ) )
303cdf0e10cSrcweir 								{
304cdf0e10cSrcweir 									Error( "Test rel. num. " + nInd + " has different tag \"" + aTestRels[nInd][nTagInd].First + "\" value!" );
305cdf0e10cSrcweir 									return false;
306cdf0e10cSrcweir 								}
307cdf0e10cSrcweir 
308cdf0e10cSrcweir 								bFound = true;
309cdf0e10cSrcweir 								pRelCheckMark[nTagInd] = true;
310cdf0e10cSrcweir 								break;
311cdf0e10cSrcweir 							}
312cdf0e10cSrcweir 						}
313cdf0e10cSrcweir 
314cdf0e10cSrcweir 						if ( !bFound )
315cdf0e10cSrcweir 						{
316cdf0e10cSrcweir 							Error( "Stor rel. num. " + nStorInd + " has unexpected tag \"" + aStorRels[nStorInd][nStorTagInd].First + "\", ID = \"" + aStorRels[nStorInd][nStorIDInd].Second + "\"!" );
317cdf0e10cSrcweir 							return false;
318cdf0e10cSrcweir 						}
319cdf0e10cSrcweir 					}
320cdf0e10cSrcweir 
321cdf0e10cSrcweir 					for ( int nCheckInd = 0; nCheckInd < pRelCheckMark.length; nCheckInd++ )
322cdf0e10cSrcweir 					{
323cdf0e10cSrcweir 						if ( !pRelCheckMark[nCheckInd] && !aTestRels[nInd][nCheckInd].Second.equals( "" ) )
324cdf0e10cSrcweir 						{
325cdf0e10cSrcweir 							Error( "Test rel. num. " + nInd + " has unexpected tag \"" + aTestRels[nInd][nCheckInd].First + "\" with nonempty value!" );
326cdf0e10cSrcweir 							return false;
327cdf0e10cSrcweir 						}
328cdf0e10cSrcweir 					}
329cdf0e10cSrcweir 
330cdf0e10cSrcweir 					break;
331cdf0e10cSrcweir 				}
332cdf0e10cSrcweir 			}
333cdf0e10cSrcweir 		}
334cdf0e10cSrcweir 
335cdf0e10cSrcweir 		return true;
336cdf0e10cSrcweir 	}
337cdf0e10cSrcweir 
checkStorageProperties( XStorage xStorage, boolean bIsRoot, int nMode, StringPair[][] aRelations )338cdf0e10cSrcweir 	public boolean checkStorageProperties( XStorage xStorage,
339cdf0e10cSrcweir 											boolean bIsRoot,
340cdf0e10cSrcweir 											int nMode,
341cdf0e10cSrcweir 											StringPair[][] aRelations )
342cdf0e10cSrcweir 	{
343cdf0e10cSrcweir 		boolean bOk = false;
344cdf0e10cSrcweir 
345cdf0e10cSrcweir 		// get access to the XPropertySet interface
346cdf0e10cSrcweir 		XPropertySet xPropSet = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xStorage );
347cdf0e10cSrcweir 		if ( xPropSet != null )
348cdf0e10cSrcweir 		{
349cdf0e10cSrcweir 			try
350cdf0e10cSrcweir 			{
351cdf0e10cSrcweir 				// get "IsRoot" and "OpenMode" properties and control there values
352cdf0e10cSrcweir 				boolean bPropIsRoot = AnyConverter.toBoolean( xPropSet.getPropertyValue( "IsRoot" ) );
353cdf0e10cSrcweir 				int nPropMode = AnyConverter.toInt( xPropSet.getPropertyValue( "OpenMode" ) );
354cdf0e10cSrcweir 
355cdf0e10cSrcweir 				bOk = true;
356cdf0e10cSrcweir 				if ( bPropIsRoot != bIsRoot )
357cdf0e10cSrcweir 				{
358cdf0e10cSrcweir 					Error( "'IsRoot' property contains wrong value!" );
359cdf0e10cSrcweir 					bOk = false;
360cdf0e10cSrcweir 				}
361cdf0e10cSrcweir 
362cdf0e10cSrcweir 				if ( ( bIsRoot
363cdf0e10cSrcweir 				  && ( nPropMode | ElementModes.READ ) != ( nMode | ElementModes.READ ) )
364cdf0e10cSrcweir 				  || ( !bIsRoot && ( nPropMode & nMode ) != nMode ) )
365cdf0e10cSrcweir 				{
366cdf0e10cSrcweir 					Error( "'OpenMode' property contains wrong value, expected " + nMode + ", in reality " + nPropMode + "!" );
367cdf0e10cSrcweir 					bOk = false;
368cdf0e10cSrcweir 				}
369cdf0e10cSrcweir 			}
370cdf0e10cSrcweir 			catch( Exception e )
371cdf0e10cSrcweir 			{
372cdf0e10cSrcweir 				Error( "Can't get properties of substorage, exception: " + e );
373cdf0e10cSrcweir 			}
374cdf0e10cSrcweir 		}
375cdf0e10cSrcweir 		else
376cdf0e10cSrcweir 		{
377cdf0e10cSrcweir 			Error( "Can't get XPropertySet implementation from storage!" );
378cdf0e10cSrcweir 		}
379cdf0e10cSrcweir 
380cdf0e10cSrcweir 		// get access to the relationship information
381cdf0e10cSrcweir 		XRelationshipAccess xRelAccess = (XRelationshipAccess) UnoRuntime.queryInterface( XRelationshipAccess.class, xStorage );
382cdf0e10cSrcweir 
383cdf0e10cSrcweir 		if ( xRelAccess == null )
384cdf0e10cSrcweir 		{
385cdf0e10cSrcweir 			Error( "Can't get XRelationshipAccess implementation from the checked storage!" );
386cdf0e10cSrcweir 			return false;
387cdf0e10cSrcweir 		}
388cdf0e10cSrcweir 
389cdf0e10cSrcweir 		// get the relationship information
390cdf0e10cSrcweir 		StringPair[][] aStorRels;
391cdf0e10cSrcweir 		try
392cdf0e10cSrcweir 		{
393cdf0e10cSrcweir 			aStorRels = xRelAccess.getAllRelationships();
394cdf0e10cSrcweir 		}
395cdf0e10cSrcweir 		catch( Exception e )
396cdf0e10cSrcweir 		{
397cdf0e10cSrcweir 			Error( "Can't get relationships of the checked storage, exception: " + e );
398cdf0e10cSrcweir 			return false;
399cdf0e10cSrcweir 		}
400cdf0e10cSrcweir 
401cdf0e10cSrcweir 		if ( !checkRelations( aStorRels, aRelations ) )
402cdf0e10cSrcweir 		{
403cdf0e10cSrcweir 			Error( "StorageRelationsChecking has failed!" );
404cdf0e10cSrcweir 			return false;
405cdf0e10cSrcweir 		}
406cdf0e10cSrcweir 
407cdf0e10cSrcweir 		return bOk;
408cdf0e10cSrcweir 	}
409cdf0e10cSrcweir 
InternalCheckStream( XStream xStream, String sName, String sMediaType, byte[] pBytes, StringPair[][] aRelations )410cdf0e10cSrcweir 	public boolean InternalCheckStream( XStream xStream,
411cdf0e10cSrcweir 										String sName,
412cdf0e10cSrcweir 										String sMediaType,
413cdf0e10cSrcweir 										byte[] pBytes,
414cdf0e10cSrcweir 										StringPair[][] aRelations )
415cdf0e10cSrcweir 	{
416cdf0e10cSrcweir 		// get input stream of substream
417cdf0e10cSrcweir 		XInputStream xInput = xStream.getInputStream();
418cdf0e10cSrcweir 		if ( xInput == null )
419cdf0e10cSrcweir 		{
420cdf0e10cSrcweir 			Error( "Can't get XInputStream implementation from substream '" + sName + "'!" );
421cdf0e10cSrcweir 			return false;
422cdf0e10cSrcweir 		}
423cdf0e10cSrcweir 
424cdf0e10cSrcweir 		byte pContents[][] = new byte[1][]; // ???
425cdf0e10cSrcweir 
426cdf0e10cSrcweir 		// read contents
427cdf0e10cSrcweir 		try
428cdf0e10cSrcweir 		{
429cdf0e10cSrcweir 			xInput.readBytes( pContents, pBytes.length + 1 );
430cdf0e10cSrcweir 		}
431cdf0e10cSrcweir 		catch( Exception e )
432cdf0e10cSrcweir 		{
433cdf0e10cSrcweir 			Error( "Can't read from stream '" + sName + "', exception: " + e );
434cdf0e10cSrcweir 			return false;
435cdf0e10cSrcweir 		}
436cdf0e10cSrcweir 
437cdf0e10cSrcweir 		// check size of stream data
438cdf0e10cSrcweir 		if ( pContents.length == 0 )
439cdf0e10cSrcweir 		{
440cdf0e10cSrcweir 			Error( "SubStream '" + sName + "' reading produced disaster!"  );
441cdf0e10cSrcweir 			return false;
442cdf0e10cSrcweir 		}
443cdf0e10cSrcweir 
444cdf0e10cSrcweir 		if ( pBytes.length != pContents[0].length )
445cdf0e10cSrcweir 		{
446cdf0e10cSrcweir 			Error( "SubStream '" + sName + "' contains wrong amount of data! (" + pContents[0].length + "/" + pBytes.length + ")" );
447cdf0e10cSrcweir 			return false;
448cdf0e10cSrcweir 		}
449cdf0e10cSrcweir 
450cdf0e10cSrcweir 		// check stream data
451cdf0e10cSrcweir 		for ( int ind = 0; ind < pBytes.length; ind++ )
452cdf0e10cSrcweir 		{
453cdf0e10cSrcweir 			if ( pBytes[ind] != pContents[0][ind] )
454cdf0e10cSrcweir 			{
455cdf0e10cSrcweir 				Error( "SubStream '" + sName + "' contains wrong data! ( byte num. "
456cdf0e10cSrcweir 						+ ind + " should be" + pBytes[ind] + " but it is " + pContents[0][ind] + ")" );
457cdf0e10cSrcweir 				return false;
458cdf0e10cSrcweir 			}
459cdf0e10cSrcweir 		}
460cdf0e10cSrcweir 
461cdf0e10cSrcweir 		// check properties
462cdf0e10cSrcweir 		boolean bOk = false;
463cdf0e10cSrcweir 
464cdf0e10cSrcweir 		// get access to the XPropertySet interface
465cdf0e10cSrcweir 		XPropertySet xPropSet = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xStream );
466cdf0e10cSrcweir 		if ( xPropSet != null )
467cdf0e10cSrcweir 		{
468cdf0e10cSrcweir 			try
469cdf0e10cSrcweir 			{
470cdf0e10cSrcweir 				// get "MediaType" and "Size" properties and control there values
471cdf0e10cSrcweir 				String sPropMediaType = AnyConverter.toString( xPropSet.getPropertyValue( "MediaType" ) );
472cdf0e10cSrcweir 				int nPropSize = AnyConverter.toInt( xPropSet.getPropertyValue( "Size" ) );
473cdf0e10cSrcweir 
474cdf0e10cSrcweir 				bOk = true;
475cdf0e10cSrcweir 				if ( !sPropMediaType.equals( sMediaType ) )
476cdf0e10cSrcweir 				{
477cdf0e10cSrcweir 					Error( "'MediaType' property contains wrong value for stream '" + sName + "',\nexpected: '"
478cdf0e10cSrcweir 							+ sMediaType + "', set: '" + sPropMediaType + "'!" );
479cdf0e10cSrcweir 					bOk = false;
480cdf0e10cSrcweir 				}
481cdf0e10cSrcweir 
482cdf0e10cSrcweir 				if ( nPropSize != pBytes.length )
483cdf0e10cSrcweir 				{
484cdf0e10cSrcweir 					Error( "'Size' property contains wrong value for stream'" + sName + "'!" );
485cdf0e10cSrcweir 					bOk = false;
486cdf0e10cSrcweir 				}
487cdf0e10cSrcweir 			}
488cdf0e10cSrcweir 			catch( Exception e )
489cdf0e10cSrcweir 			{
490cdf0e10cSrcweir 				Error( "Can't get properties of substream '" + sName + "', exception: " + e );
491cdf0e10cSrcweir 			}
492cdf0e10cSrcweir 		}
493cdf0e10cSrcweir 		else
494cdf0e10cSrcweir 		{
495cdf0e10cSrcweir 			Error( "Can't get XPropertySet implementation from stream '" + sName + "'!" );
496cdf0e10cSrcweir 		}
497cdf0e10cSrcweir 
498cdf0e10cSrcweir 
499cdf0e10cSrcweir 		// get access to the relationship information
500cdf0e10cSrcweir 		XRelationshipAccess xRelAccess = (XRelationshipAccess) UnoRuntime.queryInterface( XRelationshipAccess.class, xStream );
501cdf0e10cSrcweir 
502cdf0e10cSrcweir 		if ( xRelAccess == null )
503cdf0e10cSrcweir 		{
504cdf0e10cSrcweir 			Error( "Can't get XRelationshipAccess implementation from the stream\"" + sName + "\"!" );
505cdf0e10cSrcweir 			return false;
506cdf0e10cSrcweir 		}
507cdf0e10cSrcweir 
508cdf0e10cSrcweir 		// get the relationship information
509cdf0e10cSrcweir 		StringPair[][] aStorRels;
510cdf0e10cSrcweir 		try
511cdf0e10cSrcweir 		{
512cdf0e10cSrcweir 			aStorRels = xRelAccess.getAllRelationships();
513cdf0e10cSrcweir 		}
514cdf0e10cSrcweir 		catch( Exception e )
515cdf0e10cSrcweir 		{
516cdf0e10cSrcweir 			Error( "Can't get relationships of the substream '" + sName + "', exception: " + e );
517cdf0e10cSrcweir 			return false;
518cdf0e10cSrcweir 		}
519cdf0e10cSrcweir 
520cdf0e10cSrcweir 		if ( !checkRelations( aStorRels, aRelations ) )
521cdf0e10cSrcweir 		{
522cdf0e10cSrcweir 			Error( "Stream '" + sName + "' RelationsChecking has failed!" );
523cdf0e10cSrcweir 			return false;
524cdf0e10cSrcweir 		}
525cdf0e10cSrcweir 
526cdf0e10cSrcweir 		return bOk;
527cdf0e10cSrcweir 	}
528cdf0e10cSrcweir 
checkStream( XStorage xParentStorage, String sName, String sMediaType, byte[] pBytes, StringPair[][] aRelations )529cdf0e10cSrcweir 	public boolean checkStream( XStorage xParentStorage,
530cdf0e10cSrcweir 								String sName,
531cdf0e10cSrcweir 								String sMediaType,
532cdf0e10cSrcweir 								byte[] pBytes,
533cdf0e10cSrcweir 								StringPair[][] aRelations )
534cdf0e10cSrcweir 	{
535cdf0e10cSrcweir 		// open substream element first
536cdf0e10cSrcweir 		XStream xSubStream = null;
537cdf0e10cSrcweir 		try
538cdf0e10cSrcweir 		{
539cdf0e10cSrcweir 			Object oSubStream = xParentStorage.openStreamElement( sName, ElementModes.READ );
540cdf0e10cSrcweir 			xSubStream = (XStream) UnoRuntime.queryInterface( XStream.class, oSubStream );
541cdf0e10cSrcweir 			if ( xSubStream == null )
542cdf0e10cSrcweir 			{
543cdf0e10cSrcweir 				Error( "Can't open substream '" + sName + "'!" );
544cdf0e10cSrcweir 				return false;
545cdf0e10cSrcweir 			}
546cdf0e10cSrcweir 		}
547cdf0e10cSrcweir 		catch( Exception e )
548cdf0e10cSrcweir 		{
549cdf0e10cSrcweir 			Error( "Can't open substream '" + sName + "', exception : " + e + "!" );
550cdf0e10cSrcweir 			return false;
551cdf0e10cSrcweir 		}
552cdf0e10cSrcweir 
553cdf0e10cSrcweir 		boolean bResult = InternalCheckStream( xSubStream, sName, sMediaType, pBytes, aRelations );
554cdf0e10cSrcweir 
555cdf0e10cSrcweir 		// free the stream resources, garbage collector may remove the object too late
556cdf0e10cSrcweir 		if ( !disposeStream( xSubStream, sName ) )
557cdf0e10cSrcweir 			return false;
558cdf0e10cSrcweir 
559cdf0e10cSrcweir 		return bResult;
560cdf0e10cSrcweir 	}
561cdf0e10cSrcweir 
copyStorage( XStorage xSourceStorage, XStorage xDestStorage )562cdf0e10cSrcweir 	public boolean copyStorage( XStorage xSourceStorage, XStorage xDestStorage )
563cdf0e10cSrcweir 	{
564cdf0e10cSrcweir 		// copy xSourceStorage to xDestStorage
565cdf0e10cSrcweir 		try
566cdf0e10cSrcweir 		{
567cdf0e10cSrcweir 			xSourceStorage.copyToStorage( xDestStorage );
568cdf0e10cSrcweir 		}
569cdf0e10cSrcweir 		catch( Exception e )
570cdf0e10cSrcweir 		{
571cdf0e10cSrcweir 			Error( "Storage copying failed, exception: " + e );
572cdf0e10cSrcweir 			return false;
573cdf0e10cSrcweir 		}
574cdf0e10cSrcweir 
575cdf0e10cSrcweir 		return true;
576cdf0e10cSrcweir 	}
577cdf0e10cSrcweir 
commitStorage( XStorage xStorage )578cdf0e10cSrcweir 	public boolean commitStorage( XStorage xStorage )
579cdf0e10cSrcweir 	{
580cdf0e10cSrcweir 		// XTransactedObject must be supported by storages
581cdf0e10cSrcweir 		XTransactedObject xTransact = (XTransactedObject) UnoRuntime.queryInterface( XTransactedObject.class, xStorage );
582cdf0e10cSrcweir 		if ( xTransact == null )
583cdf0e10cSrcweir 		{
584cdf0e10cSrcweir 			Error( "Storage doesn't implement transacted access!" );
585cdf0e10cSrcweir 			return false;
586cdf0e10cSrcweir 		}
587cdf0e10cSrcweir 
588cdf0e10cSrcweir 		try
589cdf0e10cSrcweir 		{
590cdf0e10cSrcweir 			xTransact.commit();
591cdf0e10cSrcweir 		}
592cdf0e10cSrcweir 		catch( Exception e )
593cdf0e10cSrcweir 		{
594cdf0e10cSrcweir 			Error( "Storage commit failed, exception:" + e );
595cdf0e10cSrcweir 			return false;
596cdf0e10cSrcweir 		}
597cdf0e10cSrcweir 
598cdf0e10cSrcweir 		return true;
599cdf0e10cSrcweir 	}
600cdf0e10cSrcweir 
disposeStream( XStream xStream, String sStreamName )601cdf0e10cSrcweir 	public boolean disposeStream( XStream xStream, String sStreamName )
602cdf0e10cSrcweir 	{
603cdf0e10cSrcweir 		XComponent xComponent = (XComponent) UnoRuntime.queryInterface( XComponent.class, xStream );
604cdf0e10cSrcweir 		if ( xComponent == null )
605cdf0e10cSrcweir 		{
606cdf0e10cSrcweir 			Error( "Can't get XComponent implementation from substream '" + sStreamName + "'!" );
607cdf0e10cSrcweir 			return false;
608cdf0e10cSrcweir 		}
609cdf0e10cSrcweir 
610cdf0e10cSrcweir 		try
611cdf0e10cSrcweir 		{
612cdf0e10cSrcweir 			xComponent.dispose();
613cdf0e10cSrcweir 		}
614cdf0e10cSrcweir 		catch( Exception e )
615cdf0e10cSrcweir 		{
616cdf0e10cSrcweir 			Error( "Substream '" + sStreamName + "' disposing throws exception: " + e );
617cdf0e10cSrcweir 			return false;
618cdf0e10cSrcweir 		}
619cdf0e10cSrcweir 
620cdf0e10cSrcweir 		return true;
621cdf0e10cSrcweir 	}
622cdf0e10cSrcweir 
disposeStorage( XStorage xStorage )623cdf0e10cSrcweir 	public boolean disposeStorage( XStorage xStorage )
624cdf0e10cSrcweir 	{
625cdf0e10cSrcweir 		// dispose the storage
626cdf0e10cSrcweir 		XComponent xComponent = (XComponent) UnoRuntime.queryInterface( XComponent.class, xStorage );
627cdf0e10cSrcweir 		if ( xComponent == null )
628cdf0e10cSrcweir 		{
629cdf0e10cSrcweir 			Error( "Can't retrieve XComponent implementation from storage!" );
630cdf0e10cSrcweir 			return false;
631cdf0e10cSrcweir 		}
632cdf0e10cSrcweir 
633cdf0e10cSrcweir 		try
634cdf0e10cSrcweir 		{
635cdf0e10cSrcweir 			xComponent.dispose();
636cdf0e10cSrcweir 		}
637cdf0e10cSrcweir 		catch( Exception e )
638cdf0e10cSrcweir 		{
639cdf0e10cSrcweir 			Error( "Storage disposing failed!" );
640cdf0e10cSrcweir 			return false;
641cdf0e10cSrcweir 		}
642cdf0e10cSrcweir 
643cdf0e10cSrcweir 		return true;
644cdf0e10cSrcweir 	}
645cdf0e10cSrcweir 
getInputStream( XStream xStream )646cdf0e10cSrcweir 	public XInputStream getInputStream( XStream xStream )
647cdf0e10cSrcweir 	{
648cdf0e10cSrcweir 		XInputStream xInTemp = null;
649cdf0e10cSrcweir 		try
650cdf0e10cSrcweir 		{
651cdf0e10cSrcweir 			xInTemp = xStream.getInputStream();
652cdf0e10cSrcweir 			if ( xInTemp == null )
653cdf0e10cSrcweir 				Error( "Can't get the input part of a stream!" );
654cdf0e10cSrcweir 		}
655cdf0e10cSrcweir 		catch ( Exception e )
656cdf0e10cSrcweir 		{
657cdf0e10cSrcweir 			Error( "Can't get the input part of a stream, exception :" + e );
658cdf0e10cSrcweir 		}
659cdf0e10cSrcweir 
660cdf0e10cSrcweir 		return xInTemp;
661cdf0e10cSrcweir 	}
662cdf0e10cSrcweir 
closeOutput( XStream xStream )663cdf0e10cSrcweir 	public boolean closeOutput( XStream xStream )
664cdf0e10cSrcweir 	{
665cdf0e10cSrcweir 		XOutputStream xOutTemp = null;
666cdf0e10cSrcweir 		try
667cdf0e10cSrcweir 		{
668cdf0e10cSrcweir 			xOutTemp = xStream.getOutputStream();
669cdf0e10cSrcweir 			if ( xOutTemp == null )
670cdf0e10cSrcweir 			{
671cdf0e10cSrcweir 				Error( "Can't get the output part of a stream!" );
672cdf0e10cSrcweir 				return false;
673cdf0e10cSrcweir 			}
674cdf0e10cSrcweir 		}
675cdf0e10cSrcweir 		catch ( Exception e )
676cdf0e10cSrcweir 		{
677cdf0e10cSrcweir 			Error( "Can't get the output part of a stream, exception :" + e );
678cdf0e10cSrcweir 			return false;
679cdf0e10cSrcweir 		}
680cdf0e10cSrcweir 
681cdf0e10cSrcweir 		try
682cdf0e10cSrcweir 		{
683cdf0e10cSrcweir 			xOutTemp.closeOutput();
684cdf0e10cSrcweir 		}
685cdf0e10cSrcweir 		catch ( Exception e )
686cdf0e10cSrcweir 		{
687cdf0e10cSrcweir 			Error( "Can't close output part of a stream, exception :" + e );
688cdf0e10cSrcweir 			return false;
689cdf0e10cSrcweir 		}
690cdf0e10cSrcweir 
691cdf0e10cSrcweir 		return true;
692cdf0e10cSrcweir 	}
693cdf0e10cSrcweir 
openSubStorage( XStorage xStorage, String sName, int nMode )694cdf0e10cSrcweir 	public XStorage openSubStorage( XStorage xStorage, String sName, int nMode )
695cdf0e10cSrcweir 	{
696cdf0e10cSrcweir 		// open existing substorage
697cdf0e10cSrcweir 		try
698cdf0e10cSrcweir 		{
699cdf0e10cSrcweir 			Object oSubStorage = xStorage.openStorageElement( sName, nMode );
700cdf0e10cSrcweir 			XStorage xSubStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oSubStorage );
701cdf0e10cSrcweir 			return xSubStorage;
702cdf0e10cSrcweir 		}
703cdf0e10cSrcweir 		catch( Exception e )
704cdf0e10cSrcweir 		{
705cdf0e10cSrcweir 			Error( "Can't open substorage '" + sName + "', exception: " + e );
706cdf0e10cSrcweir 		}
707cdf0e10cSrcweir 
708cdf0e10cSrcweir 		return null;
709cdf0e10cSrcweir 	}
710cdf0e10cSrcweir 
CreateTempFileStream( XMultiServiceFactory xMSF )711cdf0e10cSrcweir 	public XStream CreateTempFileStream( XMultiServiceFactory xMSF )
712cdf0e10cSrcweir 	{
713cdf0e10cSrcweir 		// try to get temporary file representation
714cdf0e10cSrcweir 		XStream xTempFileStream = null;
715cdf0e10cSrcweir 		try
716cdf0e10cSrcweir 		{
717cdf0e10cSrcweir 			Object oTempFile = xMSF.createInstance( "com.sun.star.io.TempFile" );
718cdf0e10cSrcweir 			xTempFileStream = (XStream)UnoRuntime.queryInterface( XStream.class, oTempFile );
719cdf0e10cSrcweir 		}
720cdf0e10cSrcweir 		catch( Exception e )
721cdf0e10cSrcweir 		{}
722cdf0e10cSrcweir 
723cdf0e10cSrcweir 		if ( xTempFileStream == null )
724cdf0e10cSrcweir 			Error( "Can't create temporary file!" );
725cdf0e10cSrcweir 
726cdf0e10cSrcweir 		return xTempFileStream;
727cdf0e10cSrcweir 	}
728cdf0e10cSrcweir 
CreateTempFile( XMultiServiceFactory xMSF )729cdf0e10cSrcweir 	public String CreateTempFile( XMultiServiceFactory xMSF )
730cdf0e10cSrcweir 	{
731cdf0e10cSrcweir 		String sResult = null;
732cdf0e10cSrcweir 
733cdf0e10cSrcweir 		// try to get temporary file representation
734cdf0e10cSrcweir 		XPropertySet xTempFileProps = null;
735cdf0e10cSrcweir 		try
736cdf0e10cSrcweir 		{
737cdf0e10cSrcweir 			Object oTempFile = xMSF.createInstance( "com.sun.star.io.TempFile" );
738cdf0e10cSrcweir 			xTempFileProps = (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, oTempFile );
739cdf0e10cSrcweir 		}
740cdf0e10cSrcweir 		catch( Exception e )
741cdf0e10cSrcweir 		{}
742cdf0e10cSrcweir 
743cdf0e10cSrcweir 		if ( xTempFileProps != null )
744cdf0e10cSrcweir 		{
745cdf0e10cSrcweir 			try
746cdf0e10cSrcweir 			{
747cdf0e10cSrcweir 				xTempFileProps.setPropertyValue( "RemoveFile", new Boolean( false ) );
748cdf0e10cSrcweir 				sResult = AnyConverter.toString( xTempFileProps.getPropertyValue( "Uri" ) );
749cdf0e10cSrcweir 			}
750cdf0e10cSrcweir 			catch( Exception e )
751cdf0e10cSrcweir 			{
752cdf0e10cSrcweir 				Error( "Can't control TempFile properties, exception: " + e );
753cdf0e10cSrcweir 			}
754cdf0e10cSrcweir 		}
755cdf0e10cSrcweir 		else
756cdf0e10cSrcweir 		{
757cdf0e10cSrcweir 			Error( "Can't create temporary file representation!" );
758cdf0e10cSrcweir 		}
759cdf0e10cSrcweir 
760cdf0e10cSrcweir 		// close temporary file explicitly
761cdf0e10cSrcweir 		try
762cdf0e10cSrcweir 		{
763cdf0e10cSrcweir 			XStream xStream = (XStream)UnoRuntime.queryInterface( XStream.class, xTempFileProps );
764cdf0e10cSrcweir 			if ( xStream != null )
765cdf0e10cSrcweir 			{
766cdf0e10cSrcweir 				XOutputStream xOut = xStream.getOutputStream();
767cdf0e10cSrcweir 				if ( xOut != null )
768cdf0e10cSrcweir 					xOut.closeOutput();
769cdf0e10cSrcweir 
770cdf0e10cSrcweir 				XInputStream xIn = xStream.getInputStream();
771cdf0e10cSrcweir 				if ( xIn != null )
772cdf0e10cSrcweir 					xIn.closeInput();
773cdf0e10cSrcweir 			}
774cdf0e10cSrcweir 			else
775cdf0e10cSrcweir 				Error( "Can't close TempFile!" );
776cdf0e10cSrcweir 		}
777cdf0e10cSrcweir 		catch( Exception e )
778cdf0e10cSrcweir 		{
779cdf0e10cSrcweir 			Error( "Can't close TempFile, exception: " + e );
780cdf0e10cSrcweir 		}
781cdf0e10cSrcweir 
782cdf0e10cSrcweir 		return sResult;
783cdf0e10cSrcweir 	}
784cdf0e10cSrcweir 
copyElementTo( XStorage xSource, String sName, XStorage xDest )785cdf0e10cSrcweir 	public boolean copyElementTo( XStorage xSource, String sName, XStorage xDest )
786cdf0e10cSrcweir 	{
787cdf0e10cSrcweir 		// copy element with name sName from xSource to xDest
788cdf0e10cSrcweir 		try
789cdf0e10cSrcweir 		{
790cdf0e10cSrcweir 			xSource.copyElementTo( sName, xDest, sName );
791cdf0e10cSrcweir 		}
792cdf0e10cSrcweir 		catch( Exception e )
793cdf0e10cSrcweir 		{
794cdf0e10cSrcweir 			Error( "Element copying failed, exception: " + e );
795cdf0e10cSrcweir 			return false;
796cdf0e10cSrcweir 		}
797cdf0e10cSrcweir 
798cdf0e10cSrcweir 		return true;
799cdf0e10cSrcweir 	}
800cdf0e10cSrcweir 
copyElementTo( XStorage xSource, String sName, XStorage xDest, String sTargetName )801cdf0e10cSrcweir 	public boolean copyElementTo( XStorage xSource, String sName, XStorage xDest, String sTargetName )
802cdf0e10cSrcweir 	{
803cdf0e10cSrcweir 		// copy element with name sName from xSource to xDest
804cdf0e10cSrcweir 		try
805cdf0e10cSrcweir 		{
806cdf0e10cSrcweir 			xSource.copyElementTo( sName, xDest, sTargetName );
807cdf0e10cSrcweir 		}
808cdf0e10cSrcweir 		catch( Exception e )
809cdf0e10cSrcweir 		{
810cdf0e10cSrcweir 			Error( "Element copying failed, exception: " + e );
811cdf0e10cSrcweir 			return false;
812cdf0e10cSrcweir 		}
813cdf0e10cSrcweir 
814cdf0e10cSrcweir 		return true;
815cdf0e10cSrcweir 	}
816cdf0e10cSrcweir 
moveElementTo( XStorage xSource, String sName, XStorage xDest )817cdf0e10cSrcweir 	public boolean moveElementTo( XStorage xSource, String sName, XStorage xDest )
818cdf0e10cSrcweir 	{
819cdf0e10cSrcweir 		// move element with name sName from xSource to xDest
820cdf0e10cSrcweir 		try
821cdf0e10cSrcweir 		{
822cdf0e10cSrcweir 			xSource.moveElementTo( sName, xDest, sName );
823cdf0e10cSrcweir 		}
824cdf0e10cSrcweir 		catch( Exception e )
825cdf0e10cSrcweir 		{
826cdf0e10cSrcweir 			Error( "Element moving failed, exception: " + e );
827cdf0e10cSrcweir 			return false;
828cdf0e10cSrcweir 		}
829cdf0e10cSrcweir 
830cdf0e10cSrcweir 		return true;
831cdf0e10cSrcweir 	}
832cdf0e10cSrcweir 
renameElement( XStorage xStorage, String sOldName, String sNewName )833cdf0e10cSrcweir 	public boolean renameElement( XStorage xStorage, String sOldName, String sNewName )
834cdf0e10cSrcweir 	{
835cdf0e10cSrcweir 		// rename element with name sOldName to sNewName
836cdf0e10cSrcweir 		try
837cdf0e10cSrcweir 		{
838cdf0e10cSrcweir 			xStorage.renameElement( sOldName, sNewName );
839cdf0e10cSrcweir 		}
840cdf0e10cSrcweir 		catch( Exception e )
841cdf0e10cSrcweir 		{
842cdf0e10cSrcweir 			Error( "Element renaming failed, exception: " + e );
843cdf0e10cSrcweir 			return false;
844cdf0e10cSrcweir 		}
845cdf0e10cSrcweir 
846cdf0e10cSrcweir 		return true;
847cdf0e10cSrcweir 	}
848cdf0e10cSrcweir 
removeElement( XStorage xStorage, String sName )849cdf0e10cSrcweir 	public boolean removeElement( XStorage xStorage, String sName )
850cdf0e10cSrcweir 	{
851cdf0e10cSrcweir 		// remove element with name sName
852cdf0e10cSrcweir 		try
853cdf0e10cSrcweir 		{
854cdf0e10cSrcweir 			xStorage.removeElement( sName );
855cdf0e10cSrcweir 		}
856cdf0e10cSrcweir 		catch( Exception e )
857cdf0e10cSrcweir 		{
858cdf0e10cSrcweir 			Error( "Element removing failed, exception: " + e );
859cdf0e10cSrcweir 			return false;
860cdf0e10cSrcweir 		}
861cdf0e10cSrcweir 
862cdf0e10cSrcweir 		return true;
863cdf0e10cSrcweir 	}
864cdf0e10cSrcweir 
OpenStream( XStorage xStorage, String sStreamName, int nMode )865cdf0e10cSrcweir 	public XStream OpenStream( XStorage xStorage,
866cdf0e10cSrcweir 								String sStreamName,
867cdf0e10cSrcweir 								int nMode )
868cdf0e10cSrcweir 	{
869cdf0e10cSrcweir 		// open substream element
870cdf0e10cSrcweir 		XStream xSubStream = null;
871cdf0e10cSrcweir 		try
872cdf0e10cSrcweir 		{
873cdf0e10cSrcweir 			Object oSubStream = xStorage.openStreamElement( sStreamName, nMode );
874cdf0e10cSrcweir 			xSubStream = (XStream) UnoRuntime.queryInterface( XStream.class, oSubStream );
875cdf0e10cSrcweir 			if ( xSubStream == null )
876cdf0e10cSrcweir 				Error( "Can't create substream '" + sStreamName + "'!" );
877cdf0e10cSrcweir 		}
878cdf0e10cSrcweir 		catch( Exception e )
879cdf0e10cSrcweir 		{
880cdf0e10cSrcweir 			Error( "Can't create substream '" + sStreamName + "', exception : " + e + "!" );
881cdf0e10cSrcweir 		}
882cdf0e10cSrcweir 
883cdf0e10cSrcweir 		return xSubStream;
884cdf0e10cSrcweir 	}
885cdf0e10cSrcweir 
cantOpenStorage( XStorage xStorage, String sName )886cdf0e10cSrcweir 	public boolean cantOpenStorage( XStorage xStorage, String sName )
887cdf0e10cSrcweir 	{
888cdf0e10cSrcweir 		// try to open an opened substorage, open call must fail
889cdf0e10cSrcweir 		try
890cdf0e10cSrcweir 		{
891cdf0e10cSrcweir 			Object oDummyStorage = xStorage.openStorageElement( sName, ElementModes.READ );
892cdf0e10cSrcweir 			Error( "The trying to reopen opened substorage '" + sName + "' must fail!" );
893cdf0e10cSrcweir 		}
894cdf0e10cSrcweir 		catch( Exception e )
895cdf0e10cSrcweir 		{
896cdf0e10cSrcweir 			return true;
897cdf0e10cSrcweir 		}
898cdf0e10cSrcweir 
899cdf0e10cSrcweir 		return false;
900cdf0e10cSrcweir 	}
901cdf0e10cSrcweir 
cantOpenStream( XStorage xStorage, String sName, int nMode )902cdf0e10cSrcweir 	public boolean cantOpenStream( XStorage xStorage, String sName, int nMode )
903cdf0e10cSrcweir 	{
904cdf0e10cSrcweir 		// try to open the substream with specified mode must fail
905cdf0e10cSrcweir 		try
906cdf0e10cSrcweir 		{
907cdf0e10cSrcweir 			Object oDummyStream = xStorage.openStreamElement( sName, nMode );
908cdf0e10cSrcweir 			Error( "The trying to open substoream '" + sName + "' must fail!" );
909cdf0e10cSrcweir 		}
910cdf0e10cSrcweir 		catch( Exception e )
911cdf0e10cSrcweir 		{
912cdf0e10cSrcweir 			return true;
913cdf0e10cSrcweir 		}
914cdf0e10cSrcweir 
915cdf0e10cSrcweir 		return false;
916cdf0e10cSrcweir 	}
917cdf0e10cSrcweir 
createStorageFromURL( XSingleServiceFactory xFactory, String aURL, int nMode )918cdf0e10cSrcweir 	public XStorage createStorageFromURL(
919cdf0e10cSrcweir 								XSingleServiceFactory xFactory,
920cdf0e10cSrcweir 								String aURL,
921cdf0e10cSrcweir 								int nMode )
922cdf0e10cSrcweir 	{
923cdf0e10cSrcweir 		XStorage xResult = null;
924cdf0e10cSrcweir 
925cdf0e10cSrcweir 		try
926cdf0e10cSrcweir 		{
927cdf0e10cSrcweir 			PropertyValue[] aAddArgs = new PropertyValue[1];
928cdf0e10cSrcweir 			aAddArgs[0] = new PropertyValue();
929cdf0e10cSrcweir 			aAddArgs[0].Name = "StorageFormat";
930cdf0e10cSrcweir 			aAddArgs[0].Value = "OFOPXMLFormat";
931cdf0e10cSrcweir 
932cdf0e10cSrcweir 			Object pArgs[] = new Object[3];
933cdf0e10cSrcweir 			pArgs[0] = (Object) aURL;
934cdf0e10cSrcweir 			pArgs[1] = new Integer( nMode );
935cdf0e10cSrcweir 			pArgs[2] = (Object) aAddArgs;
936cdf0e10cSrcweir 
937cdf0e10cSrcweir 			Object oTempStorage = xFactory.createInstanceWithArguments( pArgs );
938cdf0e10cSrcweir 			xResult = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage );
939cdf0e10cSrcweir 		}
940cdf0e10cSrcweir 		catch( Exception e )
941cdf0e10cSrcweir 		{
942cdf0e10cSrcweir 			Error( "Can't create storage from URL, exception: " + e );
943cdf0e10cSrcweir 			return null;
944cdf0e10cSrcweir 		}
945cdf0e10cSrcweir 
946cdf0e10cSrcweir 		if ( xResult == null )
947cdf0e10cSrcweir 			Error( "Can't create storage from URL!" );
948cdf0e10cSrcweir 
949cdf0e10cSrcweir 		return xResult;
950cdf0e10cSrcweir 	}
951cdf0e10cSrcweir 
createStorageFromStream( XSingleServiceFactory xFactory, XStream xStream, int nMode )952cdf0e10cSrcweir 	public XStorage createStorageFromStream(
953cdf0e10cSrcweir 								XSingleServiceFactory xFactory,
954cdf0e10cSrcweir 								XStream xStream,
955cdf0e10cSrcweir 								int nMode )
956cdf0e10cSrcweir 	{
957cdf0e10cSrcweir 		XStorage xResult = null;
958cdf0e10cSrcweir 
959cdf0e10cSrcweir 		try
960cdf0e10cSrcweir 		{
961cdf0e10cSrcweir 			PropertyValue[] aAddArgs = new PropertyValue[1];
962cdf0e10cSrcweir 			aAddArgs[0] = new PropertyValue();
963cdf0e10cSrcweir 			aAddArgs[0].Name = "StorageFormat";
964cdf0e10cSrcweir 			aAddArgs[0].Value = "OFOPXMLFormat";
965cdf0e10cSrcweir 
966cdf0e10cSrcweir 			Object pArgs[] = new Object[3];
967cdf0e10cSrcweir 			pArgs[0] = (Object) xStream;
968cdf0e10cSrcweir 			pArgs[1] = new Integer( nMode );
969cdf0e10cSrcweir 			pArgs[2] = (Object) aAddArgs;
970cdf0e10cSrcweir 
971cdf0e10cSrcweir 			Object oTempStorage = xFactory.createInstanceWithArguments( pArgs );
972cdf0e10cSrcweir 			xResult = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage );
973cdf0e10cSrcweir 		}
974cdf0e10cSrcweir 		catch( Exception e )
975cdf0e10cSrcweir 		{
976cdf0e10cSrcweir 			Error( "Can't create storage from stream, exception: " + e );
977cdf0e10cSrcweir 			return null;
978cdf0e10cSrcweir 		}
979cdf0e10cSrcweir 
980cdf0e10cSrcweir 		if ( xResult == null )
981cdf0e10cSrcweir 			Error( "Can't create storage from stream!" );
982cdf0e10cSrcweir 
983cdf0e10cSrcweir 		return xResult;
984cdf0e10cSrcweir 	}
985cdf0e10cSrcweir 
createStorageFromInputStream( XSingleServiceFactory xFactory, XInputStream xInStream )986cdf0e10cSrcweir 	public XStorage createStorageFromInputStream(
987cdf0e10cSrcweir 								XSingleServiceFactory xFactory,
988cdf0e10cSrcweir 								XInputStream xInStream )
989cdf0e10cSrcweir 	{
990cdf0e10cSrcweir 		XStorage xResult = null;
991cdf0e10cSrcweir 
992cdf0e10cSrcweir 		try
993cdf0e10cSrcweir 		{
994cdf0e10cSrcweir 			PropertyValue[] aAddArgs = new PropertyValue[1];
995cdf0e10cSrcweir 			aAddArgs[0] = new PropertyValue();
996cdf0e10cSrcweir 			aAddArgs[0].Name = "StorageFormat";
997cdf0e10cSrcweir 			aAddArgs[0].Value = "OFOPXMLFormat";
998cdf0e10cSrcweir 
999cdf0e10cSrcweir 			Object pArgs[] = new Object[3];
1000cdf0e10cSrcweir 			pArgs[0] = (Object) xInStream;
1001cdf0e10cSrcweir 			pArgs[1] = new Integer( ElementModes.READ );
1002cdf0e10cSrcweir 			pArgs[2] = (Object) aAddArgs;
1003cdf0e10cSrcweir 
1004cdf0e10cSrcweir 			Object oTempStorage = xFactory.createInstanceWithArguments( pArgs );
1005cdf0e10cSrcweir 			xResult = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage );
1006cdf0e10cSrcweir 		}
1007cdf0e10cSrcweir 		catch( Exception e )
1008cdf0e10cSrcweir 		{
1009cdf0e10cSrcweir 			Error( "Can't create storage from input stream, exception: " + e );
1010cdf0e10cSrcweir 			return null;
1011cdf0e10cSrcweir 		}
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir 		if ( xResult == null )
1014cdf0e10cSrcweir 			Error( "Can't create storage from input stream!" );
1015cdf0e10cSrcweir 
1016cdf0e10cSrcweir 		return xResult;
1017cdf0e10cSrcweir 	}
1018cdf0e10cSrcweir 
createTempStorage( XMultiServiceFactory xMSF, XSingleServiceFactory xFactory )1019cdf0e10cSrcweir 	public XStorage createTempStorage( XMultiServiceFactory xMSF, XSingleServiceFactory xFactory )
1020cdf0e10cSrcweir 	{
1021cdf0e10cSrcweir 		// create a temporary storage
1022cdf0e10cSrcweir 		XStorage xResult = null;
1023cdf0e10cSrcweir 		XStream xStream = CreateTempFileStream( xMSF );
1024cdf0e10cSrcweir 		if ( xStream == null )
1025cdf0e10cSrcweir 		{
1026cdf0e10cSrcweir 			Error( "Can't create temp file stream!" );
1027cdf0e10cSrcweir 			return null;
1028cdf0e10cSrcweir 		}
1029cdf0e10cSrcweir 
1030cdf0e10cSrcweir 		try
1031cdf0e10cSrcweir 		{
1032cdf0e10cSrcweir 			xResult = createStorageFromStream( xFactory, xStream, ElementModes.WRITE );
1033cdf0e10cSrcweir 		}
1034cdf0e10cSrcweir 		catch( Exception e )
1035cdf0e10cSrcweir 		{
1036cdf0e10cSrcweir 			Error( "Can't create temp storage, exception: " + e );
1037cdf0e10cSrcweir 		}
1038cdf0e10cSrcweir 
1039cdf0e10cSrcweir 		return xResult;
1040cdf0e10cSrcweir 	}
1041cdf0e10cSrcweir 
cloneStorage( XMultiServiceFactory xMSF, XSingleServiceFactory xFactory, XStorage xStorage )1042cdf0e10cSrcweir 	public XStorage cloneStorage( XMultiServiceFactory xMSF, XSingleServiceFactory xFactory, XStorage xStorage )
1043cdf0e10cSrcweir 	{
1044*a893be29SPedro Giffuni 		// create a copy of a last committed version of specified storage
1045cdf0e10cSrcweir 		XStorage xResult = null;
1046cdf0e10cSrcweir 		try
1047cdf0e10cSrcweir 		{
1048cdf0e10cSrcweir 			xResult = createTempStorage( xMSF, xFactory );
1049cdf0e10cSrcweir 			if ( xResult != null )
1050cdf0e10cSrcweir 				xStorage.copyLastCommitTo( xResult );
1051cdf0e10cSrcweir 		}
1052cdf0e10cSrcweir 		catch( Exception e )
1053cdf0e10cSrcweir 		{
1054cdf0e10cSrcweir 			Error( "Can't clone storage, exception: " + e );
1055cdf0e10cSrcweir 			return null;
1056cdf0e10cSrcweir 		}
1057cdf0e10cSrcweir 
1058cdf0e10cSrcweir 		return xResult;
1059cdf0e10cSrcweir 	}
1060cdf0e10cSrcweir 
cloneSubStorage( XMultiServiceFactory xMSF, XSingleServiceFactory xFactory, XStorage xStorage, String sName )1061cdf0e10cSrcweir 	public XStorage cloneSubStorage( XMultiServiceFactory xMSF, XSingleServiceFactory xFactory, XStorage xStorage, String sName )
1062cdf0e10cSrcweir 	{
1063*a893be29SPedro Giffuni 		// create a copy of a last committed version of specified substorage
1064cdf0e10cSrcweir 		XStorage xResult = null;
1065cdf0e10cSrcweir 		try
1066cdf0e10cSrcweir 		{
1067cdf0e10cSrcweir 			xResult = createTempStorage( xMSF, xFactory );
1068cdf0e10cSrcweir 			if ( xResult != null )
1069cdf0e10cSrcweir 				xStorage.copyStorageElementLastCommitTo( sName, xResult );
1070cdf0e10cSrcweir 		}
1071cdf0e10cSrcweir 		catch( Exception e )
1072cdf0e10cSrcweir 		{
1073cdf0e10cSrcweir 			Error( "Can't clone substorage '" + sName + "', exception: " + e );
1074cdf0e10cSrcweir 			return null;
1075cdf0e10cSrcweir 		}
1076cdf0e10cSrcweir 
1077cdf0e10cSrcweir 		return xResult;
1078cdf0e10cSrcweir 	}
1079cdf0e10cSrcweir 
cloneSubStream( XStorage xStorage, String sName )1080cdf0e10cSrcweir 	public XStream cloneSubStream( XStorage xStorage, String sName )
1081cdf0e10cSrcweir 	{
1082cdf0e10cSrcweir 		// clone existing substream
1083cdf0e10cSrcweir 		try
1084cdf0e10cSrcweir 		{
1085cdf0e10cSrcweir 			XStream xStream = xStorage.cloneStreamElement( sName );
1086cdf0e10cSrcweir 			return xStream;
1087cdf0e10cSrcweir 		}
1088cdf0e10cSrcweir 		catch( Exception e )
1089cdf0e10cSrcweir 		{
1090cdf0e10cSrcweir 			Error( "Can't clone substream '" + sName + "', exception: " + e );
1091cdf0e10cSrcweir 		}
1092cdf0e10cSrcweir 
1093cdf0e10cSrcweir 		return null;
1094cdf0e10cSrcweir 	}
1095cdf0e10cSrcweir 
Error( String sError )1096cdf0e10cSrcweir 	public void Error( String sError )
1097cdf0e10cSrcweir 	{
1098cdf0e10cSrcweir 		m_aLogWriter.println( m_sTestPrefix + "Error: " + sError );
1099cdf0e10cSrcweir 	}
1100cdf0e10cSrcweir 
Message( String sMessage )1101cdf0e10cSrcweir 	public void Message( String sMessage )
1102cdf0e10cSrcweir 	{
1103cdf0e10cSrcweir 		m_aLogWriter.println( m_sTestPrefix + sMessage );
1104cdf0e10cSrcweir 	}
1105cdf0e10cSrcweir 
PrintRelations( StringPair[][] aRels )1106cdf0e10cSrcweir 	public void PrintRelations( StringPair[][] aRels )
1107cdf0e10cSrcweir 	{
1108cdf0e10cSrcweir 		m_aLogWriter.println( "========" );
1109cdf0e10cSrcweir 		for ( int nInd1 = 0; nInd1 < aRels.length; nInd1++ )
1110cdf0e10cSrcweir 		{
1111cdf0e10cSrcweir 			for ( int nInd2 = 0; nInd2 < aRels[nInd1].length; nInd2++ )
1112cdf0e10cSrcweir 			{
1113cdf0e10cSrcweir 				m_aLogWriter.println( "\"" + aRels[nInd1][nInd2].First + "\" = \"" + aRels[nInd1][nInd2].Second + "\", " );
1114cdf0e10cSrcweir 			}
1115cdf0e10cSrcweir 			m_aLogWriter.println( "========" );
1116cdf0e10cSrcweir 		}
1117cdf0e10cSrcweir 	}
1118cdf0e10cSrcweir }
1119cdf0e10cSrcweir 
1120