/*******************************************************************************
* Copyright (c) 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.orion.server.logs;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.runtime.Path;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.RollingPolicy;
import ch.qos.logback.core.rolling.RollingPolicyBase;
import ch.qos.logback.core.rolling.helper.FileNamePattern;
/**
* Default ILogService implementation.
*/
public class LogService implements ILogService {
@Override
public List<Logger> getLoggers() {
LoggerContext loggerContext = (LoggerContext) LoggerFactory
.getILoggerFactory();
return loggerContext.getLoggerList();
}
@Override
public Logger getLogger(String name) {
if (name == null)
return null;
LoggerContext loggerContext = (LoggerContext) LoggerFactory
.getILoggerFactory();
return loggerContext.getLogger(name);
}
@Override
public List<FileAppender<ILoggingEvent>> getFileAppenders() {
List<FileAppender<ILoggingEvent>> fileAppenders = new LinkedList<FileAppender<ILoggingEvent>>();
for (Logger logger : getLoggers()) {
for (Iterator<Appender<ILoggingEvent>> index = logger
.iteratorForAppenders(); index.hasNext();) {
Appender<ILoggingEvent> appender = index.next();
if (appender instanceof FileAppender)
fileAppenders.add((FileAppender<ILoggingEvent>) appender);
}
}
return fileAppenders;
}
@Override
public FileAppender<ILoggingEvent> getFileAppender(String name) {
if (name == null)
return null;
for (Logger logger : getLoggers()) {
for (Iterator<Appender<ILoggingEvent>> index = logger
.iteratorForAppenders(); index.hasNext();) {
Appender<ILoggingEvent> appender = index.next();
if (appender instanceof FileAppender
&& name.equals(appender.getName()))
return (FileAppender<ILoggingEvent>) appender;
}
}
return null;
}
@Override
public RollingFileAppender<ILoggingEvent> getRollingFileAppender(String name) {
FileAppender<ILoggingEvent> fileAppender = getFileAppender(name);
if (fileAppender == null)
return null;
if (fileAppender instanceof RollingFileAppender<?>)
return (RollingFileAppender<ILoggingEvent>) fileAppender;
return null;
}
@Override
public File[] getArchivedLogFiles(
RollingFileAppender<ILoggingEvent> rollingFileAppender) {
if (rollingFileAppender == null)
return null;
RollingPolicy rollingPolicy = rollingFileAppender.getRollingPolicy();
if (rollingPolicy == null)
return null;
if (rollingPolicy instanceof RollingPolicyBase) {
RollingPolicyBase policy = (RollingPolicyBase) rollingPolicy;
String fileNamePattern = policy.getFileNamePattern();
Context context = rollingFileAppender.getContext();
File dir = null;
FileNamePattern pattern = new FileNamePattern(fileNamePattern,
context);
Path path = new Path(pattern.toRegex(new Date()));
if (!path.isAbsolute())
dir = new File("."); //$NON-NLS-1$
else {
dir = path.removeLastSegments(1).toFile();
/* extract relative pattern */
Path p = new Path(fileNamePattern);
pattern = new FileNamePattern(p.lastSegment(), context);
}
final String patternRegex = pattern.toRegex();
File[] files = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.matches(patternRegex);
}
});
return files;
}
return null;
}
@Override
public File getArchivedLogFile(
RollingFileAppender<ILoggingEvent> rollingFileAppender,
String logFileName) {
if (rollingFileAppender == null || logFileName == null)
return null;
File[] archvieLogFiles = getArchivedLogFiles(rollingFileAppender);
if (archvieLogFiles == null)
return null;
for (File logFile : archvieLogFiles)
if (logFileName.equals(logFile.getName()))
return logFile;
return null;
}
@Override
public List<RollingFileAppender<ILoggingEvent>> getRollingFileAppenders() {
List<RollingFileAppender<ILoggingEvent>> rollingFileAppenders = new LinkedList<RollingFileAppender<ILoggingEvent>>();
for (Logger logger : getLoggers()) {
for (Iterator<Appender<ILoggingEvent>> index = logger
.iteratorForAppenders(); index.hasNext();) {
Appender<ILoggingEvent> appender = index.next();
if (appender instanceof RollingFileAppender)
rollingFileAppenders
.add((RollingFileAppender<ILoggingEvent>) appender);
}
}
return rollingFileAppenders;
}
}