blob: 9e1a227f01afb10f510c7b2e51953b370de0b663 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2016 SSI Schaefer and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* SSI Schaefer
*******************************************************************************/
package org.eclipse.debug.internal.core.groups.observer;
import java.util.concurrent.CountDownLatch;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.IStreamListener;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.core.model.IStreamMonitor;
import org.eclipse.debug.core.model.IStreamsProxy;
/**
* The {@code StreamObserver} observes a given {@linkplain IStreamsProxy output stream} instance and
* notifies a {@linkplain CountDownLatch synchronization object} when a given string appears in the
* output.
*/
public class StreamObserver implements Runnable {
private final String stringPattern;
private final IProcess process;
private final CountDownLatch countDownLatch;
private final IProgressMonitor pMonitor;
public StreamObserver(IProgressMonitor monitor, IProcess process, String pattern,
CountDownLatch countDownLatch) {
this.process = process;
this.pMonitor = monitor;
this.stringPattern = pattern;
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
// append wild card if not provided
StringBuilder patternBuilder = new StringBuilder();
if (!stringPattern.startsWith(".*")) { //$NON-NLS-1$
patternBuilder.append(".*"); //$NON-NLS-1$
}
patternBuilder.append(stringPattern);
if (!stringPattern.endsWith(".*")) { //$NON-NLS-1$
patternBuilder.append(".*"); //$NON-NLS-1$
}
// create pattern and start listening to the output
final Pattern pattern = Pattern.compile(patternBuilder.toString(), Pattern.MULTILINE);
final IStreamMonitor outputStreamMonitor = process.getStreamsProxy()
.getOutputStreamMonitor();
outputStreamMonitor.addListener(new IStreamListener() {
@Override
public void streamAppended(String text, IStreamMonitor monitor) {
if (countDownLatch.getCount() == 0) {
outputStreamMonitor.removeListener(this);
return;
}
Matcher matcher = pattern.matcher(text);
if (!matcher.find() && !pMonitor.isCanceled()) {
return;
}
countDownLatch.countDown();
}
});
}
}