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