/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * 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.jkiss.dbeaver.ui.views.process; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.part.ViewPart; import org.jkiss.dbeaver.core.DBeaverUI; import org.jkiss.dbeaver.model.runtime.AbstractJob; import org.jkiss.dbeaver.model.runtime.DBRProcessController; import org.jkiss.dbeaver.model.runtime.DBRProcessDescriptor; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.ui.IHelpContextIds; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.utils.GeneralUtils; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; public class ShellProcessView extends ViewPart implements DBRProcessController { public static final String VIEW_ID = "org.jkiss.dbeaver.core.shellProcess"; private StyledText processLogText; private static int viewId = 0; private DBRProcessDescriptor processDescriptor; @Override public void createPartControl(Composite parent) { Composite group = UIUtils.createPlaceholder(parent, 1); group.setLayout(new FillLayout()); processLogText = new StyledText(group, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.READ_ONLY); UIUtils.setHelp(group, IHelpContextIds.CTX_QUERY_MANAGER); } @Override public DBRProcessDescriptor getProcessDescriptor() { return processDescriptor; } @Override public void terminateProcess() { if (processDescriptor != null) { if (processDescriptor.isRunning()) { processDescriptor.terminate(); DBeaverUI.asyncExec(new Runnable() { @Override public void run() { setPartName(processDescriptor.getName() + " (destroyed: " + processDescriptor.getExitValue() + ")"); } }); } } } @Override public void dispose() { terminateProcess(); super.dispose(); } @Override public void setFocus() { if (processLogText != null && !processLogText.isDisposed()) { processLogText.setFocus(); } } public synchronized static String getNextId() { viewId++; return String.valueOf(viewId); } public void initProcess(DBRProcessDescriptor processDescriptor) { this.processDescriptor = processDescriptor; setPartName(processDescriptor.getName()); new ProcessLogger().schedule(); } private class ProcessLogger extends AbstractJob { protected ProcessLogger() { super(processDescriptor.getName()); } @Override protected IStatus run(DBRProgressMonitor monitor) { try { Process process = processDescriptor.getProcess(); if (process == null) { return Status.OK_STATUS; } try { final InputStream execOut = process.getInputStream(); final BufferedReader reader = new BufferedReader( new InputStreamReader(execOut, GeneralUtils.getDefaultConsoleEncoding()) ); for (;;) { final String line = reader.readLine(); if (line == null) { break; } writeProcessLog(line); } } finally { processDescriptor.terminate(); } } catch (Exception e) { return GeneralUtils.makeExceptionStatus(e); } return Status.OK_STATUS; } } private void writeProcessLog(final String line) { if (line.isEmpty()) { return; } final String logLine = line + GeneralUtils.getDefaultLineSeparator(); DBeaverUI.asyncExec(new Runnable() { @Override public void run() { if (processLogText == null || processLogText.isDisposed()) { return; } processLogText.append(logLine); } }); } }