/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ package complex.tdoc; import com.sun.star.beans.Property; import com.sun.star.beans.PropertyValue; import com.sun.star.document.XDocumentSubStorageSupplier; import com.sun.star.embed.ElementModes; import com.sun.star.embed.XStorage; import com.sun.star.frame.XModel; import com.sun.star.frame.XTransientDocumentsDocumentContentFactory; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.sdbc.XResultSet; import com.sun.star.sdbc.XRow; import com.sun.star.text.XTextDocument; import com.sun.star.ucb.Command; import com.sun.star.ucb.ContentInfo; import com.sun.star.ucb.OpenCommandArgument2; import com.sun.star.ucb.OpenMode; import com.sun.star.ucb.XCommandProcessor; import com.sun.star.ucb.XContent; import com.sun.star.ucb.XDynamicResultSet; import com.sun.star.uno.UnoRuntime; import util.WriterTools; import util.utils; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.openoffice.test.OfficeConnection; import static org.junit.Assert.*; /** * */ public class CheckTransientDocumentsDocumentContent { // TODO: document doesn't exists private final String testDocuments = "sForm.sxw"; private final String folderName = "TestFolder"; private XMultiServiceFactory xMSF = null; private XTextDocument xTextDoc = null; // public String[] getTestMethodNames() { // return new String[]{"checkTransientDocumentsDocumentContent"}; // } @Before public void before() { xMSF = getMSF(); System.out.println("Open a document."); String fileName = TestDocument.getUrl(testDocuments); xTextDoc = WriterTools.loadTextDoc(xMSF, fileName); assertNotNull(xTextDoc); } @After public void after() { System.out.println("Close all documents."); xTextDoc.dispose(); } /** * Check the provider of document content: open some documents * and look if they are accessible. */ @Test public void checkTransientDocumentsDocumentContent() { try { // create a content provider Object o = xMSF.createInstance("com.sun.star.comp.ucb.TransientDocumentsDocumentContentFactory"); XTransientDocumentsDocumentContentFactory xTransientDocumentsDocumentContentFactory = UnoRuntime.queryInterface(XTransientDocumentsDocumentContentFactory.class, o); // get the model from the opened document XModel xModel = xTextDoc.getCurrentController().getModel(); // a little additional check for 114733 XDocumentSubStorageSupplier xDocumentSubStorageSupplier = UnoRuntime.queryInterface(XDocumentSubStorageSupplier.class, xModel); String[]names = xDocumentSubStorageSupplier.getDocumentSubStoragesNames(); for (int i=0; i<names.length; i++) { System.out.println("SubStorage names " + i + ": " +names[i]); } XStorage xStorage = xDocumentSubStorageSupplier.getDocumentSubStorage(names[0], ElementModes.READWRITE); assertTrue("Could not get a storage from the XDocumentStorageSupplier.", xStorage != null); // get content XContent xContent = xTransientDocumentsDocumentContentFactory.createDocumentContent(xModel); // actual test: execute some commands XCommandProcessor xCommandProcessor = UnoRuntime.queryInterface(XCommandProcessor.class, xContent); // create the command and arguments Command command = new Command(); OpenCommandArgument2 cmargs2 = new OpenCommandArgument2(); Property[]props = new Property[1]; props[0] = new Property(); props[0].Name = "Title"; props[0].Handle = -1; cmargs2.Mode = OpenMode.ALL; cmargs2.Properties = props; command.Name = "open"; command.Argument = cmargs2; Object result = xCommandProcessor.execute(command, 0, null); XDynamicResultSet xDynamicResultSet = UnoRuntime.queryInterface(XDynamicResultSet.class, result); XResultSet xResultSet = xDynamicResultSet.getStaticResultSet(); XRow xRow = UnoRuntime.queryInterface(XRow.class, xResultSet); // create the new folder 'folderName': first, check if it's already there while(xResultSet.next()) { String existingFolderName = xRow.getString(1); System.out.println("Found existing folder: '" + existingFolderName + "'"); if (folderName.equals(existingFolderName)) { fail("Cannot create a new folder: folder already exists: adapt test or choose a different document."); } } // create a folder System.out.println("Create new folder "+ folderName); ContentInfo contentInfo = new ContentInfo(); contentInfo.Type = "application/vnd.sun.star.tdoc-folder"; command.Name = "createNewContent"; command.Argument = contentInfo; result = xCommandProcessor.execute(command, 0, null); XContent xNewFolder = UnoRuntime.queryInterface(XContent.class, result); XCommandProcessor xFolderCommandProcessor = UnoRuntime.queryInterface(XCommandProcessor.class, xNewFolder); System.out.println("Got the new folder: " + utils.getImplName(xNewFolder)); // name the new folder PropertyValue[] titleProp = new PropertyValue[1]; titleProp[0] = new PropertyValue(); titleProp[0].Name = "Title"; titleProp[0].Handle = -1; titleProp[0].Value = folderName; Command titleSetCommand = new Command(); titleSetCommand.Name = "setPropertyValues"; titleSetCommand.Argument = titleProp; xFolderCommandProcessor.execute(titleSetCommand, 0, null); // 2do: check all this stuff! // commit changes /* InsertCommandArgument insertArgs = new InsertCommandArgument(); insertArgs.Data = null; insertArgs.ReplaceExisting = true; Command commitCommand = new Command(); commitCommand.Name = "insert"; commitCommand.Argument = insertArgs; xFolderCommandProcessor.execute(commitCommand, 0, null); */ } catch (com.sun.star.uno.Exception e) { e.printStackTrace(); fail("Could not create test objects."); } } private XMultiServiceFactory getMSF() { final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager()); return xMSF1; } // setup and close connections @BeforeClass public static void setUpConnection() throws Exception { System.out.println("setUpConnection()"); connection.setUp(); } @AfterClass public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception { System.out.println("tearDownConnection()"); connection.tearDown(); } private static final OfficeConnection connection = new OfficeConnection(); }