Java tutorial
/******************************************************************************* * Copyright (C) 2010 Marco Sandrini * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public * License along with this program. * If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package org.casbah.provider.openssl; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeUnit; import org.apache.commons.io.IOUtils; public class OpenSslWrapper { private static final String CASBAH_SSL_CA_ROOT = "CASBAH_SSL_CA_ROOT"; private final String opensslExecutable; private final File caRootDir; private static final long TIMEOUT = 60; public OpenSslWrapper(String opensslExecutable, File caRootDir) { this.opensslExecutable = opensslExecutable; this.caRootDir = caRootDir; } public int executeCommand(String input, StringBuffer output, StringBuffer error, final List<String> parameters) throws IOException, InterruptedException { ByteArrayInputStream bais = null; ByteArrayOutputStream outputStream = null; ByteArrayOutputStream errorStream = null; if (input != null) { bais = new ByteArrayInputStream(input.getBytes()); } try { outputStream = new ByteArrayOutputStream(); errorStream = new ByteArrayOutputStream(); int result = executeCommand(bais, outputStream, errorStream, parameters); output.append(outputStream.toString()); error.append(errorStream.toString()); return result; } finally { IOUtils.closeQuietly(bais); IOUtils.closeQuietly(outputStream); IOUtils.closeQuietly(errorStream); } } public int executeCommand(StringBuffer output, StringBuffer error, final List<String> parameters) throws IOException, InterruptedException { return executeCommand(null, output, error, parameters); } public int executeCommand(InputStream input, OutputStream output, OutputStream error, final List<String> parameters) throws IOException, InterruptedException { List<String> fullParams = new ArrayList<String>(parameters); fullParams.add(0, opensslExecutable); ProcessBuilder processBuilder = new ProcessBuilder(fullParams); CyclicBarrier barrier = new CyclicBarrier(3); Map<String, String> env = processBuilder.environment(); env.put(CASBAH_SSL_CA_ROOT, caRootDir.getAbsolutePath()); Process proc = processBuilder.start(); if (input != null) { BufferedOutputStream stdin = new BufferedOutputStream(proc.getOutputStream()); IOUtils.copy(input, stdin); stdin.flush(); } StreamConsumer outputConsumer = new StreamConsumer(output, proc.getInputStream(), barrier, TIMEOUT); StreamConsumer errorConsumer = new StreamConsumer(error, proc.getErrorStream(), barrier, TIMEOUT); outputConsumer.start(); errorConsumer.start(); int returnValue = proc.waitFor(); try { barrier.await(TIMEOUT, TimeUnit.SECONDS); } catch (Exception e) { e.printStackTrace(); } return returnValue; } }