ch.algotrader.service.h2.H2TransactionPersistenceServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for ch.algotrader.service.h2.H2TransactionPersistenceServiceImpl.java

Source

/***********************************************************************************
 * AlgoTrader Enterprise Trading Framework
 *
 * Copyright (C) 2015 AlgoTrader GmbH - All rights reserved
 *
 * All information contained herein is, and remains the property of AlgoTrader GmbH.
 * The intellectual and technical concepts contained herein are proprietary to
 * AlgoTrader GmbH. Modification, translation, reverse engineering, decompilation,
 * disassembly or reproduction of this material is strictly forbidden unless prior
 * written permission is obtained from AlgoTrader GmbH
 *
 * Fur detailed terms and conditions consult the file LICENSE.txt or contact
 *
 * AlgoTrader GmbH
 * Aeschstrasse 6
 * 8834 Schindellegi
 ***********************************************************************************/
package ch.algotrader.service.h2;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import org.apache.commons.lang.Validate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import ch.algotrader.config.CommonConfig;
import ch.algotrader.dao.HibernateInitializer;
import ch.algotrader.dao.PositionDao;
import ch.algotrader.dao.TransactionDao;
import ch.algotrader.dao.strategy.CashBalanceDao;
import ch.algotrader.entity.Position;
import ch.algotrader.entity.Transaction;
import ch.algotrader.entity.security.Security;
import ch.algotrader.entity.strategy.CashBalance;
import ch.algotrader.entity.strategy.Strategy;
import ch.algotrader.enumeration.Currency;
import ch.algotrader.service.PortfolioService;
import ch.algotrader.service.TransactionPersistenceServiceImpl;
import ch.algotrader.vo.CurrencyAmountVO;

/**
 * @author <a href="mailto:aflury@algotrader.ch">Andy Flury</a>
 */
@Transactional(propagation = Propagation.SUPPORTS)
public class H2TransactionPersistenceServiceImpl extends TransactionPersistenceServiceImpl {

    private final SessionFactory sessionFactory;

    private final PositionDao positionDao;

    private final CashBalanceDao cashBalanceDao;

    public H2TransactionPersistenceServiceImpl(final CommonConfig commonConfig,
            final PortfolioService portfolioService, final SessionFactory sessionFactory,
            final PositionDao positionDao, final TransactionDao transactionDao,
            final CashBalanceDao cashBalanceDao) {

        super(commonConfig, portfolioService, positionDao, transactionDao, cashBalanceDao);

        Validate.notNull(sessionFactory, "SessionFactory is null");
        Validate.notNull(positionDao, "PositionDao is null");
        Validate.notNull(cashBalanceDao, "CashBalanceDao is null");

        this.sessionFactory = sessionFactory;
        this.positionDao = positionDao;
        this.cashBalanceDao = cashBalanceDao;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void ensurePositionAndCashBalance(final Transaction transaction) {

        Validate.notNull(transaction, "Transaction is null");

        transaction.initializeSecurity(HibernateInitializer.INSTANCE);

        Strategy strategy = transaction.getStrategy();
        Security security = transaction.getSecurity();
        Set<Currency> currencySet = new HashSet<>();
        Collection<CurrencyAmountVO> attributions = transaction.getAttributions();
        for (CurrencyAmountVO attribution : attributions) {
            currencySet.add(attribution.getCurrency());
        }

        Session currentSession = this.sessionFactory.getCurrentSession();

        if (security != null) {

            Position position = this.positionDao.findBySecurityAndStrategy(security.getId(), strategy.getName());
            if (position == null) {
                position = Position.Factory.newInstance(0, new BigDecimal(0.0), new BigDecimal(0.0), false,
                        strategy, security);
                currentSession.save(position);
            }
        }

        if (!currencySet.isEmpty()) {

            for (Currency currency : currencySet) {

                CashBalance cashBalance = this.cashBalanceDao.findByStrategyAndCurrency(strategy, currency);
                if (cashBalance == null) {
                    cashBalance = CashBalance.Factory.newInstance(currency, new BigDecimal(0.0), strategy);
                    currentSession.save(cashBalance);
                }
            }
        }
    }
}