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