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