/*
* Copyright 2012 Ixonos Plc, Finland. All rights reserved.
*
* This file is part of Kohti kumppanuutta.
*
* This file is licensed under GNU LGPL version 3.
* Please see the 'license.txt' file in the root directory of the package you received.
* If you did not receive a license, please contact the copyright holder
* (http://www.ixonos.com/).
*
*/
package fi.koku.services.utility.log.impl;
import static fi.koku.services.utility.log.impl.LogServiceErrorCode.LOG_ERROR_INVALID_LOGTYPE;
import java.text.ParseException;
import java.util.Iterator;
import java.util.List;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
import javax.jws.WebService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.koku.KoKuFaultException;
import fi.koku.calendar.CalendarUtil;
import fi.koku.services.utility.authorizationinfo.util.AuthUtils;
import fi.koku.services.utility.authorizationinfo.v1.AuthorizationInfoService;
import fi.koku.services.utility.authorizationinfo.v1.AuthorizationInfoServiceFactory;
import fi.koku.services.utility.log.v1.ArchivalResultsType;
import fi.koku.services.utility.log.v1.AuditInfoType;
import fi.koku.services.utility.log.v1.LogArchivalParametersType;
import fi.koku.services.utility.log.v1.LogEntriesType;
import fi.koku.services.utility.log.v1.LogEntryType;
import fi.koku.services.utility.log.v1.LogQueryCriteriaType;
import fi.koku.services.utility.log.v1.LogServicePortType;
import fi.koku.services.utility.log.v1.VoidType;
import fi.koku.settings.KoKuPropertiesUtil;
/**
* KoKu log service implementation class. Actual point of entry to Log service.
* Will call LogService for database access. Uses AuthorizationInfoService for
* access validation.
*
* @author aspluma
* @author makinsu
*/
@Stateless
@Interceptors({ LogServiceFaultInterceptor.class })
@WebService(wsdlLocation = "META-INF/wsdl/logService.wsdl", endpointInterface = "fi.koku.services.utility.log.v1.LogServicePortType", targetNamespace = "http://services.koku.fi/utility/log/v1", portName = "logService-soap11-port", serviceName = "logService")
@RolesAllowed("koku-role")
public class LogServiceEndpointBean implements LogServicePortType {
private static final Logger logger = LoggerFactory.getLogger(LogServiceEndpointBean.class);
@EJB
private LogService logService;
private LogConverter logConverter;
private LogUtils logUtils;
private AuthorizationInfoService authInfoService;
public LogServiceEndpointBean() {
logConverter = new LogConverter();
logUtils = new LogUtils();
String uid = KoKuPropertiesUtil.get("lok.authorizationinfo.service.user.id");
String pwd = KoKuPropertiesUtil.get("lok.authorizationinfo.service.password");
String ep = KoKuPropertiesUtil.get("authorizationinfo.service.endpointaddress");
AuthorizationInfoServiceFactory authFactory = new AuthorizationInfoServiceFactory(uid, pwd, ep);
authInfoService = authFactory.getAuthorizationInfoService();
}
/**
* Implements the use case LOK-1 (Tallenna lokitieto).
*
* @return
*/
@Override
public VoidType opLog(LogEntriesType logEntriesType, AuditInfoType auditInfoType) {
List<LogEntryType> list = logEntriesType.getLogEntry();
Iterator<LogEntryType> i = list.iterator();
while (i.hasNext()) {
LogEntryType logEntryType = (LogEntryType) i.next();
if (logEntryType != null) {
// Use ClientSystemId to tell in which log table we write!
if (LogConstants.LOG_WRITER_LOG.equalsIgnoreCase(logEntryType.getClientSystemId())) {
if (logUtils.validateLogEntryType(logEntryType, LogConstants.LOG_ADMIN)) {
logService.writeAdminLogEntry(logConverter.fromWsTypeToAdmin(logEntryType));
}
} else {
if (logUtils.validateLogEntryType(logEntryType, LogConstants.LOG_NORMAL)) {
logService.writeNormalLogEntry(logConverter.fromWsType(logEntryType));
}
}
}
}
return new VoidType();
}
/**
* Implements the use cases LOK-3 (Etsi lokitieto) and LOK-4 (Tarkista lokin
* käsittelyloki).
*/
@Override
public LogEntriesType opQueryLog(LogQueryCriteriaType criteriaType, AuditInfoType auditInfoType) {
LogEntriesType logEntriesType = new LogEntriesType();
if (LogConstants.LOG_NORMAL.equals(criteriaType.getLogType())) {
// Check permission
AuthUtils.requirePermission("AdminSystemLogFile", auditInfoType.getUserId(),
authInfoService.getUsersRoles(LogConstants.COMPONENT_LOK, auditInfoType.getUserId()));
List<LogEntry> entries = logService.queryNormalLog(logConverter.fromWsType(criteriaType));
if (entries == null) {
logger.info("No entries found in log table!");
} else {
Iterator<LogEntry> i = entries.iterator();
while (i.hasNext()) {
LogEntry entry = (LogEntry) i.next();
if (entry != null) {
// convert log entry to log entry web Service type and add it to the collection
logEntriesType.getLogEntry().add(logConverter.toWsType(entry));
}
}
}
// log the query event
logService.writeAdminLogQueryEvent(criteriaType, auditInfoType);
} else if (LogConstants.LOG_ADMIN.equals(criteriaType.getLogType())) {
// Check permission
AuthUtils.requirePermission("ViewAdminLogFile", auditInfoType.getUserId(),
authInfoService.getUsersRoles(LogConstants.COMPONENT_LOK, auditInfoType.getUserId()));
List<AdminLogEntry> entries = logService.queryAdminLog(logConverter.fromWsType(criteriaType));
if (entries == null) {
logger.info("No entries found in log_admin table!");
} else {
Iterator<AdminLogEntry> j = entries.iterator();
while (j.hasNext()) {
// convert log entry to admin log entry web Service type and add it to the collection
AdminLogEntry entry = (AdminLogEntry) j.next();
if (entry != null) {
logEntriesType.getLogEntry().add(logConverter.toWsFromAdminType(entry));
}
}
}
// log the query event
logService.writeNormalLogQueryEvent(criteriaType, auditInfoType);
} else {
throw new KoKuFaultException(LOG_ERROR_INVALID_LOGTYPE.getValue(),
LOG_ERROR_INVALID_LOGTYPE.getDescription());
}
return logEntriesType;
}
/**
* Implements the use case LOK-2 (Arkistoi lokitietoa).
*/
@Override
public ArchivalResultsType opArchiveLog(LogArchivalParametersType archivalParameters, AuditInfoType auditInfoType) {
logger.info("opArchiveLog");
// Check permission
AuthUtils.requirePermission("AdminSystemLogFile", auditInfoType.getUserId(),
authInfoService.getUsersRoles(LogConstants.COMPONENT_LOK, auditInfoType.getUserId()));
return logService.archiveLog(archivalParameters, auditInfoType);
}
/**
* Convert from internal object representation (LogEntry) to webservice type
* (LogEntryType).
*
* @author makinsu
*/
private static class LogConverter {
public LogConverter() {
}
/**
* Method converts the query criteria from WS type to service type.
*
* @param type
* @return
*/
public LogQueryCriteria fromWsType(LogQueryCriteriaType type) {
// criteria parameters have been null-checked on the portlet side
// TODO: KOKU-1187
LogQueryCriteria criteria = new LogQueryCriteria(type.getLogType(), type.getCustomerPic(), type.getDataItemType(),
type.getUserPic(), CalendarUtil.getDate(type.getStartTime()), CalendarUtil.getDate(type.getEndTime()));
return criteria;
}
/**
* Helper method that converts the Admin log entry to Web Service type
*
* @param entry
* @return
* @throws ParseException
*/
public LogEntryType toWsFromAdminType(AdminLogEntry entry) {
LogEntryType entryType = new LogEntryType();
entryType.setCustomerPic(entry.getCustomerPic());
entryType.setUserPic(entry.getUserPic());
entryType.setOperation(entry.getOperation());
entryType.setMessage(entry.getMessage());
entryType.setTimestamp(CalendarUtil.getXmlDateTime(entry.getTimestamp()));
return entryType;
}
/**
* Helper method that converts the Log entry to Web Service type
*
* @param entry
* @return
* @throws ParseException
*/
public LogEntryType toWsType(LogEntry entry) {
LogEntryType et = new LogEntryType();
et.setClientSystemId(entry.getClientSystemId());
et.setCustomerPic(entry.getCustomerPic());
et.setDataItemId(entry.getDataItemId());
et.setDataItemType(entry.getDataItemType());
et.setMessage(entry.getMessage());
et.setOperation(entry.getOperation());
et.setTimestamp(CalendarUtil.getXmlDateTime(entry.getTimestamp()));
et.setUserPic(entry.getUserPic());
return et;
}
/**
* Convert from webservice type (LogEntryType) to internal object
* representation (LogEntry).
*
* @author makinsu
* @param logt
* @return
*/
public LogEntry fromWsType(LogEntryType logt) {
LogEntry entry = new LogEntry();
entry.setCustomerPic(logt.getCustomerPic());
entry.setClientSystemId(logt.getClientSystemId());
entry.setDataItemType(logt.getDataItemType());
entry.setDataItemId(logt.getDataItemId());
entry.setMessage(logt.getMessage());
entry.setOperation(logt.getOperation());
entry.setTimestamp(CalendarUtil.getDate(logt.getTimestamp()));
entry.setUserPic(logt.getUserPic());
return entry;
}
/**
* Converts the LogEntryType ws type to AdminLogEntry type
*
* @param logt
* @return
*/
public AdminLogEntry fromWsTypeToAdmin(LogEntryType logt) {
AdminLogEntry entry = new AdminLogEntry();
entry.setMessage(logt.getMessage());
entry.setOperation(logt.getOperation());
entry.setTimestamp(CalendarUtil.getDate(logt.getTimestamp()));
entry.setUserPic(logt.getUserPic());
entry.setCustomerPic(logt.getCustomerPic());
return entry;
}
}
}