1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: _XPropertySet.java,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
33 import java
.util
.Random
;
34 import java
.util
.StringTokenizer
;
36 import lib
.MultiMethodTest
;
37 import util
.ValueChanger
;
40 import com
.sun
.star
.beans
.Property
;
41 import com
.sun
.star
.beans
.PropertyAttribute
;
42 import com
.sun
.star
.beans
.PropertyChangeEvent
;
43 import com
.sun
.star
.beans
.XPropertyChangeListener
;
44 import com
.sun
.star
.beans
.XPropertySet
;
45 import com
.sun
.star
.beans
.XPropertySetInfo
;
46 import com
.sun
.star
.beans
.XVetoableChangeListener
;
47 import com
.sun
.star
.lang
.EventObject
;
50 * Testing <code>com.sun.star.beans.XPropertySet</code>
53 * <li><code>getPropertySetInfo()</code></li>
54 * <li><code>setPropertyValue()</code></li>
55 * <li><code>getPropertyValue()</code></li>
56 * <li><code>addPropertyChangeListener()</code></li>
57 * <li><code>removePropertyChangeListener()</code></li>
58 * <li><code>addVetoableChangeListener()</code></li>
59 * <li><code>removeVetoableChangeListener()</code></li>
61 * @see com.sun.star.beans.XPropertySet
63 public class _XPropertySet
extends MultiMethodTest
{
65 public XPropertySet oObj
= null;
68 * Flag that indicates change listener was called.
70 boolean propertyChanged
= false;
73 * Listener that must be called on bound property changing.
75 public class MyChangeListener
implements XPropertyChangeListener
{
77 * Just set <code>propertyChanged</code> flag to true.
79 public void propertyChange(PropertyChangeEvent e
) {
80 propertyChanged
= true;
82 public void disposing (EventObject obj
) {}
85 XPropertyChangeListener PClistener
= new MyChangeListener();
88 * Flag that indicates veto listener was called.
90 boolean vetoableChanged
= false;
93 * Listener that must be called on constrained property changing.
95 public class MyVetoListener
implements XVetoableChangeListener
{
97 * Just set <code>vetoableChanged</code> flag to true.
99 public void vetoableChange(PropertyChangeEvent e
) {
100 vetoableChanged
= true;
102 public void disposing (EventObject obj
) {}
105 XVetoableChangeListener VClistener
= new MyVetoListener();
108 * Structure that collects three properties of each type to test :
109 * Constrained, Bound and Normal.
111 public class PropsToTest
{
112 String constrained
= null;
114 String normal
= null;
117 PropsToTest PTT
= new PropsToTest();
120 * Tests method <code>getPropertySetInfo</code>. After test completed
121 * call {@link #getPropsToTest} method to retrieve different kinds
122 * of properties to test then. <p>
123 * Has OK status if not null <code>XPropertySetInfo</code>
124 * object returned.<p>
125 * Since <code>getPropertySetInfo</code> is optional, it may return null,
126 * if it is not implemented. This method uses then an object relation
127 * <code>PTT</code> (Properties To Test) to determine available properties.
128 * All tests for services without <code>getPropertySetInfo</code> must
129 * provide this object relation.
131 public void _getPropertySetInfo() {
133 XPropertySetInfo propertySetInfo
= oObj
.getPropertySetInfo();
135 if (propertySetInfo
== null) {
136 log
.println("getPropertySetInfo() method returned null");
137 tRes
.tested("getPropertySetInfo()", true) ;
138 String
[] ptt
= (String
[]) tEnv
.getObjRelation("PTT");
141 PTT
.constrained
=ptt
[2];
143 tRes
.tested("getPropertySetInfo()", true );
144 getPropsToTest(propertySetInfo
);
149 } // end of getPropertySetInfo()
152 * Tests change listener which added for bound properties.
153 * Adds listener to bound property (if it exists), then changes
154 * its value and check if listener was called. <p>
155 * Method tests to be successfully completed before :
157 * <li> <code>getPropertySetInfo</code> : in this method test
158 * one of bound properties is retrieved. </li>
160 * Has OK status if NO bound properties exist or if listener
161 * was successfully called.
163 public void _addPropertyChangeListener() {
165 requiredMethod("getPropertySetInfo()");
167 propertyChanged
= false;
170 if ( PTT
.bound
.equals("none") ) {
171 log
.println("*** No bound properties found ***");
172 tRes
.tested("addPropertyChangeListener()", true) ;
175 oObj
.addPropertyChangeListener(PTT
.bound
,PClistener
);
176 Object gValue
= oObj
.getPropertyValue(PTT
.bound
);
177 oObj
.setPropertyValue(PTT
.bound
,
178 ValueChanger
.changePValue(gValue
));
179 } catch (com
.sun
.star
.beans
.PropertyVetoException e
) {
180 log
.println("Exception occured while trying to change "+
181 "property '"+ PTT
.bound
+"'");
182 e
.printStackTrace(log
);
183 } catch (com
.sun
.star
.lang
.IllegalArgumentException e
) {
184 log
.println("Exception occured while trying to change "+
185 "property '"+ PTT
.bound
+"'");
186 e
.printStackTrace(log
);
187 } catch (com
.sun
.star
.beans
.UnknownPropertyException e
) {
188 log
.println("Exception occured while trying to change "+
189 "property '"+ PTT
.bound
+"'");
190 e
.printStackTrace(log
);
191 } catch (com
.sun
.star
.lang
.WrappedTargetException e
) {
192 log
.println("Exception occured while trying to change "+
193 "property '"+ PTT
.bound
+"'");
194 e
.printStackTrace(log
);
195 } // end of try-catch
196 tRes
.tested("addPropertyChangeListener()", propertyChanged
);
197 if (!propertyChanged
) {
198 log
.println("propertyChangeListener wasn't called for '"+
205 } // end of addPropertyChangeListener()
208 * Tests vetoable listener which added for constrained properties.
209 * Adds listener to constrained property (if it exists), then changes
210 * its value and check if listener was called. <p>
211 * Method tests to be successfully completed before :
213 * <li> <code>getPropertySetInfo</code> : in this method test
214 * one of constrained properties is retrieved. </li>
216 * Has OK status if NO constrained properties exist or if listener
217 * was successfully called.
219 public void _addVetoableChangeListener() {
221 requiredMethod("getPropertySetInfo()");
223 vetoableChanged
= false;
225 if ( PTT
.constrained
.equals("none") ) {
226 log
.println("*** No constrained properties found ***");
227 tRes
.tested("addVetoableChangeListener()", true) ;
230 oObj
.addVetoableChangeListener(PTT
.constrained
,VClistener
);
231 Object gValue
= oObj
.getPropertyValue(PTT
.constrained
);
232 oObj
.setPropertyValue(PTT
.constrained
,
233 ValueChanger
.changePValue(gValue
));
234 } catch (com
.sun
.star
.beans
.PropertyVetoException e
) {
235 log
.println("Exception occured while trying to change "+
236 "property '"+ PTT
.constrained
+"'");
237 e
.printStackTrace(log
);
238 } catch (com
.sun
.star
.lang
.IllegalArgumentException e
) {
239 log
.println("Exception occured while trying to change "+
240 "property '"+ PTT
.constrained
+"'");
241 e
.printStackTrace(log
);
242 } catch (com
.sun
.star
.beans
.UnknownPropertyException e
) {
243 log
.println("Exception occured while trying to change "+
244 "property '"+ PTT
.constrained
+"'");
245 e
.printStackTrace(log
);
246 } catch (com
.sun
.star
.lang
.WrappedTargetException e
) {
247 log
.println("Exception occured while trying to change "+
248 "property '"+ PTT
.constrained
+"'");
249 e
.printStackTrace(log
);
250 } // end of try-catch
251 tRes
.tested("addVetoableChangeListener()",vetoableChanged
);
252 if (!vetoableChanged
) {
253 log
.println("vetoableChangeListener wasn't called for '"+
254 PTT
.constrained
+"'");
260 } // end of addVetoableChangeListener()
264 * Tests <code>setPropertyValue</code> method.
265 * Stores value before call, and compares it with value after
267 * Method tests to be successfully completed before :
269 * <li> <code>getPropertySetInfo</code> : in this method test
270 * one of normal properties is retrieved. </li>
272 * Has OK status if NO normal properties exist or if value before
273 * method call is not equal to value after.
275 public void _setPropertyValue() {
277 requiredMethod("getPropertySetInfo()");
279 Object gValue
= null;
280 Object sValue
= null;
282 if ( PTT
.normal
.equals("none") ) {
283 log
.println("*** No changeable properties found ***");
284 tRes
.tested("setPropertyValue()", true) ;
287 log
.println("try to cheange value of property '" + PTT
.normal
+ "'" );
288 gValue
= oObj
.getPropertyValue(PTT
.normal
);
289 sValue
= ValueChanger
.changePValue(gValue
);
290 oObj
.setPropertyValue(PTT
.normal
, sValue
);
291 sValue
= oObj
.getPropertyValue(PTT
.normal
);
292 } catch (com
.sun
.star
.beans
.PropertyVetoException e
) {
293 log
.println("Exception occured while trying to change "+
294 "property '"+ PTT
.normal
+"'");
295 e
.printStackTrace(log
);
296 } catch (com
.sun
.star
.lang
.IllegalArgumentException e
) {
297 log
.println("Exception occured while trying to change "+
298 "property '"+ PTT
.normal
+"'");
299 e
.printStackTrace(log
);
300 } catch (com
.sun
.star
.beans
.UnknownPropertyException e
) {
301 log
.println("Exception occured while trying to change "+
302 "property '"+ PTT
.normal
+"'");
303 e
.printStackTrace(log
);
304 } catch (com
.sun
.star
.lang
.WrappedTargetException e
) {
305 log
.println("Exception occured while trying to change "+
306 "property '"+ PTT
.normal
+"'");
307 e
.printStackTrace(log
);
308 } // end of try-catch
309 tRes
.tested("setPropertyValue()",(! gValue
.equals(sValue
)));
314 } // end of setPropertyValue()
317 * Tests <code>getPropertyValue</code> method.
318 * Just call this method and checks for no exceptions <p>
319 * Method tests to be successfully completed before :
321 * <li> <code>getPropertySetInfo</code> : in this method test
322 * one of normal properties is retrieved. </li>
324 * Has OK status if NO normal properties exist or if no
325 * exceptions were thrown.
327 public void _getPropertyValue() {
329 requiredMethod("getPropertySetInfo()");
331 String toCheck
= PTT
.normal
;
333 if ( PTT
.normal
.equals("none") ) {
334 toCheck
= oObj
.getPropertySetInfo().getProperties()[0].Name
;
335 log
.println("All properties are Read Only");
336 log
.println("Using: "+toCheck
);
340 oObj
.getPropertyValue(toCheck
);
341 tRes
.tested("getPropertyValue()",true);
342 } catch (com
.sun
.star
.beans
.UnknownPropertyException e
) {
343 log
.println("Exception occured while trying to get property '"+
345 e
.printStackTrace(log
);
346 tRes
.tested("getPropertyValue()",false);
347 } catch (com
.sun
.star
.lang
.WrappedTargetException e
) {
348 log
.println("Exception occured while trying to get property '"+
350 e
.printStackTrace(log
);
351 tRes
.tested("getPropertyValue()",false);
352 } // end of try-catch
358 * Tests <code>removePropertyChangeListener</code> method.
359 * Removes change listener, then changes bound property value
360 * and checks if the listener was NOT called.
361 * Method tests to be successfully completed before :
363 * <li> <code>addPropertyChangeListener</code> : here listener
366 * Has OK status if NO bound properties exist or if listener
367 * was not called and no exceptions arose.
369 public void _removePropertyChangeListener() {
371 requiredMethod("addPropertyChangeListener()");
373 propertyChanged
= false;
375 if ( PTT
.bound
.equals("none") ) {
376 log
.println("*** No bound properties found ***");
377 tRes
.tested("removePropertyChangeListener()", true) ;
380 propertyChanged
= false;
381 oObj
.removePropertyChangeListener(PTT
.bound
,PClistener
);
382 Object gValue
= oObj
.getPropertyValue(PTT
.bound
);
383 oObj
.setPropertyValue(PTT
.bound
,
384 ValueChanger
.changePValue(gValue
));
385 } catch (com
.sun
.star
.beans
.PropertyVetoException e
) {
386 log
.println("Exception occured while trying to change "+
387 "property '"+ PTT
.bound
+"'");
388 e
.printStackTrace(log
);
389 } catch (com
.sun
.star
.lang
.IllegalArgumentException e
) {
390 log
.println("Exception occured while trying to change "+
391 "property '"+ PTT
.bound
+"'");
392 e
.printStackTrace(log
);
393 } catch (com
.sun
.star
.beans
.UnknownPropertyException e
) {
394 log
.println("Exception occured while trying to change "+
395 "property '"+ PTT
.bound
+"'");
396 e
.printStackTrace(log
);
397 } catch (com
.sun
.star
.lang
.WrappedTargetException e
) {
398 log
.println("Exception occured while trying to change "+
399 "property '"+ PTT
.bound
+"'");
400 e
.printStackTrace(log
);
401 } // end of try-catch
403 tRes
.tested("removePropertyChangeListener()",!propertyChanged
);
404 if (propertyChanged
) {
405 log
.println("propertyChangeListener was called after removing"+
406 " for '"+PTT
.bound
+"'");
412 } // end of removePropertyChangeListener()
416 * Tests <code>removeVetoableChangeListener</code> method.
417 * Removes vetoable listener, then changes constrained property value
418 * and checks if the listener was NOT called.
419 * Method tests to be successfully completed before :
421 * <li> <code>addPropertyChangeListener</code> : here vetoable listener
424 * Has OK status if NO constrained properties exist or if listener
425 * was NOT called and no exceptions arose.
427 public void _removeVetoableChangeListener() {
429 requiredMethod("addVetoableChangeListener()");
431 vetoableChanged
= false;
433 if ( PTT
.constrained
.equals("none") ) {
434 log
.println("*** No constrained properties found ***");
435 tRes
.tested("removeVetoableChangeListener()", true) ;
438 oObj
.removeVetoableChangeListener(PTT
.constrained
,VClistener
);
439 Object gValue
= oObj
.getPropertyValue(PTT
.constrained
);
440 oObj
.setPropertyValue(PTT
.constrained
,
441 ValueChanger
.changePValue(gValue
));
442 } catch (com
.sun
.star
.beans
.PropertyVetoException e
) {
443 log
.println("Exception occured while trying to change "+
444 "property '"+ PTT
.constrained
+"'");
445 e
.printStackTrace(log
);
446 } catch (com
.sun
.star
.lang
.IllegalArgumentException e
) {
447 log
.println("Exception occured while trying to change "+
448 "property '"+ PTT
.constrained
+"'");
449 e
.printStackTrace(log
);
450 } catch (com
.sun
.star
.beans
.UnknownPropertyException e
) {
451 log
.println("Exception occured while trying to change "+
452 "property '"+ PTT
.constrained
+"'");
453 e
.printStackTrace(log
);
454 } catch (com
.sun
.star
.lang
.WrappedTargetException e
) {
455 log
.println("Exception occured while trying to change "+
456 "property '"+ PTT
.constrained
+"'");
457 e
.printStackTrace(log
);
458 } // end of try-catch
460 tRes
.tested("removeVetoableChangeListener()",!vetoableChanged
);
461 if (vetoableChanged
) {
462 log
.println("vetoableChangeListener was called after "+
463 "removing for '"+PTT
.constrained
+"'");
469 } // end of removeVetoableChangeListener()
473 * Gets the properties being tested. Searches and stores by one
474 * property of each kind (Bound, Vetoable, Normal).
476 public PropsToTest
getPropsToTest(XPropertySetInfo xPSI
) {
478 Property
[] properties
= xPSI
.getProperties();
480 String constrained
= "";
482 // some properties should not be changed in a unspecific way
483 String
[] skip
= {"PrinterName", "CharRelief", "IsLayerMode"};
485 for (int i
= 0; i
< properties
.length
; i
++) {
487 Property property
= properties
[i
];
488 String name
= property
.Name
;
490 boolean cont
= false;
491 for (int j
= 0; j
< skip
.length
; j
++) {
492 if (name
.equals(skip
[j
])){
493 log
.println("skipping '" + name
+ "'");
500 if (name
.equals(oObj
))
501 log
.println("Checking '"+name
+"'");
502 boolean isWritable
= ((property
.Attributes
&
503 PropertyAttribute
.READONLY
) == 0);
504 boolean isNotNull
= ((property
.Attributes
&
505 PropertyAttribute
.MAYBEVOID
) == 0);
506 boolean isBound
= ((property
.Attributes
&
507 PropertyAttribute
.BOUND
) != 0);
508 boolean isConstr
= ((property
.Attributes
&
509 PropertyAttribute
.CONSTRAINED
) != 0);
510 boolean canChange
= false;
512 if ( !isWritable
) log
.println("Property '"+name
+"' is READONLY");
514 if (name
.endsWith("URL")) isWritable
= false;
515 if (name
.startsWith("Fill")) isWritable
= false;
516 if (name
.startsWith("Font")) isWritable
= false;
517 if (name
.startsWith("IsNumbering")) isWritable
= false;
518 if (name
.startsWith("LayerName")) isWritable
= false;
519 if (name
.startsWith("Line")) isWritable
= false;
520 if (name
.startsWith("TextWriting")) isWritable
= false;
522 //if (name.equals("xinterfaceA") || name.equals("xtypeproviderA")
523 //|| name.equals("arAnyA")) isWritable=false;
525 if ( isWritable
&& isNotNull
) canChange
= isChangeable(name
);
527 if ( isWritable
&& isNotNull
&& isBound
&& canChange
) {
531 if ( isWritable
&& isNotNull
&& isConstr
&& canChange
) {
532 constrained
+=name
+";";
535 if ( isWritable
&& isNotNull
&& canChange
) normal
+=name
+";";
540 //get a random bound property
541 PTT
.bound
=getRandomString(bound
);
542 log
.println("Bound: "+PTT
.bound
);
544 //get a random constrained property
545 PTT
.constrained
=getRandomString(constrained
);
546 log
.println("Constrained: "+PTT
.constrained
);
548 //get a random normal property
549 PTT
.normal
=getRandomString(normal
);
556 * Retrieves one random property name from list (property names separated
557 * by ';') of property names.
559 public String
getRandomString(String str
) {
562 Random rnd
= new Random();
564 if (str
.equals("")) str
= "none";
565 StringTokenizer ST
=new StringTokenizer(str
,";");
566 int nr
= rnd
.nextInt(ST
.countTokens());
568 for (int i
=1; i
<nr
+1; i
++) gRS
= ST
.nextToken();
574 public boolean isChangeable(String name
) {
575 boolean hasChanged
= false;
577 Object getProp
= oObj
.getPropertyValue(name
);
578 log
.println("Getting: "+getProp
);
579 if (name
.equals("xinterfaceA")) {
580 System
.out
.println("drin");
583 Object setValue
= null;
584 if (getProp
!= null) {
585 if (!utils
.isVoid(getProp
))
586 setValue
= ValueChanger
.changePValue(getProp
);
587 else log
.println("Property '"+name
+
588 "' is void but MAYBEVOID isn't set");
589 } else log
.println("Property '"+name
+"'is null and can't be changed");
590 if (name
.equals("LineStyle")) setValue
= null;
591 if (setValue
!= null) {
592 log
.println("Setting to :"+setValue
);
593 oObj
.setPropertyValue(name
, setValue
);
594 hasChanged
= (! getProp
.equals(oObj
.getPropertyValue(name
)));
595 } else log
.println("Couldn't change Property '"+name
+"'");
596 } catch (com
.sun
.star
.beans
.PropertyVetoException e
) {
597 log
.println("'" + name
+ "' throws exception '" + e
+ "'");
598 e
.printStackTrace(log
);
599 } catch (com
.sun
.star
.lang
.IllegalArgumentException e
) {
600 log
.println("'" + name
+ "' throws exception '" + e
+ "'");
601 e
.printStackTrace(log
);
602 } catch (com
.sun
.star
.beans
.UnknownPropertyException e
) {
603 log
.println("'" + name
+ "' throws exception '" + e
+ "'");
604 e
.printStackTrace(log
);
605 } catch (com
.sun
.star
.lang
.WrappedTargetException e
) {
606 log
.println("'" + name
+ "' throws exception '" + e
+ "'");
607 e
.printStackTrace(log
);
608 } catch (com
.sun
.star
.uno
.RuntimeException e
) {
609 log
.println("'" + name
+ "' throws exception '" + e
+ "'");
610 e
.printStackTrace(log
);
611 } catch (java
.lang
.ArrayIndexOutOfBoundsException e
) {
612 log
.println("'" + name
+ "' throws exception '" + e
+ "'");
613 e
.printStackTrace(log
);
620 * Forces environment recreation.
622 protected void after() {
623 disposeEnvironment();
627 } // finish class _XPropertySet