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 11 import com.sun.star.embed.*; 12 import com.sun.star.container.XNameAccess; 13 14 import share.LogWriter; 15 import complex.storages.TestHelper; 16 import complex.storages.StorageTest; 17 18 public class Test03 implements StorageTest { 19 20 XMultiServiceFactory m_xMSF; 21 XSingleServiceFactory m_xStorageFactory; 22 TestHelper m_aTestHelper; 23 24 public Test03( XMultiServiceFactory xMSF, XSingleServiceFactory xStorageFactory, LogWriter aLogWriter ) 25 { 26 m_xMSF = xMSF; 27 m_xStorageFactory = xStorageFactory; 28 m_aTestHelper = new TestHelper( aLogWriter, "Test03: " ); 29 } 30 31 public boolean test() 32 { 33 try 34 { 35 // create temporary storage based on arbitrary medium 36 // after such a storage is closed it is lost 37 Object oTempStorage = m_xStorageFactory.createInstance(); 38 XStorage xTempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage ); 39 if ( xTempStorage == null ) 40 { 41 m_aTestHelper.Error( "Can't create temporary storage representation!" ); 42 return false; 43 } 44 45 // open a new substorage 46 XStorage xTempSubStorage = m_aTestHelper.openSubStorage( xTempStorage, 47 "SubStorage1", 48 ElementModes.WRITE ); 49 if ( xTempSubStorage == null ) 50 { 51 m_aTestHelper.Error( "Can't create substorage!" ); 52 return false; 53 } 54 55 byte pBigBytes[] = new byte[33000]; 56 for ( int nInd = 0; nInd < 33000; nInd++ ) 57 pBigBytes[nInd] = (byte)( nInd % 128 ); 58 59 // open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes 60 if ( !m_aTestHelper.WriteBytesToSubstream( xTempStorage, "BigSubStream1", "MediaType1", true, pBigBytes ) ) 61 return false; 62 63 // open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes 64 if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage, "BigSubStream2", "MediaType2", false, pBigBytes ) ) 65 return false; 66 67 byte pBytes1[] = { 1, 1, 1, 1, 1 }; 68 69 // open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes 70 if ( !m_aTestHelper.WriteBytesToSubstream( xTempStorage, "SubStream1", "MediaType1", true, pBytes1 ) ) 71 return false; 72 73 byte pBytes2[] = { 2, 2, 2, 2, 2 }; 74 75 // open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes 76 if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage, "SubStream2", "MediaType2", false, pBytes2 ) ) 77 return false; 78 79 // set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly 80 if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubStorage, 81 "MediaType3", 82 false, 83 ElementModes.WRITE ) ) 84 return false; 85 86 if ( !m_aTestHelper.commitStorage( xTempSubStorage ) ) 87 return false; 88 89 if ( !m_aTestHelper.disposeStorage( xTempSubStorage ) ) 90 return false; 91 92 // ================================================ 93 // check storage hyerarchy tree 94 // ================================================ 95 96 // check that isStorageElement() and isStreamElement reacts to nonexisting object correctly 97 try { 98 xTempStorage.isStorageElement( "does not exist" ); 99 m_aTestHelper.Error( "Nonexisting element doesn't detected by isStorageElement() call!" ); 100 return false; 101 } 102 catch( com.sun.star.container.NoSuchElementException ne ) 103 { 104 } 105 catch( Exception e ) 106 { 107 m_aTestHelper.Error( "Wrong exception is thrown by isStorageElement() call: " + e ); 108 return false; 109 } 110 111 try { 112 xTempStorage.isStreamElement( "does not exist" ); 113 m_aTestHelper.Error( "Nonexisting element doesn't detected by isStreamElement() call!" ); 114 return false; 115 } 116 catch( com.sun.star.container.NoSuchElementException ne ) 117 { 118 } 119 catch( Exception e ) 120 { 121 m_aTestHelper.Error( "Wrong exception is thrown by isStreamElement() call: " + e ); 122 return false; 123 } 124 125 XNameAccess xRootNameAccess = (XNameAccess) UnoRuntime.queryInterface( XNameAccess.class, xTempStorage ); 126 if ( xRootNameAccess == null ) 127 { 128 m_aTestHelper.Error( "Root storage doesn't support XNameAccess!" ); 129 return false; 130 } 131 132 try { 133 if ( !xTempStorage.isStorageElement( "SubStorage1" ) || xTempStorage.isStreamElement( "SubStorage1" ) ) 134 { 135 m_aTestHelper.Error( "Child 'SubStorage1' can not be detected as storage!" ); 136 return false; 137 } 138 139 if ( xTempStorage.isStorageElement( "SubStream1" ) || !xTempStorage.isStreamElement( "SubStream1" ) ) 140 { 141 m_aTestHelper.Error( "Child 'SubStream1' can not be detected as stream!" ); 142 return false; 143 } 144 } 145 catch( Exception e ) 146 { 147 m_aTestHelper.Error( "Child's type can not be detected, exception: " + e ); 148 return false; 149 } 150 151 152 // check that root storage contents are represented correctly 153 String sRootCont[] = xRootNameAccess.getElementNames(); 154 155 if ( sRootCont.length != 3 ) 156 { 157 m_aTestHelper.Error( "Root storage contains wrong amount of children!" ); 158 return false; 159 } 160 161 int nFlag = 0; 162 for ( int nInd = 0; nInd < sRootCont.length; nInd++ ) 163 { 164 if ( sRootCont[nInd].equals( "SubStorage1" ) ) 165 nFlag |= 1; 166 else if ( sRootCont[nInd].equals( "SubStream1" ) ) 167 nFlag |= 2; 168 else if ( sRootCont[nInd].equals( "BigSubStream1" ) ) 169 nFlag |= 4; 170 } 171 172 if ( nFlag != 7 || !( xRootNameAccess.hasByName( "BigSubStream1" ) && xRootNameAccess.hasByName( "SubStream1" ) && xRootNameAccess.hasByName( "SubStorage1" ) ) ) 173 { 174 m_aTestHelper.Error( "Root storage contains wrong list of children!" ); 175 return false; 176 } 177 178 // get storage through XNameAccess 179 XStorage xResultSubStorage = getStorageFromNameAccess( xRootNameAccess, "SubStorage1" ); 180 if ( xResultSubStorage == null ) 181 return false; 182 183 if ( !m_aTestHelper.checkStorageProperties( xResultSubStorage, "MediaType3", false, ElementModes.READ ) ) 184 return false; 185 186 XNameAccess xChildAccess = (XNameAccess) UnoRuntime.queryInterface( XNameAccess.class, xResultSubStorage ); 187 if ( xChildAccess == null ) 188 { 189 m_aTestHelper.Error( "Child storage doesn't support XNameAccess!" ); 190 return false; 191 } 192 193 if ( !( xChildAccess.hasByName( "SubStream2" ) && xChildAccess.hasByName( "BigSubStream2" ) ) 194 || !xResultSubStorage.isStreamElement( "SubStream2" ) 195 || !xResultSubStorage.isStreamElement( "BigSubStream2" ) ) 196 { 197 m_aTestHelper.Error( "'SubStream2' can not be detected as child stream element of 'SubStorage1'!" ); 198 return false; 199 } 200 201 return true; 202 } 203 catch( Exception e ) 204 { 205 m_aTestHelper.Error( "Exception: " + e ); 206 return false; 207 } 208 } 209 210 public XStorage getStorageFromNameAccess( XNameAccess xAccess, String sName ) 211 { 212 try 213 { 214 Object oStorage = xAccess.getByName( sName ); 215 XStorage xResult = (XStorage) UnoRuntime.queryInterface( XStorage.class, oStorage ); 216 217 if ( xResult != null ) 218 return xResult; 219 else 220 m_aTestHelper.Error( "Can't retrieve substorage '" + sName + "' through XNameAccess!" ); 221 } 222 catch( Exception e ) 223 { 224 m_aTestHelper.Error( "Can't retrieve substorage '" + sName + "' through XNameAccess, exception: " + e ); 225 } 226 227 return null; 228 } 229 230 } 231 232