blob: bf246960035373fb51b20ce876790d457f25b907 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_112) on Mon Dec 18 11:25:20 EST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>CommandStreams (Apache Edgent (incubating) v1.2.0 API)</title>
<meta name="date" content="2017-12-18">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="CommandStreams (Apache Edgent (incubating) v1.2.0 API)";
}
}
catch(err) {
}
//-->
var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/CommandStreams.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>Prev&nbsp;Class</li>
<li>Next&nbsp;Class</li>
</ul>
<ul class="navList">
<li><a href="../../../../../index.html?org/apache/edgent/connectors/command/CommandStreams.html" target="_top">Frames</a></li>
<li><a href="CommandStreams.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">org.apache.edgent.connectors.command</div>
<h2 title="Class CommandStreams" class="title">Class CommandStreams</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
<li>
<ul class="inheritance">
<li>org.apache.edgent.connectors.command.CommandStreams</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<br>
<pre>public class <span class="typeNameLabel">CommandStreams</span>
extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
<div class="block">Connector for creating a TStream from a Command's / OS Process's output
and sinking a TStream to a Command's / OS Process's input.
<P>
e.g., run a network monitor command (like Tiger Shark) and ingest its output.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>static <a href="../../../../../org/apache/edgent/function/Supplier.html" title="interface in org.apache.edgent.function">Supplier</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#commandReaderList-java.lang.ProcessBuilder-">commandReaderList</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang">ProcessBuilder</a>&nbsp;cmd)</code>
<div class="block">Create a <code>Supplier&lt;List&lt;String&gt;&gt;</code> to ingest a command's output.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>static <a href="../../../../../org/apache/edgent/function/Consumer.html" title="interface in org.apache.edgent.function">Consumer</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#commandWriter-java.lang.ProcessBuilder-">commandWriter</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang">ProcessBuilder</a>&nbsp;cmd)</code>
<div class="block">Create a <code>Consumer&lt;String&gt;</code> to write UTF8 string data to a command's input.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>static <a href="../../../../../org/apache/edgent/function/Supplier.html" title="interface in org.apache.edgent.function">Supplier</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#endlessCommandReader-java.lang.ProcessBuilder-">endlessCommandReader</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang">ProcessBuilder</a>&nbsp;cmd)</code>
<div class="block">Create an endless <code>Supplier&lt;String&gt;</code> for ingesting a long running command's output.</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>static <a href="../../../../../org/apache/edgent/topology/TStream.html" title="interface in org.apache.edgent.topology">TStream</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#generate-org.apache.edgent.topology.Topology-java.lang.ProcessBuilder-">generate</a></span>(<a href="../../../../../org/apache/edgent/topology/Topology.html" title="interface in org.apache.edgent.topology">Topology</a>&nbsp;topology,
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang">ProcessBuilder</a>&nbsp;cmd)</code>
<div class="block">Create an endless <code>TStream&lt;String&gt;</code> from a long running command's output.</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>static <a href="../../../../../org/apache/edgent/topology/TStream.html" title="interface in org.apache.edgent.topology">TStream</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#periodicSource-org.apache.edgent.topology.Topology-java.lang.ProcessBuilder-long-java.util.concurrent.TimeUnit-">periodicSource</a></span>(<a href="../../../../../org/apache/edgent/topology/Topology.html" title="interface in org.apache.edgent.topology">Topology</a>&nbsp;topology,
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang">ProcessBuilder</a>&nbsp;cmd,
long&nbsp;period,
<a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;units)</code>
<div class="block">Create a <code>TStream&lt;String&gt;</code> from a periodically run command's output.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>static <a href="../../../../../org/apache/edgent/topology/TSink.html" title="interface in org.apache.edgent.topology">TSink</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#sink-org.apache.edgent.topology.TStream-java.lang.ProcessBuilder-">sink</a></span>(<a href="../../../../../org/apache/edgent/topology/TStream.html" title="interface in org.apache.edgent.topology">TStream</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;stream,
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang">ProcessBuilder</a>&nbsp;cmd)</code>
<div class="block">Sink a <code>TStream&lt;String&gt;</code> to a command's input.</div>
</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>static <a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#tokenize-java.lang.String-">tokenize</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmdString)</code>
<div class="block">Tokenize the specified <code>cmdString</code> in the exact same manner as
done by <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html?is-external=true#exec-java.lang.String-" title="class or interface in java.lang"><code>Runtime.exec(String)</code></a>.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></h3>
<code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<li class="blockList"><a name="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a name="tokenize-java.lang.String-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>tokenize</h4>
<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;tokenize(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmdString)</pre>
<div class="block">Tokenize the specified <code>cmdString</code> in the exact same manner as
done by <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html?is-external=true#exec-java.lang.String-" title="class or interface in java.lang"><code>Runtime.exec(String)</code></a>.
<P>
This function provides a convenience for creating a <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang"><code>ProcessBuilder</code></a>
for use by the other CommandStreams methods.
</P>
<P>
Sample use:
<pre><code>
ProcessBuilder cmd = new ProcessBuilder(tokenize("sh someShellCmd.sh and args"));
TStream&lt;String&gt; stream = CommandStreams.generate(topology, cmd);
</code></pre></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>cmdString</code> - a command string</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the tokens</dd>
</dl>
</li>
</ul>
<a name="generate-org.apache.edgent.topology.Topology-java.lang.ProcessBuilder-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>generate</h4>
<pre>public static&nbsp;<a href="../../../../../org/apache/edgent/topology/TStream.html" title="interface in org.apache.edgent.topology">TStream</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;generate(<a href="../../../../../org/apache/edgent/topology/Topology.html" title="interface in org.apache.edgent.topology">Topology</a>&nbsp;topology,
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang">ProcessBuilder</a>&nbsp;cmd)</pre>
<div class="block">Create an endless <code>TStream&lt;String&gt;</code> from a long running command's output.
<P>
The supplied <code>cmd</code> is used to start the command.
A tuple is created for each UTF8 line read from the command's
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Process.html?is-external=true#getInputStream--" title="class or interface in java.lang"><code>output</code></a>.
The tuples contain output from stderr if cmd is configured to
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true#redirectErrorStream-boolean-" title="class or interface in java.lang"><code>redirect stderr to stdout</code></a>.
The command is restarted if a read from the command's output stream
returns EOF or an error.
</P>
<P>
This is a convenience function equivalent to
<code>topology.generate(endlessCommandReader(cmd))</code>.
</P>
<P>
Sample use: create a stream of tuples for the output from a
continuously running and restartable command:
<pre><code>
ProcessBuilder cmd = new ProcessBuilder("myCommand");
TStream&lt;String&gt; cmdOutput = CommandStreams.generate(topology, cmd);
cmdOutput.print();
</code></pre></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>topology</code> - the topology to add the source stream to</dd>
<dd><code>cmd</code> - the <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang"><code>ProcessBuilder</code></a> to start the command</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the source <code>TStream&lt;String&gt;</code></dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#endlessCommandReader-java.lang.ProcessBuilder-"><code>endlessCommandReader(ProcessBuilder)</code></a>,
<a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#tokenize-java.lang.String-"><code>tokenize(String)</code></a></dd>
</dl>
</li>
</ul>
<a name="periodicSource-org.apache.edgent.topology.Topology-java.lang.ProcessBuilder-long-java.util.concurrent.TimeUnit-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>periodicSource</h4>
<pre>public static&nbsp;<a href="../../../../../org/apache/edgent/topology/TStream.html" title="interface in org.apache.edgent.topology">TStream</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;periodicSource(<a href="../../../../../org/apache/edgent/topology/Topology.html" title="interface in org.apache.edgent.topology">Topology</a>&nbsp;topology,
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang">ProcessBuilder</a>&nbsp;cmd,
long&nbsp;period,
<a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;units)</pre>
<div class="block">Create a <code>TStream&lt;String&gt;</code> from a periodically run command's output.
<P>
The supplied <code>cmd</code> is used to start the command
at the specified <code>period</code>.
The command's UTF8 <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Process.html?is-external=true#getInputStream--" title="class or interface in java.lang"><code>output</code></a> is read until EOF
and a <code>List&lt;String&gt;</code> tuple is created containing the collected output.
The tuples contain output from stderr if the cmd is configured to
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true#redirectErrorStream-boolean-" title="class or interface in java.lang"><code>redirect stderr to stdout</code></a>.
</P>
<P>
This is a convenience function equivalent to
<code>topology.poll(commandReaderList(cmd), period, units)</code>.
</P>
<P>
Sample use: create a stream of tuples containing the output
from a periodically run command:
<pre><code>
ProcessBuilder cmd = new ProcessBuilder("date");
TStream&lt;List&lt;String&gt;&gt; cmdOutput =
CommandStreams.periodicSource(topology, cmd, 2, TimeUnit.SECONDS);
cmdOutput.print();
</code></pre></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>topology</code> - the topology to add the source stream to</dd>
<dd><code>cmd</code> - the <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang"><code>ProcessBuilder</code></a> to start the command</dd>
<dd><code>period</code> - the period to run the command and collect its output</dd>
<dd><code>units</code> - TimeUnit for <code>period</code></dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the source <code>TStream&lt;List&lt;String&gt;&gt;</code></dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#commandReaderList-java.lang.ProcessBuilder-"><code>commandReaderList(ProcessBuilder)</code></a>,
<a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#tokenize-java.lang.String-"><code>tokenize(String)</code></a></dd>
</dl>
</li>
</ul>
<a name="sink-org.apache.edgent.topology.TStream-java.lang.ProcessBuilder-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>sink</h4>
<pre>public static&nbsp;<a href="../../../../../org/apache/edgent/topology/TSink.html" title="interface in org.apache.edgent.topology">TSink</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;sink(<a href="../../../../../org/apache/edgent/topology/TStream.html" title="interface in org.apache.edgent.topology">TStream</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;stream,
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang">ProcessBuilder</a>&nbsp;cmd)</pre>
<div class="block">Sink a <code>TStream&lt;String&gt;</code> to a command's input.
<P>
The supplied <code>cmd</code> is used to start the command.
Each tuple is written as UTF8 and flushed to the command's <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Process.html?is-external=true#getOutputStream--" title="class or interface in java.lang"><code>input</code></a>.
The command is restarted if a write encounters an error.
</P>
<P>
While each write is followed by a flush() that only helps to
reduce the time it takes to notice that cmd has failed and restart it.
Supposedly "successfully written and flushed" values are not guaranteed to
have been received by a cmd across restarts.
</P>
<P>
This is a convenience function equivalent to
<code>stream.sink(commandWriter(cmd))</code>
</P>
<P>
Sample use: write a stream of tuples to the input of a command:
<pre><code>
TStream&lt;String&gt; stream = topology.strings("one", "two", "three");
ProcessBuilder cmd = new ProcessBuilder("cat").redirectOutput(new File("/dev/stdout"));
CommandStreams.sink(stream, cmd);
</code></pre></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>stream</code> - the stream to sink</dd>
<dd><code>cmd</code> - the <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang"><code>ProcessBuilder</code></a> to start the command</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>a <a href="../../../../../org/apache/edgent/topology/TSink.html" title="interface in org.apache.edgent.topology"><code>TSink</code></a></dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#commandWriter-java.lang.ProcessBuilder-"><code>commandWriter(ProcessBuilder)</code></a>,
<a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#tokenize-java.lang.String-"><code>tokenize(String)</code></a></dd>
</dl>
</li>
</ul>
<a name="endlessCommandReader-java.lang.ProcessBuilder-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>endlessCommandReader</h4>
<pre>public static&nbsp;<a href="../../../../../org/apache/edgent/function/Supplier.html" title="interface in org.apache.edgent.function">Supplier</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;endlessCommandReader(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang">ProcessBuilder</a>&nbsp;cmd)</pre>
<div class="block">Create an endless <code>Supplier&lt;String&gt;</code> for ingesting a long running command's output.
<P>
This method is particularly helpful in creating a sensor or source connector
class that hides the fact that it uses a command, enabling it to be used
like any other sensor/connector.
</P>
For example:
<pre><code>
// ingest the sensor data
TStream&lt;MySensorData&gt; stream = topology.generate(new MySensor());
// MySensor class
class MySensor implements Supplier&lt;MySensorData&gt; {
private String[] cmd = new String[] {"mySensorCmd", "arg1"};
private Supplier&lt;String&gt; commandReader =
CommandStreams.endlessCommandReader(new ProcessBuilder(cmd));
// implement Supplier&lt;MySensorData&gt;.get()
public MySensorData get() {
// get the next line from the cmd and create a MySensorData tuple from it
return createMySensorData(commandReader.get());
}
}
</code></pre>
<P>
The supplied <code>cmd</code> is used to start the command.
A call to <a href="../../../../../org/apache/edgent/function/Supplier.html#get--"><code>Supplier.get()</code></a> reads the next UTF8 line from the command's
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Process.html?is-external=true#getInputStream--" title="class or interface in java.lang"><code>output</code></a>.
The returned strings contain output from stderr if the cmd is configured to
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true#redirectErrorStream-boolean-" title="class or interface in java.lang"><code>redirect stderr to stdput</code></a>.
The command is restarted if a read from the command's output stream
returns EOF or an error.
</P></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>cmd</code> - the <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang"><code>ProcessBuilder</code></a> to start the command</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the <code>Supplier&lt;String&gt;</code></dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#generate-org.apache.edgent.topology.Topology-java.lang.ProcessBuilder-"><code>generate(Topology, ProcessBuilder)</code></a>,
<a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#tokenize-java.lang.String-"><code>tokenize(String)</code></a></dd>
</dl>
</li>
</ul>
<a name="commandReaderList-java.lang.ProcessBuilder-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>commandReaderList</h4>
<pre>public static&nbsp;<a href="../../../../../org/apache/edgent/function/Supplier.html" title="interface in org.apache.edgent.function">Supplier</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;commandReaderList(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang">ProcessBuilder</a>&nbsp;cmd)</pre>
<div class="block">Create a <code>Supplier&lt;List&lt;String&gt;&gt;</code> to ingest a command's output.
<P>
This method is particularly helpful in creating a sensor or source connector
class that hides the fact that it uses a command, enabling it to be used
like any other sensor/connector.
</P>
For example:
<pre><code>
// ingest the sensor data
TStream&lt;MySensorData&gt; stream = topology.periodicSource(new MySensor());
// MySensor class
class MySensor implements Supplier&lt;MySensorData&gt; {
private String[] cmd = new String[] {"mySensorCmd", "arg1"};
private Supplier&lt;List&lt;String&gt;&gt; commandReader =
CommandStreams.commandReaderList(new ProcessBuilder(cmd));
// implement Supplier&lt;MySensorData&gt;.get()
public MySensorData get() {
// get the cmd output and create a MySensorData tuple from it
return createMySensorData(commandReader.get());
}
}
</code></pre>
<P>
The supplied <code>cmd</code> is used to start the command.
A call to <a href="../../../../../org/apache/edgent/function/Supplier.html#get--"><code>Supplier.get()</code></a> reads the command's UTF8
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Process.html?is-external=true#getInputStream--" title="class or interface in java.lang"><code>input stream</code></a> until an EOF or error
and returns a <code>List&lt;String&gt;</code> of the collected input.
The tuples contain output from stderr if the cmd is configured to
<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true#redirectErrorStream-boolean-" title="class or interface in java.lang"><code>redirect stderr to stdout</code></a>.
</P></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>cmd</code> - the <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang"><code>ProcessBuilder</code></a> to start the command</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the <code>Supplier&lt;List&lt;String&gt;&gt;</code> for the command</dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#periodicSource-org.apache.edgent.topology.Topology-java.lang.ProcessBuilder-long-java.util.concurrent.TimeUnit-"><code>periodicSource(Topology, ProcessBuilder, long, TimeUnit)</code></a>,
<a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#tokenize-java.lang.String-"><code>tokenize(String)</code></a></dd>
</dl>
</li>
</ul>
<a name="commandWriter-java.lang.ProcessBuilder-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>commandWriter</h4>
<pre>public static&nbsp;<a href="../../../../../org/apache/edgent/function/Consumer.html" title="interface in org.apache.edgent.function">Consumer</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;commandWriter(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang">ProcessBuilder</a>&nbsp;cmd)</pre>
<div class="block">Create a <code>Consumer&lt;String&gt;</code> to write UTF8 string data to a command's input.
<P>
This method is particularly helpful in creating a sink connector
that hides the fact that it uses a command, enabling it to be used
like a native connector.
</P>
For example:
<pre><code>
// sink a stream to my connector
TStream&lt;MySensorData&gt; stream = ...;
stream.sink(new MySinkConnector());
// MySinkConnector class
class MySinkConnector implements Consumer&lt;MySensorData&gt; {
private String[] cmd = new String[] {"mySinkCmd", "arg1"};
private Consumer&lt;String&gt; commandWriter =
CommandStreams.commandWriter(new ProcessBuilder(cmd));
// implement Consumer&lt;MySensorData&gt;.accept()
public void accept(MySensorData data) {
// convert the data to a string and write it to the cmd
commandWriter.accept(convertMySensorData(data));
}
}
</code></pre>
<P>
The supplied <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang"><code>cmd</code></a> is used to start the command.
Each call to <a href="../../../../../org/apache/edgent/function/Consumer.html#accept-T-"><code>accept(String)</code></a> writes a
UTF8 string to the command's <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Process.html?is-external=true#getOutputStream--" title="class or interface in java.lang"><code>input</code></a>.
Each write is followed by a flush.
The command is restarted if a write encounters an error.
</P>
<P>
While each write is followed by a flush() that only helps to
reduce the time it takes to notice that cmd has failed and restart it.
Supposedly "successfully written and flushed" values are not guaranteed to
have been received by a cmd across restarts.
</P></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>cmd</code> - the <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html?is-external=true" title="class or interface in java.lang"><code>ProcessBuilder</code></a> to start the command</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the <code>Consumer&lt;String&gt;</code> for the command</dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#sink-org.apache.edgent.topology.TStream-java.lang.ProcessBuilder-"><code>sink(TStream, ProcessBuilder)</code></a>,
<a href="../../../../../org/apache/edgent/connectors/command/CommandStreams.html#tokenize-java.lang.String-"><code>tokenize(String)</code></a></dd>
</dl>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/CommandStreams.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>Prev&nbsp;Class</li>
<li>Next&nbsp;Class</li>
</ul>
<ul class="navList">
<li><a href="../../../../../index.html?org/apache/edgent/connectors/command/CommandStreams.html" target="_top">Frames</a></li>
<li><a href="CommandStreams.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<p class="legalCopy"><small>Copyright &#169; 2016&#x2013;2017 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
</body>
</html>