/* # Licensed Materials - Property of IBM # Copyright IBM Corp. 2015 */ package com.ibm.streamsx.topology.file; import java.util.Collections; import com.ibm.streamsx.topology.TStream; import com.ibm.streamsx.topology.TopologyElement; import com.ibm.streamsx.topology.function.Predicate; import com.ibm.streamsx.topology.internal.spljava.Schemas; import com.ibm.streamsx.topology.spl.JavaPrimitive; import com.ibm.streamsx.topology.spl.SPLStream; import com.ibm.streamsx.topology.spl.SPLStreams; /** * Utilities for file system related streams. * */ public class FileStreams { /** * Creates a stream of absolute newly created file names from watching * {@code directory}. * * @param directory * Name of the directory to watch. * @return A stream that will contain newly created files in * {@code directory}. */ public static TStream<String> directoryWatcher(TopologyElement te, String directory) { SPLStream filesSpl = JavaPrimitive.invokeJavaPrimitiveSource(te, DirectoryWatcher.class, Schemas.STRING, Collections.singletonMap("directory", directory) ); return filesSpl.toStringStream(); } /** * Filter a {@code Stream<String>} containing file names by suffix values. * If a file name on {@code fileNames} ends with a suffix in * {@code suffixes} preceded by a dot {@code '.'}. * * @param fileNames * Input stream that will contain file names. * @param suffixes * Suffixes to filter for. * @return Stream that will contain file names with suffixes in * {@code suffixes}. */ public static TStream<String> suffixFilter(TStream<String> fileNames, String... suffixes) { final String[] dotSuffixes = new String[suffixes.length]; for (int i = 0; i < suffixes.length; i++) { dotSuffixes[i] = "." + suffixes[i]; } return fileNames.filter(new Predicate<String>() { private static final long serialVersionUID = 1L; @Override public boolean test(String fileName) { for (int i = 0; i < dotSuffixes.length; i++) { if (fileName.endsWith(dotSuffixes[i])) return true; } return false; } }); } /** * Returns a Stream that reads each file named on its input stream, * outputting a tuple for each line read. All files are assumed to be * encoded using UTF-8. The lines are output in the order they appear in * each file, with the first line of a file appearing first. * * @param input * Stream containing files to read. * @return Stream contains lines from input files. */ public static TStream<String> textFileReader(TStream<String> input) { SPLStream tupleInput = SPLStreams.stringToSPLStream(input); SPLStream lines = JavaPrimitive.invokeJavaPrimitive( TextFileReader.class, tupleInput, Schemas.STRING, null); return lines.toStringStream(); } }