xref: /AOO41X/main/package/qa/ofopxmlstorages/Test04.java (revision a740f2aac71e58ccad9369fb423cc251ef909663)
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 
Test04( XMultiServiceFactory xMSF, XSingleServiceFactory xStorageFactory, LogWriter aLogWriter )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 
test()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