/******************************************************************************* * Copyright 2017 Capital One Services, LLC and Bitwise, Inc. * 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 hydrograph.ui.joblogger.logger; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.ui.console.ConsolePlugin; import org.eclipse.ui.console.IConsole; import org.eclipse.ui.console.IConsoleManager; import org.eclipse.ui.console.MessageConsole; import org.eclipse.ui.console.MessageConsoleStream; import org.eclipse.ui.internal.console.ConsoleView; import org.slf4j.Logger; import hydrograph.ui.common.util.Constants; import hydrograph.ui.logging.factory.LogFactory; /** * The Class ConsoleLogger. * <p> * Class to create Console logger * * @author Bitwise */ public class ConsoleLogger extends AbstractJobLogger{ private static final int DEFAULT_CONSOLE_HIGH_WATER_MARK_OFFSET = 8000; private static final Logger logger = LogFactory.INSTANCE.getLogger(ConsoleLogger.class); private MessageConsoleStream messageConsoleStream; public ConsoleLogger(String projectName, String jobName) { super(projectName, jobName); initConsoleStream(); logger.debug("Created console logger stream"); } @Override public void log(String message) { if(messageConsoleStream!=null && !messageConsoleStream.isClosed()) messageConsoleStream.println(message); logger.debug("logged message on console - message - {}" , message ); } /** * Find console using name if exist or create new. * * @param name the console name * @return console */ private void initConsoleStream() { MessageConsole messageConsole = getMessageConsole(); messageConsoleStream=messageConsole.newMessageStream(); logger.debug("Created message console stream"); messageConsoleStream.getConsole().addPropertyChangeListener(new IPropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { ((ConsoleView)event.getSource()).setScrollLock(true); } }); } /** * get message console object * * @param messageConsole * @return */ private MessageConsole getMessageConsole() { IConsoleManager conMan = getConsoleManager(); MessageConsole messageConsole = getConsoleFromExistingConsoles(conMan); if(messageConsole == null){ messageConsole = createNewMessageConsole(conMan); logger.debug("No existing console found, created new one"); } int lowWaterMark = getConsoleBufferSize(); messageConsole.setWaterMarks(lowWaterMark, lowWaterMark + DEFAULT_CONSOLE_HIGH_WATER_MARK_OFFSET); return messageConsole; } /** * * returns gradle console if it is registered with console manager exist * * @param conMan - console manager * @return */ private MessageConsole getConsoleFromExistingConsoles(IConsoleManager conMan) { IConsole[] existing = getExistingConsoles(conMan); MessageConsole messageConsole = getExistingMessageConsole(existing); return messageConsole; } /** * * Creates new message console and register it with console manager * * @param conMan * @return */ private MessageConsole createNewMessageConsole(IConsoleManager conMan) { MessageConsole messageConsole; messageConsole = new MessageConsole(getFullJobName(), null); conMan.addConsoles(new IConsole[] { messageConsole }); logger.debug("Created message console"); return messageConsole; } private int getConsoleBufferSize(){ String bufferSize = Platform.getPreferencesService().getString( Constants.GRAPH_PLUGIN_QUALIFIER, Constants.CONSOLE_BUFFER_SIZE_PREFERANCE_NAME, Constants.DEFUALT_CONSOLE_BUFFER_SIZE, null); return Integer.parseInt(bufferSize); } /** * * returns Gradle console if it is registered with console manager * * @param existing * @return - MessageConsole */ private MessageConsole getExistingMessageConsole(IConsole[] existing) { MessageConsole messageConsole=null; for (int i = 0; i < existing.length; i++) { if (getFullJobName().equals(existing[i].getName())){ messageConsole=(MessageConsole) existing[i]; logger.debug("We have a message console"); break; } } return messageConsole; } /** * * get all consoles registered with default console manager * * @param conMan * @return - IConsole[] */ private IConsole[] getExistingConsoles(IConsoleManager conMan) { IConsole[] existing = conMan.getConsoles(); logger.debug("Retrived existing consoles. Number of console - {}" , existing.length); return existing; } /** * * get default console manager * * @return ConsoleManager */ private IConsoleManager getConsoleManager() { ConsolePlugin plugin = ConsolePlugin.getDefault(); logger.debug("Retived Console plugin object"); IConsoleManager conMan = plugin.getConsoleManager(); logger.debug("Retrived Console manager"); return conMan; } @Override public void close() { // TODO - need to re-implement once actual job kill process is in place // need input from engine /*try { messageConsoleStream.close(); } catch (IOException e) { logger.debug("Unable to close message console stream " + e.getMessage()); }*/ } @Override public void logWithNoTimeStamp(String message) { messageConsoleStream.println(message); } }