/* * ProActive Parallel Suite(TM): * The Open Source library for parallel and distributed * Workflows & Scheduling, Orchestration, Cloud Automation * and Big Data Analysis on Enterprise Grids & Clouds. * * Copyright (c) 2007 - 2017 ActiveEon * Contact: contact@activeeon.com * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation: version 3 of * the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * If needed, contact us to obtain a release under GPL Version 2 or 3 * or a different license than the AGPL. */ package org.ow2.proactive_grid_cloud_portal.scheduler; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; import org.objectweb.proactive.core.util.log.ProActiveLogger; import org.ow2.proactive.scheduler.common.exception.NotConnectedException; import org.ow2.proactive.scheduler.common.exception.PermissionException; import org.ow2.proactive.scheduler.common.exception.UnknownJobException; import org.ow2.proactive.scheduler.common.task.Log4JTaskLogs; import org.ow2.proactive.scheduler.common.util.logforwarder.LogForwardingException; import org.ow2.proactive.scheduler.common.util.logforwarder.LogForwardingService; import org.ow2.proactive_grid_cloud_portal.common.Session; import org.ow2.proactive_grid_cloud_portal.webapp.PortalConfiguration; /** * Create, show and remove jobs output * * @author The ProActive Team * @since ProActive Scheduling 0.9 */ public class JobsOutputController { private static final Logger LOGGER = ProActiveLogger.getLogger(JobsOutputController.class); private LogForwardingService logForwardingService; private Map<String, JobOutputAppender> appenders = new HashMap<>(); private Set<String> listeningTo = new HashSet<>(); private final Session session; public JobsOutputController(Session session) { this.session = session; } public synchronized String getNewLogs(String jobId) throws LogForwardingException, NotConnectedException, UnknownJobException, PermissionException, IOException { return getJobOutputAppender(jobId).fetchNewLogs(); } public synchronized String getAllLogs(String jobId) throws LogForwardingException, NotConnectedException, UnknownJobException, PermissionException, IOException { return getJobOutputAppender(jobId).fetchAllLogs(); } public synchronized int availableLinesCount(String jobId) { JobOutputAppender appender = appenders.get(jobId); if (appender != null) { return appender.size(); } return -1; } public synchronized void removeAppender(String jobId) { if (appenders.containsKey(jobId)) { JobOutputAppender appender = appenders.remove(jobId); getLogForwardingService().removeAllAppenders(Log4JTaskLogs.getLoggerName(jobId)); appender.close(); } } public synchronized void terminate() { try { if (logForwardingService != null) { logForwardingService.terminate(); } } catch (LogForwardingException e) { LOGGER.warn("Could not terminate log forwarding service", e); } } private LogForwardingService getLogForwardingService() { if (logForwardingService == null) { logForwardingService = new LogForwardingService(PortalConfiguration.SCHEDULER_LOGINFORWARDINGSERVICE_PROVIDER.getValueAsString()); try { logForwardingService.initialize(); } catch (LogForwardingException e) { LOGGER.warn("Could not initialize log forwarding service", e); } } return logForwardingService; } private JobOutputAppender getJobOutputAppender(String jobId) throws UnknownJobException, LogForwardingException, NotConnectedException, PermissionException, IOException { JobOutputAppender jobOutputAppender = appenders.get(jobId); if (jobOutputAppender == null) { jobOutputAppender = createJobOutputAppender(jobId); } return jobOutputAppender; } private JobOutputAppender createJobOutputAppender(String jobId) throws NotConnectedException, UnknownJobException, PermissionException, LogForwardingException, IOException { JobOutputAppender jobOutputAppender = new JobOutputAppender(); addJobOutputAppender(jobId, jobOutputAppender); return jobOutputAppender; } // public for tests public synchronized void addJobOutputAppender(String jobId, JobOutputAppender jobOutputAppender) throws NotConnectedException, UnknownJobException, PermissionException, LogForwardingException { getLogForwardingService().addAppender(Log4JTaskLogs.getLoggerName(jobId), jobOutputAppender); if (!listeningTo.contains(jobId)) { session.getScheduler().listenJobLogs(jobId, getLogForwardingService().getAppenderProvider()); listeningTo.add(jobId); } appenders.put(jobId, jobOutputAppender); } }