/* * Copyright 2000-2013 JetBrains s.r.o. * * 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 com.intellij.remoteServer.agent.util.log; import com.intellij.remoteServer.agent.util.ILogger; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * @author michael.golubev */ public abstract class LogPipe { private final ILogger myLog; private final String myDeploymentName; private boolean myClosed; private int myTotalLines; private int myLines2Skip; public LogPipe(String deploymentName, ILogger log) { myDeploymentName = deploymentName; myLog = log; myClosed = false; } public void open() { InputStream inputStream = createInputStream(myDeploymentName); if (inputStream == null) { return; } InputStreamReader streamReader = new InputStreamReader(inputStream); final BufferedReader bufferedReader = new BufferedReader(streamReader); myTotalLines = 0; myLines2Skip = 0; new Thread() { @Override public void run() { try { while (true) { String line = bufferedReader.readLine(); if (myClosed) { myLog.debug("log pipe closed for: " + myDeploymentName); break; } if (line == null) { myLog.debug("end of log stream for: " + myDeploymentName); break; } if (myLines2Skip == 0) { getLogListener().lineLogged(line); myTotalLines++; } else { myLines2Skip--; } } } catch (IOException e) { myLog.errorEx(e); } } }.start(); } public void close() { myClosed = true; } protected final void cutTail() { myLines2Skip = myTotalLines; } protected final boolean isClosed() { return myClosed; } protected abstract InputStream createInputStream(String deploymentName); protected abstract LogListener getLogListener(); }