1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 package complex.ofopxmlstorages;
23 
24 import com.sun.star.uno.XInterface;
25 import com.sun.star.lang.XMultiServiceFactory;
26 import com.sun.star.lang.XSingleServiceFactory;
27 import com.sun.star.lang.DisposedException;
28 
29 import com.sun.star.bridge.XUnoUrlResolver;
30 import com.sun.star.uno.UnoRuntime;
31 import com.sun.star.uno.XInterface;
32 
33 import com.sun.star.container.XNameAccess;
34 
35 import com.sun.star.embed.*;
36 import com.sun.star.beans.StringPair;
37 
38 import share.LogWriter;
39 import complex.ofopxmlstorages.TestHelper;
40 import complex.ofopxmlstorages.StorageTest;
41 
42 public class Test04 implements StorageTest {
43 
44 	XMultiServiceFactory m_xMSF;
45 	XSingleServiceFactory m_xStorageFactory;
46 	TestHelper m_aTestHelper;
47 
48 	public Test04( XMultiServiceFactory xMSF, XSingleServiceFactory xStorageFactory, LogWriter aLogWriter )
49 	{
50 		m_xMSF = xMSF;
51 		m_xStorageFactory = xStorageFactory;
52 		m_aTestHelper = new TestHelper( aLogWriter, "Test04: " );
53 	}
54 
55     public boolean test()
56 	{
57 		StringPair[][] aRelations1 =
58 			{ { new StringPair( "Id", "Num1" ) },
59 			  { new StringPair( "Target", "TargetURLValue1" ), new StringPair( "Id", "Num6" ) },
60 			  { new StringPair( "Target", "" ), new StringPair( "Id", "Num7" ) },
61 			  { new StringPair( "Id", "Num2" ), new StringPair( "TargetMode", "Internal1" ), new StringPair( "Type", "unknown1" ), new StringPair( "Target", "URL value 1" ) },
62 			  { new StringPair( "Id", "Num3" ), new StringPair( "TargetMode", "Internal1" ), new StringPair( "Type", "unknown1" ), new StringPair( "Target", "URL value 1" ) },
63 			  { new StringPair( "Id", "Num4" ), new StringPair( "TargetMode", "Internal1" ), new StringPair( "Type", "unknown1" ), new StringPair( "Target", "URL value 1" ) },
64 			  { new StringPair( "Id", "Num5" ), new StringPair( "TargetMode", "" ), new StringPair( "Type", "unknown1" ), new StringPair( "Target", "URL value1" ) }
65 			};
66 
67 		StringPair[][] aRelations2 =
68 			{ { new StringPair( "Id", "Num1" ) },
69 			  { new StringPair( "Target", "TargetURLValue2" ), new StringPair( "Id", "Num6" ) },
70 			  { new StringPair( "Target", "" ), new StringPair( "Id", "Num7" ) },
71 			  { new StringPair( "Id", "Num2" ), new StringPair( "TargetMode", "Internal2" ), new StringPair( "Type", "unknown2" ), new StringPair( "Target", "URL value 2" ) },
72 			  { new StringPair( "Id", "Num3" ), new StringPair( "TargetMode", "Internal2" ), new StringPair( "Type", "unknown2" ), new StringPair( "Target", "URL value 2" ) },
73 			  { new StringPair( "Id", "Num4" ), new StringPair( "TargetMode", "Internal2" ), new StringPair( "Type", "unknown" ), new StringPair( "Target", "URL value" ) },
74 			  { new StringPair( "Id", "Num5" ), new StringPair( "TargetMode", "" ), new StringPair( "Type", "unknown" ), new StringPair( "Target", "URL value" ) }
75 			};
76 
77 		try
78 		{
79 			String sTempFileURL = m_aTestHelper.CreateTempFile( m_xMSF );
80 			if ( sTempFileURL == null || sTempFileURL == "" )
81 			{
82 				m_aTestHelper.Error( "No valid temporary file was created!" );
83 				return false;
84 			}
85 
86 			// create temporary storage based on arbitrary medium
87 			// after such a storage is closed it is lost
88 			XStorage xTempStorage = m_aTestHelper.createTempStorage( m_xMSF, m_xStorageFactory );
89 			if ( xTempStorage == null )
90 			{
91 				m_aTestHelper.Error( "Can't create temporary storage representation!" );
92 				return false;
93 			}
94 
95 			// open substorages and create streams there
96 
97 			// first substorage of the root storage
98 			XStorage xTempSubStorage1 = m_aTestHelper.openSubStorage( xTempStorage,
99 																		"SubStorage1",
100 																		ElementModes.WRITE );
101 			if ( xTempSubStorage1 == null )
102 			{
103 				m_aTestHelper.Error( "Can't create substorage!" );
104 				return false;
105 			}
106 
107 			byte pBytes1[] = { 1, 1, 1, 1, 1 };
108 
109 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
110 			if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage1,
111 														"SubStream1",
112 														"MediaType1",
113 														true,
114 														pBytes1,
115 														aRelations1 ) )
116 				return false;
117 
118 			// second substorage of the root storage
119 			XStorage xTempSubStorage2 = m_aTestHelper.openSubStorage( xTempStorage,
120 																		"SubStorage2",
121 																		ElementModes.WRITE );
122 			if ( xTempSubStorage2 == null )
123 			{
124 				m_aTestHelper.Error( "Can't create substorage!" );
125 				return false;
126 			}
127 
128 			byte pBytes2[] = { 2, 2, 2, 2, 2 };
129 
130 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
131 			if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage2,
132 														"SubStream2",
133 														"MediaType2",
134 														false,
135 														pBytes2,
136 														aRelations2 ) )
137 				return false;
138 
139 			// set Relations for storages and check that "IsRoot" and "OpenMode" properties are set correctly
140 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempStorage,
141 															true,
142 															ElementModes.WRITE,
143 															aRelations2 ) )
144 				return false;
145 
146 			// set Relations for storages and check that "IsRoot" and "OpenMode" properties are set correctly
147 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubStorage1,
148 															false,
149 															ElementModes.WRITE,
150 															aRelations2 ) )
151 				return false;
152 
153 			// set Relations for storages and check that "IsRoot" and "OpenMode" properties are set correctly
154 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubStorage2,
155 															false,
156 															ElementModes.WRITE,
157 															aRelations2 ) )
158 				return false;
159 
160 			// create temporary storage based on a previously created temporary file
161 			XStorage xTempFileStorage = m_aTestHelper.createStorageFromURL( m_xStorageFactory,
162 																			sTempFileURL,
163 																			ElementModes.WRITE );
164 			if ( xTempFileStorage == null )
165 			{
166 				m_aTestHelper.Error( "Can't create storage based on temporary file!" );
167 				return false;
168 			}
169 
170 			if ( !m_aTestHelper.copyElementTo( xTempStorage, "SubStorage1", xTempFileStorage ) )
171 				return false;
172 
173 			// if storage is not commited before disposing all the changes will be lost
174 			if ( !m_aTestHelper.commitStorage( xTempSubStorage2 ) )
175 				return false;
176 
177 			// a storage must be disposed before moving/removing otherwise the access will be denied
178 			if ( !m_aTestHelper.disposeStorage( xTempSubStorage2 ) )
179 				return false;
180 
181 			if ( !m_aTestHelper.moveElementTo( xTempStorage, "SubStorage2", xTempFileStorage ) )
182 				return false;
183 
184 			// SubStorage2 must be removed and disposed now
185 			try
186 			{
187 				xTempSubStorage2.isStreamElement( "SubStream2" );
188 				m_aTestHelper.Error( "SubStorage2 must be disposed already!" );
189 				return false;
190 			}
191 			catch( com.sun.star.lang.DisposedException de )
192 			{
193 			}
194 			catch( Exception e )
195 			{
196 				m_aTestHelper.Error( "Wrong exception in case of disposed storage, exception: " + e );
197 				return false;
198 			}
199 
200 			if ( !m_aTestHelper.copyElementTo( xTempSubStorage1, "SubStream1", xTempFileStorage ) )
201 				return false;
202 
203 			if ( !m_aTestHelper.renameElement( xTempFileStorage, "SubStream1", "SubStream1_copy" ) )
204 				return false;
205 
206 			if ( !m_aTestHelper.moveElementTo( xTempSubStorage1, "SubStream1", xTempFileStorage ) )
207 				return false;
208 
209 			if ( !m_aTestHelper.commitStorage( xTempFileStorage ) )
210 				return false;
211 
212 			// dispose used storages to free resources
213 			if ( !m_aTestHelper.disposeStorage( xTempStorage ) || !m_aTestHelper.disposeStorage( xTempFileStorage ) )
214 				return false;
215 
216 			// ================================================
217 			// now check all the written and copied information
218 			// ================================================
219 
220 			// the temporary file must not be locked any more after storage disposing
221 			XStorage xResStorage = m_aTestHelper.createStorageFromURL( m_xStorageFactory,
222 																		sTempFileURL,
223 																		ElementModes.WRITE );
224 
225 			if ( xResStorage == null )
226 			{
227 				m_aTestHelper.Error( "Can't reopen storage based on temporary file!" );
228 				return false;
229 			}
230 
231 			// open and check SubStorage1
232 			XStorage xResSubStorage1 = m_aTestHelper.openSubStorage( xResStorage,
233 																		"SubStorage1",
234 																		ElementModes.READ );
235 			if ( xResSubStorage1 == null )
236 			{
237 				m_aTestHelper.Error( "Can't open existing substorage!" );
238 				return false;
239 			}
240 
241 			if ( !m_aTestHelper.checkStorageProperties( xResSubStorage1,
242 														false,
243 														ElementModes.READ,
244 														aRelations2 ) )
245 				return false;
246 
247 
248 			// open and check SubStorage2
249 			XStorage xResSubStorage2 = m_aTestHelper.openSubStorage( xResStorage,
250 																		"SubStorage2",
251 																		ElementModes.READ );
252 			if ( xResSubStorage2 == null )
253 			{
254 				m_aTestHelper.Error( "Can't open existing substorage!" );
255 				return false;
256 			}
257 
258 			if ( !m_aTestHelper.checkStorageProperties( xResSubStorage2,
259 														false,
260 														ElementModes.READ,
261 														aRelations2 ) )
262 				return false;
263 
264 
265 			// check all the result streams
266 
267 			if ( !m_aTestHelper.checkStream( xResStorage, "SubStream1", "MediaType1", pBytes1, aRelations1 ) )
268 				return false;
269 
270 			if ( !m_aTestHelper.checkStream( xResStorage, "SubStream1_copy", "MediaType1", pBytes1, aRelations1 ) )
271 				return false;
272 
273 			if ( !m_aTestHelper.checkStream( xResSubStorage1, "SubStream1", "MediaType1", pBytes1, aRelations1 ) )
274 				return false;
275 
276 			if ( !m_aTestHelper.checkStream( xResSubStorage2, "SubStream2", "MediaType2", pBytes2, aRelations2 ) )
277 				return false;
278 
279 			// the storage must be disposed before removing
280 			if ( !m_aTestHelper.disposeStorage( xResSubStorage2 ) )
281 				return false;
282 
283 			// remove element and check that it was removed completelly
284 			if ( !m_aTestHelper.removeElement( xResStorage, "SubStorage2" ) )
285 				return false;
286 
287 			try
288 			{
289 				XNameAccess xResAccess = (XNameAccess) UnoRuntime.queryInterface( XNameAccess.class, xResStorage );
290 				if ( xResAccess.hasByName( "SubStorage2" ) )
291 					m_aTestHelper.Error( "SubStorage2 must be removed already!" );
292 			}
293 			catch( Exception e )
294 			{
295 				m_aTestHelper.Error( "Can't get access to root storage, exception: " + e );
296 				return false;
297 			}
298 
299 			try
300 			{
301 				xResSubStorage2.isStreamElement( "SubStream2" );
302 
303 				m_aTestHelper.Error( "SubStorage2 must be disposed already!" );
304 				return false;
305 			}
306 			catch( com.sun.star.lang.DisposedException de )
307 			{
308 			}
309 			catch( Exception e )
310 			{
311 				m_aTestHelper.Error( "Wrong exception in case of disposed storage, exception: " + e );
312 				return false;
313 			}
314 
315 			// dispose used storages to free resources
316 			if ( !m_aTestHelper.disposeStorage( xResStorage ) )
317 				return false;
318 
319 			return true;
320 		}
321 		catch( Exception e )
322 		{
323 			m_aTestHelper.Error( "Exception: " + e );
324 			return false;
325 		}
326     }
327 
328 }
329 
330