xref: /aoo41x/main/package/qa/storages/Test04.java (revision cdf0e10c)
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 import com.sun.star.lang.DisposedException;
7 
8 import com.sun.star.bridge.XUnoUrlResolver;
9 import com.sun.star.uno.UnoRuntime;
10 import com.sun.star.uno.XInterface;
11 
12 import com.sun.star.container.XNameAccess;
13 
14 import com.sun.star.embed.*;
15 
16 import share.LogWriter;
17 import complex.storages.TestHelper;
18 import complex.storages.StorageTest;
19 
20 public class Test04 implements StorageTest {
21 
22 	XMultiServiceFactory m_xMSF;
23 	XSingleServiceFactory m_xStorageFactory;
24 	TestHelper m_aTestHelper;
25 
26 	public Test04( XMultiServiceFactory xMSF, XSingleServiceFactory xStorageFactory, LogWriter aLogWriter )
27 	{
28 		m_xMSF = xMSF;
29 		m_xStorageFactory = xStorageFactory;
30 		m_aTestHelper = new TestHelper( aLogWriter, "Test04: " );
31 	}
32 
33     public boolean test()
34 	{
35 		try
36 		{
37 			String sTempFileURL = m_aTestHelper.CreateTempFile( m_xMSF );
38 			if ( sTempFileURL == null || sTempFileURL == "" )
39 			{
40 				m_aTestHelper.Error( "No valid temporary file was created!" );
41 				return false;
42 			}
43 
44 			// create temporary storage based on arbitrary medium
45 			// after such a storage is closed it is lost
46 			Object oTempStorage = m_xStorageFactory.createInstance();
47 			XStorage xTempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage );
48 			if ( xTempStorage == null )
49 			{
50 				m_aTestHelper.Error( "Can't create temporary storage representation!" );
51 				return false;
52 			}
53 
54 			// open substorages and create streams there
55 
56 			// first substorage of the root storage
57 			XStorage xTempSubStorage1 = m_aTestHelper.openSubStorage( xTempStorage,
58 																		"SubStorage1",
59 																		ElementModes.WRITE );
60 			if ( xTempSubStorage1 == null )
61 			{
62 				m_aTestHelper.Error( "Can't create substorage!" );
63 				return false;
64 			}
65 
66             byte pBigBytes[] = new byte[33000];
67 			for ( int nInd = 0; nInd < 33000; nInd++ )
68 				pBigBytes[nInd] = (byte)( nInd % 128 );
69 
70 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
71 			if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage1, "BigSubStream1", "MediaType1", true, pBigBytes ) )
72 				return false;
73 
74 			byte pBytes1[] = { 1, 1, 1, 1, 1 };
75 
76 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
77 			if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage1, "SubStream1", "MediaType1", true, pBytes1 ) )
78 				return false;
79 
80 			// second substorage of the root storage
81 			XStorage xTempSubStorage2 = m_aTestHelper.openSubStorage( xTempStorage,
82 																		"SubStorage2",
83 																		ElementModes.WRITE );
84 			if ( xTempSubStorage2 == null )
85 			{
86 				m_aTestHelper.Error( "Can't create substorage!" );
87 				return false;
88 			}
89 
90 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
91 			if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage2, "BigSubStream2", "MediaType2", false, pBigBytes ) )
92 				return false;
93 
94 			byte pBytes2[] = { 2, 2, 2, 2, 2 };
95 
96 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
97 			if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage2, "SubStream2", "MediaType2", false, pBytes2 ) )
98 				return false;
99 
100 			// set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly
101 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempStorage,
102 															"MediaType3",
103 															true,
104 															ElementModes.WRITE ) )
105 				return false;
106 
107 			// set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly
108 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubStorage1,
109 															"MediaType4",
110 															false,
111 															ElementModes.WRITE ) )
112 				return false;
113 
114 			// set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly
115 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubStorage2,
116 															"MediaType5",
117 															false,
118 															ElementModes.WRITE ) )
119 				return false;
120 
121 			// create temporary storage based on a previously created temporary file
122 			Object pArgs[] = new Object[2];
123 			pArgs[0] = (Object) sTempFileURL;
124 			pArgs[1] = new Integer( ElementModes.WRITE );
125 
126 			Object oTempFileStorage = m_xStorageFactory.createInstanceWithArguments( pArgs );
127 			XStorage xTempFileStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oTempFileStorage );
128 			if ( xTempFileStorage == null )
129 			{
130 				m_aTestHelper.Error( "Can't create storage based on temporary file!" );
131 				return false;
132 			}
133 
134 			if ( !m_aTestHelper.copyElementTo( xTempStorage, "SubStorage1", xTempFileStorage ) )
135 				return false;
136 
137 			// if storage is not commited before disposing all the changes will be lost
138 			if ( !m_aTestHelper.commitStorage( xTempSubStorage2 ) )
139 				return false;
140 
141 			// a storage must be disposed before moving/removing otherwise the access will be denied
142 			if ( !m_aTestHelper.disposeStorage( xTempSubStorage2 ) )
143 				return false;
144 
145 			if ( !m_aTestHelper.moveElementTo( xTempStorage, "SubStorage2", xTempFileStorage ) )
146 				return false;
147 
148 			// SubStorage2 must be removed and disposed now
149 			try
150 			{
151 				xTempSubStorage2.isStreamElement( "SubStream2" );
152 				m_aTestHelper.Error( "SubStorage2 must be disposed already!" );
153 				return false;
154 			}
155 			catch( com.sun.star.lang.DisposedException de )
156 			{
157 			}
158 			catch( Exception e )
159 			{
160 				m_aTestHelper.Error( "Wrong exception in case of disposed storage, exception: " + e );
161 				return false;
162 			}
163 
164 			if ( !m_aTestHelper.copyElementTo( xTempSubStorage1, "SubStream1", xTempFileStorage ) )
165 				return false;
166 
167 			if ( !m_aTestHelper.renameElement( xTempFileStorage, "SubStream1", "SubStream1_copy" ) )
168 				return false;
169 
170 			if ( !m_aTestHelper.moveElementTo( xTempSubStorage1, "SubStream1", xTempFileStorage ) )
171 				return false;
172 
173 			if ( !m_aTestHelper.copyElementTo( xTempSubStorage1, "BigSubStream1", xTempFileStorage ) )
174 				return false;
175 
176 			if ( !m_aTestHelper.renameElement( xTempFileStorage, "BigSubStream1", "BigSubStream1_copy" ) )
177 				return false;
178 
179 			if ( !m_aTestHelper.moveElementTo( xTempSubStorage1, "BigSubStream1", xTempFileStorage ) )
180 				return false;
181 
182 			if ( !m_aTestHelper.commitStorage( xTempFileStorage ) )
183 				return false;
184 
185 			// dispose used storages to free resources
186 			if ( !m_aTestHelper.disposeStorage( xTempStorage ) || !m_aTestHelper.disposeStorage( xTempFileStorage ) )
187 				return false;
188 
189 			// ================================================
190 			// now check all the written and copied information
191 			// ================================================
192 
193 			// the temporary file must not be locked any more after storage disposing
194 			pArgs[1] = new Integer( ElementModes.WRITE );
195 			Object oResStorage = m_xStorageFactory.createInstanceWithArguments( pArgs );
196 			XStorage xResStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oResStorage );
197 			if ( xResStorage == null )
198 			{
199 				m_aTestHelper.Error( "Can't reopen storage based on temporary file!" );
200 				return false;
201 			}
202 
203 			// open and check SubStorage1
204 			XStorage xResSubStorage1 = m_aTestHelper.openSubStorage( xResStorage,
205 																		"SubStorage1",
206 																		ElementModes.READ );
207 			if ( xResSubStorage1 == null )
208 			{
209 				m_aTestHelper.Error( "Can't open existing substorage!" );
210 				return false;
211 			}
212 
213 			if ( !m_aTestHelper.checkStorageProperties( xResSubStorage1, "MediaType4", false, ElementModes.READ ) )
214 				return false;
215 
216 
217 			// open and check SubStorage2
218 			XStorage xResSubStorage2 = m_aTestHelper.openSubStorage( xResStorage,
219 																		"SubStorage2",
220 																		ElementModes.READ );
221 			if ( xResSubStorage2 == null )
222 			{
223 				m_aTestHelper.Error( "Can't open existing substorage!" );
224 				return false;
225 			}
226 
227 			if ( !m_aTestHelper.checkStorageProperties( xResSubStorage2, "MediaType5", false, ElementModes.READ ) )
228 				return false;
229 
230 
231 			// check all the result streams
232 
233 			if ( !m_aTestHelper.checkStream( xResStorage, "SubStream1", "MediaType1", true, pBytes1 ) )
234 				return false;
235 
236 			if ( !m_aTestHelper.checkStream( xResStorage, "BigSubStream1", "MediaType1", true, pBigBytes ) )
237 				return false;
238 
239 			if ( !m_aTestHelper.checkStream( xResStorage, "SubStream1_copy", "MediaType1", true, pBytes1 ) )
240 				return false;
241 
242 			if ( !m_aTestHelper.checkStream( xResStorage, "BigSubStream1_copy", "MediaType1", true, pBigBytes ) )
243 				return false;
244 
245 			if ( !m_aTestHelper.checkStream( xResSubStorage1, "SubStream1", "MediaType1", true, pBytes1 ) )
246 				return false;
247 
248 			if ( !m_aTestHelper.checkStream( xResSubStorage1, "BigSubStream1", "MediaType1", true, pBigBytes ) )
249 				return false;
250 
251 			if ( !m_aTestHelper.checkStream( xResSubStorage2, "SubStream2", "MediaType2", false, pBytes2 ) )
252 				return false;
253 
254 			if ( !m_aTestHelper.checkStream( xResSubStorage2, "BigSubStream2", "MediaType2", false, pBigBytes ) )
255 				return false;
256 
257 			// the storage must be disposed before removing
258 			if ( !m_aTestHelper.disposeStorage( xResSubStorage2 ) )
259 				return false;
260 
261 			// remove element and check that it was removed completelly
262 			if ( !m_aTestHelper.removeElement( xResStorage, "SubStorage2" ) )
263 				return false;
264 
265 			try
266 			{
267 				XNameAccess xResAccess = (XNameAccess) UnoRuntime.queryInterface( XNameAccess.class, xResStorage );
268 				if ( xResAccess.hasByName( "SubStorage2" ) )
269 					m_aTestHelper.Error( "SubStorage2 must be removed already!" );
270 			}
271 			catch( Exception e )
272 			{
273 				m_aTestHelper.Error( "Can't get access to root storage, exception: " + e );
274 				return false;
275 			}
276 
277 			try
278 			{
279 				xResSubStorage2.isStreamElement( "SubStream2" );
280 
281 				m_aTestHelper.Error( "SubStorage2 must be disposed already!" );
282 				return false;
283 			}
284 			catch( com.sun.star.lang.DisposedException de )
285 			{
286 			}
287 			catch( Exception e )
288 			{
289 				m_aTestHelper.Error( "Wrong exception in case of disposed storage, exception: " + e );
290 				return false;
291 			}
292 
293 			// dispose used storages to free resources
294 			if ( !m_aTestHelper.disposeStorage( xResStorage ) )
295 				return false;
296 
297 			return true;
298 		}
299 		catch( Exception e )
300 		{
301 			m_aTestHelper.Error( "Exception: " + e );
302 			return false;
303 		}
304     }
305 
306 }
307 
308