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_i29169 implements StorageTest {
20 
21 	XMultiServiceFactory m_xMSF;
22 	XSingleServiceFactory m_xStorageFactory;
23 	TestHelper m_aTestHelper;
24 
25 	public RegressionTest_i29169( XMultiServiceFactory xMSF, XSingleServiceFactory xStorageFactory, LogWriter aLogWriter )
26 	{
27 		m_xMSF = xMSF;
28 		m_xStorageFactory = xStorageFactory;
29 		m_aTestHelper = new TestHelper( aLogWriter, "RegressionTest_i29169: " );
30 	}
31 
32     public boolean test()
33 	{
34 		try
35 		{
36 			XStream xTempFileStream = m_aTestHelper.CreateTempFileStream( m_xMSF );
37 			if ( xTempFileStream == null )
38 				return false;
39 
40 			// create storage based on the temporary stream
41 			Object pArgs[] = new Object[2];
42 			pArgs[0] = (Object) xTempFileStream;
43 			pArgs[1] = new Integer( ElementModes.WRITE );
44 
45 			Object oTempStorage = m_xStorageFactory.createInstanceWithArguments( pArgs );
46 			XStorage xTempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage );
47 			if ( xTempStorage == null )
48 			{
49 				m_aTestHelper.Error( "Can't create temporary storage representation!" );
50 				return false;
51 			}
52 
53 			// open a new substorage
54 			XStorage xTempSubStorage = m_aTestHelper.openSubStorage( xTempStorage,
55 																	"SubStorage1",
56 																	ElementModes.WRITE );
57 			if ( xTempSubStorage == null )
58 			{
59 				m_aTestHelper.Error( "Can't create substorage!" );
60 				return false;
61 			}
62 
63 			byte pBytes1[] = { 1, 1, 1, 1, 1 };
64 
65 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
66 			if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage, "SubStream1", "MediaType1", true, pBytes1 ) )
67 				return false;
68 
69 			// open a new substorage in the existing substorage
70 			XStorage xTempSubSubStorage = m_aTestHelper.openSubStorage( xTempSubStorage,
71 																		"SubSubStorage1",
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( xTempSubSubStorage, "SubSubStream1", "MediaType2", true, pBytes1 ) )
81 				return false;
82 
83 			// set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly
84 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubSubStorage,
85 															"MediaType3",
86 															false,
87 															ElementModes.WRITE ) )
88 				return false;
89 
90 
91 			// set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly
92 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubStorage,
93 															"MediaType4",
94 															false,
95 															ElementModes.WRITE ) )
96 				return false;
97 
98 			// set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly
99 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempStorage,
100 															"MediaType5",
101 															true,
102 															ElementModes.WRITE ) )
103 				return false;
104 
105 			// ================================================
106 			// commit the storages, and check the renaming in all stages
107 			// ================================================
108 
109 			// rename the storage before it is commited
110 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubSubStorage1", "SubSubStorage2" ) )
111 				return false;
112 
113 			// rename the stream
114 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubStream1", "SubStream2" ) )
115 				return false;
116 
117 			// commit lowlevel substorage first
118 			if ( !m_aTestHelper.commitStorage( xTempSubSubStorage ) )
119 				return false;
120 
121 			// rename the storage after it is commited
122 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubSubStorage2", "SubSubStorage3" ) )
123 				return false;
124 
125 			// rename the stream one more time
126 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubStream2", "SubStream3" ) )
127 				return false;
128 
129 			// commit substorage
130 			if ( !m_aTestHelper.commitStorage( xTempSubStorage ) )
131 				return false;
132 
133 			// rename the storage after it`s parent is commited
134 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubSubStorage3", "SubSubStorage4" ) )
135 				return false;
136 
137 			// rename the stream after it`s parent is commited
138 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubStream3", "SubStream4" ) )
139 				return false;
140 
141 			// commit substorage to let the renaming take place
142 			if ( !m_aTestHelper.commitStorage( xTempSubStorage ) )
143 				return false;
144 
145 			// commit the root storage so the contents must be stored now
146 			if ( !m_aTestHelper.commitStorage( xTempStorage ) )
147 				return false;
148 
149 			// rename the storage after the package is commited
150 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubSubStorage4", "SubSubStorage5" ) )
151 				return false;
152 
153 			// rename the stream after it`s parent is commited
154 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubStream4", "SubStream5" ) )
155 				return false;
156 
157 			// commit substorage to let the renaming take place
158 			if ( !m_aTestHelper.commitStorage( xTempSubStorage ) )
159 				return false;
160 
161 			// commit the root storage so the contents must be stored now
162 			if ( !m_aTestHelper.commitStorage( xTempStorage ) )
163 				return false;
164 
165 			// ================================================
166 			// dispose the storages
167 			// ================================================
168 
169 			// dispose lowerest substorage
170 			if ( !m_aTestHelper.disposeStorage( xTempSubSubStorage ) )
171 				return false;
172 
173 			// dispose substorage
174 			if ( !m_aTestHelper.disposeStorage( xTempSubStorage ) )
175 				return false;
176 
177 			// dispose the temporary storage
178 			if ( !m_aTestHelper.disposeStorage( xTempStorage ) )
179 				return false;
180 
181 			// ================================================
182 			// create a new storage based on the stream and check the substreams and substorages
183 			// ================================================
184 
185 			oTempStorage = m_xStorageFactory.createInstanceWithArguments( pArgs );
186 			xTempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage );
187 			if ( xTempStorage == null )
188 			{
189 				m_aTestHelper.Error( "Can't create temporary storage representation!" );
190 				return false;
191 			}
192 
193 			// open the substorage
194 			xTempSubStorage = m_aTestHelper.openSubStorage( xTempStorage,
195 															"SubStorage1",
196 															ElementModes.WRITE );
197 			if ( xTempSubStorage == null )
198 			{
199 				m_aTestHelper.Error( "Can't create substorage!" );
200 				return false;
201 			}
202 
203 			// open the lowlevel substorage
204 			xTempSubSubStorage = m_aTestHelper.openSubStorage( xTempSubStorage,
205 																		"SubSubStorage5",
206 																		ElementModes.WRITE );
207 			if ( xTempSubStorage == null )
208 			{
209 				m_aTestHelper.Error( "Can't create substorage!" );
210 				return false;
211 			}
212 
213 			// check the storages and streams
214 
215 			if ( !m_aTestHelper.checkStorageProperties( xTempSubSubStorage, "MediaType3", false, ElementModes.WRITE ) )
216 				return false;
217 
218 			if ( !m_aTestHelper.checkStorageProperties( xTempSubStorage, "MediaType4", false, ElementModes.WRITE ) )
219 				return false;
220 
221 			if ( !m_aTestHelper.checkStorageProperties( xTempStorage, "MediaType5", true, ElementModes.WRITE ) )
222 				return false;
223 
224 			if ( !m_aTestHelper.checkStream( xTempSubStorage, "SubStream5", "MediaType1", true, pBytes1 ) )
225 				return false;
226 
227 			if ( !m_aTestHelper.checkStream( xTempSubSubStorage, "SubSubStream1", "MediaType2", true, pBytes1 ) )
228 				return false;
229 
230 			// ================================================
231 			// rename the reopened storages and streams
232 			// ================================================
233 
234 			// rename the storage before it is commited
235 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubSubStorage5", "SubSubStorage6" ) )
236 				return false;
237 
238 			// rename the stream
239 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubStream5", "SubStream6" ) )
240 				return false;
241 
242 			// commit lowlevel substorage first
243 			if ( !m_aTestHelper.commitStorage( xTempSubSubStorage ) )
244 				return false;
245 
246 			// rename the storage after it is commited
247 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubSubStorage6", "SubSubStorage7" ) )
248 				return false;
249 
250 			// rename the stream one more time
251 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubStream6", "SubStream7" ) )
252 				return false;
253 
254 			// commit substorage
255 			if ( !m_aTestHelper.commitStorage( xTempSubStorage ) )
256 				return false;
257 
258 			// rename the storage after it`s parent is commited
259 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubSubStorage7", "SubSubStorage8" ) )
260 				return false;
261 
262 			// rename the stream after it`s parent is commited
263 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubStream7", "SubStream8" ) )
264 				return false;
265 
266 			// commit substorage to let the renaming take place
267 			if ( !m_aTestHelper.commitStorage( xTempSubStorage ) )
268 				return false;
269 
270 			// commit the root storage so the contents must be stored now
271 			if ( !m_aTestHelper.commitStorage( xTempStorage ) )
272 				return false;
273 
274 			// rename the storage after the package is commited
275 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubSubStorage8", "SubSubStorage9" ) )
276 				return false;
277 
278 			// rename the stream after it`s parent is commited
279 			if ( !m_aTestHelper.renameElement( xTempSubStorage, "SubStream8", "SubStream9" ) )
280 				return false;
281 
282 			// commit substorage to let the renaming take place
283 			if ( !m_aTestHelper.commitStorage( xTempSubStorage ) )
284 				return false;
285 
286 			// commit the root storage so the contents must be stored now
287 			if ( !m_aTestHelper.commitStorage( xTempStorage ) )
288 				return false;
289 
290 			// ================================================
291 			// dispose the storages
292 			// ================================================
293 
294 			// dispose lowerest substorage
295 			if ( !m_aTestHelper.disposeStorage( xTempSubSubStorage ) )
296 				return false;
297 
298 			// dispose substorage
299 			if ( !m_aTestHelper.disposeStorage( xTempSubStorage ) )
300 				return false;
301 
302 			// dispose the temporary storage
303 			if ( !m_aTestHelper.disposeStorage( xTempStorage ) )
304 				return false;
305 
306 
307 			// ================================================
308 			// create a new readonly storage based on the stream and check the contents
309 			// ================================================
310 
311 			pArgs[1] = new Integer( ElementModes.READ );
312 			oTempStorage = m_xStorageFactory.createInstanceWithArguments( pArgs );
313 			xTempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage );
314 			if ( xTempStorage == null )
315 			{
316 				m_aTestHelper.Error( "Can't create temporary storage representation!" );
317 				return false;
318 			}
319 
320 			// open the substorage
321 			xTempSubStorage = m_aTestHelper.openSubStorage( xTempStorage,
322 															"SubStorage1",
323 															ElementModes.READ );
324 			if ( xTempSubStorage == null )
325 			{
326 				m_aTestHelper.Error( "Can't create substorage!" );
327 				return false;
328 			}
329 
330 			// open the lowlevel substorage
331 			xTempSubSubStorage = m_aTestHelper.openSubStorage( xTempSubStorage,
332 																		"SubSubStorage9",
333 																		ElementModes.READ );
334 			if ( xTempSubStorage == null )
335 			{
336 				m_aTestHelper.Error( "Can't create substorage!" );
337 				return false;
338 			}
339 
340 			// check the storages and streams
341 
342 			if ( !m_aTestHelper.checkStorageProperties( xTempSubSubStorage, "MediaType3", false, ElementModes.READ ) )
343 				return false;
344 
345 			if ( !m_aTestHelper.checkStorageProperties( xTempSubStorage, "MediaType4", false, ElementModes.READ ) )
346 				return false;
347 
348 			if ( !m_aTestHelper.checkStorageProperties( xTempStorage, "MediaType5", true, ElementModes.READ ) )
349 				return false;
350 
351 			if ( !m_aTestHelper.checkStream( xTempSubStorage, "SubStream9", "MediaType1", true, pBytes1 ) )
352 				return false;
353 
354 			if ( !m_aTestHelper.checkStream( xTempSubSubStorage, "SubSubStream1", "MediaType2", true, pBytes1 ) )
355 				return false;
356 
357 			// the storage is based on the temporary stream so it can be left undisposed, since it does not lock
358 			// any resource, later the garbage collector will release the object and it must die by refcount
359 
360 			return true;
361 		}
362 		catch( Exception e )
363 		{
364 			m_aTestHelper.Error( "Exception: " + e );
365 			return false;
366 		}
367     }
368 }
369 
370