1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package mod._sw;
25 
26 import com.sun.star.beans.NamedValue;
27 
28 import util.DBTools;
29 import util.utils;
30 import com.sun.star.beans.PropertyVetoException;
31 import com.sun.star.beans.UnknownPropertyException;
32 import com.sun.star.beans.XPropertySet;
33 import com.sun.star.container.NoSuchElementException;
34 import com.sun.star.container.XNameAccess;
35 import com.sun.star.lang.IllegalArgumentException;
36 import com.sun.star.lang.WrappedTargetException;
37 import com.sun.star.lang.XMultiServiceFactory;
38 import com.sun.star.sdb.CommandType;
39 import com.sun.star.sdbc.*;
40 import com.sun.star.sdbcx.XRowLocate;
41 import com.sun.star.task.XJob;
42 import com.sun.star.text.MailMergeType;
43 import com.sun.star.uno.Exception;
44 import com.sun.star.uno.UnoRuntime;
45 import com.sun.star.uno.XInterface;
46 import java.io.PrintWriter;
47 import lib.StatusException;
48 import lib.TestCase;
49 import lib.TestEnvironment;
50 import lib.TestParameters;
51 
52 /**
53 * Here <code>com.sun.star.text.MailMerge</code> service is tested.<p>
54 * @see com.sun.star.text.MailMerge
55 * @see com.sun.star.task.XJob
56 * @see com.sun.star.text.XMailMergeBroadcaster
57 */
58 public class SwXMailMerge extends TestCase {
59 
initialize( TestParameters Param, PrintWriter log )60     public void initialize( TestParameters Param, PrintWriter log ) {
61         if (! Param.containsKey("uniqueSuffix")){
62             Param.put("uniqueSuffix", new Integer(0));
63         }
64     }
65 
66     /**
67      * Creating a Testenvironment for the interfaces to be tested. <p>
68      * Creates <code>MailMerge</code> service     * Object relations created :
69     * <ul>
70     *  <li> <code>'executeArgs'</code> for
71     *    {@link ifc.text._XMailMergeBroadcaster} : NamedValue[]</li>
72     *  <li> <code>'Job'</code> for
73     *    {@link ifc.text._XMailMergeBroadcaster} : XJob</li>
74     *  <li> <code>'XJobArgs'</code> for
75     *    {@link ifc.task._XJob} : Object[]</li>
76     * </ul>
77      */
createTestEnvironment(TestParameters Param, PrintWriter log)78     protected synchronized TestEnvironment createTestEnvironment(TestParameters Param, PrintWriter log) {
79 
80         XInterface oObj = null;
81         XInterface oRowSet = null;
82         Object oConnection = null;
83         XJob Job = null;
84 
85         log.println(" instantiate MailMerge service");
86         try {
87             oObj = (XInterface) ( (XMultiServiceFactory) Param.getMSF()).createInstance
88                 ("com.sun.star.text.MailMerge");
89         } catch (Exception e) {
90             throw new StatusException("Can't create object environment", e) ;
91         }
92 
93         // <set some variables>
94         String cTestDoc = utils.getFullTestURL("MailMerge.sxw");
95         //cMailMerge_DocumentURL = cTestDoc
96         String cOutputURL = utils.getOfficeTemp( (XMultiServiceFactory) Param.getMSF());
97         String cDataSourceName  = "Bibliography";
98         String cDataCommand = "biblio";
99         Object[] sel = new Object[2];
100         sel[0] = new int[2];
101         sel[1] = new int[5];
102         Object[] myBookMarks = new Object[2];
103         // </set some variables>
104 
105         // <create XResultSet>
106         log.println("create a XResultSet");
107         try {
108             oRowSet = (XInterface) ( (XMultiServiceFactory) Param.getMSF()).createInstance
109                 ("com.sun.star.sdb.RowSet");
110         } catch (Exception e) {
111             throw new StatusException("Can't create com.sun.star.sdb.RowSet", e);
112         }
113         XPropertySet oRowSetProps = (XPropertySet)
114                         UnoRuntime.queryInterface(XPropertySet.class, oRowSet);
115         XRowSet xRowSet = (XRowSet)
116                         UnoRuntime.queryInterface(XRowSet.class, oRowSet);
117         try {
118             oRowSetProps.setPropertyValue("DataSourceName",cDataSourceName);
119             oRowSetProps.setPropertyValue("Command",cDataCommand);
120             oRowSetProps.setPropertyValue("CommandType", new Integer(CommandType.TABLE));
121         } catch (UnknownPropertyException e) {
122             throw new StatusException("Can't set properties on oRowSet", e);
123         } catch (PropertyVetoException e) {
124             throw new StatusException("Can't set properties on oRowSet", e);
125         } catch (IllegalArgumentException e) {
126             throw new StatusException("Can't set properties on oRowSet", e);
127         } catch (WrappedTargetException e) {
128             throw new StatusException("Can't set properties on oRowSet", e);
129         }
130         try {
131             xRowSet.execute();
132         } catch (SQLException e) {
133             throw new StatusException("Can't execute oRowSet", e);
134         }
135 
136         XResultSet oResultSet = (XResultSet)
137                            UnoRuntime.queryInterface(XResultSet.class, oRowSet);
138 
139 
140 
141 
142         // <create Bookmarks>
143         log.println("create bookmarks");
144         try {
145             XRowLocate oRowLocate = (XRowLocate) UnoRuntime.queryInterface(
146                                                   XRowLocate.class, oResultSet);
147             oResultSet.first();
148             myBookMarks[0] = oRowLocate.getBookmark();
149             oResultSet.next();
150             myBookMarks[1] = oRowLocate.getBookmark();
151         } catch (SQLException e) {
152             throw new StatusException("Cant get Bookmarks", e);
153         }
154         // </create Bookmarks>
155 
156         // <fill object with values>
157 
158         log.println("fill MailMerge with default connection");
159 
160         XPropertySet oObjProps = (XPropertySet)
161                             UnoRuntime.queryInterface(XPropertySet.class, oObj);
162         try {
163             oObjProps.setPropertyValue("ActiveConnection", getLocalXConnection(Param));
164             oObjProps.setPropertyValue("DataSourceName", cDataSourceName);
165             oObjProps.setPropertyValue("Command", cDataCommand);
166             oObjProps.setPropertyValue("CommandType", new Integer(CommandType.TABLE));
167             oObjProps.setPropertyValue("OutputType", new Short(MailMergeType.FILE));
168             oObjProps.setPropertyValue("DocumentURL", cTestDoc);
169             oObjProps.setPropertyValue("OutputURL", cOutputURL);
170             oObjProps.setPropertyValue("FileNamePrefix", "Author");
171             oObjProps.setPropertyValue("FileNameFromColumn", new Boolean(false));
172             oObjProps.setPropertyValue("Selection", new Object[0]);
173 
174         } catch (UnknownPropertyException e) {
175             throw new StatusException("Can't set properties on oObj", e);
176         } catch (PropertyVetoException e) {
177             throw new StatusException("Can't set properties on oObj", e);
178         } catch (IllegalArgumentException e) {
179             throw new StatusException("Can't set properties on oObj", e);
180         } catch (WrappedTargetException e) {
181             throw new StatusException("Can't set properties on oObj", e);
182         }
183         // </fill object with values>
184 
185 
186         // <create object relations>
187         Object[] vXJobArgs = new Object[4];
188         NamedValue[] vXJobArg0 = new NamedValue[8];
189         NamedValue[] vXJobArg1 = new NamedValue[7];
190         NamedValue[] vXJobArg2 = new NamedValue[10];
191         NamedValue[] vXJobArg3 = new NamedValue[0];
192 
193         // first Arguments
194         vXJobArg0[0] = new NamedValue("DataSourceName", cDataSourceName);
195         vXJobArg0[1] = new NamedValue("Command", cDataCommand);
196         vXJobArg0[2] = new NamedValue("CommandType",new Integer(CommandType.TABLE));
197         vXJobArg0[3] = new NamedValue("OutputType",new Short(MailMergeType.FILE));
198         vXJobArg0[4] = new NamedValue("DocumentURL", cTestDoc);
199         vXJobArg0[5] = new NamedValue("OutputURL", cOutputURL);
200         vXJobArg0[6] = new NamedValue("FileNamePrefix", "Identifier");
201         vXJobArg0[7] = new NamedValue("FileNameFromColumn", new Boolean(true));
202 
203         //second Arguments
204         vXJobArg1[0] = new NamedValue("DataSourceName", cDataSourceName);
205         vXJobArg1[1] = new NamedValue("Command", cDataCommand);
206         vXJobArg1[2] = new NamedValue("CommandType",new Integer(CommandType.TABLE));
207         vXJobArg1[3] = new NamedValue("OutputType",
208                              new Short(MailMergeType.PRINTER));
209         vXJobArg1[4] = new NamedValue("DocumentURL", cTestDoc);
210         vXJobArg1[5] = new NamedValue("FileNamePrefix", "Author");
211         vXJobArg1[6] = new NamedValue("FileNameFromColumn", new Boolean(true));
212 
213         // third Arguments
214         vXJobArg2[0] = new NamedValue("ActiveConnection", getLocalXConnection(Param));
215         vXJobArg2[1] = new NamedValue("DataSourceName", cDataSourceName);
216         vXJobArg2[2] = new NamedValue("Command", cDataCommand);
217         vXJobArg2[3] = new NamedValue("CommandType",new Integer(CommandType.TABLE));
218         vXJobArg2[4] = new NamedValue("OutputType",
219                              new Short(MailMergeType.FILE));
220         vXJobArg2[5] = new NamedValue("ResultSet", oResultSet);
221         vXJobArg2[6] = new NamedValue("OutputURL", cOutputURL);
222         vXJobArg2[7] = new NamedValue("FileNamePrefix", "Identifier");
223         vXJobArg2[8] = new NamedValue("FileNameFromColumn", new Boolean(true));
224         vXJobArg2[9] = new NamedValue("Selection", myBookMarks);
225 
226         vXJobArgs[0] = vXJobArg0;
227         vXJobArgs[1] = vXJobArg1;
228         vXJobArgs[2] = vXJobArg2;
229         vXJobArgs[3] = vXJobArg3;
230 
231 
232         Job = (XJob) UnoRuntime.queryInterface(XJob.class, oObj);
233         try{
234             Job.execute(vXJobArg2);
235         } catch ( IllegalArgumentException e){
236             System.out.println(e.toString());
237         } catch (  Exception e){
238             System.out.println(e.toString());
239         }
240 
241 
242         // <create XResultSet>
243         log.println("create XResultSet");
244 
245         try {
246             oRowSet = (XInterface) ( (XMultiServiceFactory) Param.getMSF()).createInstance
247                 ("com.sun.star.sdb.RowSet");
248         } catch (Exception e) {
249             throw new StatusException("Can't create com.sun.star.sdb.RowSet", e);
250         }
251         oRowSetProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, oRowSet);
252 
253         xRowSet = (XRowSet) UnoRuntime.queryInterface(XRowSet.class, oRowSet);
254 
255         try {
256             oRowSetProps.setPropertyValue("DataSourceName",cDataSourceName);
257             oRowSetProps.setPropertyValue("Command",cDataCommand);
258             oRowSetProps.setPropertyValue("CommandType", new Integer(CommandType.TABLE));
259         } catch (UnknownPropertyException e) {
260             throw new StatusException("Can't set properties on oRowSet", e);
261         } catch (PropertyVetoException e) {
262             throw new StatusException("Can't set properties on oRowSet", e);
263         } catch (IllegalArgumentException e) {
264             throw new StatusException("Can't set properties on oRowSet", e);
265         } catch (WrappedTargetException e) {
266             throw new StatusException("Can't set properties on oRowSet", e);
267         }
268         try {
269             xRowSet.execute();
270         } catch (SQLException e) {
271             throw new StatusException("Can't execute oRowSet", e);
272         }
273 
274         oResultSet = (XResultSet)
275                            UnoRuntime.queryInterface(XResultSet.class, oRowSet);
276 
277         XResultSet oMMXResultSet = null;
278         try {
279             oMMXResultSet = (XResultSet)
280                            UnoRuntime.queryInterface(XResultSet.class,
281                                ( (XInterface)
282                                 ( (XMultiServiceFactory)
283                                 Param.getMSF()).createInstance("com.sun.star.sdb.RowSet")));
284 
285         } catch (Exception e) {
286             throw new StatusException("Can't create com.sun.star.sdb.RowSet", e);
287         }
288         // </create object relations>
289 
290         TestEnvironment tEnv = new TestEnvironment(oObj) ;
291 
292         // <adding object relations>
293 
294         // com.sun.star.sdb.DataAccessDescriptor
295         tEnv.addObjRelation("DataAccessDescriptor.XResultSet", oResultSet);
296         tEnv.addObjRelation("DataAccessDescriptor.XConnection", getRemoteXConnection(Param));
297 
298         // com.sun.star.text.MailMaerge
299         tEnv.addObjRelation("MailMerge.XConnection", getRemoteXConnection(Param));
300         tEnv.addObjRelation("MailMerge.XResultSet", oMMXResultSet);
301 
302         // com.sun.star.text.XMailMergeBroadcaster
303         tEnv.addObjRelation( "executeArgs", vXJobArg0);
304         tEnv.addObjRelation( "Job", Job);
305 
306         // com.sun.star.task.XJob
307         tEnv.addObjRelation("XJobArgs", vXJobArgs);
308 
309         // </adding object relations>
310 
311         return tEnv ;
312     }
313 
getRemoteXConnection(TestParameters Param)314     private XConnection getRemoteXConnection(TestParameters Param){
315 
316         log.println("create remote connection");
317 
318         String databaseName = null ;
319         XDataSource oXDataSource = null;
320         Object oInterface = null;
321         XMultiServiceFactory xMSF = null ;
322         int uniqueSuffix = Param.getInt("uniqueSuffix");
323 
324         try {
325             xMSF = (XMultiServiceFactory)Param.getMSF();
326             oInterface = xMSF.createInstance( "com.sun.star.sdb.DatabaseContext" );
327 
328             // retrieving temp directory for database
329             String tmpDatabaseUrl = utils.getOfficeTempDir((XMultiServiceFactory)Param.getMSF());
330 
331             databaseName = "NewDatabaseSource" + uniqueSuffix ;
332 
333             String tmpDatabaseFile = tmpDatabaseUrl + databaseName + ".odb";
334             System.out.println("try to delete '"+tmpDatabaseFile+"'");
335             utils.deleteFile(((XMultiServiceFactory) Param.getMSF()), tmpDatabaseFile);
336 
337 
338             tmpDatabaseUrl = "sdbc:dbase:file:///" + tmpDatabaseUrl ;
339 
340             // Creating new DBase data source in the TEMP directory
341             XInterface newSource = (XInterface) xMSF.createInstance
342                 ("com.sun.star.sdb.DataSource") ;
343 
344             XPropertySet xSrcProp = (XPropertySet)
345                 UnoRuntime.queryInterface(XPropertySet.class, newSource);
346 
347             xSrcProp.setPropertyValue("URL", tmpDatabaseUrl) ;
348 
349             DBTools dbt = new DBTools( (XMultiServiceFactory)Param.getMSF(), log );
350             // registering source in DatabaseContext
351             log.println("register database '"+tmpDatabaseUrl+"' as '"+databaseName+"'" );
352             dbt.reRegisterDB(databaseName, newSource) ;
353 
354             uniqueSuffix++;
355             Param.put("uniqueSuffix", new Integer(uniqueSuffix));
356 
357             return dbt.connectToSource(newSource);
358         }
359         catch( Exception e ) {
360             uniqueSuffix++;
361             Param.put("uniqueSuffix", new Integer(uniqueSuffix));
362             log.println("could not register new database" );
363             e.printStackTrace();
364             throw new StatusException("could not register new database", e) ;
365         }
366     }
367 
getLocalXConnection(TestParameters Param)368     private XConnection getLocalXConnection(TestParameters Param){
369 
370         log.println("create local connection");
371 
372         XInterface oDataCont = null;
373         try {
374             oDataCont = (XInterface)( (XMultiServiceFactory) Param.getMSF()).createInstance
375                                    ("com.sun.star.sdb.DatabaseContext");
376         } catch(Exception e) {
377             throw new StatusException("Couldn't create instance of 'com.sun.star.sdb.DatabaseContext'", e);
378         }
379         XNameAccess xNADataCont = (XNameAccess)
380             UnoRuntime.queryInterface(XNameAccess.class, oDataCont);
381 
382         String[] dataNames = xNADataCont.getElementNames();
383 
384         String dataName="";
385         for (int i = 0; i < dataNames.length; i++){
386             if (dataNames[i].startsWith("Biblio")) dataName=dataNames[i];
387         }
388 
389         try{
390 
391             Object oDataBase = xNADataCont.getByName(dataName);
392             XDataSource xDataSource = (XDataSource)
393                 UnoRuntime.queryInterface(XDataSource.class, oDataBase);
394 
395             return xDataSource.getConnection("","");
396 
397         } catch ( NoSuchElementException e){
398             throw new StatusException("Couldn't get registered data base", e);
399         } catch (  WrappedTargetException e){
400             throw new StatusException("Couldn't get registered data base", e);
401         } catch (   SQLException e){
402             throw new StatusException("Couldn't get XConnection from registered data base", e);
403         }
404 
405     }
406 
cleanup(TestParameters Param, PrintWriter log)407     protected void cleanup(TestParameters Param, PrintWriter log) {
408         log.println("closing connections...");
409         XMultiServiceFactory xMsf = (XMultiServiceFactory) Param.getMSF();
410         DBTools dbt = new DBTools( xMsf, log );
411 
412         if (Param.containsKey("uniqueSuffix")){
413             int uniqueSuffix = Param.getInt("uniqueSuffix");
414             uniqueSuffix--;
415             String databaseName =  "";
416             while (uniqueSuffix >= 0){
417 
418                 databaseName = "NewDatabaseSource" + uniqueSuffix ;
419 
420                 log.println("revoke '"+databaseName+"'");
421 
422                 try{
423                     dbt.revokeDB(databaseName);
424                 } catch (com.sun.star.uno.Exception e){
425                 }
426 
427                 uniqueSuffix--;
428             }
429         }
430 
431     }
432 
433 }
434 
435 
436