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