All Downloads are FREE. Search and download functionalities are using the official Maven repository.

schemacrawler.tools.integration.graph.ProcessExecutor Maven / Gradle / Ivy

/*
 * SchemaCrawler
 * http://sourceforge.net/projects/schemacrawler
 * Copyright (c) 2000-2015, Sualeh Fatehi.
 * This library is free software; you can redistribute it and/or modify it under
 * the terms
 * of the GNU Lesser General Public License as published by the Free Software
 * Foundation;
 * either version 2.1 of the License, or (at your option) any later version.
 * This library 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 Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public License
 * along with this
 * library; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330,
 * Boston, MA 02111-1307, USA.
 */
package schemacrawler.tools.integration.graph;


import static sf.util.Utility.containsWhitespace;
import static sf.util.Utility.readFully;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.logging.Level;
import java.util.logging.Logger;

public final class ProcessExecutor
{

  final class StreamReader
    implements Callable
  {

    private final InputStream in;

    private StreamReader(final InputStream in)
    {
      if (in == null)
      {
        throw new RuntimeException("No input stream provided");
      }
      this.in = in;
    }

    @Override
    public String call()
      throws Exception
    {
      final Reader reader = new BufferedReader(new InputStreamReader(in));
      return readFully(reader);
    }

  }

  static private String createCommandLine(final List command)
  {
    final StringBuilder sb = new StringBuilder();
    boolean first = true;
    for (final String arg: command)
    {
      if (first)
      {
        first = false;
      }
      else
      {
        sb.append(" ");
      }
      if (containsWhitespace(arg))
      {
        sb.append("\"").append(arg).append("\"");
      }
      else
      {
        sb.append(arg);
      }
    }
    return sb.toString();
  }

  private static final Logger LOGGER = Logger.getLogger(ProcessExecutor.class
    .getName());

  private final List command;
  private String processOutput;

  private String processError;

  public ProcessExecutor(final List command)
    throws IOException
  {
    if (command == null || command.isEmpty())
    {
      throw new RuntimeException("No command provided");
    }
    this.command = command;
    LOGGER.log(Level.CONFIG, command.toString());
  }

  public int execute()
    throws IOException
  {
    LOGGER.log(Level.CONFIG, "Executing:\n" + createCommandLine(command));

    final ExecutorService threadPool = Executors.newFixedThreadPool(2);
    try
    {

      final ProcessBuilder processBuilder = new ProcessBuilder(command);
      final Process process = processBuilder.start();

      final FutureTask inReaderTask = new FutureTask<>(new StreamReader(process
        .getInputStream()));
      threadPool.execute(inReaderTask);
      final FutureTask errReaderTask = new FutureTask<>(new StreamReader(process
        .getErrorStream()));
      threadPool.execute(errReaderTask);

      final int exitCode = process.waitFor();

      processOutput = inReaderTask.get();
      processError = errReaderTask.get();

      return exitCode;
    }
    catch (final SecurityException | ExecutionException | InterruptedException e)
    {
      throw new IOException(e.getMessage(), e);
    }
    finally
    {
      threadPool.shutdown();
    }
  }

  public String getProcessError()
  {
    return processError;
  }

  public String getProcessOutput()
  {
    return processOutput;
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy