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