nl.strohalm.cyclos.services.alerts.ErrorLogServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for nl.strohalm.cyclos.services.alerts.ErrorLogServiceImpl.java

Source

/*
This file is part of Cyclos (www.cyclos.org).
A project of the Social Trade Organisation (www.socialtrade.org).
    
Cyclos is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
    
Cyclos is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with Cyclos; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    
 */
package nl.strohalm.cyclos.services.alerts;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;

import nl.strohalm.cyclos.dao.alerts.ErrorLogEntryDAO;
import nl.strohalm.cyclos.entities.Relationship;
import nl.strohalm.cyclos.entities.alerts.ErrorLogEntry;
import nl.strohalm.cyclos.entities.alerts.ErrorLogEntryQuery;
import nl.strohalm.cyclos.utils.FormatObject;
import nl.strohalm.cyclos.utils.TransactionHelper;
import nl.strohalm.cyclos.utils.access.LoggedUser;
import nl.strohalm.cyclos.utils.conversion.CoercionHelper;
import nl.strohalm.cyclos.utils.notifications.AdminNotificationHandler;
import nl.strohalm.cyclos.utils.query.PageHelper;
import nl.strohalm.cyclos.utils.validation.RequiredError;
import nl.strohalm.cyclos.utils.validation.ValidationException;

import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;

/**
 * Implementation for error logs service
 * @author luis
 */
public class ErrorLogServiceImpl implements ErrorLogServiceLocal {

    private ErrorLogEntryDAO errorLogEntryDao;
    private AdminNotificationHandler adminNotificationHandler;
    private TransactionHelper transactionHelper;

    @Override
    public int getCount() {
        final ErrorLogEntryQuery query = new ErrorLogEntryQuery();
        query.setShowRemoved(false);
        query.setPageForCount();
        return PageHelper.getTotalCount(errorLogEntryDao.search(query));
    }

    @Override
    public Future<ErrorLogEntry> insert(final Throwable t, final String path, final Map<String, ?> parameters) {
        if (t == null) {
            throw new ValidationException("exception", new RequiredError());
        }
        if (StringUtils.isEmpty(path)) {
            throw new ValidationException("path", new RequiredError());
        }
        return transactionHelper.runAsync(new TransactionCallback<ErrorLogEntry>() {
            @Override
            public ErrorLogEntry doInTransaction(final TransactionStatus status) {
                return doInsert(t, path, parameters);
            }
        });
    }

    @Override
    public ErrorLogEntry load(final Long id, final Relationship... fetch) {
        return errorLogEntryDao.load(id, fetch);
    }

    @Override
    public int remove(final Long... ids) {
        return errorLogEntryDao.delete(ids);
    }

    @Override
    public List<ErrorLogEntry> search(final ErrorLogEntryQuery query) {
        return errorLogEntryDao.search(query);
    }

    public void setAdminNotificationHandler(final AdminNotificationHandler adminNotificationHandler) {
        this.adminNotificationHandler = adminNotificationHandler;
    }

    public void setErrorLogEntryDao(final ErrorLogEntryDAO errorLogEntryDao) {
        this.errorLogEntryDao = errorLogEntryDao;
    }

    public void setTransactionHelper(final TransactionHelper transactionHelper) {
        this.transactionHelper = transactionHelper;
    }

    private ErrorLogEntry doInsert(final Throwable t, final String path, final Map<String, ?> parameters) {
        ErrorLogEntry entry = new ErrorLogEntry();
        // Basic attributes
        entry.setDate(Calendar.getInstance());
        entry.setPath(path);
        // Logged user
        if (LoggedUser.hasUser()) {
            entry.setLoggedUser(LoggedUser.user());
        }
        // Exception
        final StringWriter stackTrace = new StringWriter();
        t.printStackTrace(new PrintWriter(stackTrace));
        entry.setStackTrace(stackTrace.toString());
        // Request parameters
        if (MapUtils.isEmpty(parameters)) {
            entry.setParameters(new HashMap<String, String>());
        } else {
            final Map<String, String> params = new HashMap<String, String>();
            for (final Map.Entry<String, ?> e : parameters.entrySet()) {
                final String name = e.getKey();
                if (StringUtils.isEmpty(name)) {
                    continue;
                }
                // Mask the value if needed
                String value = CoercionHelper.coerce(String.class, e.getValue());
                params.put(name, FormatObject.maskIfNeeded(name, value));
            }
            entry.setParameters(params);
        }
        entry = errorLogEntryDao.insert(entry);
        adminNotificationHandler.notifyApplicationErrors(entry);
        return entry;
    }
}