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 
24*b1cdbd2cSJim Jagielski // JDK API
25*b1cdbd2cSJim Jagielski import java.io.IOException;
26*b1cdbd2cSJim Jagielski import java.io.PrintWriter;
27*b1cdbd2cSJim Jagielski import java.io.File;
28*b1cdbd2cSJim Jagielski import java.io.FileInputStream;
29*b1cdbd2cSJim Jagielski import java.io.BufferedInputStream;
30*b1cdbd2cSJim Jagielski import java.util.Enumeration;
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski // Servlet API
33*b1cdbd2cSJim Jagielski import javax.servlet.ServletException;
34*b1cdbd2cSJim Jagielski import javax.servlet.http.HttpServlet;
35*b1cdbd2cSJim Jagielski import javax.servlet.http.HttpServletRequest;
36*b1cdbd2cSJim Jagielski import javax.servlet.http.HttpServletResponse;
37*b1cdbd2cSJim Jagielski import javax.servlet.ServletOutputStream;
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski // Helper API
40*b1cdbd2cSJim Jagielski import com.oreilly.servlet.MultipartRequest;
41*b1cdbd2cSJim Jagielski import com.oreilly.servlet.MultipartResponse;
42*b1cdbd2cSJim Jagielski import com.oreilly.servlet.ServletUtils;
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski // UNO API
45*b1cdbd2cSJim Jagielski import com.sun.star.bridge.XUnoUrlResolver;
46*b1cdbd2cSJim Jagielski import com.sun.star.uno.XComponentContext;
47*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
48*b1cdbd2cSJim Jagielski import com.sun.star.frame.XComponentLoader;
49*b1cdbd2cSJim Jagielski import com.sun.star.frame.XStorable;
50*b1cdbd2cSJim Jagielski import com.sun.star.util.XCloseable;
51*b1cdbd2cSJim Jagielski import com.sun.star.beans.PropertyValue;
52*b1cdbd2cSJim Jagielski import com.sun.star.beans.XPropertySet;
53*b1cdbd2cSJim Jagielski import com.sun.star.lang.XComponent;
54*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiComponentFactory;
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski /** This class implements a http servlet in order to convert an incoming document
58*b1cdbd2cSJim Jagielski  * with help of a running OpenOffice.org and to push the converted file back
59*b1cdbd2cSJim Jagielski  * to the client.
60*b1cdbd2cSJim Jagielski  */
61*b1cdbd2cSJim Jagielski public class ConverterServlet extends HttpServlet {
62*b1cdbd2cSJim Jagielski     /** Specifies the temporary directory on the web server.
63*b1cdbd2cSJim Jagielski      */
64*b1cdbd2cSJim Jagielski     private String stringWorkingDirectory =
65*b1cdbd2cSJim Jagielski     System.getProperty( "java.io.tmpdir" ).replace( '\\', '/' );
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski     /** Specifies the host for the office server.
68*b1cdbd2cSJim Jagielski      */
69*b1cdbd2cSJim Jagielski     private String stringHost = "localhost";
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski     /** Specifies the port for the office server.
72*b1cdbd2cSJim Jagielski      */
73*b1cdbd2cSJim Jagielski     private String stringPort = "2083";
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski     /** Called by the server (via the service method) to allow a servlet to handle
76*b1cdbd2cSJim Jagielski      * a POST request. The file from the client will be uploaded to the web server
77*b1cdbd2cSJim Jagielski      * and converted on the web server and after all pushed to the client.
78*b1cdbd2cSJim Jagielski      * @param request Object that contains the request the client has made of the servlet.
79*b1cdbd2cSJim Jagielski      * @param response Object that contains the response the servlet sends to the client.
80*b1cdbd2cSJim Jagielski      * @throws ServletException If the request for the POST could not be handled.
81*b1cdbd2cSJim Jagielski      * @throws IOException If an input or output error is detected when the servlet handles the request.
82*b1cdbd2cSJim Jagielski      */
doPost( HttpServletRequest request, HttpServletResponse response)83*b1cdbd2cSJim Jagielski     protected void doPost( HttpServletRequest request,
84*b1cdbd2cSJim Jagielski                            HttpServletResponse response) throws ServletException, java.io.IOException {
85*b1cdbd2cSJim Jagielski         try {
86*b1cdbd2cSJim Jagielski             // If necessary, add a slash to the end of the string.
87*b1cdbd2cSJim Jagielski             if ( !stringWorkingDirectory.endsWith( "/" ) ) {
88*b1cdbd2cSJim Jagielski                 stringWorkingDirectory += "/";
89*b1cdbd2cSJim Jagielski             }
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski             // Construct a MultipartRequest to help read the information.
92*b1cdbd2cSJim Jagielski             // Pass in the request, a directory to save files to, and the
93*b1cdbd2cSJim Jagielski             // maximum POST size we should attempt to handle.
94*b1cdbd2cSJim Jagielski             MultipartRequest multipartrequest =
95*b1cdbd2cSJim Jagielski                 new MultipartRequest( request, stringWorkingDirectory, 5 * 1024 * 1024 );
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski             // Getting all file names from the request
98*b1cdbd2cSJim Jagielski             Enumeration files = multipartrequest.getFileNames();
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski             // Every received file will be converted to the specified type
101*b1cdbd2cSJim Jagielski             while (files.hasMoreElements()) {
102*b1cdbd2cSJim Jagielski                 // Getting the name from the element
103*b1cdbd2cSJim Jagielski                 String stringName = (String)files.nextElement();
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski                 // Getting the filename from the request
106*b1cdbd2cSJim Jagielski                 String stringFilename =
107*b1cdbd2cSJim Jagielski                     multipartrequest.getFilesystemName( stringName );
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski                 // Converting the given file on the server to the specified type and
110*b1cdbd2cSJim Jagielski                 // append a special extension
111*b1cdbd2cSJim Jagielski                 File cleanupFile = null;
112*b1cdbd2cSJim Jagielski                 String stringSourceFile = stringWorkingDirectory + stringFilename;
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski                 try {
115*b1cdbd2cSJim Jagielski                     String stringConvertedFile = convertDocument(stringSourceFile,
116*b1cdbd2cSJim Jagielski                         multipartrequest.getParameter( "converttype" ),
117*b1cdbd2cSJim Jagielski                         multipartrequest.getParameter( "extension" ));
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski                     String shortFileName = stringConvertedFile.substring(
120*b1cdbd2cSJim Jagielski                         stringConvertedFile.lastIndexOf('/') + 1);
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski                     // Set the response header
123*b1cdbd2cSJim Jagielski                     // Set the filename, is used when the file will be saved (problem with mozilla)
124*b1cdbd2cSJim Jagielski                     response.addHeader( "Content-Disposition",
125*b1cdbd2cSJim Jagielski                                         "attachment; filename=" + shortFileName);
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski                     // Constructing the multi part response to the client
128*b1cdbd2cSJim Jagielski                     MultipartResponse multipartresponse = new MultipartResponse(response);
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski                     // Is the convert type HTML?
131*b1cdbd2cSJim Jagielski                     if ( ( multipartrequest.getParameter( "converttype" ).equals(
132*b1cdbd2cSJim Jagielski                                "swriter: HTML (StarWriter)" ) )
133*b1cdbd2cSJim Jagielski                          || ( multipartrequest.getParameter( "converttype" ).equals(
134*b1cdbd2cSJim Jagielski                                   "scalc: HTML (StarCalc)" ) ) ) {
135*b1cdbd2cSJim Jagielski                         // Setting the content type of the response being sent to the client
136*b1cdbd2cSJim Jagielski                         // to text
137*b1cdbd2cSJim Jagielski                         multipartresponse.startResponse( "text/html" );
138*b1cdbd2cSJim Jagielski                     } else {
139*b1cdbd2cSJim Jagielski                         // Setting the content type of the response being sent to the client
140*b1cdbd2cSJim Jagielski                         // to application/octet-stream so that file will open a dialog box
141*b1cdbd2cSJim Jagielski                         // at the client in order to save the converted file
142*b1cdbd2cSJim Jagielski                         multipartresponse.startResponse( "application/octet-stream" );
143*b1cdbd2cSJim Jagielski                     }
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski                     // Pushing the converted file to the client
146*b1cdbd2cSJim Jagielski                     ServletUtils.returnFile( stringConvertedFile,
147*b1cdbd2cSJim Jagielski                                              response.getOutputStream() );
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski                     // Finishing the multi part response
150*b1cdbd2cSJim Jagielski                     multipartresponse.finish();
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski                     // clean up the working directory
153*b1cdbd2cSJim Jagielski                     cleanupFile = new File(stringConvertedFile);
154*b1cdbd2cSJim Jagielski                     if ( cleanupFile.exists() )
155*b1cdbd2cSJim Jagielski                         cleanupFile.delete();
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski                 } catch (Exception exc) {
158*b1cdbd2cSJim Jagielski                     response.setContentType( "text/html;charset=8859-1" );
159*b1cdbd2cSJim Jagielski                     PrintWriter out = response.getWriter();
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski                     exc.printStackTrace();
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski                     out.println( "<html><head>" );
164*b1cdbd2cSJim Jagielski                     out.println( " <title>" + "SDK Converter Servlet" + "</title>" );
165*b1cdbd2cSJim Jagielski                     out.println( "</head>" );
166*b1cdbd2cSJim Jagielski                     out.println( "<body><br><p>");
167*b1cdbd2cSJim Jagielski                     out.println( "<b>Sorry, the conversion failed!</b></p>");
168*b1cdbd2cSJim Jagielski                     out.println( "<p><b>Error Mesage:</b><br>" + exc.getMessage() + "<br>");
169*b1cdbd2cSJim Jagielski                     exc.printStackTrace(out);
170*b1cdbd2cSJim Jagielski                     out.println( "</p></body><html>");
171*b1cdbd2cSJim Jagielski                 }
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski                 // clean up the working directory
174*b1cdbd2cSJim Jagielski                 cleanupFile = new File(stringSourceFile);
175*b1cdbd2cSJim Jagielski                 if ( cleanupFile.exists() )
176*b1cdbd2cSJim Jagielski                     cleanupFile.delete();
177*b1cdbd2cSJim Jagielski             }
178*b1cdbd2cSJim Jagielski         }
179*b1cdbd2cSJim Jagielski         catch (Exception exception) {
180*b1cdbd2cSJim Jagielski             System.err.println( exception.toString() );
181*b1cdbd2cSJim Jagielski         }
182*b1cdbd2cSJim Jagielski     }
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski     /** This method converts a document to a given type by using a running
185*b1cdbd2cSJim Jagielski      * OpenOffice.org and saves the converted document to the specified
186*b1cdbd2cSJim Jagielski      * working directory.
187*b1cdbd2cSJim Jagielski      * @param stringDocumentName The full path name of the file on the server to be converted.
188*b1cdbd2cSJim Jagielski      * @param stringConvertType Type to convert to.
189*b1cdbd2cSJim Jagielski      * @param stringExtension This string will be appended to the file name of the converted file.
190*b1cdbd2cSJim Jagielski      * @return The full path name of the converted file will be returned.
191*b1cdbd2cSJim Jagielski      * @see stringWorkingDirectory
192*b1cdbd2cSJim Jagielski      */
convertDocument( String stringDocumentName, String stringConvertType, String stringExtension)193*b1cdbd2cSJim Jagielski     private String convertDocument( String stringDocumentName,
194*b1cdbd2cSJim Jagielski                                     String stringConvertType,
195*b1cdbd2cSJim Jagielski                                     String stringExtension)
196*b1cdbd2cSJim Jagielski         throws Exception
197*b1cdbd2cSJim Jagielski     {
198*b1cdbd2cSJim Jagielski         String stringConvertedFile = "";
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski         // Converting the document to the favoured type
201*b1cdbd2cSJim Jagielski //         try {
202*b1cdbd2cSJim Jagielski             // Composing the URL
203*b1cdbd2cSJim Jagielski             String stringUrl = "file:///" + stringDocumentName;
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski             /* Bootstraps a component context with the jurt base components
206*b1cdbd2cSJim Jagielski                registered. Component context to be granted to a component for running.
207*b1cdbd2cSJim Jagielski                Arbitrary values can be retrieved from the context. */
208*b1cdbd2cSJim Jagielski             XComponentContext xcomponentcontext =
209*b1cdbd2cSJim Jagielski                 com.sun.star.comp.helper.Bootstrap.createInitialComponentContext( null );
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski             /* Gets the service manager instance to be used (or null). This method has
212*b1cdbd2cSJim Jagielski                been added for convenience, because the service manager is a often used
213*b1cdbd2cSJim Jagielski                object. */
214*b1cdbd2cSJim Jagielski             XMultiComponentFactory xmulticomponentfactory =
215*b1cdbd2cSJim Jagielski                 xcomponentcontext.getServiceManager();
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski             /* Creates an instance of the component UnoUrlResolver which
218*b1cdbd2cSJim Jagielski                supports the services specified by the factory. */
219*b1cdbd2cSJim Jagielski             Object objectUrlResolver =
220*b1cdbd2cSJim Jagielski                 xmulticomponentfactory.createInstanceWithContext(
221*b1cdbd2cSJim Jagielski                     "com.sun.star.bridge.UnoUrlResolver", xcomponentcontext );
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski             // Create a new url resolver
224*b1cdbd2cSJim Jagielski             XUnoUrlResolver xurlresolver = ( XUnoUrlResolver )
225*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface( XUnoUrlResolver.class,
226*b1cdbd2cSJim Jagielski                                            objectUrlResolver );
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski             // Resolves an object that is specified as follow:
229*b1cdbd2cSJim Jagielski             // uno:<connection description>;<protocol description>;<initial object name>
230*b1cdbd2cSJim Jagielski             Object objectInitial = xurlresolver.resolve(
231*b1cdbd2cSJim Jagielski                 "uno:socket,host=" + stringHost + ",port=" + stringPort +
232*b1cdbd2cSJim Jagielski                 ";urp;StarOffice.ServiceManager" );
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski             // Create a service manager from the initial object
235*b1cdbd2cSJim Jagielski             xmulticomponentfactory = ( XMultiComponentFactory )
236*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface( XMultiComponentFactory.class, objectInitial );
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski             // Query for the XPropertySet interface.
239*b1cdbd2cSJim Jagielski             XPropertySet xpropertysetMultiComponentFactory = ( XPropertySet )
240*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface( XPropertySet.class, xmulticomponentfactory );
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski             // Get the default context from the office server.
243*b1cdbd2cSJim Jagielski             Object objectDefaultContext =
244*b1cdbd2cSJim Jagielski                 xpropertysetMultiComponentFactory.getPropertyValue( "DefaultContext" );
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski             // Query for the interface XComponentContext.
247*b1cdbd2cSJim Jagielski             xcomponentcontext = ( XComponentContext ) UnoRuntime.queryInterface(
248*b1cdbd2cSJim Jagielski                 XComponentContext.class, objectDefaultContext );
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski             /* A desktop environment contains tasks with one or more
251*b1cdbd2cSJim Jagielski                frames in which components can be loaded. Desktop is the
252*b1cdbd2cSJim Jagielski                environment for components which can instanciate within
253*b1cdbd2cSJim Jagielski                frames. */
254*b1cdbd2cSJim Jagielski             XComponentLoader xcomponentloader = ( XComponentLoader )
255*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface( XComponentLoader.class,
256*b1cdbd2cSJim Jagielski                                            xmulticomponentfactory.createInstanceWithContext(
257*b1cdbd2cSJim Jagielski                                                "com.sun.star.frame.Desktop", xcomponentcontext ) );
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski             // Preparing properties for loading the document
260*b1cdbd2cSJim Jagielski             PropertyValue propertyvalue[] = new PropertyValue[ 1 ];
261*b1cdbd2cSJim Jagielski             // Setting the flag for hidding the open document
262*b1cdbd2cSJim Jagielski             propertyvalue[ 0 ] = new PropertyValue();
263*b1cdbd2cSJim Jagielski             propertyvalue[ 0 ].Name = "Hidden";
264*b1cdbd2cSJim Jagielski             propertyvalue[ 0 ].Value = new Boolean(true);
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski             // Loading the wanted document
267*b1cdbd2cSJim Jagielski             Object objectDocumentToStore =
268*b1cdbd2cSJim Jagielski                 xcomponentloader.loadComponentFromURL(
269*b1cdbd2cSJim Jagielski                     stringUrl, "_blank", 0, propertyvalue );
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski             // Getting an object that will offer a simple way to store a document to a URL.
272*b1cdbd2cSJim Jagielski             XStorable xstorable =
273*b1cdbd2cSJim Jagielski                 ( XStorable ) UnoRuntime.queryInterface( XStorable.class,
274*b1cdbd2cSJim Jagielski                                                          objectDocumentToStore );
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski             // Preparing properties for converting the document
277*b1cdbd2cSJim Jagielski             propertyvalue = new PropertyValue[ 2 ];
278*b1cdbd2cSJim Jagielski             // Setting the flag for overwriting
279*b1cdbd2cSJim Jagielski             propertyvalue[ 0 ] = new PropertyValue();
280*b1cdbd2cSJim Jagielski             propertyvalue[ 0 ].Name = "Overwrite";
281*b1cdbd2cSJim Jagielski             propertyvalue[ 0 ].Value = new Boolean(true);
282*b1cdbd2cSJim Jagielski             // Setting the filter name
283*b1cdbd2cSJim Jagielski             propertyvalue[ 1 ] = new PropertyValue();
284*b1cdbd2cSJim Jagielski             propertyvalue[ 1 ].Name = "FilterName";
285*b1cdbd2cSJim Jagielski             propertyvalue[ 1 ].Value = stringConvertType;
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski             // Appending the favoured extension to the origin document name
288*b1cdbd2cSJim Jagielski             int index = stringUrl.lastIndexOf('.');
289*b1cdbd2cSJim Jagielski             if ( index >= 0 ) {
290*b1cdbd2cSJim Jagielski                 stringConvertedFile = stringUrl.substring(0, index) + "." + stringExtension;
291*b1cdbd2cSJim Jagielski             } else {
292*b1cdbd2cSJim Jagielski                 stringConvertedFile = stringUrl + "." + stringExtension;
293*b1cdbd2cSJim Jagielski             }
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski             // Storing and converting the document
296*b1cdbd2cSJim Jagielski             xstorable.storeAsURL( stringConvertedFile, propertyvalue );
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski             XCloseable xcloseable = (XCloseable)UnoRuntime.queryInterface( XCloseable.class,xstorable );
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski             // Closing the converted document
301*b1cdbd2cSJim Jagielski             if ( xcloseable != null )
302*b1cdbd2cSJim Jagielski                 xcloseable.close(false);
303*b1cdbd2cSJim Jagielski             else {
304*b1cdbd2cSJim Jagielski                 // If Xcloseable is not supported (older versions,
305*b1cdbd2cSJim Jagielski                 // use dispose() for closing the document
306*b1cdbd2cSJim Jagielski                 XComponent xComponent = ( XComponent ) UnoRuntime.queryInterface(
307*b1cdbd2cSJim Jagielski                     XComponent.class, xstorable );
308*b1cdbd2cSJim Jagielski                 xComponent.dispose();
309*b1cdbd2cSJim Jagielski             }
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski //         }
312*b1cdbd2cSJim Jagielski //         catch( Exception exception ) {
313*b1cdbd2cSJim Jagielski //             exception.printStackTrace();
314*b1cdbd2cSJim Jagielski //             return( "" );
315*b1cdbd2cSJim Jagielski //         }
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski         if ( stringConvertedFile.startsWith( "file:///" ) ) {
318*b1cdbd2cSJim Jagielski             // Truncating the beginning of the file name
319*b1cdbd2cSJim Jagielski             stringConvertedFile = stringConvertedFile.substring( 8 );
320*b1cdbd2cSJim Jagielski         }
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski         // Returning the name of the converted file
323*b1cdbd2cSJim Jagielski         return stringConvertedFile;
324*b1cdbd2cSJim Jagielski     }
325*b1cdbd2cSJim Jagielski }
326