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 storagetesting; 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 37 import storagetesting.TestHelper; 38 import storagetesting.StorageTest; 39 40 public class Test04 implements StorageTest { 41 42 XMultiServiceFactory m_xMSF; 43 XSingleServiceFactory m_xStorageFactory; 44 TestHelper m_aTestHelper; 45 46 public Test04( XMultiServiceFactory xMSF, XSingleServiceFactory xStorageFactory ) 47 { 48 m_xMSF = xMSF; 49 m_xStorageFactory = xStorageFactory; 50 m_aTestHelper = new TestHelper( "Test04: " ); 51 } 52 53 public boolean test() 54 { 55 try 56 { 57 String sTempFileURL = m_aTestHelper.CreateTempFile( m_xMSF ); 58 if ( sTempFileURL == null || sTempFileURL == "" ) 59 { 60 m_aTestHelper.Error( "No valid temporary file was created!" ); 61 return false; 62 } 63 64 // create temporary storage based on arbitrary medium 65 // after such a storage is closed it is lost 66 Object oTempStorage = m_xStorageFactory.createInstance(); 67 XStorage xTempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage ); 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.ELEMENT_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, "SubStream1", "MediaType1", true, pBytes1 ) ) 90 return false; 91 92 // second substorage of the root storage 93 XStorage xTempSubStorage2 = m_aTestHelper.openSubStorage( xTempStorage, 94 "SubStorage2", 95 ElementModes.ELEMENT_WRITE ); 96 if ( xTempSubStorage2 == null ) 97 { 98 m_aTestHelper.Error( "Can't create substorage!" ); 99 return false; 100 } 101 102 byte pBytes2[] = { 2, 2, 2, 2, 2 }; 103 104 // open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes 105 if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage2, "SubStream2", "MediaType2", false, pBytes2 ) ) 106 return false; 107 108 // set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly 109 if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempStorage, 110 "MediaType3", 111 true, 112 ElementModes.ELEMENT_READWRITE ) ) 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( xTempSubStorage1, 117 "MediaType4", 118 false, 119 ElementModes.ELEMENT_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( xTempSubStorage2, 124 "MediaType5", 125 false, 126 ElementModes.ELEMENT_WRITE ) ) 127 return false; 128 129 // create temporary storage based on a previously created temporary file 130 Object pArgs[] = new Object[2]; 131 pArgs[0] = (Object) sTempFileURL; 132 pArgs[1] = new Integer( ElementModes.ELEMENT_WRITE ); 133 134 Object oTempFileStorage = m_xStorageFactory.createInstanceWithArguments( pArgs ); 135 XStorage xTempFileStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oTempFileStorage ); 136 if ( xTempFileStorage == null ) 137 { 138 m_aTestHelper.Error( "Can't create storage based on temporary file!" ); 139 return false; 140 } 141 142 if ( !m_aTestHelper.copyElementTo( xTempStorage, "SubStorage1", xTempFileStorage ) ) 143 return false; 144 145 // if storage is not commited before disposing all the changes will be lost 146 if ( !m_aTestHelper.commitStorage( xTempSubStorage2 ) ) 147 return false; 148 149 // a storage must be disposed before moving/removing otherwise the access will be denied 150 if ( !m_aTestHelper.disposeStorage( xTempSubStorage2 ) ) 151 return false; 152 153 if ( !m_aTestHelper.moveElementTo( xTempStorage, "SubStorage2", xTempFileStorage ) ) 154 return false; 155 156 // SubStorage2 must be removed and disposed now 157 try 158 { 159 xTempSubStorage2.isStreamElement( "SubStream2" ); 160 m_aTestHelper.Error( "SubStorage2 must be disposed already!" ); 161 return false; 162 } 163 catch( com.sun.star.lang.DisposedException de ) 164 { 165 } 166 catch( Exception e ) 167 { 168 m_aTestHelper.Error( "Wrong exception in case of disposed storage, exception: " + e ); 169 return false; 170 } 171 172 if ( !m_aTestHelper.copyElementTo( xTempSubStorage1, "SubStream1", xTempFileStorage ) ) 173 return false; 174 175 if ( !m_aTestHelper.renameElement( xTempFileStorage, "SubStream1", "SubStream1_copy" ) ) 176 return false; 177 178 if ( !m_aTestHelper.moveElementTo( xTempSubStorage1, "SubStream1", xTempFileStorage ) ) 179 return false; 180 181 if ( !m_aTestHelper.commitStorage( xTempFileStorage ) ) 182 return false; 183 184 // dispose used storages to free resources 185 if ( !m_aTestHelper.disposeStorage( xTempStorage ) || !m_aTestHelper.disposeStorage( xTempFileStorage ) ) 186 return false; 187 188 // ================================================ 189 // now check all the written and copied information 190 // ================================================ 191 192 // the temporary file must not be locked any more after storage disposing 193 pArgs[1] = new Integer( ElementModes.ELEMENT_READWRITE ); 194 Object oResStorage = m_xStorageFactory.createInstanceWithArguments( pArgs ); 195 XStorage xResStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oResStorage ); 196 if ( xResStorage == null ) 197 { 198 m_aTestHelper.Error( "Can't reopen storage based on temporary file!" ); 199 return false; 200 } 201 202 // open and check SubStorage1 203 XStorage xResSubStorage1 = m_aTestHelper.openSubStorage( xResStorage, 204 "SubStorage1", 205 ElementModes.ELEMENT_READ ); 206 if ( xResSubStorage1 == null ) 207 { 208 m_aTestHelper.Error( "Can't open existing substorage!" ); 209 return false; 210 } 211 212 if ( !m_aTestHelper.checkStorageProperties( xResSubStorage1, "MediaType4", false, ElementModes.ELEMENT_READ ) ) 213 return false; 214 215 216 // open and check SubStorage2 217 XStorage xResSubStorage2 = m_aTestHelper.openSubStorage( xResStorage, 218 "SubStorage2", 219 ElementModes.ELEMENT_READ ); 220 if ( xResSubStorage2 == null ) 221 { 222 m_aTestHelper.Error( "Can't open existing substorage!" ); 223 return false; 224 } 225 226 if ( !m_aTestHelper.checkStorageProperties( xResSubStorage2, "MediaType5", false, ElementModes.ELEMENT_READ ) ) 227 return false; 228 229 230 // check all the result streams 231 232 if ( !m_aTestHelper.checkStream( xResStorage, "SubStream1", "MediaType1", pBytes1 ) ) 233 return false; 234 235 if ( !m_aTestHelper.checkStream( xResStorage, "SubStream1_copy", "MediaType1", pBytes1 ) ) 236 return false; 237 238 if ( !m_aTestHelper.checkStream( xResSubStorage1, "SubStream1", "MediaType1", pBytes1 ) ) 239 return false; 240 241 if ( !m_aTestHelper.checkStream( xResSubStorage2, "SubStream2", "MediaType2", pBytes2 ) ) 242 return false; 243 244 // the storage must be disposed before removing 245 if ( !m_aTestHelper.disposeStorage( xResSubStorage2 ) ) 246 return false; 247 248 // remove element and check that it was removed completelly 249 if ( !m_aTestHelper.removeElement( xResStorage, "SubStorage2" ) ) 250 return false; 251 252 try 253 { 254 XNameAccess xResAccess = (XNameAccess) UnoRuntime.queryInterface( XNameAccess.class, xResStorage ); 255 if ( xResAccess.hasByName( "SubStorage2" ) ) 256 m_aTestHelper.Error( "SubStorage2 must be removed already!" ); 257 } 258 catch( Exception e ) 259 { 260 m_aTestHelper.Error( "Can't get access to root storage, exception: " + e ); 261 return false; 262 } 263 264 try 265 { 266 xResSubStorage2.isStreamElement( "SubStream2" ); 267 268 m_aTestHelper.Error( "SubStorage2 must be disposed already!" ); 269 return false; 270 } 271 catch( com.sun.star.lang.DisposedException de ) 272 { 273 } 274 catch( Exception e ) 275 { 276 m_aTestHelper.Error( "Wrong exception in case of disposed storage, exception: " + e ); 277 return false; 278 } 279 280 // dispose used storages to free resources 281 if ( !m_aTestHelper.disposeStorage( xResStorage ) ) 282 return false; 283 284 return true; 285 } 286 catch( Exception e ) 287 { 288 m_aTestHelper.Error( "Exception: " + e ); 289 return false; 290 } 291 } 292 293 } 294 295