1ef39d40dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3ef39d40dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4ef39d40dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5ef39d40dSAndrew Rist  * distributed with this work for additional information
6ef39d40dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7ef39d40dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8ef39d40dSAndrew Rist  * "License"); you may not use this file except in compliance
9ef39d40dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10ef39d40dSAndrew Rist  *
11ef39d40dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12ef39d40dSAndrew Rist  *
13ef39d40dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14ef39d40dSAndrew Rist  * software distributed under the License is distributed on an
15ef39d40dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16ef39d40dSAndrew Rist  * KIND, either express or implied.  See the License for the
17ef39d40dSAndrew Rist  * specific language governing permissions and limitations
18ef39d40dSAndrew Rist  * under the License.
19ef39d40dSAndrew Rist  *
20ef39d40dSAndrew Rist  *************************************************************/
21ef39d40dSAndrew Rist 
22ef39d40dSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir package ifc.io;
25cdf0e10cSrcweir 
26cdf0e10cSrcweir import lib.MultiMethodTest;
27cdf0e10cSrcweir import util.ValueComparer;
28cdf0e10cSrcweir import util.dbg;
29cdf0e10cSrcweir import util.utils;
30cdf0e10cSrcweir 
31cdf0e10cSrcweir import com.sun.star.beans.Property;
32cdf0e10cSrcweir import com.sun.star.beans.XPropertySet;
33cdf0e10cSrcweir import com.sun.star.beans.XPropertySetInfo;
34cdf0e10cSrcweir import com.sun.star.io.XActiveDataSink;
35cdf0e10cSrcweir import com.sun.star.io.XActiveDataSource;
36cdf0e10cSrcweir import com.sun.star.io.XInputStream;
37cdf0e10cSrcweir import com.sun.star.io.XObjectInputStream;
38cdf0e10cSrcweir import com.sun.star.io.XObjectOutputStream;
39cdf0e10cSrcweir import com.sun.star.io.XOutputStream;
40cdf0e10cSrcweir import com.sun.star.io.XPersistObject;
41cdf0e10cSrcweir import com.sun.star.lang.XMultiServiceFactory;
42cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
43cdf0e10cSrcweir 
44cdf0e10cSrcweir 
45cdf0e10cSrcweir /**
46cdf0e10cSrcweir * Testing <code>com.sun.star.io.XPersistObject</code>
47cdf0e10cSrcweir * interface methods :
48cdf0e10cSrcweir * <ul>
49cdf0e10cSrcweir *  <li><code> getServiceName()</code></li>
50cdf0e10cSrcweir *  <li><code> write()</code></li>
51cdf0e10cSrcweir *  <li><code> read()</code></li>
52cdf0e10cSrcweir * </ul> <p>
53cdf0e10cSrcweir * This test need the following object relations :
54cdf0e10cSrcweir * <ul>
55cdf0e10cSrcweir *  <li> <code>'OBJNAME'</code> : <code>String</code> value that
56cdf0e10cSrcweir *   contains service name which object represents.</li>
57cdf0e10cSrcweir * <ul> <p>
58cdf0e10cSrcweir * Test is <b> NOT </b> multithread compilant. <p>
59cdf0e10cSrcweir * After test completion object environment has to be recreated.
60cdf0e10cSrcweir * @see com.sun.star.io.XPersistObject
61cdf0e10cSrcweir * @see com.sun.star.io.XObjectInputStream
62cdf0e10cSrcweir * @see com.sun.star.io.XObjectOutputStream
63cdf0e10cSrcweir */
64cdf0e10cSrcweir public class _XPersistObject extends MultiMethodTest {
65cdf0e10cSrcweir 
66cdf0e10cSrcweir     public XPersistObject    oObj = null;
67cdf0e10cSrcweir     XObjectInputStream iStream = null;
68cdf0e10cSrcweir     XObjectOutputStream oStream = null;
69cdf0e10cSrcweir     String sname = null;
70cdf0e10cSrcweir 
71cdf0e10cSrcweir     boolean    result = true;
72cdf0e10cSrcweir 
73cdf0e10cSrcweir 
74cdf0e10cSrcweir     /**
75cdf0e10cSrcweir     * Test calls the method and checks return value. <p>
76cdf0e10cSrcweir     * Has <b> OK </b> status if the method returns proper service names
77cdf0e10cSrcweir     * which is equal to <code>'OBJNAME'</code> relation value. <p>
78cdf0e10cSrcweir     */
_getServiceName()79cdf0e10cSrcweir     public void _getServiceName() {
80cdf0e10cSrcweir         result = true;
81cdf0e10cSrcweir         sname = oObj.getServiceName();
82cdf0e10cSrcweir         log.println("Method returned '" + sname + "'") ;
83cdf0e10cSrcweir         String objName = (String)tEnv.getObjRelation("OBJNAME");
84cdf0e10cSrcweir         if (objName == null) {
85cdf0e10cSrcweir             log.println("No OBJNAME relation!");
86cdf0e10cSrcweir             result = false;
87cdf0e10cSrcweir         } else {
88cdf0e10cSrcweir             result &= sname.equals(objName);
89cdf0e10cSrcweir             if (!result)
90cdf0e10cSrcweir                 log.println("Name of object must be '" + objName +
91cdf0e10cSrcweir                             "' but returned name is '" + sname +"'");
92cdf0e10cSrcweir         }
93cdf0e10cSrcweir 
94cdf0e10cSrcweir         tRes.tested("getServiceName()", result);
95cdf0e10cSrcweir     }
96cdf0e10cSrcweir 
97cdf0e10cSrcweir     /**
98cdf0e10cSrcweir     * Creates service get by <code>getServiceName</code> method and tries
99cdf0e10cSrcweir     * to read object written to stream by <code>write</code> method test.
100cdf0e10cSrcweir     * Then properties of object written and object read are compared. <p>
101cdf0e10cSrcweir     * Has <b>OK</b> status if all properties of two objects are equal
102cdf0e10cSrcweir     * and no exceptions were thrown. <p>
103cdf0e10cSrcweir     * The following method tests are to be completed successfully before :
104cdf0e10cSrcweir     * <ul>
105cdf0e10cSrcweir     *  <li> <code> getServiceName() </code> : to have service name
106cdf0e10cSrcweir     *   which has to be created </li>
107cdf0e10cSrcweir     *  <li> <code> write() </code> : to write object tested into stream</li>
108cdf0e10cSrcweir     * </ul>
109cdf0e10cSrcweir     */
_read()110cdf0e10cSrcweir     public void _read() {
111cdf0e10cSrcweir         requiredMethod("getServiceName()");
112cdf0e10cSrcweir         requiredMethod("write()") ;
113cdf0e10cSrcweir 
114cdf0e10cSrcweir         boolean bResult = true;
115cdf0e10cSrcweir 
116cdf0e10cSrcweir         try {
117cdf0e10cSrcweir             Object noPS = tEnv.getObjRelation("noPS");
118cdf0e10cSrcweir             if ( noPS == null) {
119cdf0e10cSrcweir                 XPropertySet objps = (XPropertySet)UnoRuntime.queryInterface(
120cdf0e10cSrcweir                     XPropertySet.class, oObj);
121cdf0e10cSrcweir                 XPropertySetInfo objpsi = objps.getPropertySetInfo();
122cdf0e10cSrcweir                 Property[] objprops = objpsi.getProperties();
123cdf0e10cSrcweir 
124cdf0e10cSrcweir                 Object oCopy = ((XMultiServiceFactory)tParam.getMSF()).createInstance(sname);
125cdf0e10cSrcweir 
126cdf0e10cSrcweir                 XPersistObject persCopy = (XPersistObject)
127cdf0e10cSrcweir                         UnoRuntime.queryInterface(XPersistObject.class, oCopy);
128cdf0e10cSrcweir 
129cdf0e10cSrcweir                 persCopy.read(iStream);
130cdf0e10cSrcweir 
131cdf0e10cSrcweir                 XPropertySet copyps = (XPropertySet)UnoRuntime.queryInterface(
132cdf0e10cSrcweir                                                     XPropertySet.class, oCopy);
133cdf0e10cSrcweir 
134cdf0e10cSrcweir                 XPropertySetInfo copypsi = copyps.getPropertySetInfo();
135cdf0e10cSrcweir                 Property[] copyprops = copypsi.getProperties();
136cdf0e10cSrcweir 
137cdf0e10cSrcweir                 for (int i = 0; i < copyprops.length; i++) {
138cdf0e10cSrcweir                     Object cps = copyps.getPropertyValue(copyprops[i].Name);
139cdf0e10cSrcweir                     Object ops = objps.getPropertyValue(objprops[i].Name);
140cdf0e10cSrcweir                     boolean locRes = ( (ValueComparer.equalValue(cps,ops)) ||
141cdf0e10cSrcweir                                     (utils.isVoid(cps) && utils.isVoid(ops)) );
142cdf0e10cSrcweir 
143cdf0e10cSrcweir                     //transient properties aran't stored
144cdf0e10cSrcweir                     if (isTransient(objprops[i])) locRes = true;
145cdf0e10cSrcweir 
146cdf0e10cSrcweir                     Object pseudo = tEnv.getObjRelation("PSEUDOPERSISTENT");
147cdf0e10cSrcweir                     if ( (pseudo != null) && !locRes) {
148cdf0e10cSrcweir                         String str = copyprops[i].Name;
149cdf0e10cSrcweir                         locRes = ( (str.equals("Time")) || (str.equals("Date"))
150cdf0e10cSrcweir                                             || (str.equals("FormatsSupplier"))
151cdf0e10cSrcweir                                             || (str.equals("Text"))
152cdf0e10cSrcweir                                             || (str.equals("Value"))
153cdf0e10cSrcweir                                             || (str.indexOf("UserDefined")>0)
154cdf0e10cSrcweir                                             );
155cdf0e10cSrcweir                     }
156cdf0e10cSrcweir                     if (!locRes) {
157cdf0e10cSrcweir                         log.println("Property '" + copyprops[i].Name
158cdf0e10cSrcweir                             + "' failed");
159cdf0e10cSrcweir                         dbg.printPropertyInfo(objps, objprops[i].Name, log);
160cdf0e10cSrcweir                         dbg.printPropertyInfo(copyps, copyprops[i].Name, log);
161cdf0e10cSrcweir                     }
162cdf0e10cSrcweir                     bResult &= locRes;
163cdf0e10cSrcweir                 }
164cdf0e10cSrcweir             } else {
165cdf0e10cSrcweir                 Object oCopy = ((XMultiServiceFactory)tParam.getMSF()).createInstance(sname);
166cdf0e10cSrcweir                 XPersistObject persCopy = (XPersistObject)
167cdf0e10cSrcweir                         UnoRuntime.queryInterface(XPersistObject.class, oCopy);
168cdf0e10cSrcweir 
169cdf0e10cSrcweir                 persCopy.read(iStream);
170cdf0e10cSrcweir 
171cdf0e10cSrcweir                 bResult = ( persCopy.getServiceName().equals(sname) );
172cdf0e10cSrcweir 
173cdf0e10cSrcweir             }
174cdf0e10cSrcweir 
175cdf0e10cSrcweir         } catch (com.sun.star.uno.Exception e) {
176*bb6af6bcSPedro Giffuni             log.println("Exception occurred : ");
177cdf0e10cSrcweir             e.printStackTrace(log) ;
178cdf0e10cSrcweir             bResult = false;
179cdf0e10cSrcweir         }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir         tRes.tested("read()", bResult);
182cdf0e10cSrcweir     }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir     /**
185cdf0e10cSrcweir     * Test calls the method and checks that
186cdf0e10cSrcweir     * no exceptions were thrown. <p>
187cdf0e10cSrcweir     * Has <b> OK </b> status if no exceptions were thrown. <p>
188cdf0e10cSrcweir     */
_write()189cdf0e10cSrcweir     public void _write() {
190cdf0e10cSrcweir         boolean bResult = true;
191cdf0e10cSrcweir         try {
192cdf0e10cSrcweir             initPipe();
193cdf0e10cSrcweir             oObj.write(oStream);
194cdf0e10cSrcweir         } catch (com.sun.star.io.IOException e) {
195*bb6af6bcSPedro Giffuni             log.println("Exception occurred while test. " + e);
196cdf0e10cSrcweir             bResult = false;
197cdf0e10cSrcweir         }
198cdf0e10cSrcweir         tRes.tested("write()", bResult);
199cdf0e10cSrcweir     }
200cdf0e10cSrcweir 
201cdf0e10cSrcweir 
202cdf0e10cSrcweir     /**
203cdf0e10cSrcweir     * Creates the following stream scheme <code>
204cdf0e10cSrcweir     * ObjectOutputStream -> Pipe -> ObjectInputStream </code> for writing/reading
205cdf0e10cSrcweir     * object.
206cdf0e10cSrcweir     */
initPipe()207cdf0e10cSrcweir     protected void initPipe() {
208cdf0e10cSrcweir         try {
209cdf0e10cSrcweir             Object aPipe = ((XMultiServiceFactory)tParam.getMSF()).createInstance
210cdf0e10cSrcweir                 ("com.sun.star.io.Pipe");
211cdf0e10cSrcweir             Object istream = ((XMultiServiceFactory)tParam.getMSF()).createInstance
212cdf0e10cSrcweir                 ("com.sun.star.io.ObjectInputStream");
213cdf0e10cSrcweir             Object ostream = ((XMultiServiceFactory)tParam.getMSF()).createInstance
214cdf0e10cSrcweir                 ("com.sun.star.io.ObjectOutputStream");
215cdf0e10cSrcweir 
216cdf0e10cSrcweir             // Now the objects that aren't described anywhere
217cdf0e10cSrcweir             Object mistream = ((XMultiServiceFactory)tParam.getMSF()).createInstance
218cdf0e10cSrcweir                 ("com.sun.star.io.MarkableInputStream");
219cdf0e10cSrcweir             Object mostream = ((XMultiServiceFactory)tParam.getMSF()).createInstance
220cdf0e10cSrcweir                 ("com.sun.star.io.MarkableOutputStream");
221cdf0e10cSrcweir 
222cdf0e10cSrcweir             XActiveDataSink xdSi = (XActiveDataSink)
223cdf0e10cSrcweir                 UnoRuntime.queryInterface(XActiveDataSink.class, istream);
224cdf0e10cSrcweir             XActiveDataSource xdSo = (XActiveDataSource)
225cdf0e10cSrcweir                 UnoRuntime.queryInterface(XActiveDataSource.class, ostream);
226cdf0e10cSrcweir             XActiveDataSink xdSmi = (XActiveDataSink)
227cdf0e10cSrcweir                 UnoRuntime.queryInterface(XActiveDataSink.class, mistream);
228cdf0e10cSrcweir             XActiveDataSource xdSmo = (XActiveDataSource)
229cdf0e10cSrcweir                 UnoRuntime.queryInterface(XActiveDataSource.class, mostream);
230cdf0e10cSrcweir 
231cdf0e10cSrcweir             XInputStream miStream = (XInputStream)
232cdf0e10cSrcweir                 UnoRuntime.queryInterface(XInputStream.class, mistream);
233cdf0e10cSrcweir             XOutputStream moStream = (XOutputStream)
234cdf0e10cSrcweir                 UnoRuntime.queryInterface(XOutputStream.class, mostream);
235cdf0e10cSrcweir             XInputStream PipeIn = (XInputStream)
236cdf0e10cSrcweir                 UnoRuntime.queryInterface(XInputStream.class, aPipe);
237cdf0e10cSrcweir             XOutputStream PipeOut = (XOutputStream)
238cdf0e10cSrcweir                 UnoRuntime.queryInterface(XOutputStream.class,aPipe);
239cdf0e10cSrcweir 
240cdf0e10cSrcweir             xdSi.setInputStream(miStream);
241cdf0e10cSrcweir             xdSo.setOutputStream(moStream);
242cdf0e10cSrcweir             xdSmi.setInputStream(PipeIn);
243cdf0e10cSrcweir             xdSmo.setOutputStream(PipeOut);
244cdf0e10cSrcweir 
245cdf0e10cSrcweir             iStream = (XObjectInputStream)
246cdf0e10cSrcweir                 UnoRuntime.queryInterface(XObjectInputStream.class, istream);
247cdf0e10cSrcweir             oStream = (XObjectOutputStream)
248cdf0e10cSrcweir                 UnoRuntime.queryInterface(XObjectOutputStream.class, ostream);
249cdf0e10cSrcweir 
250cdf0e10cSrcweir 
251cdf0e10cSrcweir         } catch (com.sun.star.uno.Exception e) {
252cdf0e10cSrcweir             System.out.println("exc " + e);
253cdf0e10cSrcweir         }
254cdf0e10cSrcweir 
255cdf0e10cSrcweir     }
256cdf0e10cSrcweir 
isTransient(Property prop)257cdf0e10cSrcweir     public static boolean isTransient(Property prop) {
258cdf0e10cSrcweir         short attr = prop.Attributes;
259cdf0e10cSrcweir         return ((attr & com.sun.star.beans.PropertyAttribute.TRANSIENT) != 0);
260cdf0e10cSrcweir     }
261cdf0e10cSrcweir 
262cdf0e10cSrcweir 
263cdf0e10cSrcweir }
264cdf0e10cSrcweir 
265cdf0e10cSrcweir 
266