Version 6.1.0.2, tag libreoffice-6.1.0.2
[LibreOffice.git] / odk / examples / java / DocumentHandling / DocumentConverter.java
blob386af9f1f8fc91649fb20abc621e50b9c084a2f6
1 /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*************************************************************************
4 * The Contents of this file are made available subject to the terms of
5 * the BSD license.
7 * Copyright 2000, 2010 Oracle and/or its affiliates.
8 * All rights reserved.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of Sun Microsystems, Inc. nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
29 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
31 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
32 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 *************************************************************************/
36 import com.sun.star.uno.UnoRuntime;
38 import java.io.File;
41 /** The class <CODE>DocumentConverter</CODE> allows you to convert all documents
42 * in a given directory and in its subdirectories to a given type. A converted
43 * document will be created in the same directory as the origin document.
46 public class DocumentConverter {
47 /** Containing the loaded documents
49 static com.sun.star.frame.XComponentLoader xCompLoader = null;
50 /** Containing the given type to convert to
52 static String sConvertType = "";
53 /** Containing the given extension
55 static String sExtension = "";
56 /** Containing the current file or directory
58 static String sIndent = "";
59 /** Containing the directory where the converted files are saved
61 static String sOutputDir = "";
63 /** Traversing the given directory recursively and converting their files to
64 * the favoured type if possible
65 * @param fileDirectory Containing the directory
67 static void traverse( File fileDirectory ) {
68 // Testing, if the file is a directory, and if so, it throws an exception
69 if ( !fileDirectory.isDirectory() ) {
70 throw new IllegalArgumentException(
71 "not a directory: " + fileDirectory.getName()
75 // Prepare Url for the output directory
76 File outdir = new File(DocumentConverter.sOutputDir);
77 String sOutUrl = "file:///" + outdir.getAbsolutePath().replace( '\\', '/' );
79 System.out.println("\nThe converted documents will stored in \""
80 + outdir.getPath() + "!");
82 System.out.println(sIndent + "[" + fileDirectory.getName() + "]");
83 sIndent += " ";
85 // Getting all files and directories in the current directory
86 File[] entries = fileDirectory.listFiles();
89 // Iterating for each file and directory
90 for ( int i = 0; i < entries.length; ++i ) {
91 // Testing, if the entry in the list is a directory
92 if ( entries[ i ].isDirectory() ) {
93 // Recursive call for the new directory
94 traverse( entries[ i ] );
95 } else {
96 // Converting the document to the favoured type
97 try {
98 // Composing the URL by replacing all backslashes
99 String sUrl = "file:///"
100 + entries[ i ].getAbsolutePath().replace( '\\', '/' );
102 // Loading the wanted document
103 com.sun.star.beans.PropertyValue propertyValues[] =
104 new com.sun.star.beans.PropertyValue[1];
105 propertyValues[0] = new com.sun.star.beans.PropertyValue();
106 propertyValues[0].Name = "Hidden";
107 propertyValues[0].Value = Boolean.TRUE;
109 Object oDocToStore =
110 DocumentConverter.xCompLoader.loadComponentFromURL(
111 sUrl, "_blank", 0, propertyValues);
113 // Getting an object that will offer a simple way to store
114 // a document to a URL.
115 com.sun.star.frame.XStorable xStorable =
116 UnoRuntime.queryInterface(
117 com.sun.star.frame.XStorable.class, oDocToStore );
119 // Preparing properties for converting the document
120 propertyValues = new com.sun.star.beans.PropertyValue[2];
121 // Setting the flag for overwriting
122 propertyValues[0] = new com.sun.star.beans.PropertyValue();
123 propertyValues[0].Name = "Overwrite";
124 propertyValues[0].Value = Boolean.TRUE;
125 // Setting the filter name
126 propertyValues[1] = new com.sun.star.beans.PropertyValue();
127 propertyValues[1].Name = "FilterName";
128 propertyValues[1].Value = DocumentConverter.sConvertType;
130 // Appending the favoured extension to the origin document name
131 int index1 = sUrl.lastIndexOf('/');
132 int index2 = sUrl.lastIndexOf('.');
133 String sStoreUrl = sOutUrl + sUrl.substring(index1, index2 + 1)
134 + DocumentConverter.sExtension;
136 // Storing and converting the document
137 xStorable.storeAsURL(sStoreUrl, propertyValues);
139 // Closing the converted document. Use XCloseable.close if the
140 // interface is supported, otherwise use XComponent.dispose
141 com.sun.star.util.XCloseable xCloseable =
142 UnoRuntime.queryInterface(
143 com.sun.star.util.XCloseable.class, xStorable);
145 if ( xCloseable != null ) {
146 xCloseable.close(false);
147 } else {
148 com.sun.star.lang.XComponent xComp =
149 UnoRuntime.queryInterface(
150 com.sun.star.lang.XComponent.class, xStorable);
152 xComp.dispose();
155 catch( Exception e ) {
156 e.printStackTrace(System.err);
159 System.out.println(sIndent + entries[ i ].getName());
163 sIndent = sIndent.substring(2);
166 /** Bootstrap UNO, getting the remote component context, getting a new instance
167 * of the desktop (used interface XComponentLoader) and calling the
168 * static method traverse
169 * @param args The array of the type String contains the directory, in which
170 * all files should be converted, the favoured converting type
171 * and the wanted extension
173 public static void main( String args[] ) {
174 if ( args.length < 3 ) {
175 System.out.println("usage: java -jar DocumentConverter.jar " +
176 "\"<directory to convert>\" \"<type to convert to>\" " +
177 "\"<extension>\" \"<output_directory>\"");
178 System.out.println("\ne.g.:");
179 System.out.println("usage: java -jar DocumentConverter.jar " +
180 "\"c:/myoffice\" \"swriter: MS Word 97\" \"doc\"");
181 System.exit(1);
184 com.sun.star.uno.XComponentContext xContext = null;
186 try {
187 // get the remote office component context
188 xContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
189 System.out.println("Connected to a running office ...");
191 // get the remote office service manager
192 com.sun.star.lang.XMultiComponentFactory xMCF =
193 xContext.getServiceManager();
195 Object oDesktop = xMCF.createInstanceWithContext(
196 "com.sun.star.frame.Desktop", xContext);
198 xCompLoader = UnoRuntime.queryInterface(com.sun.star.frame.XComponentLoader.class,
199 oDesktop);
201 // Getting the given starting directory
202 File file = new File(args[0]);
204 // Getting the given type to convert to
205 sConvertType = args[1];
207 // Getting the given extension that should be appended to the
208 // origin document
209 sExtension = args[2];
211 // Getting the given type to convert to
212 sOutputDir = args[3];
214 // Starting the conversion of documents in the given directory
215 // and subdirectories
216 traverse(file);
218 System.exit(0);
219 } catch( Exception e ) {
220 e.printStackTrace(System.err);
221 System.exit(1);
226 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */