public void start(boolean restart) throws IOException { ProcessQuery processQuery = new ProcessQuery("soffice.bin", unoUrl.getAcceptString()); long existingPid = processManager.findPid(processQuery); if (!(existingPid == PID_NOT_FOUND || existingPid == PID_UNKNOWN)) { throw new IllegalStateException( String.format( "a process with acceptString '%s' is already running; pid %d", unoUrl.getAcceptString(), existingPid)); } if (!restart) { prepareInstanceProfileDir(); } List<String> command = new ArrayList<String>(); File executable = OfficeUtils.getOfficeExecutable(officeHome); if (runAsArgs != null) { command.addAll(Arrays.asList(runAsArgs)); } command.add(executable.getAbsolutePath()); command.add("-accept=" + unoUrl.getAcceptString() + ";urp;"); command.add("-env:UserInstallation=" + OfficeUtils.toUrl(instanceProfileDir)); command.add("-headless"); command.add("-nocrashreport"); command.add("-nodefault"); command.add("-nofirststartwizard"); command.add("-nolockcheck"); command.add("-nologo"); command.add("-norestore"); ProcessBuilder processBuilder = new ProcessBuilder(command); if (PlatformUtils.isWindows()) { addBasisAndUrePaths(processBuilder); } logger.info( String.format( "starting process with acceptString '%s' and profileDir '%s'", unoUrl, instanceProfileDir)); process = processBuilder.start(); pid = processManager.findPid(processQuery); if (pid == PID_NOT_FOUND) { throw new IllegalStateException( String.format( "process with acceptString '%s' started but its pid could not be found", unoUrl.getAcceptString())); } logger.info("started process" + (pid != PID_UNKNOWN ? "; pid = " + pid : "")); }
public OfficeManager buildOfficeManager() throws IllegalStateException { if (officeHome == null) throw new IllegalStateException("officeHome not set and could not be auto-detected"); else if (!officeHome.isDirectory()) throw new IllegalStateException( "officeHome doesn't exist or is not a directory: " + officeHome); else if (!OfficeUtils.getOfficeExecutable(officeHome).isFile()) throw new IllegalStateException( "invalid officeHome: it doesn't contain soffice.bin: " + officeHome); if (templateProfileDir != null && !isValidProfileDir(templateProfileDir)) throw new IllegalStateException( "templateProfileDir doesn't appear to contain a user profile: " + templateProfileDir); if (!workDir.isDirectory()) throw new IllegalStateException("workDir doesn't exist or is not a directory: " + workDir); if (processManager == null) processManager = findBestProcessManager(); final int numInstances = connectionProtocol == OfficeConnectionProtocol.PIPE ? pipeNames.length : portNumbers.length; final UnoUrl[] unoUrls = new UnoUrl[numInstances]; for (int i = 0; i < numInstances; i++) unoUrls[i] = connectionProtocol == OfficeConnectionProtocol.PIPE ? UnoUrl.pipe(pipeNames[i]) : UnoUrl.socket(portNumbers[i]); return new ProcessPoolOfficeManager( officeHome, unoUrls, runAsArgs, templateProfileDir, workDir, retryTimeout, taskQueueTimeout, taskExecutionTimeout, maxTasksPerProcess, processManager, manageExternalInstances); }
private File getInstanceProfileDir(File workDir, UnoUrl unoUrl) { String dirName = ".jodconverter_" + unoUrl.getAcceptString().replace(',', '_').replace('=', '-'); return new File(workDir, dirName); }