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 package complex.tdoc;
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski import com.sun.star.beans.Property;
26*b1cdbd2cSJim Jagielski import com.sun.star.beans.PropertyValue;
27*b1cdbd2cSJim Jagielski import com.sun.star.document.XDocumentSubStorageSupplier;
28*b1cdbd2cSJim Jagielski import com.sun.star.embed.ElementModes;
29*b1cdbd2cSJim Jagielski import com.sun.star.embed.XStorage;
30*b1cdbd2cSJim Jagielski import com.sun.star.frame.XModel;
31*b1cdbd2cSJim Jagielski import com.sun.star.frame.XTransientDocumentsDocumentContentFactory;
32*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiServiceFactory;
33*b1cdbd2cSJim Jagielski import com.sun.star.sdbc.XResultSet;
34*b1cdbd2cSJim Jagielski import com.sun.star.sdbc.XRow;
35*b1cdbd2cSJim Jagielski import com.sun.star.text.XTextDocument;
36*b1cdbd2cSJim Jagielski import com.sun.star.ucb.Command;
37*b1cdbd2cSJim Jagielski import com.sun.star.ucb.ContentInfo;
38*b1cdbd2cSJim Jagielski import com.sun.star.ucb.OpenCommandArgument2;
39*b1cdbd2cSJim Jagielski import com.sun.star.ucb.OpenMode;
40*b1cdbd2cSJim Jagielski import com.sun.star.ucb.XCommandProcessor;
41*b1cdbd2cSJim Jagielski import com.sun.star.ucb.XContent;
42*b1cdbd2cSJim Jagielski import com.sun.star.ucb.XDynamicResultSet;
43*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
44*b1cdbd2cSJim Jagielski import util.WriterTools;
45*b1cdbd2cSJim Jagielski import util.utils;
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski import org.junit.After;
48*b1cdbd2cSJim Jagielski import org.junit.AfterClass;
49*b1cdbd2cSJim Jagielski import org.junit.Before;
50*b1cdbd2cSJim Jagielski import org.junit.BeforeClass;
51*b1cdbd2cSJim Jagielski import org.junit.Test;
52*b1cdbd2cSJim Jagielski import org.openoffice.test.OfficeConnection;
53*b1cdbd2cSJim Jagielski import static org.junit.Assert.*;
54*b1cdbd2cSJim Jagielski /**
55*b1cdbd2cSJim Jagielski  *
56*b1cdbd2cSJim Jagielski  */
57*b1cdbd2cSJim Jagielski public class CheckTransientDocumentsDocumentContent {
58*b1cdbd2cSJim Jagielski     // TODO: document doesn't exists
59*b1cdbd2cSJim Jagielski     private final String testDocuments = "sForm.sxw";
60*b1cdbd2cSJim Jagielski     private final String folderName = "TestFolder";
61*b1cdbd2cSJim Jagielski     private XMultiServiceFactory xMSF = null;
62*b1cdbd2cSJim Jagielski     private XTextDocument xTextDoc = null;
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski //    public String[] getTestMethodNames() {
65*b1cdbd2cSJim Jagielski //        return new String[]{"checkTransientDocumentsDocumentContent"};
66*b1cdbd2cSJim Jagielski //    }
67*b1cdbd2cSJim Jagielski 
before()68*b1cdbd2cSJim Jagielski     @Before public void before() {
69*b1cdbd2cSJim Jagielski         xMSF = getMSF();
70*b1cdbd2cSJim Jagielski         System.out.println("Open a document.");
71*b1cdbd2cSJim Jagielski         String fileName = TestDocument.getUrl(testDocuments);
72*b1cdbd2cSJim Jagielski         xTextDoc = WriterTools.loadTextDoc(xMSF, fileName);
73*b1cdbd2cSJim Jagielski         assertNotNull(xTextDoc);
74*b1cdbd2cSJim Jagielski     }
after()75*b1cdbd2cSJim Jagielski     @After public void after() {
76*b1cdbd2cSJim Jagielski         System.out.println("Close all documents.");
77*b1cdbd2cSJim Jagielski         xTextDoc.dispose();
78*b1cdbd2cSJim Jagielski     }
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski     /**
81*b1cdbd2cSJim Jagielski      * Check the provider of document content: open some documents
82*b1cdbd2cSJim Jagielski      * and look if they are accessible.
83*b1cdbd2cSJim Jagielski      */
checkTransientDocumentsDocumentContent()84*b1cdbd2cSJim Jagielski     @Test public void checkTransientDocumentsDocumentContent() {
85*b1cdbd2cSJim Jagielski         try {
86*b1cdbd2cSJim Jagielski             // create a content provider
87*b1cdbd2cSJim Jagielski             Object o = xMSF.createInstance("com.sun.star.comp.ucb.TransientDocumentsDocumentContentFactory");
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski             XTransientDocumentsDocumentContentFactory xTransientDocumentsDocumentContentFactory =
90*b1cdbd2cSJim Jagielski                             UnoRuntime.queryInterface(XTransientDocumentsDocumentContentFactory.class, o);
91*b1cdbd2cSJim Jagielski             // get the model from the opened document
92*b1cdbd2cSJim Jagielski             XModel xModel = xTextDoc.getCurrentController().getModel();
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski             // a little additional check for 114733
95*b1cdbd2cSJim Jagielski             XDocumentSubStorageSupplier xDocumentSubStorageSupplier = UnoRuntime.queryInterface(XDocumentSubStorageSupplier.class, xModel);
96*b1cdbd2cSJim Jagielski             String[]names = xDocumentSubStorageSupplier.getDocumentSubStoragesNames();
97*b1cdbd2cSJim Jagielski             for (int i=0; i<names.length; i++) {
98*b1cdbd2cSJim Jagielski                 System.out.println("SubStorage names " + i + ": " +names[i]);
99*b1cdbd2cSJim Jagielski             }
100*b1cdbd2cSJim Jagielski             XStorage xStorage = xDocumentSubStorageSupplier.getDocumentSubStorage(names[0], ElementModes.READWRITE);
101*b1cdbd2cSJim Jagielski             assertTrue("Could not get a storage from the XDocumentStorageSupplier.", xStorage != null);
102*b1cdbd2cSJim Jagielski             // get content
103*b1cdbd2cSJim Jagielski             XContent xContent = xTransientDocumentsDocumentContentFactory.createDocumentContent(xModel);
104*b1cdbd2cSJim Jagielski             // actual test: execute some commands
105*b1cdbd2cSJim Jagielski             XCommandProcessor xCommandProcessor = UnoRuntime.queryInterface(XCommandProcessor.class, xContent);
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski             // create the command and arguments
108*b1cdbd2cSJim Jagielski             Command command = new Command();
109*b1cdbd2cSJim Jagielski             OpenCommandArgument2 cmargs2 = new OpenCommandArgument2();
110*b1cdbd2cSJim Jagielski             Property[]props = new Property[1];
111*b1cdbd2cSJim Jagielski             props[0] = new Property();
112*b1cdbd2cSJim Jagielski             props[0].Name = "Title";
113*b1cdbd2cSJim Jagielski             props[0].Handle = -1;
114*b1cdbd2cSJim Jagielski             cmargs2.Mode = OpenMode.ALL;
115*b1cdbd2cSJim Jagielski             cmargs2.Properties = props;
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski             command.Name = "open";
118*b1cdbd2cSJim Jagielski             command.Argument = cmargs2;
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski             Object result = xCommandProcessor.execute(command, 0, null);
121*b1cdbd2cSJim Jagielski             XDynamicResultSet xDynamicResultSet = UnoRuntime.queryInterface(XDynamicResultSet.class, result);
122*b1cdbd2cSJim Jagielski             XResultSet xResultSet = xDynamicResultSet.getStaticResultSet();
123*b1cdbd2cSJim Jagielski             XRow xRow = UnoRuntime.queryInterface(XRow.class, xResultSet);
124*b1cdbd2cSJim Jagielski             // create the new folder 'folderName': first, check if it's already there
125*b1cdbd2cSJim Jagielski             while(xResultSet.next()) {
126*b1cdbd2cSJim Jagielski                 String existingFolderName = xRow.getString(1);
127*b1cdbd2cSJim Jagielski                 System.out.println("Found existing folder: '" + existingFolderName + "'");
128*b1cdbd2cSJim Jagielski                 if (folderName.equals(existingFolderName)) {
129*b1cdbd2cSJim Jagielski                     fail("Cannot create a new folder: folder already exists: adapt test or choose a different document.");
130*b1cdbd2cSJim Jagielski                 }
131*b1cdbd2cSJim Jagielski             }
132*b1cdbd2cSJim Jagielski             // create a folder
133*b1cdbd2cSJim Jagielski             System.out.println("Create new folder "+ folderName);
134*b1cdbd2cSJim Jagielski             ContentInfo contentInfo = new ContentInfo();
135*b1cdbd2cSJim Jagielski             contentInfo.Type = "application/vnd.sun.star.tdoc-folder";
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski             command.Name = "createNewContent";
138*b1cdbd2cSJim Jagielski             command.Argument = contentInfo;
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski             result = xCommandProcessor.execute(command, 0, null);
141*b1cdbd2cSJim Jagielski             XContent xNewFolder = UnoRuntime.queryInterface(XContent.class, result);
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski             XCommandProcessor xFolderCommandProcessor = UnoRuntime.queryInterface(XCommandProcessor.class, xNewFolder);
144*b1cdbd2cSJim Jagielski             System.out.println("Got the new folder: " + utils.getImplName(xNewFolder));
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski             // name the new folder
147*b1cdbd2cSJim Jagielski             PropertyValue[] titleProp = new PropertyValue[1];
148*b1cdbd2cSJim Jagielski             titleProp[0] = new PropertyValue();
149*b1cdbd2cSJim Jagielski             titleProp[0].Name = "Title";
150*b1cdbd2cSJim Jagielski             titleProp[0].Handle = -1;
151*b1cdbd2cSJim Jagielski             titleProp[0].Value = folderName;
152*b1cdbd2cSJim Jagielski             Command titleSetCommand = new Command();
153*b1cdbd2cSJim Jagielski             titleSetCommand.Name = "setPropertyValues";
154*b1cdbd2cSJim Jagielski             titleSetCommand.Argument = titleProp;
155*b1cdbd2cSJim Jagielski             xFolderCommandProcessor.execute(titleSetCommand, 0, null);
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski             // 2do: check all this stuff!
158*b1cdbd2cSJim Jagielski             // commit changes
159*b1cdbd2cSJim Jagielski /*            InsertCommandArgument insertArgs = new InsertCommandArgument();
160*b1cdbd2cSJim Jagielski             insertArgs.Data = null;
161*b1cdbd2cSJim Jagielski             insertArgs.ReplaceExisting = true;
162*b1cdbd2cSJim Jagielski             Command commitCommand = new Command();
163*b1cdbd2cSJim Jagielski             commitCommand.Name = "insert";
164*b1cdbd2cSJim Jagielski             commitCommand.Argument = insertArgs;
165*b1cdbd2cSJim Jagielski             xFolderCommandProcessor.execute(commitCommand, 0, null); */
166*b1cdbd2cSJim Jagielski         }
167*b1cdbd2cSJim Jagielski         catch (com.sun.star.uno.Exception e) {
168*b1cdbd2cSJim Jagielski             e.printStackTrace();
169*b1cdbd2cSJim Jagielski             fail("Could not create test objects.");
170*b1cdbd2cSJim Jagielski         }
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski     }
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 
getMSF()175*b1cdbd2cSJim Jagielski     private XMultiServiceFactory getMSF()
176*b1cdbd2cSJim Jagielski     {
177*b1cdbd2cSJim Jagielski         final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager());
178*b1cdbd2cSJim Jagielski         return xMSF1;
179*b1cdbd2cSJim Jagielski     }
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski     // setup and close connections
setUpConnection()182*b1cdbd2cSJim Jagielski     @BeforeClass public static void setUpConnection() throws Exception {
183*b1cdbd2cSJim Jagielski         System.out.println("setUpConnection()");
184*b1cdbd2cSJim Jagielski         connection.setUp();
185*b1cdbd2cSJim Jagielski     }
186*b1cdbd2cSJim Jagielski 
tearDownConnection()187*b1cdbd2cSJim Jagielski     @AfterClass public static void tearDownConnection()
188*b1cdbd2cSJim Jagielski         throws InterruptedException, com.sun.star.uno.Exception
189*b1cdbd2cSJim Jagielski     {
190*b1cdbd2cSJim Jagielski         System.out.println("tearDownConnection()");
191*b1cdbd2cSJim Jagielski         connection.tearDown();
192*b1cdbd2cSJim Jagielski     }
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski     private static final OfficeConnection connection = new OfficeConnection();
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski }
198