/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gws.api.impl;
import ru.codeinside.gws.api.ClientLog;
import ru.codeinside.gws.api.LogService;
import ru.codeinside.gws.api.ServerLog;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
final public class LogServiceFileImpl implements LogService {
final static Logger LOGGER = Logger.getLogger(LogServiceFileImpl.class.getName());
final Set<String> enabledServers = new HashSet<String>();
final Set<String> ignoreSet = new HashSet<String>();
boolean serverLogEnabled = false;
boolean logErrors = false;
String logStatus = null;
@Override
public void setServerLogEnabled(boolean enabled) {
synchronized (enabledServers) {
serverLogEnabled = enabled;
writeConfig();
}
}
@Override
public void setServerLogErrorsEnabled(boolean enabled) {
synchronized (enabledServers) {
logErrors = enabled;
writeConfig();
}
}
@Override
public void setServerLogStatus(String status) {
synchronized (enabledServers) {
logStatus = status;
writeConfig();
}
}
@Override
public boolean isServerLogEnabled() {
synchronized (enabledServers) {
return serverLogEnabled;
}
}
@Override
public boolean isServerLogErrorsEnabled() {
synchronized (enabledServers) {
return logErrors;
}
}
@Override
public String getServerLogStatus() {
synchronized (enabledServers) {
return logStatus;
}
}
@Override
public void setServerLogEnabled(String componentName, boolean enabled) {
synchronized (enabledServers) {
if (enabled) {
enabledServers.add(componentName);
} else {
enabledServers.remove(componentName);
}
writeConfig();
}
}
@Override
public boolean isServerLogEnabled(String componentName) {
synchronized (enabledServers) {
return enabledServers.contains(componentName);
}
}
@Override
public String getPathInfo() {
return LogSettings.getPath(false);
}
@Override
public void setIgnoreSet(Set<String> set) {
synchronized (enabledServers) {
ignoreSet.clear();
if (set != null) {
ignoreSet.addAll(set);
}
writeConfig();
}
}
@Override
public ClientLog createClientLog(long bid, String componentName, String processInstanceId,
boolean isLogEnabled, boolean logErrors, String status, Set<String> remotes) {
if (remotes != null) {
for (String remote : remotes) {
if (ignoreSet.contains(remote)) {
isLogEnabled = false;
}
}
}
if (!isLogEnabled && !logErrors) {
return null;
}
return new FileClientLog(bid, componentName, processInstanceId, isLogEnabled, logErrors, status);
}
@Override
public ServerLog createServerLog(String componentName, String remote) {
boolean logEnabled;
synchronized (enabledServers) {
logEnabled = serverLogEnabled && enabledServers.contains(componentName);
if (ignoreSet.contains(remote)) {
logEnabled = false;
}
if (!logEnabled && !logErrors) {
return null;
}
}
return new FileServerLog(componentName, logEnabled, logErrors, logStatus);
}
File getCfgRoot() {
String instanceRoot = System.getProperty("com.sun.aas.instanceRoot");
final File cfgRoot;
if (instanceRoot != null) {
File asRoot = new File(instanceRoot);
cfgRoot = new File(asRoot, "config");
} else {
// core scope !!!
cfgRoot = new File("target");
}
return cfgRoot;
}
File getConfigFile() {
return new File(getCfgRoot(), "smev-log.cfg");
}
File getOldConfigFile() {
return new File(getCfgRoot(), "smev-log.conf");
}
void readConfig() throws IOException {
File cfg = getOldConfigFile();
boolean oldConfig = cfg.exists();
if (!oldConfig) {
cfg = getConfigFile();
}
if (cfg.exists()) {
BufferedReader br = new BufferedReader(new FileReader(cfg));
try {
String line = trim(br.readLine());
serverLogEnabled = Boolean.parseBoolean(line);
if (!oldConfig) {
line = trim(br.readLine());
logErrors = Boolean.parseBoolean(line);
line = trim(br.readLine());
logStatus = line;
line = trim(br.readLine());
ignoreSet.clear();
if (line != null) {
ignoreSet.addAll(Arrays.asList(line.split("[,;\\s]+")));
}
}
while (null != (line = br.readLine())) {
line = line.trim();
if (!line.isEmpty()) {
enabledServers.add(line);
}
}
} finally {
Files.close(br);
}
}
}
void writeConfig() {
File oldCfg = getOldConfigFile();
if (oldCfg.exists()) {
if (!oldCfg.delete()) {
throw new IllegalStateException("can't remove " + oldCfg);
}
}
File cfg = getConfigFile();
try {
BufferedWriter bf = new BufferedWriter(new FileWriter(cfg));
try {
bf.write(Boolean.toString(serverLogEnabled));
bf.newLine();
bf.write(Boolean.toString(logErrors));
bf.newLine();
if (logStatus != null) {
bf.write(logStatus);
}
bf.newLine();
for (String ignore : ignoreSet) {
bf.write(' ');
bf.write(ignore);
}
bf.newLine();
for (String line : enabledServers) {
bf.write(line);
bf.newLine();
}
} finally {
Files.close(bf);
}
} catch (IOException e) {
LOGGER.log(Level.WARNING, "config writing failure", e);
}
}
String trim(String str) {
if (str == null) {
return null;
}
return str.trim();
}
}