1 package complex.ofopxmlstorages;
2 
3 import com.sun.star.lang.XMultiServiceFactory;
4 import com.sun.star.lang.XSingleServiceFactory;
5 
6 import com.sun.star.bridge.XUnoUrlResolver;
7 import com.sun.star.uno.UnoRuntime;
8 import com.sun.star.uno.XInterface;
9 
10 import com.sun.star.container.XNameAccess;
11 import com.sun.star.io.XStream;
12 
13 import com.sun.star.embed.*;
14 import com.sun.star.beans.StringPair;
15 
16 import share.LogWriter;
17 import complex.ofopxmlstorages.TestHelper;
18 import complex.ofopxmlstorages.StorageTest;
19 
20 public class Test07 implements StorageTest {
21 
22 	XMultiServiceFactory m_xMSF;
23 	XSingleServiceFactory m_xStorageFactory;
24 	TestHelper m_aTestHelper;
25 
26 	public Test07( XMultiServiceFactory xMSF, XSingleServiceFactory xStorageFactory, LogWriter aLogWriter )
27 	{
28 		m_xMSF = xMSF;
29 		m_xStorageFactory = xStorageFactory;
30 		m_aTestHelper = new TestHelper( aLogWriter, "Test07: " );
31 	}
32 
33     public boolean test()
34 	{
35 		StringPair[][] aRelations1 =
36 			{ { new StringPair( "Id", "Num1" ) },
37 			  { new StringPair( "Target", "TargetURLValue1" ), new StringPair( "Id", "Num6" ) },
38 			  { new StringPair( "Target", "" ), new StringPair( "Id", "Num7" ) },
39 			  { new StringPair( "Id", "Num2" ), new StringPair( "TargetMode", "Internal1" ), new StringPair( "Type", "unknown1" ), new StringPair( "Target", "URL value 1" ) },
40 			  { new StringPair( "Id", "Num3" ), new StringPair( "TargetMode", "Internal1" ), new StringPair( "Type", "unknown1" ), new StringPair( "Target", "URL value 1" ) },
41 			  { new StringPair( "Id", "Num4" ), new StringPair( "TargetMode", "Internal1" ), new StringPair( "Type", "unknown1" ), new StringPair( "Target", "URL value 1" ) },
42 			  { new StringPair( "Id", "Num5" ), new StringPair( "TargetMode", "" ), new StringPair( "Type", "unknown1" ), new StringPair( "Target", "URL value1" ) }
43 			};
44 
45 		StringPair[][] aRelations2 =
46 			{ { new StringPair( "Id", "Num1" ) },
47 			  { new StringPair( "Target", "TargetURLValue2" ), new StringPair( "Id", "Num6" ) },
48 			  { new StringPair( "Target", "" ), new StringPair( "Id", "Num7" ) },
49 			  { new StringPair( "Id", "Num2" ), new StringPair( "TargetMode", "Internal2" ), new StringPair( "Type", "unknown2" ), new StringPair( "Target", "URL value 2" ) },
50 			  { new StringPair( "Id", "Num3" ), new StringPair( "TargetMode", "Internal2" ), new StringPair( "Type", "unknown2" ), new StringPair( "Target", "URL value 2" ) },
51 			  { new StringPair( "Id", "Num4" ), new StringPair( "TargetMode", "Internal2" ), new StringPair( "Type", "unknown" ), new StringPair( "Target", "URL value" ) },
52 			  { new StringPair( "Id", "Num5" ), new StringPair( "TargetMode", "" ), new StringPair( "Type", "unknown" ), new StringPair( "Target", "URL value" ) }
53 			};
54 
55 		try
56 		{
57 			// create temporary storage based on arbitrary medium
58 			// after such a storage is closed it is lost
59 			XStorage xTempStorage = m_aTestHelper.createTempStorage( m_xMSF, m_xStorageFactory );
60 			if ( xTempStorage == null )
61 			{
62 				m_aTestHelper.Error( "Can't create temporary storage representation!" );
63 				return false;
64 			}
65 
66 			byte pBytes1[] = { 1, 1, 1, 1, 1 };
67 
68 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
69 			if ( !m_aTestHelper.WriteBytesToSubstream( xTempStorage,
70 														"SubStream1",
71 														"MediaType1",
72 														true,
73 														pBytes1,
74 														aRelations1 ) )
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 			byte pBytes2[] = { 2, 2, 2, 2, 2 };
89 
90 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
91 			if ( !m_aTestHelper.WriteBytesToSubstream( xTempSubStorage,
92 														"SubStream2",
93 														"MediaType2",
94 														true,
95 														pBytes2,
96 														aRelations2 ) )
97 				return false;
98 
99 			// set Relations for storages and check that "IsRoot" and "OpenMode" properties are set correctly
100 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempStorage,
101 															true,
102 															ElementModes.WRITE,
103 															aRelations2 ) )
104 				return false;
105 
106 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubStorage,
107 															false,
108 															ElementModes.WRITE,
109 															aRelations2 ) )
110 				return false;
111 
112 			// ==============================
113 			// check cloning at current state
114 			// ==============================
115 
116 			// the new storage still was not commited so the clone must be empty
117 			XStorage xClonedSubStorage = m_aTestHelper.cloneSubStorage( m_xMSF, m_xStorageFactory, xTempStorage, "SubStorage1" );
118 
119 			if ( xClonedSubStorage == null )
120 			{
121 				m_aTestHelper.Error( "The result of clone is empty!" );
122 				return false;
123 			}
124 
125 			XNameAccess xClonedNameAccess = (XNameAccess) UnoRuntime.queryInterface( XNameAccess.class, xClonedSubStorage );
126 			if ( xClonedNameAccess == null )
127 			{
128 				m_aTestHelper.Error( "XNameAccess is not implemented by the clone!" );
129 				return false;
130 			}
131 
132 			if ( !m_aTestHelper.checkStorageProperties( xClonedSubStorage,
133 														true,
134 														ElementModes.WRITE,
135 														new StringPair[0][0] ) )
136 				return false;
137 
138 			if ( xClonedNameAccess.hasElements() )
139 			{
140 				m_aTestHelper.Error( "The new substorage still was not commited so it must be empty!" );
141 				return false;
142 			}
143 
144 			if ( !m_aTestHelper.disposeStorage( xClonedSubStorage ) )
145 				return false;
146 
147 			xClonedSubStorage = null;
148 			xClonedNameAccess = null;
149 
150 			// the new stream was opened, written and closed, that means flashed
151 			// so the clone must contain all the information
152 			XStream xClonedSubStream = m_aTestHelper.cloneSubStream( xTempStorage, "SubStream1" );
153 			if ( !m_aTestHelper.InternalCheckStream( xClonedSubStream,
154 													"SubStream1",
155 													"MediaType1",
156 													pBytes1,
157 													aRelations1 ) )
158 				return false;
159 
160 			if ( !m_aTestHelper.disposeStream( xClonedSubStream, "SubStream1" ) )
161 				return false;
162 
163 			// ==============================
164 			// commit substorage and check cloning
165 			// ==============================
166 
167 			if ( !m_aTestHelper.commitStorage( xTempSubStorage ) )
168 				return false;
169 
170 			xClonedSubStorage = m_aTestHelper.cloneSubStorage( m_xMSF, m_xStorageFactory, xTempStorage, "SubStorage1" );
171 			if ( xClonedSubStorage == null )
172 			{
173 				m_aTestHelper.Error( "The result of clone is empty!" );
174 				return false;
175 			}
176 
177 			if ( !m_aTestHelper.checkStorageProperties( xClonedSubStorage,
178 														true,
179 														ElementModes.WRITE,
180 														aRelations2 ) )
181 				return false;
182 
183 			if ( !m_aTestHelper.checkStream( xClonedSubStorage,
184 											"SubStream2",
185 											"MediaType2",
186 											pBytes2,
187 											aRelations2 ) )
188 				return false;
189 
190 			XStorage xCloneOfRoot = m_aTestHelper.cloneStorage( m_xMSF, m_xStorageFactory, xTempStorage );
191 			if ( xCloneOfRoot == null )
192 			{
193 				m_aTestHelper.Error( "The result of root clone is empty!" );
194 				return false;
195 			}
196 
197 			XNameAccess xCloneOfRootNA = (XNameAccess) UnoRuntime.queryInterface( XNameAccess.class, xCloneOfRoot );
198 			if ( xCloneOfRootNA == null )
199 			{
200 				m_aTestHelper.Error( "XNameAccess is not implemented by the root clone!" );
201 				return false;
202 			}
203 
204 			if ( xCloneOfRootNA.hasElements() )
205 			{
206 				m_aTestHelper.Error( "The root storage still was not commited so it's clone must be empty!" );
207 				return false;
208 			}
209 
210 			if ( !m_aTestHelper.disposeStorage( xCloneOfRoot ) )
211 				return false;
212 
213 			xCloneOfRoot = null;
214 
215 			// ==============================
216 			// commit root storage and check cloning
217 			// ==============================
218 
219 			if ( !m_aTestHelper.commitStorage( xTempStorage ) )
220 				return false;
221 
222 			xCloneOfRoot = m_aTestHelper.cloneStorage( m_xMSF, m_xStorageFactory, xTempStorage );
223 			if ( xCloneOfRoot == null )
224 			{
225 				m_aTestHelper.Error( "The result of root clone is empty!" );
226 				return false;
227 			}
228 
229 			XStorage xSubStorageOfClone = xCloneOfRoot.openStorageElement( "SubStorage1", ElementModes.READ );
230 			if ( xSubStorageOfClone == null )
231 			{
232 				m_aTestHelper.Error( "The result of root clone is wrong!" );
233 				return false;
234 			}
235 
236 			if ( !m_aTestHelper.checkStorageProperties( xSubStorageOfClone,
237 														false,
238 														ElementModes.READ,
239 														aRelations2 ) )
240 				return false;
241 
242 			if ( !m_aTestHelper.checkStream( xSubStorageOfClone,
243 											"SubStream2",
244 											"MediaType2",
245 											pBytes2,
246 											aRelations2 ) )
247 				return false;
248 
249 			return true;
250 		}
251 		catch( Exception e )
252 		{
253 			m_aTestHelper.Error( "Exception: " + e );
254 			return false;
255 		}
256     }
257 }
258 
259