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 import com.sun.star.beans.XPropertySet; 13 import com.sun.star.uno.AnyConverter; 14 15 import com.sun.star.embed.*; 16 17 import share.LogWriter; 18 import complex.storages.TestHelper; 19 import complex.storages.StorageTest; 20 21 /////////////////////////////////// 22 // Tests also fix for i51352 23 /////////////////////////////////// 24 25 public class RegressionTest_i27773 implements StorageTest { 26 27 XMultiServiceFactory m_xMSF; 28 XSingleServiceFactory m_xStorageFactory; 29 TestHelper m_aTestHelper; 30 31 public RegressionTest_i27773( XMultiServiceFactory xMSF, XSingleServiceFactory xStorageFactory, LogWriter aLogWriter ) 32 { 33 m_xMSF = xMSF; 34 m_xStorageFactory = xStorageFactory; 35 m_aTestHelper = new TestHelper( aLogWriter, "RegressionTest_i27773: " ); 36 } 37 38 public boolean test() 39 { 40 try 41 { 42 XStream xTempFileStream = m_aTestHelper.CreateTempFileStream( m_xMSF ); 43 if ( xTempFileStream == null ) 44 return false; 45 46 if ( true ) 47 { 48 // for debugging proposes 49 50 XPropertySet xPropSet = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xTempFileStream ); 51 if ( xPropSet != null ) 52 { 53 try 54 { 55 String sTempURL = AnyConverter.toString( xPropSet.getPropertyValue( "Uri" ) ); 56 // m_aTestHelper.Message( "URL: " + sTempURL ); 57 xPropSet.setPropertyValue( "RemoveFile", new Boolean( false ) ); 58 } 59 catch ( Exception e ) 60 { 61 } 62 } 63 } 64 65 // create storage based on the temporary stream 66 Object pArgs[] = new Object[2]; 67 pArgs[0] = (Object) xTempFileStream; 68 pArgs[1] = new Integer( ElementModes.WRITE ); 69 70 Object oTempStorage = m_xStorageFactory.createInstanceWithArguments( pArgs ); 71 XStorage xTempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage ); 72 if ( xTempStorage == null ) 73 { 74 m_aTestHelper.Error( "Can't create temporary storage representation!" ); 75 return false; 76 } 77 78 // open a new substorage 79 XStorage xTempSubStorage = m_aTestHelper.openSubStorage( xTempStorage, 80 "SubStorage1", 81 ElementModes.WRITE ); 82 if ( xTempSubStorage == null ) 83 { 84 m_aTestHelper.Error( "Can't create substorage!" ); 85 return false; 86 } 87 88 // open an empty substorage 89 XStorage xEmptySubStorage = m_aTestHelper.openSubStorage( xTempStorage, 90 "EmptySubStorage1", 91 ElementModes.WRITE ); 92 if ( xEmptySubStorage == null ) 93 { 94 m_aTestHelper.Error( "Can't create substorage!" ); 95 return false; 96 } 97 98 // open an empty substorage 99 XStorage xEmptySubSubStorage = m_aTestHelper.openSubStorage( xTempSubStorage, 100 "EmptySubSubStorage1", 101 ElementModes.WRITE ); 102 if ( xEmptySubSubStorage == null ) 103 { 104 m_aTestHelper.Error( "Can't create substorage!" ); 105 return false; 106 } 107 108 109 byte pBytes1[] = { 1, 1, 1, 1, 1 }; 110 111 // open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes 112 if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage, "SubStream1", "MediaType1", true, pBytes1 ) ) 113 return false; 114 115 // set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly 116 if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempStorage, 117 "MediaType2", 118 true, 119 ElementModes.WRITE ) ) 120 return false; 121 122 // set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly 123 if ( !m_aTestHelper.setStorageTypeAndCheckProps( xEmptySubStorage, 124 "MediaType3", 125 false, 126 ElementModes.WRITE ) ) 127 return false; 128 129 // set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly 130 if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubStorage, 131 "MediaType4", 132 false, 133 ElementModes.WRITE ) ) 134 return false; 135 136 // set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly 137 if ( !m_aTestHelper.setStorageTypeAndCheckProps( xEmptySubSubStorage, 138 "MediaType5", 139 false, 140 ElementModes.WRITE ) ) 141 return false; 142 143 144 // make a copy of substorage 145 146 if ( !m_aTestHelper.copyElementTo( xTempStorage, "SubStorage1", xTempStorage, "SubStorage1_copy" ) ) 147 return false; 148 149 if ( !m_aTestHelper.copyElementTo( xTempStorage, "EmptySubStorage1", xTempStorage, "EmptySubStorage1_copy" ) ) 150 return false; 151 152 // ================================================ 153 // copy all the changed and noncommited substorages 154 // and dispose them 155 // ================================================ 156 157 if ( !m_aTestHelper.commitStorage( xEmptySubSubStorage ) ) 158 return false; 159 160 if ( !m_aTestHelper.commitStorage( xTempSubStorage ) ) 161 return false; 162 163 if ( !m_aTestHelper.commitStorage( xEmptySubStorage ) ) 164 return false; 165 166 if ( !m_aTestHelper.commitStorage( xTempStorage ) ) 167 return false; 168 169 // dispose substorages 170 171 if ( !m_aTestHelper.disposeStorage( xEmptySubSubStorage ) ) 172 return false; 173 174 if ( !m_aTestHelper.disposeStorage( xTempSubStorage ) ) 175 return false; 176 177 if ( !m_aTestHelper.disposeStorage( xEmptySubStorage ) ) 178 return false; 179 180 if ( !m_aTestHelper.disposeStorage( xTempStorage ) ) 181 return false; 182 183 // ================================================ 184 // reopen the storage in readonly mode an check contents 185 // ================================================ 186 187 pArgs[1] = new Integer( ElementModes.READ ); 188 189 oTempStorage = m_xStorageFactory.createInstanceWithArguments( pArgs ); 190 xTempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage ); 191 if ( xTempStorage == null ) 192 { 193 m_aTestHelper.Error( "Can't create temporary storage representation!" ); 194 return false; 195 } 196 197 // open original substorage 198 xTempSubStorage = m_aTestHelper.openSubStorage( xTempStorage, 199 "SubStorage1", 200 ElementModes.READ ); 201 if ( xTempSubStorage == null ) 202 { 203 m_aTestHelper.Error( "Can't create substorage!" ); 204 return false; 205 } 206 207 // open copy of the original substorage 208 XStorage xTempSubStorage_copy = m_aTestHelper.openSubStorage( xTempStorage, 209 "SubStorage1_copy", 210 ElementModes.READ ); 211 if ( xTempSubStorage_copy == null ) 212 { 213 m_aTestHelper.Error( "Can't create substorage!" ); 214 return false; 215 } 216 217 // open empty substorage 218 xEmptySubStorage = m_aTestHelper.openSubStorage( xTempStorage, 219 "EmptySubStorage1", 220 ElementModes.READ ); 221 if ( xEmptySubStorage == null ) 222 { 223 m_aTestHelper.Error( "Can't create substorage!" ); 224 return false; 225 } 226 227 // open copy of empty substorage 228 XStorage xEmptySubStorage_copy = m_aTestHelper.openSubStorage( xTempStorage, 229 "EmptySubStorage1_copy", 230 ElementModes.READ ); 231 if ( xEmptySubStorage_copy == null ) 232 { 233 m_aTestHelper.Error( "Can't create substorage!" ); 234 return false; 235 } 236 237 // open an empty substorage of the substorage 238 xEmptySubSubStorage = m_aTestHelper.openSubStorage( xTempSubStorage, 239 "EmptySubSubStorage1", 240 ElementModes.READ ); 241 if ( xEmptySubSubStorage == null ) 242 { 243 m_aTestHelper.Error( "Can't create substorage!" ); 244 return false; 245 } 246 247 // open an empty substorage of the substorage copy 248 XStorage xEmptySubSubStorage_inCopy = m_aTestHelper.openSubStorage( xTempSubStorage_copy, 249 "EmptySubSubStorage1", 250 ElementModes.READ ); 251 if ( xEmptySubSubStorage_inCopy == null ) 252 { 253 m_aTestHelper.Error( "Can't create substorage!" ); 254 return false; 255 } 256 257 258 // check contents 259 260 if ( !m_aTestHelper.checkStorageProperties( xEmptySubSubStorage, "MediaType5", false, ElementModes.READ ) ) 261 return false; 262 263 if ( !m_aTestHelper.checkStorageProperties( xEmptySubSubStorage_inCopy, "MediaType5", false, ElementModes.READ ) ) 264 return false; 265 266 if ( !m_aTestHelper.checkStorageProperties( xTempSubStorage, "MediaType4", false, ElementModes.READ ) ) 267 return false; 268 269 if ( !m_aTestHelper.checkStorageProperties( xTempSubStorage_copy, "MediaType4", false, ElementModes.READ ) ) 270 return false; 271 272 if ( !m_aTestHelper.checkStorageProperties( xEmptySubStorage, "MediaType3", false, ElementModes.READ ) ) 273 return false; 274 275 if ( !m_aTestHelper.checkStorageProperties( xEmptySubStorage_copy, "MediaType3", false, ElementModes.READ ) ) 276 return false; 277 278 if ( !m_aTestHelper.checkStorageProperties( xTempStorage, "MediaType2", true, ElementModes.READ ) ) 279 return false; 280 281 if ( !m_aTestHelper.checkStream( xTempSubStorage, "SubStream1", "MediaType1", true, pBytes1 ) ) 282 return false; 283 284 if ( !m_aTestHelper.checkStream( xTempSubStorage_copy, "SubStream1", "MediaType1", true, pBytes1 ) ) 285 return false; 286 287 // the root storage is based on the temporary stream so it can be left undisposed, since it does not lock 288 // any resource, later the garbage collector will release the object and it must die by refcount 289 290 return true; 291 } 292 catch( Exception e ) 293 { 294 m_aTestHelper.Error( "Exception: " + e ); 295 return false; 296 } 297 } 298 } 299 300