Home / Class/ Invocation Class — spring-boot Architecture

Invocation Class — spring-boot Architecture

Architecture documentation for the Invocation class in CommandLineInvoker.java from the spring-boot codebase.

Entity Profile

Relationship Graph

Source Code

cli/spring-boot-cli/src/intTest/java/org/springframework/boot/cli/infrastructure/CommandLineInvoker.java lines 120–215

	public static final class Invocation {

		private final StringBuffer err = new StringBuffer();

		private final StringBuffer out = new StringBuffer();

		private final StringBuffer combined = new StringBuffer();

		private final Process process;

		private final List<Thread> streamReaders = new ArrayList<>();

		public Invocation(Process process) {
			this.process = process;
			this.streamReaders
				.add(new Thread(new StreamReadingRunnable(this.process.getErrorStream(), this.err, this.combined)));
			this.streamReaders
				.add(new Thread(new StreamReadingRunnable(this.process.getInputStream(), this.out, this.combined)));
			for (Thread streamReader : this.streamReaders) {
				streamReader.start();
			}
		}

		public String getOutput() {
			return postProcessLines(getLines(this.combined));
		}

		public String getErrorOutput() {
			return postProcessLines(getLines(this.err));
		}

		public String getStandardOutput() {
			return postProcessLines(getStandardOutputLines());
		}

		public List<String> getStandardOutputLines() {
			return getLines(this.out);
		}

		private String postProcessLines(List<String> lines) {
			StringWriter out = new StringWriter();
			PrintWriter printOut = new PrintWriter(out);
			for (String line : lines) {
				if (!line.startsWith("Maven settings decryption failed")) {
					printOut.println(line);
				}
			}
			return out.toString();
		}

		private List<String> getLines(StringBuffer buffer) {
			BufferedReader reader = new BufferedReader(new StringReader(buffer.toString()));
			return reader.lines().filter((line) -> !line.startsWith("Picked up ")).toList();
		}

		public int await() throws InterruptedException {
			for (Thread streamReader : this.streamReaders) {
				streamReader.join();
			}
			return this.process.waitFor();
		}

		/**
		 * {@link Runnable} to copy stream output.
		 */
		private final class StreamReadingRunnable implements Runnable {

			private final InputStream stream;

			private final StringBuffer[] outputs;

			private final byte[] buffer = new byte[4096];

			private StreamReadingRunnable(InputStream stream, StringBuffer... outputs) {
				this.stream = stream;
				this.outputs = outputs;
			}

			@Override
			public void run() {
				int read;
				try {
					while ((read = this.stream.read(this.buffer)) > 0) {
						for (StringBuffer output : this.outputs) {
							output.append(new String(this.buffer, 0, read));
						}
					}
				}
				catch (IOException ex) {
					// Allow thread to die
				}
			}

		}

	}

Domain

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free