package org.springframework.roo.addon.logging;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Properties;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.Validate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.springframework.roo.model.JavaPackage;
import org.springframework.roo.process.manager.FileManager;
import org.springframework.roo.process.manager.MutableFile;
import org.springframework.roo.project.Path;
import org.springframework.roo.project.PathResolver;
import org.springframework.roo.project.ProjectOperations;
import org.springframework.roo.support.util.FileUtils;
/**
* Implementation of {@link LoggingOperations}.
*
* @author Stefan Schmidt
* @since 1.0
*/
@Component
@Service
public class LoggingOperationsImpl implements LoggingOperations {
@Reference
private FileManager fileManager;
@Reference
private PathResolver pathResolver;
@Reference
private ProjectOperations projectOperations;
public void configureLogging(final LogLevel logLevel, final LoggerPackage loggerPackage) {
Validate.notNull(logLevel, "LogLevel required");
Validate.notNull(loggerPackage, "LoggerPackage required");
setupProperties(logLevel, loggerPackage);
}
public boolean isLoggingInstallationPossible() {
return projectOperations.isFocusedProjectAvailable();
}
private void setupProperties(final LogLevel logLevel, final LoggerPackage loggerPackage) {
final String filePath =
pathResolver.getFocusedIdentifier(Path.SRC_MAIN_RESOURCES, "log4j.properties");
MutableFile log4jMutableFile = null;
final Properties props = new Properties();
InputStream inputStream = null;
try {
if (fileManager.exists(filePath)) {
log4jMutableFile = fileManager.updateFile(filePath);
inputStream = log4jMutableFile.getInputStream();
props.load(inputStream);
} else {
log4jMutableFile = fileManager.createFile(filePath);
inputStream = FileUtils.getInputStream(getClass(), "log4j-template.properties");
Validate.notNull(inputStream, "Could not acquire log4j configuration template");
props.load(inputStream);
}
} catch (final IOException ioe) {
throw new IllegalStateException(ioe);
} finally {
IOUtils.closeQuietly(inputStream);
}
final JavaPackage topLevelPackage =
projectOperations.getTopLevelPackage(projectOperations.getFocusedModuleName());
final String logStr = "log4j.logger.";
switch (loggerPackage) {
case ROOT:
props.remove("log4j.rootLogger");
props.setProperty("log4j.rootLogger", logLevel.name() + ", stdout");
break;
case PROJECT:
props.remove(logStr + topLevelPackage.getFullyQualifiedPackageName());
props.setProperty(logStr + topLevelPackage.getFullyQualifiedPackageName(), logLevel.name());
break;
default:
for (final String packageName : loggerPackage.getPackageNames()) {
props.remove(logStr + packageName);
props.setProperty(logStr + packageName, logLevel.name());
}
break;
}
OutputStream outputStream = null;
try {
outputStream = log4jMutableFile.getOutputStream();
props.store(outputStream, "Updated at " + new Date());
} catch (final IOException ioe) {
throw new IllegalStateException(ioe);
} finally {
IOUtils.closeQuietly(outputStream);
}
}
}