Example usage for org.springframework.transaction.interceptor DefaultTransactionAttribute DefaultTransactionAttribute

List of usage examples for org.springframework.transaction.interceptor DefaultTransactionAttribute DefaultTransactionAttribute

Introduction

In this page you can find the example usage for org.springframework.transaction.interceptor DefaultTransactionAttribute DefaultTransactionAttribute.

Prototype

public DefaultTransactionAttribute(int propagationBehavior) 

Source Link

Document

Create a new DefaultTransactionAttribute with the given propagation behavior.

Usage

From source file:org.springframework.test.context.jdbc.DatabaseInitializerTestExecutionListener.java

/**
 * Execute the SQL scripts configured via the supplied
 * {@link DatabaseInitializer @DatabaseInitializer} for the given
 * {@link ExecutionPhase} and {@link TestContext}.
 *
 * <p>Special care must be taken in order to properly support the
 * {@link DatabaseInitializer#requireNewTransaction requireNewTransaction}
 * flag.//from w ww.  j av a 2 s.  c  o m
 *
 * @param databaseInitializer the {@code @DatabaseInitializer} to parse
 * @param executionPhase the current execution phase
 * @param testContext the current {@code TestContext}
 * @param classLevel {@code true} if {@link DatabaseInitializer @DatabaseInitializer}
 * was declared at the class level
 */
@SuppressWarnings("serial")
private void executeDatabaseInitializer(DatabaseInitializer databaseInitializer, ExecutionPhase executionPhase,
        TestContext testContext, boolean classLevel) throws Exception {
    if (logger.isDebugEnabled()) {
        logger.debug(String.format("Processing %s for execution phase [%s] and test context %s.",
                databaseInitializer, executionPhase, testContext));
    }

    if (executionPhase != databaseInitializer.executionPhase()) {
        return;
    }

    final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
    populator.setSqlScriptEncoding(databaseInitializer.encoding());
    populator.setSeparator(databaseInitializer.separator());
    populator.setCommentPrefix(databaseInitializer.commentPrefix());
    populator.setBlockCommentStartDelimiter(databaseInitializer.blockCommentStartDelimiter());
    populator.setBlockCommentEndDelimiter(databaseInitializer.blockCommentEndDelimiter());
    populator.setContinueOnError(databaseInitializer.continueOnError());
    populator.setIgnoreFailedDrops(databaseInitializer.ignoreFailedDrops());

    String[] scripts = getScripts(databaseInitializer, testContext, classLevel);
    scripts = TestContextResourceUtils.convertToClasspathResourcePaths(testContext.getTestClass(), scripts);
    populator.setScripts(
            TestContextResourceUtils.convertToResources(testContext.getApplicationContext(), scripts));
    if (logger.isDebugEnabled()) {
        logger.debug("Executing SQL scripts: " + ObjectUtils.nullSafeToString(scripts));
    }

    final DataSource dataSource = TestContextTransactionUtils.retrieveDataSource(testContext,
            databaseInitializer.dataSource());
    final PlatformTransactionManager transactionManager = TestContextTransactionUtils
            .retrieveTransactionManager(testContext, databaseInitializer.transactionManager());

    int propagation = databaseInitializer.requireNewTransaction()
            ? TransactionDefinition.PROPAGATION_REQUIRES_NEW
            : TransactionDefinition.PROPAGATION_REQUIRED;

    TransactionAttribute transactionAttribute = TestContextTransactionUtils
            .createDelegatingTransactionAttribute(testContext, new DefaultTransactionAttribute(propagation));

    new TransactionTemplate(transactionManager, transactionAttribute)
            .execute(new TransactionCallbackWithoutResult() {

                @Override
                public void doInTransactionWithoutResult(TransactionStatus status) {
                    populator.execute(dataSource);
                };
            });
}

From source file:org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.java

/**
 * Execute the SQL scripts configured via the supplied {@link Sql @Sql}
 * annotation for the given {@link ExecutionPhase} and {@link TestContext}.
 * <p>Special care must be taken in order to properly support the configured
 * {@link SqlConfig#transactionMode}./*from   ww  w  . j  ava2s  .c om*/
 * @param sql the {@code @Sql} annotation to parse
 * @param executionPhase the current execution phase
 * @param testContext the current {@code TestContext}
 * @param classLevel {@code true} if {@link Sql @Sql} was declared at the class level
 */
private void executeSqlScripts(Sql sql, ExecutionPhase executionPhase, TestContext testContext,
        boolean classLevel) throws Exception {

    if (executionPhase != sql.executionPhase()) {
        return;
    }

    MergedSqlConfig mergedSqlConfig = new MergedSqlConfig(sql.config(), testContext.getTestClass());
    if (logger.isDebugEnabled()) {
        logger.debug(String.format("Processing %s for execution phase [%s] and test context %s.",
                mergedSqlConfig, executionPhase, testContext));
    }

    final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
    populator.setSqlScriptEncoding(mergedSqlConfig.getEncoding());
    populator.setSeparator(mergedSqlConfig.getSeparator());
    populator.setCommentPrefix(mergedSqlConfig.getCommentPrefix());
    populator.setBlockCommentStartDelimiter(mergedSqlConfig.getBlockCommentStartDelimiter());
    populator.setBlockCommentEndDelimiter(mergedSqlConfig.getBlockCommentEndDelimiter());
    populator.setContinueOnError(mergedSqlConfig.getErrorMode() == ErrorMode.CONTINUE_ON_ERROR);
    populator.setIgnoreFailedDrops(mergedSqlConfig.getErrorMode() == ErrorMode.IGNORE_FAILED_DROPS);

    String[] scripts = getScripts(sql, testContext, classLevel);
    scripts = TestContextResourceUtils.convertToClasspathResourcePaths(testContext.getTestClass(), scripts);
    List<Resource> scriptResources = TestContextResourceUtils
            .convertToResourceList(testContext.getApplicationContext(), scripts);
    for (String stmt : sql.statements()) {
        if (StringUtils.hasText(stmt)) {
            stmt = stmt.trim();
            scriptResources.add(new ByteArrayResource(stmt.getBytes(), "from inlined SQL statement: " + stmt));
        }
    }
    populator.setScripts(scriptResources.toArray(new Resource[scriptResources.size()]));
    if (logger.isDebugEnabled()) {
        logger.debug("Executing SQL scripts: " + ObjectUtils.nullSafeToString(scriptResources));
    }

    String dsName = mergedSqlConfig.getDataSource();
    String tmName = mergedSqlConfig.getTransactionManager();
    DataSource dataSource = TestContextTransactionUtils.retrieveDataSource(testContext, dsName);
    PlatformTransactionManager txMgr = TestContextTransactionUtils.retrieveTransactionManager(testContext,
            tmName);
    boolean newTxRequired = (mergedSqlConfig.getTransactionMode() == TransactionMode.ISOLATED);

    if (txMgr == null) {
        Assert.state(!newTxRequired,
                () -> String.format(
                        "Failed to execute SQL scripts for test context %s: "
                                + "cannot execute SQL scripts using Transaction Mode "
                                + "[%s] without a PlatformTransactionManager.",
                        testContext, TransactionMode.ISOLATED));
        Assert.state(dataSource != null,
                () -> String.format("Failed to execute SQL scripts for test context %s: "
                        + "supply at least a DataSource or PlatformTransactionManager.", testContext));
        // Execute scripts directly against the DataSource
        populator.execute(dataSource);
    } else {
        DataSource dataSourceFromTxMgr = getDataSourceFromTransactionManager(txMgr);
        // Ensure user configured an appropriate DataSource/TransactionManager pair.
        if (dataSource != null && dataSourceFromTxMgr != null && !dataSource.equals(dataSourceFromTxMgr)) {
            throw new IllegalStateException(String.format(
                    "Failed to execute SQL scripts for test context %s: "
                            + "the configured DataSource [%s] (named '%s') is not the one associated with "
                            + "transaction manager [%s] (named '%s').",
                    testContext, dataSource.getClass().getName(), dsName, txMgr.getClass().getName(), tmName));
        }
        if (dataSource == null) {
            dataSource = dataSourceFromTxMgr;
            Assert.state(dataSource != null, () -> String.format("Failed to execute SQL scripts for "
                    + "test context %s: could not obtain DataSource from transaction manager [%s] (named '%s').",
                    testContext, txMgr.getClass().getName(), tmName));
        }
        final DataSource finalDataSource = dataSource;
        int propagation = (newTxRequired ? TransactionDefinition.PROPAGATION_REQUIRES_NEW
                : TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionAttribute txAttr = TestContextTransactionUtils.createDelegatingTransactionAttribute(
                testContext, new DefaultTransactionAttribute(propagation));
        new TransactionTemplate(txMgr, txAttr).execute(status -> {
            populator.execute(finalDataSource);
            return null;
        });
    }
}

From source file:se.vgregion.service.innovationsslussen.idea.IdeaServiceImpl.java

@Override
public Idea addLike(long companyId, long groupId, long userId, String urlTitle) {

    TransactionStatus transaction = transactionManager
            .getTransaction(new DefaultTransactionAttribute(TransactionDefinition.PROPAGATION_REQUIRED));

    boolean isIdeaUserLiked = getIsIdeaUserLiked(companyId, groupId, userId, urlTitle);
    Idea idea = findIdeaByUrlTitle(urlTitle);

    if (isIdeaUserLiked) {
        // User already likes the idea
        return idea;
    }//from   w w  w. j a  v a  2 s  . c o m

    IdeaUserLike ideaUserLike = new IdeaUserLike(companyId, groupId, userId);
    ideaUserLike.setIdea(idea);

    ideaUserLikeRepository.merge(ideaUserLike);
    ideaUserLikeRepository.flush();

    transactionManager.commit(transaction);

    return ideaRepository.find(idea.getId());
}

From source file:se.vgregion.service.innovationsslussen.idea.IdeaServiceImpl.java

@Override
//@Transactional(rollbackFor = BariumException.class)
public UpdateFromBariumResult updateFromBarium(Idea idea) throws UpdateIdeaException {

    // Do the transaction manually since we may run this in a separate thread.
    TransactionStatus transaction = transactionManager
            .getTransaction(new DefaultTransactionAttribute(TransactionDefinition.PROPAGATION_REQUIRES_NEW));

    try {// ww w  .j  a v  a  2 s. co m

        UpdateFromBariumResult result = new UpdateFromBariumResult();
        result.setOldIdea(find(idea.getId()));
        result.getOldIdea().getIdeaContentPrivate();
        result.getOldIdea().getIdeaContentPublic();

        LOGGER.info(" Update from Barium, idea: " + idea.getTitle());

        // Idea idea = findIdeaByBariumId(id);
        final String ideaId = idea.getId();

        String oldTitle = idea.getTitle(); // To know whether it has changed, in case we need to update in Barium

        // Make two calls asynchronously and simultaneously to speed up.
        Future<IdeaObjectFields> ideaObjectFieldsFuture = bariumService.asyncGetIdeaObjectFields(ideaId);
        Future<String> bariumIdeaPhase = bariumService.asyncGetIdeaPhaseFuture(ideaId);

        int bariumPhase = 0;
        int currentPhase = Integer.parseInt(idea.getPhase() == null ? "0" : idea.getPhase());
        IdeaStatus oldStatus = idea.getStatus();

        try {
            if (bariumIdeaPhase.get() == null) {
                throw new BariumException("bariumIdeaPhase is null");
            }
            bariumPhase = Integer.parseInt(bariumIdeaPhase.get());

            populateIdea(ideaObjectFieldsFuture.get(), idea);

            //Sync files
            if (idea.getIdeaContentPrivate() != null) {
                populateFile(idea, idea.getIdeaContentPrivate(), LIFERAY_CLOSED_DOCUMENTS);
            }
            if (idea.getIdeaContentPublic() != null) {
                populateFile(idea, idea.getIdeaContentPublic(), LIFERAY_OPEN_DOCUMENTS);
            }

        } catch (InterruptedException e) {
            throw new UpdateIdeaException(e);
        } catch (ExecutionException e) {
            throw new UpdateIdeaException(e);
        }

        result.setChanged(!isIdeasTheSame(idea, result.getOldIdea()));

        final String finalUrlTitle;
        if (!oldTitle.equals(idea.getTitle())) {
            finalUrlTitle = generateNewUrlTitle(idea.getTitle());
            idea.setUrlTitle(finalUrlTitle);
        } else {
            idea.setUrlTitle(result.getOldIdea().getUrlTitle());
            finalUrlTitle = null;
        }

        if (idea.getOriginalUserId() == null) {
            idea.setOriginalUserId(0L);
        }

        idea = ideaRepository.merge(idea);
        result.setNewIdea(idea);

        if (finalUrlTitle != null) {
            final Idea finalIdea = idea;
            // We may just as well do this asynchronously since we don't throw anything and don't return anything
            // from
            // here.
            executor.submit(new Runnable() {
                @Override
                public void run() {
                    // We need to update the ideaSiteLink in Barium.
                    String ideaSiteLink = generateIdeaSiteLink(schemeServerNameUrl, finalUrlTitle);
                    try {
                        bariumService.updateIdea(finalIdea.getId(), "siteLank", ideaSiteLink);
                    } catch (BariumException e) {
                        LOGGER.error("Failed to update idea " + finalIdea.getId() + " with new site link: "
                                + ideaSiteLink, e);
                    }
                }

            });
        }

        if (currentPhase != bariumPhase) {
            idea.setPhase("" + (bariumPhase));
            result.setChanged(true);
        }

        // Add auto-comments to the idea.
        idea = generateAutoComments(idea, oldStatus, currentPhase, bariumPhase);

        // Sync comments count
        idea.setCommentsCount(getPrivateCommentsCount(idea));
        idea = ideaRepository.merge(idea);

        // Sync last comment date
        List<CommentItemVO> privateComments = getComments(idea.getIdeaContentPrivate());
        if (privateComments.size() > 0) {
            Collections.sort(privateComments, new Comparator<CommentItemVO>() {
                @Override
                public int compare(CommentItemVO o1, CommentItemVO o2) {
                    return -o1.getCreateDate().compareTo(o2.getCreateDate());
                }
            });
            idea.setLastPrivateCommentDate(privateComments.get(0).getCreateDate());
        }

        if (transaction.isNewTransaction()) {
            transactionManager.commit(transaction);
        }

        return result;
    } catch (BariumException be) {
        transactionManager.rollback(transaction);
        LOGGER.warn(be.getMessage());
    } finally {
        if (!transaction.isCompleted()) {
            //If this happens, a runtimeexception has likley occurred.
            transactionManager.rollback(transaction);
            LOGGER.warn("Rolledback transaction because of likely RunTimeException");
        }
    }
    return null;
}

From source file:se.vgregion.service.innovationsslussen.idea.IdeaServiceImpl.java

private Idea upgradeIfOldVersion(Idea idea) {
    // Upgrade potentially old ideas without the hidden attribute set
    if (idea.getHidden() == null) {
        idea.setHidden(false);//from   www  .j ava  2  s  .c  o  m
        TransactionStatus transaction = null;
        try {
            // Do the transaction manually since we may run this in a separate thread.
            transaction = transactionManager.getTransaction(
                    new DefaultTransactionAttribute(TransactionDefinition.PROPAGATION_REQUIRED));
            // Merge here so we don't get unexpected consequences later when we will compare to decide whether
            // the idea has changed. This should not cause a change.
            ideaRepository.merge(idea);
            transactionManager.commit(transaction);
        } catch (RuntimeException e) {
            transactionManager.rollback(transaction);
        }
    }
    return idea;
}

From source file:uk.ac.ebi.phenotype.solr.indexer.AbstractIndexer.java

protected void initialiseHibernateSession(ApplicationContext applicationContext) {
    // allow hibernate session to stay open the whole execution
    PlatformTransactionManager transactionManager = (PlatformTransactionManager) applicationContext
            .getBean("transactionManager");
    DefaultTransactionAttribute transactionAttribute = new DefaultTransactionAttribute(
            TransactionDefinition.PROPAGATION_REQUIRED);
    transactionAttribute.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
    transactionManager.getTransaction(transactionAttribute);
}