1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski package ifc.container;
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski import com.sun.star.container.NoSuchElementException;
27*b1cdbd2cSJim Jagielski import com.sun.star.container.XNameContainer;
28*b1cdbd2cSJim Jagielski import lib.MultiMethodTest;
29*b1cdbd2cSJim Jagielski import lib.StatusException;
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski /**
32*b1cdbd2cSJim Jagielski * Testing <code>com.sun.star.container.XNameContainer</code>
33*b1cdbd2cSJim Jagielski * interface methods :
34*b1cdbd2cSJim Jagielski * <ul>
35*b1cdbd2cSJim Jagielski *  <li><code> insertByName()</code></li>
36*b1cdbd2cSJim Jagielski *  <li><code> removeByName()</code></li>
37*b1cdbd2cSJim Jagielski * </ul>
38*b1cdbd2cSJim Jagielski * This test needs the following object relations :
39*b1cdbd2cSJim Jagielski * <ul>
40*b1cdbd2cSJim Jagielski *  <li> <code>'INSTANCE1', ..., 'INSTANCEN'</code> : N relations
41*b1cdbd2cSJim Jagielski *   which represents objects to be inserted. See below
42*b1cdbd2cSJim Jagielski *   for more information.</li>
43*b1cdbd2cSJim Jagielski *  <li> <code>'XNameContainerINDEX'</code> : For internal test
44*b1cdbd2cSJim Jagielski *   usage. Contains current thread number. </li>
45*b1cdbd2cSJim Jagielski *  <li> <code>'XNameContainer.AllowDuplicateNames'</code> <b>optional</b>:
46*b1cdbd2cSJim Jagielski *   if this relation exists then container elements can have duplicate
47*b1cdbd2cSJim Jagielski *   names. </li>
48*b1cdbd2cSJim Jagielski *  <li> Test environment variable <code>'THRCNT'</code> : number
49*b1cdbd2cSJim Jagielski *   of interface threads running concurently. </li>
50*b1cdbd2cSJim Jagielski * <ul> <p>
51*b1cdbd2cSJim Jagielski * XNameComtainer needs n ObjectRelations "INSTANCEn" , where n=1, ..., THRCNT.
52*b1cdbd2cSJim Jagielski *
53*b1cdbd2cSJim Jagielski * When this interface tested by different threads, it must use different
54*b1cdbd2cSJim Jagielski * instances to insert/remove - one for each thread.
55*b1cdbd2cSJim Jagielski *
56*b1cdbd2cSJim Jagielski * That's why we use objRelation "XNameContainerINDEX" to store the number of
57*b1cdbd2cSJim Jagielski * last taken instance. If there is no such relation, it initialize with 1.
58*b1cdbd2cSJim Jagielski *
59*b1cdbd2cSJim Jagielski * If you insert the same Object by insertByName() several times you
60*b1cdbd2cSJim Jagielski * don't insert the Object several times. The first insertByName() inserts
61*b1cdbd2cSJim Jagielski * the Object to the Container but all other insertByName() changes
62*b1cdbd2cSJim Jagielski * the Name in the Continer because it's the same Object.
63*b1cdbd2cSJim Jagielski * @see com.sun.star.container.XNameContainer
64*b1cdbd2cSJim Jagielski */
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski public class _XNameContainer extends MultiMethodTest {
67*b1cdbd2cSJim Jagielski     public XNameContainer oObj = null;
68*b1cdbd2cSJim Jagielski     String Name = "XNameContainer";
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski     /**
71*b1cdbd2cSJim Jagielski     * First inserts object by name (different objects for different threads)
72*b1cdbd2cSJim Jagielski     * and checks if it exists. Second, if duplicate names are not allowed
73*b1cdbd2cSJim Jagielski     * test tries to insert element with the same name and checks for
74*b1cdbd2cSJim Jagielski     * proper exception. Third, tries to add <code>null</code> element and
75*b1cdbd2cSJim Jagielski     * checks for proper exception. <p>
76*b1cdbd2cSJim Jagielski     * Has <b>OK</b> status if in the first case element added exists in
77*b1cdbd2cSJim Jagielski     * the container, in the second case <code>ElementExistException</code>
78*b1cdbd2cSJim Jagielski     * is thrown, and in the third case <code>IllegalArgumentException</code>
79*b1cdbd2cSJim Jagielski     * is thrown.
80*b1cdbd2cSJim Jagielski     */
_insertByName()81*b1cdbd2cSJim Jagielski     public void _insertByName() {
82*b1cdbd2cSJim Jagielski         boolean result = true;
83*b1cdbd2cSJim Jagielski         int Index = 0;
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski         //get for every thread its own Object to insert it
86*b1cdbd2cSJim Jagielski         log.println("get ObjRelation(\"XNameContainerINDEX\")");
87*b1cdbd2cSJim Jagielski         String sIndex = null ;
88*b1cdbd2cSJim Jagielski         synchronized (tEnv) {
89*b1cdbd2cSJim Jagielski             sIndex = (String)tEnv.getObjRelation("XNameContainerINDEX");
90*b1cdbd2cSJim Jagielski             if (sIndex == null) {
91*b1cdbd2cSJim Jagielski                 log.println("No XNameContainerINDEX - so set it to 1.");
92*b1cdbd2cSJim Jagielski                 tEnv.addObjRelation("XNameContainerINDEX",Integer.toString(1));
93*b1cdbd2cSJim Jagielski                 Index = 1;
94*b1cdbd2cSJim Jagielski             } else {
95*b1cdbd2cSJim Jagielski                 Index = Integer.parseInt(sIndex);
96*b1cdbd2cSJim Jagielski                 Index++;
97*b1cdbd2cSJim Jagielski                 tEnv.addObjRelation("XNameContainerINDEX",
98*b1cdbd2cSJim Jagielski                     Integer.toString(Index));
99*b1cdbd2cSJim Jagielski             }
100*b1cdbd2cSJim Jagielski         }
101*b1cdbd2cSJim Jagielski         Name += Index ;
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski         log.println("get ObjRelation(\"INSTANCE" + Index +"\")");
104*b1cdbd2cSJim Jagielski         Object oInstance = tEnv.getObjRelation("INSTANCE"+ Index);
105*b1cdbd2cSJim Jagielski         if (oInstance == null) {
106*b1cdbd2cSJim Jagielski             log.println("ObjRelation(\"INSTANCE" + Index +"\") Object n.a.");
107*b1cdbd2cSJim Jagielski         }
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski         log.println("testing insertByName(\""+Name+"\")...");
111*b1cdbd2cSJim Jagielski         try {
112*b1cdbd2cSJim Jagielski             String[] names = oObj.getElementNames() ;
113*b1cdbd2cSJim Jagielski             log.println("Element names :") ;
114*b1cdbd2cSJim Jagielski             for (int i = 0; i<names.length; i++) {
115*b1cdbd2cSJim Jagielski                  log.println("  '" + names[i] + "'") ;
116*b1cdbd2cSJim Jagielski             }
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski             oObj.insertByName(Name, oInstance);
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski             names = oObj.getElementNames() ;
121*b1cdbd2cSJim Jagielski             log.println("Element names :") ;
122*b1cdbd2cSJim Jagielski             for (int i = 0; i<names.length; i++) {
123*b1cdbd2cSJim Jagielski                  log.println("  " + names[i]) ;
124*b1cdbd2cSJim Jagielski             }
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski             result &= oObj.hasByName(Name) ;
127*b1cdbd2cSJim Jagielski             log.println("insertByName(\""+Name+"\")...OK");
128*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IllegalArgumentException e) {
129*b1cdbd2cSJim Jagielski             log.println("insertByName(\""+Name+"\"): " + e + " FALSE");
130*b1cdbd2cSJim Jagielski             result = false;
131*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.WrappedTargetException e) {
132*b1cdbd2cSJim Jagielski             log.println("insertByName(\""+Name+"\"): " + e + " FALSE");
133*b1cdbd2cSJim Jagielski             result = false;
134*b1cdbd2cSJim Jagielski         } catch (com.sun.star.container.ElementExistException e) {
135*b1cdbd2cSJim Jagielski             log.println("insertByName(\""+Name+"\"): " + e + " FALSE");
136*b1cdbd2cSJim Jagielski             result = false;
137*b1cdbd2cSJim Jagielski         }
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski         // if duplicate names is not allowed test for valid exception
140*b1cdbd2cSJim Jagielski         if (tEnv.getObjRelation("XNameContainer.AllowDuplicateNames")==null) {
141*b1cdbd2cSJim Jagielski             Object secondInstance = tEnv.getObjRelation("SecondInstance");
142*b1cdbd2cSJim Jagielski             if (secondInstance != null) {
143*b1cdbd2cSJim Jagielski                 oInstance = secondInstance;
144*b1cdbd2cSJim Jagielski             }
145*b1cdbd2cSJim Jagielski             log.println("Trying to add element with the same name ...") ;
146*b1cdbd2cSJim Jagielski             try {
147*b1cdbd2cSJim Jagielski                 oObj.insertByName(Name, oInstance);
148*b1cdbd2cSJim Jagielski                 result = false ;
149*b1cdbd2cSJim Jagielski                 log.println("!!! No exception were thrown !!!");
150*b1cdbd2cSJim Jagielski             } catch (com.sun.star.lang.IllegalArgumentException e) {
151*b1cdbd2cSJim Jagielski                 log.println("!!! Wrong exception : " + e + " FALSE");
152*b1cdbd2cSJim Jagielski                 result = false;
153*b1cdbd2cSJim Jagielski             } catch (com.sun.star.lang.WrappedTargetException e) {
154*b1cdbd2cSJim Jagielski                 log.println("!!! Wrong exception : " + e + " FALSE");
155*b1cdbd2cSJim Jagielski                 result = false;
156*b1cdbd2cSJim Jagielski             } catch (com.sun.star.container.ElementExistException e) {
157*b1cdbd2cSJim Jagielski                 log.println("Right exception : " + e + " OK");
158*b1cdbd2cSJim Jagielski             }
159*b1cdbd2cSJim Jagielski         }
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski         log.println("inserting a wrong Object occurs Exceptions ...");
162*b1cdbd2cSJim Jagielski         try {
163*b1cdbd2cSJim Jagielski             Object dummy = null;
164*b1cdbd2cSJim Jagielski             oObj.insertByName("Dummy", dummy);
165*b1cdbd2cSJim Jagielski             log.println("No Exception: -> FALSE");
166*b1cdbd2cSJim Jagielski             result = false;
167*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IllegalArgumentException e) {
168*b1cdbd2cSJim Jagielski             log.println("Dummy-Exception: " + e + " -> OK");
169*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.WrappedTargetException e) {
170*b1cdbd2cSJim Jagielski             log.println("!!! This exception not expected: " +e+ " -> FAILED");
171*b1cdbd2cSJim Jagielski             result = false;
172*b1cdbd2cSJim Jagielski         } catch (com.sun.star.container.ElementExistException e) {
173*b1cdbd2cSJim Jagielski             log.println("!!! This exception not expected: " +e+ " -> FAILED");
174*b1cdbd2cSJim Jagielski             result = false;
175*b1cdbd2cSJim Jagielski         }
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski         tRes.tested("insertByName()", result);
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski     } // end insertByName()
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski     /**
182*b1cdbd2cSJim Jagielski     * Test removes element inserted before and checks if element
183*b1cdbd2cSJim Jagielski     * still exists in the container. Second test tries to remove
184*b1cdbd2cSJim Jagielski     * element with non-existing name and checks for proper exception. <p>
185*b1cdbd2cSJim Jagielski     * Has <b> OK </b> status if in the first case element doesn't
186*b1cdbd2cSJim Jagielski     * exist anymore (or duplicate names are allowed), and in the
187*b1cdbd2cSJim Jagielski     * second case <code>NoSuchElementException</code> is thrown. <p>
188*b1cdbd2cSJim Jagielski     * The following method tests are to be completed successfully before :
189*b1cdbd2cSJim Jagielski     * <ul>
190*b1cdbd2cSJim Jagielski     *  <li> <code> insertByName() </code> : to remove the element inserted
191*b1cdbd2cSJim Jagielski     *    in this test. </li>
192*b1cdbd2cSJim Jagielski     * </ul>
193*b1cdbd2cSJim Jagielski     */
_removeByName()194*b1cdbd2cSJim Jagielski     public void _removeByName() {
195*b1cdbd2cSJim Jagielski         try {
196*b1cdbd2cSJim Jagielski             requiredMethod("insertByName()");
197*b1cdbd2cSJim Jagielski         } catch (StatusException e) {
198*b1cdbd2cSJim Jagielski             // removing the name anywhere
199*b1cdbd2cSJim Jagielski             try {
200*b1cdbd2cSJim Jagielski                 oObj.removeByName(Name);
201*b1cdbd2cSJim Jagielski             } catch (com.sun.star.container.NoSuchElementException e1) {
202*b1cdbd2cSJim Jagielski             } catch (com.sun.star.lang.WrappedTargetException e1) {
203*b1cdbd2cSJim Jagielski             }
204*b1cdbd2cSJim Jagielski         }
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski         boolean result = true;
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski         log.println("testing removeByName() ...");
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski         try {
211*b1cdbd2cSJim Jagielski             log.println("remove " + Name);
212*b1cdbd2cSJim Jagielski             String[] names = oObj.getElementNames() ;
213*b1cdbd2cSJim Jagielski             log.println("Element names :") ;
214*b1cdbd2cSJim Jagielski             for (int i = 0; i<names.length; i++) {
215*b1cdbd2cSJim Jagielski                 log.println("  " + names[i]) ;
216*b1cdbd2cSJim Jagielski             }
217*b1cdbd2cSJim Jagielski             oObj.removeByName(Name);
218*b1cdbd2cSJim Jagielski             boolean loc_res = !oObj.hasByName(Name) || tEnv.getObjRelation
219*b1cdbd2cSJim Jagielski                 ("XNameContainer.AllowDuplicateNames") != null ;
220*b1cdbd2cSJim Jagielski             result &= loc_res ;
221*b1cdbd2cSJim Jagielski             if (loc_res)
222*b1cdbd2cSJim Jagielski                 log.println("1. removeByName(\""+Name+"\") ...OK");
223*b1cdbd2cSJim Jagielski             else
224*b1cdbd2cSJim Jagielski                 log.println("1. !!! Container still has element with name "
225*b1cdbd2cSJim Jagielski                     + Name) ;
226*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.WrappedTargetException e) {
227*b1cdbd2cSJim Jagielski             result = false;
228*b1cdbd2cSJim Jagielski             log.println("1. removeByName:(\""+Name+"\") " + e + " - FAILED");
229*b1cdbd2cSJim Jagielski         } catch (com.sun.star.container.NoSuchElementException e) {
230*b1cdbd2cSJim Jagielski             result = false;
231*b1cdbd2cSJim Jagielski             log.println("1. removeByName:(\""+Name+"\") " + e + " - FAILED");
232*b1cdbd2cSJim Jagielski         }
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski         log.println("removing a non existent object to get an exception");
235*b1cdbd2cSJim Jagielski         try {
236*b1cdbd2cSJim Jagielski             oObj.removeByName(Name+ " dummy");
237*b1cdbd2cSJim Jagielski             result = false;
238*b1cdbd2cSJim Jagielski             log.println("2. removeByName(): Exception expected! - FAILED");
239*b1cdbd2cSJim Jagielski         } catch (NoSuchElementException e) {
240*b1cdbd2cSJim Jagielski             log.println("2. removeByName(): Expected exception - OK");
241*b1cdbd2cSJim Jagielski             result &= true;
242*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.WrappedTargetException e) {
243*b1cdbd2cSJim Jagielski             result = false;
244*b1cdbd2cSJim Jagielski             log.println("2. removeByName(): Unexpected exception! - " +
245*b1cdbd2cSJim Jagielski                 e + " - FAILED");
246*b1cdbd2cSJim Jagielski         }
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski         tRes.tested("removeByName()", result);
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski         return;
251*b1cdbd2cSJim Jagielski     } // end removeByName()
252*b1cdbd2cSJim Jagielski } //XNameContainer
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 
256