org.wallride.autoconfigure.WallRideCacheConfiguration.java Source code

Java tutorial

Introduction

Here is the source code for org.wallride.autoconfigure.WallRideCacheConfiguration.java

Source

/*
 * Copyright 2014 Tagbangers, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.wallride.autoconfigure;

import com.amazonaws.internal.EC2MetadataClient;
import jp.co.tagbangers.jgroups.S3_CLIENT_PING;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.configuration.parsing.ConfigurationBuilderHolder;
import org.infinispan.configuration.parsing.ParserRegistry;
import org.infinispan.eviction.EvictionStrategy;
import org.infinispan.eviction.EvictionType;
import org.infinispan.hibernate.search.impl.DefaultCacheManagerService;
import org.infinispan.lucene.LuceneKey2StringMapper;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.persistence.jdbc.configuration.JdbcStringBasedStoreConfigurationBuilder;
import org.infinispan.spring.provider.SpringEmbeddedCacheManager;
import org.jgroups.conf.ClassConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import javax.sql.DataSource;
import java.io.IOException;

@Configuration
@EnableCaching
public class WallRideCacheConfiguration extends CachingConfigurerSupport {

    public static final String BLOG_CACHE = "blogs";
    public static final String POPULAR_POST_CACHE = "popularPosts";
    public static final String ARTICLE_CACHE = "articles";
    public static final String PAGE_CACHE = "pages";
    public static final String CATEGORY_CACHE = "categories";
    public static final String CUSTOM_FIELD_CACHE = "customFields";
    public static final String MEDIA_CACHE = "medias";
    public static final String BANNER_CACHE = "banners";
    public static final String USER_CACHE = "users";

    @Autowired
    private DataSource dataSource;

    @Autowired
    private Environment environment;

    @Autowired
    private DataSourceProperties dataSourceProperties;

    private static Logger logger = LoggerFactory.getLogger(WallRideCacheConfiguration.class);

    @Bean
    @Override
    public CacheManager cacheManager() {
        // JGroups settings
        String jgroupsConfigurationFile = environment.getRequiredProperty("jgroups.configurationFile");
        if ("jgroups-ec2.xml".equals(jgroupsConfigurationFile)) {
            ClassConfigurator.addProtocol((short) 1000, S3_CLIENT_PING.class);
            EC2MetadataClient metadataClient = new EC2MetadataClient();
            String ipAddress;
            try {
                ipAddress = metadataClient.readResource("/latest/meta-data/local-ipv4");
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            logger.info("jgroups.tcp.address -> {}", ipAddress);
            System.setProperty("jgroups.tcp.address", ipAddress);
            System.setProperty("jgroups.s3.bucket", environment.getRequiredProperty("jgroups.s3.bucket"));
        }

        Resource hibernateSearchConfig = new ClassPathResource(
                DefaultCacheManagerService.DEFAULT_INFINISPAN_CONFIGURATION_RESOURCENAME);
        ParserRegistry parserRegistry = new ParserRegistry();
        ConfigurationBuilderHolder holder;
        try {
            holder = parserRegistry.parse(hibernateSearchConfig.getInputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        // GlobalConfiguration
        // @formatter:off
        GlobalConfigurationBuilder globalBuilder = holder.getGlobalConfigurationBuilder();
        globalBuilder.globalJmxStatistics().allowDuplicateDomains(true).transport().defaultTransport()
                .addProperty("configurationFile", jgroupsConfigurationFile);
        // @formatter:on

        // DefaultConfiguration
        // @formatter:off
        for (ConfigurationBuilder luceneIndexesBuilder : holder.getNamedConfigurationBuilders().values()) {
            if ("mysql".equals(dataSourceProperties.getPlatform())) {
                luceneIndexesBuilder.persistence().addStore(JdbcStringBasedStoreConfigurationBuilder.class)
                        .preload(true).shared(true).key2StringMapper(LuceneKey2StringMapper.class).table()
                        .tableNamePrefix("ispn_string_table").idColumnName("id_column").idColumnType("varchar(255)")
                        .dataColumnName("data_column").dataColumnType("longblob")
                        .timestampColumnName("timestamp_column").timestampColumnType("bigint").dropOnExit(false)
                        .createOnStart(true).async().enable().threadPoolSize(10).fetchPersistentState(true)
                        .ignoreModifications(false).purgeOnStartup(false)
                        .connectionFactory(InfinispanDataSourceConnectionFactoryConfigurationBuilder.class)
                        .dataSource(dataSource);
            } else if ("postgresql".equals(dataSourceProperties.getPlatform())) {
                luceneIndexesBuilder.persistence().addStore(JdbcStringBasedStoreConfigurationBuilder.class)
                        .preload(true).shared(true).key2StringMapper(LuceneKey2StringMapper.class).table()
                        .tableNamePrefix("ispn_string_table").idColumnName("id_column").idColumnType("varchar(255)")
                        .dataColumnName("data_column").dataColumnType("bytea")
                        .timestampColumnName("timestamp_column").timestampColumnType("bigint").dropOnExit(false)
                        .createOnStart(true).async().enable().threadPoolSize(10).fetchPersistentState(true)
                        .ignoreModifications(false).purgeOnStartup(false)
                        .connectionFactory(InfinispanDataSourceConnectionFactoryConfigurationBuilder.class)
                        .dataSource(dataSource);
            } else {
                throw new IllegalStateException();
            }
        }
        // @formatter:on

        // @formatter:off
        ConfigurationBuilder cacheBuilder = new ConfigurationBuilder();
        cacheBuilder.clustering().cacheMode(CacheMode.REPL_SYNC).eviction().type(EvictionType.COUNT)
                .strategy(EvictionStrategy.LIRS).size(1000);
        //            .indexing()
        //               .index(Index.NONE);
        // @formatter:on

        holder.getNamedConfigurationBuilders().put(BLOG_CACHE, cacheBuilder);
        //      holder.getNamedConfigurationBuilders().put("settings", cacheBuilder);
        holder.getNamedConfigurationBuilders().put(POPULAR_POST_CACHE, cacheBuilder);
        holder.getNamedConfigurationBuilders().put(ARTICLE_CACHE, cacheBuilder);
        holder.getNamedConfigurationBuilders().put(PAGE_CACHE, cacheBuilder);
        holder.getNamedConfigurationBuilders().put(CATEGORY_CACHE, cacheBuilder);
        holder.getNamedConfigurationBuilders().put(CUSTOM_FIELD_CACHE, cacheBuilder);
        holder.getNamedConfigurationBuilders().put(MEDIA_CACHE, cacheBuilder);
        holder.getNamedConfigurationBuilders().put(BANNER_CACHE, cacheBuilder);
        holder.getNamedConfigurationBuilders().put(USER_CACHE, cacheBuilder);

        EmbeddedCacheManager embeddedCacheManager = new DefaultCacheManager(holder, true);
        InfinispanSingletonCacheManagerDirectoryProvider.cacheManager = embeddedCacheManager;
        return new SpringEmbeddedCacheManager(embeddedCacheManager);
    }

    @Bean
    @Override
    public KeyGenerator keyGenerator() {
        return new CacheKeyGenerator();
    }
}