se.inera.axel.shs.broker.messagestore.internal.MongoMessageLogAdminService.java Source code

Java tutorial

Introduction

Here is the source code for se.inera.axel.shs.broker.messagestore.internal.MongoMessageLogAdminService.java

Source

/**
 * Copyright (C) 2013 Inera AB (http://www.inera.se)
 *
 * This file is part of Inera Axel (http://code.google.com/p/inera-axel).
 *
 * Inera Axel is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Inera Axel 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 */
package se.inera.axel.shs.broker.messagestore.internal;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import se.inera.axel.shs.broker.messagestore.MessageLogAdminService;
import se.inera.axel.shs.broker.messagestore.MessageStoreService;
import se.inera.axel.shs.broker.messagestore.ShsMessageEntry;
import se.inera.axel.shs.mime.ShsMessage;
import se.inera.axel.shs.xml.label.ShsLabel;

import javax.annotation.Resource;
import javax.ws.rs.WebApplicationException;
import java.util.ArrayList;
import java.util.List;

@Service("messageLogAdminService")
public class MongoMessageLogAdminService implements MessageLogAdminService {

    private final static Logger log = LoggerFactory.getLogger(MongoMessageLogAdminService.class);

    @Resource
    private MessageLogRepository repository;

    @Autowired
    private MessageStoreService messageStoreService;

    @Autowired
    MongoTemplate mongoTemplate;

    @Override
    public Iterable<ShsMessageEntry> findRelatedEntries(ShsMessageEntry entry, int maxRelatedEntries) {
        ArrayList<ShsMessageEntry> related = new ArrayList<ShsMessageEntry>();

        if (entry == null)
            return related;

        // Fetch one more because one will get thrown away due to being the original message
        Pageable pageable = new PageRequest(0, maxRelatedEntries + 1);
        Page<ShsMessageEntry> page = repository.findByLabelCorrId(entry.getLabel().getCorrId(), pageable);
        List<ShsMessageEntry> pageContent = page.getContent();

        for (ShsMessageEntry e : pageContent) {
            if (e.getId() != null && e.getId().equals(entry.getId()) == false) {
                related.add(e);
            }
        }

        return related;
    }

    @Override
    public Iterable<ShsMessageEntry> findMessages(Filter filter) {

        Criteria criteria = buildCriteria(filter);
        Query query = Query.query(criteria);

        query.with(new Sort(Sort.Direction.DESC, "arrivalTimeStamp"));

        query = query.limit(filter.getLimit());
        query = query.skip(filter.getSkip());

        return mongoTemplate.find(query, ShsMessageEntry.class);

    }

    @Override
    public int countMessages(Filter filter) {

        Criteria criteria = buildCriteria(filter);
        Query query = Query.query(criteria);

        return (int) mongoTemplate.count(query, ShsMessageEntry.class);

    }

    private Criteria buildCriteria(Filter filter) {
        Criteria criteria = new Criteria();

        if (filter.getTo() != null) {
            criteria = criteria.and("label.to.value").regex("^" + filter.getTo());
        }

        if (filter.getFrom() != null) {
            criteria = criteria.and("label.originatorOrFrom.value").regex("^" + filter.getFrom());
        }

        if (filter.getTxId() != null) {
            criteria = criteria.and("label.txId").regex("^" + filter.getTxId());
        }

        if (filter.getCorrId() != null) {
            criteria = criteria.and("label.corrId").regex("^" + filter.getCorrId());
        }

        if (filter.getFilename() != null) {
            criteria = criteria.and("label.content.dataOrCompound.filename").regex("^" + filter.getFilename());
        }

        if (filter.getProduct() != null) {
            criteria = criteria.and("label.product.value").regex("^" + filter.getProduct());
        }

        /* show both acknowledged and un-acknowledged messages by default */
        if (filter.getAcknowledged() != null && filter.getAcknowledged() == false) {
            criteria = criteria.and("acknowledged").in(null, false);
        } else if (filter.getAcknowledged() != null && filter.getAcknowledged() == true) {
            criteria = criteria.and("acknowledged").is(true);
        }

        /* don't show archived messages at all, unless asked to. */
        if (filter.getArchived() == null || filter.getArchived() == false) {
            criteria = criteria.and("archived").in(false, null);
        } else {
            criteria = criteria.and("archived").is(true);
        }

        if (filter.getState() != null) {
            criteria = criteria.and("state").is(filter.getState());
        }

        return criteria;
    }

    @Override
    public ShsMessageEntry findById(String messageId) {
        return repository.findOne(messageId);
    }

    @Override
    public void deleteEntry(String txId) {
        ShsMessageEntry shsMessageEntry = repository.findOneByLabelTxId(txId);
        if (shsMessageEntry == null) {
            throw (new WebApplicationException());
        }

        log.info("Deleting ShsMessageEntry for txId[" + txId + "]");
        repository.delete(shsMessageEntry);

        // When deleting the entry then we even have to delete the associated file
        // in the messageStoreService. Otherwise, we would end up with orphans.
        ShsMessage shsMessage = messageStoreService.findOne(shsMessageEntry);
        if (shsMessage == null) {
            throw (new WebApplicationException());
        }
        log.info("Deleting ShsMessage for txId[" + txId + "]");
        messageStoreService.delete(shsMessageEntry);
    }

    @Override
    public ShsLabel findEntryById(String txId) {
        ShsMessageEntry entry = repository.findOneByLabelTxId(txId);
        if (entry == null) {
            throw (new WebApplicationException());
        }

        return entry.getLabel();
    }

    @Override
    public void deleteFile(String txId) {
        ShsMessageEntry shsMessageEntry = repository.findOneByLabelTxId(txId);
        if (shsMessageEntry == null) {
            throw (new WebApplicationException());
        }

        ShsMessage shsMessage = messageStoreService.findOne(shsMessageEntry);
        if (shsMessage == null) {
            throw (new WebApplicationException());
        }
        log.info("Deleting ShsMessage for txId[" + txId + "]");
        messageStoreService.delete(shsMessageEntry);
    }

    @Override
    public ShsLabel findFileById(String txId) {
        ShsMessageEntry shsMessageEntry = repository.findOneByLabelTxId(txId);
        if (shsMessageEntry == null) {
            throw (new WebApplicationException());
        }

        ShsMessage shsMessage = messageStoreService.findOne(shsMessageEntry);
        if (shsMessage == null) {
            throw (new WebApplicationException());
        }

        return shsMessage.getLabel();
    }
}