package org.lognavigator.service;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Set;
import org.lognavigator.bean.FileInfo;
import org.lognavigator.bean.LogAccessConfig;
import org.lognavigator.exception.LogAccessException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
/**
* Service Facade to the different implementations of LogAccessService (ssh, local, fake)
*/
@Service
@Qualifier("facade")
public class FacadeLogAccessService implements LogAccessService {
@Value("${fake:false}")
private boolean isFakeEnabled;
@Autowired
private ConfigService configService;
@Autowired
@Qualifier("ssh")
private LogAccessService logAccessServiceSsh;
@Autowired
@Qualifier("local")
private LogAccessService logAccessServiceLocal;
@Autowired
@Qualifier("httpd")
private LogAccessService logAccessServiceHttpd;
@Autowired
@Qualifier("fake")
private LogAccessService logAccessServiceFake;
@Override
public InputStream executeCommand(String logAccessConfigId, String shellCommand) throws LogAccessException {
return getLogAccessServiceDelegate(logAccessConfigId).executeCommand(logAccessConfigId, shellCommand);
}
@Override
public void downloadFile(String logAccessConfigId, String fileName, OutputStream downloadOutputStream) throws LogAccessException {
getLogAccessServiceDelegate(logAccessConfigId).downloadFile(logAccessConfigId, fileName, downloadOutputStream);
}
@Override
public Set<FileInfo> listFiles(String logAccessConfigId, String subPath) throws LogAccessException {
return getLogAccessServiceDelegate(logAccessConfigId).listFiles(logAccessConfigId, subPath);
}
/**
* Return the suitable LogAccessService delegate service :
* - fake : if isFakeEnabled=true
* - local : if logAccessConfig type is LOCAL
* - httpd : if logAccessConfig type is HTTPD
* - ssh : if logAccessConfig type is SSH
*
* @param logAccessConfigId log access config id
*/
private LogAccessService getLogAccessServiceDelegate(String logAccessConfigId) {
if (isFakeEnabled) {
return logAccessServiceFake;
}
// Get the LogAccessConfig
LogAccessConfig logAccessConfig = configService.getLogAccessConfig(logAccessConfigId);
switch (logAccessConfig.getType()) {
case LOCAL:
return logAccessServiceLocal;
case HTTPD:
return logAccessServiceHttpd;
case SSH:
return logAccessServiceSsh;
default:
throw new IllegalArgumentException("Unknown type for log access config " + logAccessConfigId);
}
}
}