1 package complex.storages;
2 
3 import com.sun.star.uno.XInterface;
4 import com.sun.star.lang.XMultiServiceFactory;
5 import com.sun.star.lang.XSingleServiceFactory;
6 
7 import com.sun.star.bridge.XUnoUrlResolver;
8 import com.sun.star.uno.UnoRuntime;
9 import com.sun.star.uno.XInterface;
10 import com.sun.star.io.XStream;
11 import com.sun.star.io.XInputStream;
12 
13 import com.sun.star.embed.*;
14 
15 import share.LogWriter;
16 import complex.storages.TestHelper;
17 import complex.storages.StorageTest;
18 
19 public class RegressionTest_i30400 implements StorageTest {
20 
21 	XMultiServiceFactory m_xMSF;
22 	XSingleServiceFactory m_xStorageFactory;
23 	TestHelper m_aTestHelper;
24 
25 	public RegressionTest_i30400( XMultiServiceFactory xMSF, XSingleServiceFactory xStorageFactory, LogWriter aLogWriter )
26 	{
27 		m_xMSF = xMSF;
28 		m_xStorageFactory = xStorageFactory;
29 		m_aTestHelper = new TestHelper( aLogWriter, "RegressionTest_i30400: " );
30 	}
31 
32     public boolean test()
33 	{
34 		try
35 		{
36 			// ================================================
37 			// create a temporary stream and a storage based on it
38 			// fill the storage with the data that will be used for testing
39 			// ================================================
40 
41 			XStream xTempFileStream = m_aTestHelper.CreateTempFileStream( m_xMSF );
42 			if ( xTempFileStream == null )
43 				return false;
44 
45 			// create storage based on the temporary stream
46 			Object pArgs[] = new Object[2];
47 			pArgs[0] = (Object) xTempFileStream;
48 			pArgs[1] = new Integer( ElementModes.WRITE );
49 			byte pBytes1[] = { 1, 1, 1, 1, 1 };
50 			String pPass1 = "1, 2, 3, 4, 5";
51 
52 			Object oTempStorage = m_xStorageFactory.createInstanceWithArguments( pArgs );
53 			XStorage xTempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage );
54 			if ( xTempStorage == null )
55 			{
56 				m_aTestHelper.Error( "Can't create temporary storage representation!" );
57 				return false;
58 			}
59 
60 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
61 			if ( !m_aTestHelper.WriteBytesToSubstream( xTempStorage, "Stream1", "MediaType1", true, pBytes1 ) )
62 				return false;
63 
64 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
65 			if ( !m_aTestHelper.WriteBytesToEncrSubstream( xTempStorage, "EncrStream1", "MediaType2", true, pBytes1, pPass1 ) )
66 				return false;
67 
68 
69 			// open a new substorage
70 			XStorage xTempSubStorage = m_aTestHelper.openSubStorage( xTempStorage,
71 																	"SubStorage1",
72 																	ElementModes.WRITE );
73 			if ( xTempSubStorage == null )
74 			{
75 				m_aTestHelper.Error( "Can't create substorage!" );
76 				return false;
77 			}
78 
79 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
80 			if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage, "SubStream1", "MediaType3", true, pBytes1 ) )
81 				return false;
82 
83 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
84 			if ( !m_aTestHelper.WriteBytesToEncrSubstream( xTempSubStorage, "SubEncrStream1", "MediaType4", true, pBytes1, pPass1 ) )
85 				return false;
86 
87 			// open a new substorage in the existing substorage
88 			XStorage xTempSubSubStorage = m_aTestHelper.openSubStorage( xTempSubStorage,
89 																		"SubSubStorage1",
90 																		ElementModes.WRITE );
91 			if ( xTempSubStorage == null )
92 			{
93 				m_aTestHelper.Error( "Can't create substorage!" );
94 				return false;
95 			}
96 
97 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
98 			if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubSubStorage, "SubSubStream1", "MediaType5", true, pBytes1 ) )
99 				return false;
100 
101 			// set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly
102 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubSubStorage,
103 															"MediaType6",
104 															false,
105 															ElementModes.WRITE ) )
106 				return false;
107 
108 
109 			// set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly
110 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubStorage,
111 															"MediaType7",
112 															false,
113 															ElementModes.WRITE ) )
114 				return false;
115 
116 			// set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly
117 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempStorage,
118 															"MediaType8",
119 															true,
120 															ElementModes.WRITE ) )
121 				return false;
122 
123 			// ================================================
124 			// check the copying with renaming
125 			// ================================================
126 
127 			if ( !TestCopyWithRenaming( xTempStorage, xTempSubStorage, xTempSubSubStorage ) )
128 				return false;
129 
130 			// ================================================
131 			// commit the storages
132 			// ================================================
133 
134 			// commit lowlevel substorage
135 			if ( !m_aTestHelper.commitStorage( xTempSubSubStorage ) )
136 				return false;
137 
138 			// commit substorage
139 			if ( !m_aTestHelper.commitStorage( xTempSubStorage ) )
140 				return false;
141 
142 			// commit the root storage so the contents must be stored now
143 			if ( !m_aTestHelper.commitStorage( xTempStorage ) )
144 				return false;
145 
146 			// ================================================
147 			// dispose the storages
148 			// ================================================
149 
150 			// dispose lowerest substorage
151 			if ( !m_aTestHelper.disposeStorage( xTempSubSubStorage ) )
152 				return false;
153 
154 			// dispose substorage
155 			if ( !m_aTestHelper.disposeStorage( xTempSubStorage ) )
156 				return false;
157 
158 			// dispose the temporary storage
159 			if ( !m_aTestHelper.disposeStorage( xTempStorage ) )
160 				return false;
161 
162 			// ================================================
163 			// reopen the target storage readonly, and check the copying with renaming
164 			// ================================================
165 
166 			pArgs[1] = new Integer( ElementModes.READ );
167 			oTempStorage = m_xStorageFactory.createInstanceWithArguments( pArgs );
168 			xTempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage );
169 			if ( xTempStorage == null )
170 			{
171 				m_aTestHelper.Error( "Can't create temporary storage representation!" );
172 				return false;
173 			}
174 
175 			// open the substorages
176 
177 			xTempSubStorage = m_aTestHelper.openSubStorage( xTempStorage,
178 															"SubStorage1",
179 															ElementModes.READ );
180 			if ( xTempSubStorage == null )
181 			{
182 				m_aTestHelper.Error( "Can't create substorage!" );
183 				return false;
184 			}
185 
186 			// open the lowlevel substorages
187 
188 			xTempSubSubStorage = m_aTestHelper.openSubStorage( xTempSubStorage,
189 																"SubSubStorage1",
190 																ElementModes.READ );
191 			if ( xTempSubSubStorage == null )
192 			{
193 				m_aTestHelper.Error( "Can't create substorage!" );
194 				return false;
195 			}
196 
197 			// test the copying with renaming
198 			if ( !TestCopyWithRenaming( xTempStorage, xTempSubStorage, xTempSubSubStorage ) )
199 				return false;
200 
201 
202 			// the storage is based on the temporary stream so it can be left undisposed, since it does not lock
203 			// any resource, later the garbage collector will release the object and it must die by refcount
204 
205 			return true;
206 		}
207 		catch( Exception e )
208 		{
209 			m_aTestHelper.Error( "Exception: " + e );
210 			return false;
211 		}
212     }
213 
214 
215 	public boolean TestCopyWithRenaming( XStorage xTempStorage, XStorage xTempSubStorage, XStorage xTempSubSubStorage )
216 		throws com.sun.star.uno.Exception
217 	{
218 		// ================================================
219 		// create a second temporary stream and copy all the staff there
220 		// with renaming, check the success
221 		// ================================================
222 
223 		XStream xTempFileStream2 = m_aTestHelper.CreateTempFileStream( m_xMSF );
224 		if ( xTempFileStream2 == null )
225 			return false;
226 
227 		Object pArgs[] = new Object[2];
228 		pArgs[0] = (Object) xTempFileStream2;
229 		pArgs[1] = new Integer( ElementModes.WRITE );
230 		byte pBytes1[] = { 1, 1, 1, 1, 1 };
231 		String pPass1 = "1, 2, 3, 4, 5";
232 
233 		Object oTempStorage2 = m_xStorageFactory.createInstanceWithArguments( pArgs );
234 		XStorage xTempStorage2 = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage2 );
235 		if ( xTempStorage2 == null )
236 		{
237 			m_aTestHelper.Error( "Can't create temporary storage representation!" );
238 			return false;
239 		}
240 
241 		// open a new substorage
242 		XStorage xTempSubStorage2 = m_aTestHelper.openSubStorage( xTempStorage2,
243 																"SubStorage1_target",
244 																ElementModes.WRITE );
245 		if ( xTempSubStorage2 == null )
246 		{
247 			m_aTestHelper.Error( "Can't create substorage!" );
248 			return false;
249 		}
250 
251 		// open a new substorage in the existing substorage
252 		XStorage xTempSubSubStorage2 = m_aTestHelper.openSubStorage( xTempSubStorage2,
253 																	"SubSubStorage1_target",
254 																	ElementModes.WRITE );
255 		if ( xTempSubSubStorage2 == null )
256 		{
257 			m_aTestHelper.Error( "Can't create substorage!" );
258 			return false;
259 		}
260 
261 		// make a copy with renaming on lowerest level
262 		if ( !m_aTestHelper.copyElementTo( xTempSubSubStorage, "SubSubStream1", xTempSubSubStorage2, "SubSubStream1_renamed" ) )
263 			return false;
264 
265 		// make a copy with renaming on the next level
266 
267 		if ( !m_aTestHelper.copyElementTo( xTempSubStorage, "SubStream1", xTempSubStorage2, "SubStream1_renamed" ) )
268 			return false;
269 
270 		if ( !m_aTestHelper.copyElementTo( xTempSubStorage, "SubEncrStream1", xTempSubStorage2, "SubEncrStream1_renamed" ) )
271 			return false;
272 
273 		if ( !m_aTestHelper.copyElementTo( xTempSubStorage, "SubSubStorage1", xTempSubStorage2, "SubSubStorage1_renamed" ) )
274 			return false;
275 
276 		// make a copy with renaming of subelements of the root storage
277 
278 		if ( !m_aTestHelper.copyElementTo( xTempStorage, "Stream1", xTempStorage2, "Stream1_renamed" ) )
279 			return false;
280 
281 		if ( !m_aTestHelper.copyElementTo( xTempStorage, "EncrStream1", xTempStorage2, "EncrStream1_renamed" ) )
282 			return false;
283 
284 		if ( !m_aTestHelper.copyElementTo( xTempStorage, "SubStorage1", xTempStorage2, "SubStorage1_renamed" ) )
285 			return false;
286 
287 		// ================================================
288 		// commit the storages, and check the renaming in all stages
289 		// ================================================
290 
291 		// commit substorage to let the renaming take place
292 		if ( !m_aTestHelper.commitStorage( xTempSubSubStorage2 ) )
293 			return false;
294 
295 		// commit substorage to let the renaming take place
296 		if ( !m_aTestHelper.commitStorage( xTempSubStorage2 ) )
297 			return false;
298 
299 		// commit the root storage so the contents must be stored now
300 		if ( !m_aTestHelper.commitStorage( xTempStorage2 ) )
301 			return false;
302 
303 		// ================================================
304 		// dispose the storages
305 		// ================================================
306 
307 		// dispose lowerest substorage
308 		if ( !m_aTestHelper.disposeStorage( xTempSubSubStorage2 ) )
309 			return false;
310 
311 		// dispose substorage
312 		if ( !m_aTestHelper.disposeStorage( xTempSubStorage2 ) )
313 			return false;
314 
315 		// dispose the temporary storage
316 		if ( !m_aTestHelper.disposeStorage( xTempStorage2 ) )
317 			return false;
318 
319 		// ================================================
320 		// reopen the target storage readonly, and check the contents
321 		// ================================================
322 
323 		pArgs[1] = new Integer( ElementModes.READ );
324 		oTempStorage2 = m_xStorageFactory.createInstanceWithArguments( pArgs );
325 		xTempStorage2 = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage2 );
326 		if ( xTempStorage2 == null )
327 		{
328 			m_aTestHelper.Error( "Can't create temporary storage representation!" );
329 			return false;
330 		}
331 
332 		// open the substorages
333 
334 		XStorage xTempSubStorage2_target = m_aTestHelper.openSubStorage( xTempStorage2,
335 																"SubStorage1_target",
336 																ElementModes.READ );
337 		if ( xTempSubStorage2_target == null )
338 		{
339 			m_aTestHelper.Error( "Can't create substorage!" );
340 			return false;
341 		}
342 
343 		XStorage xTempSubStorage2_renamed = m_aTestHelper.openSubStorage( xTempStorage2,
344 																"SubStorage1_renamed",
345 																ElementModes.READ );
346 		if ( xTempSubStorage2_renamed == null )
347 		{
348 			m_aTestHelper.Error( "Can't create substorage!" );
349 			return false;
350 		}
351 
352 		// open the lowlevel substorages
353 
354 		XStorage xTempSubSubStorage2_inRenamed = m_aTestHelper.openSubStorage( xTempSubStorage2_renamed,
355 																				"SubSubStorage1",
356 																				ElementModes.READ );
357 		if ( xTempSubSubStorage2_inRenamed == null )
358 		{
359 			m_aTestHelper.Error( "Can't create substorage!" );
360 			return false;
361 		}
362 
363 		XStorage xTempSubSubStorage2_renamed = m_aTestHelper.openSubStorage( xTempSubStorage2_target,
364 																			"SubSubStorage1_renamed",
365 																			ElementModes.READ );
366 		if ( xTempSubSubStorage2_renamed == null )
367 		{
368 			m_aTestHelper.Error( "Can't create substorage!" );
369 			return false;
370 		}
371 
372 		XStorage xTempSubSubStorage2_target = m_aTestHelper.openSubStorage( xTempSubStorage2_target,
373 																			"SubSubStorage1_target",
374 																			ElementModes.READ );
375 		if ( xTempSubSubStorage2_target == null )
376 		{
377 			m_aTestHelper.Error( "Can't create substorage!" );
378 			return false;
379 		}
380 
381 		// check the storages
382 
383 		if ( !m_aTestHelper.checkStorageProperties( xTempSubSubStorage2_inRenamed, "MediaType6", false, ElementModes.READ ) )
384 			return false;
385 
386 		if ( !m_aTestHelper.checkStorageProperties( xTempSubSubStorage2_renamed, "MediaType6", false, ElementModes.READ ) )
387 			return false;
388 
389 		if ( !m_aTestHelper.checkStorageProperties( xTempSubStorage2_renamed, "MediaType7", false, ElementModes.READ ) )
390 			return false;
391 
392 
393 		// check the streams
394 
395 
396 		// sub sub level
397 
398 		if ( !m_aTestHelper.checkStream( xTempSubSubStorage2_inRenamed, "SubSubStream1", "MediaType5", true, pBytes1 ) )
399 			return false;
400 
401 		if ( !m_aTestHelper.checkStream( xTempSubSubStorage2_renamed, "SubSubStream1", "MediaType5", true, pBytes1 ) )
402 			return false;
403 
404 		if ( !m_aTestHelper.checkStream( xTempSubSubStorage2_target, "SubSubStream1_renamed", "MediaType5", true, pBytes1 ) )
405 			return false;
406 
407 		// sub level
408 
409 		if ( !m_aTestHelper.checkStream( xTempSubStorage2_renamed, "SubStream1", "MediaType3", true, pBytes1 ) )
410 			return false;
411 
412 		if ( !m_aTestHelper.checkEncrStream( xTempSubStorage2_renamed, "SubEncrStream1", "MediaType4", pBytes1, pPass1 ) )
413 			return false;
414 
415 		if ( !m_aTestHelper.checkStream( xTempSubStorage2_target, "SubStream1_renamed", "MediaType3", true, pBytes1 ) )
416 			return false;
417 
418 		if ( !m_aTestHelper.checkEncrStream( xTempSubStorage2_target, "SubEncrStream1_renamed", "MediaType4", pBytes1, pPass1 ) )
419 			return false;
420 
421 		// root storage level
422 
423 		if ( !m_aTestHelper.checkStream( xTempStorage2, "Stream1_renamed", "MediaType1", true, pBytes1 ) )
424 			return false;
425 
426 		if ( !m_aTestHelper.checkEncrStream( xTempStorage2, "EncrStream1_renamed", "MediaType2", pBytes1, pPass1 ) )
427 			return false;
428 
429 		// the storage is based on the temporary stream so it can be left undisposed, since it does not lock
430 		// any resource, later the garbage collector will release the object and it must die by refcount
431 
432 		return true;
433 	}
434 }
435 
436