| /* |
| * Copyright 2003-2007 the original author or authors. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.codehaus.groovy.tools.shell |
| |
| import org.codehaus.groovy.tools.shell.util.Logger |
| |
| /** |
| * Support for running a {@link Shell}. |
| * |
| * @version $Id$ |
| * @author <a href="mailto:jason@planet57.com">Jason Dillon</a> |
| */ |
| abstract class ShellRunner |
| implements Runnable |
| { |
| protected final Logger log = Logger.create(this.class) |
| |
| final Shell shell |
| |
| boolean running = false |
| |
| boolean breakOnNull = true |
| |
| Closure errorHandler = { e -> |
| log.debug(e) |
| |
| running = false |
| } |
| |
| ShellRunner(final Shell shell) { |
| assert shell |
| |
| this.shell = shell |
| } |
| |
| void run() { |
| log.debug('Running') |
| |
| running = true |
| |
| while (running) { |
| try { |
| running = work() |
| } |
| catch (ExitNotification n) { |
| throw n |
| } |
| catch (Throwable t) { |
| log.debug("Work failed: $t") |
| |
| if (errorHandler) { |
| errorHandler.call(t) |
| } |
| } |
| } |
| |
| log.debug('Finished') |
| } |
| |
| protected boolean work() { |
| def line = readLine() |
| |
| if (log.debugEnabled) { |
| log.debug("Read line: $line") |
| } |
| |
| // Stop on null (maybe) |
| if (line == null && breakOnNull) { |
| return false // stop the loop |
| } |
| |
| // Ingore empty lines |
| if (line.trim().size() > 0) { |
| def result = shell << line |
| } |
| |
| return true |
| } |
| |
| protected abstract String readLine() |
| } |
| |