package org.apereo.cas.config; import com.google.common.base.Throwables; import com.hazelcast.config.Config; import com.hazelcast.config.XmlConfigBuilder; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; import org.apereo.cas.configuration.CasConfigurationProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.springframework.session.hazelcast.config.annotation.web.http.EnableHazelcastHttpSession; import java.net.URL; /** * This is {@link HazelcastSessionConfiguration}. * * @author Misagh Moayyed * @since 5.0.0 */ @Configuration("hazelcastSessionConfiguration") @EnableHazelcastHttpSession @EnableConfigurationProperties(CasConfigurationProperties.class) public class HazelcastSessionConfiguration { @Autowired private CasConfigurationProperties casProperties; /** * Hazelcast instance that is used by the spring session * repository to broadcast session events. The name * of this bean must be left untouched. * * @return the hazelcast instance */ @Bean public HazelcastInstance hazelcastInstance() { final Resource hzConfigResource = casProperties.getWebflow().getSession().getHzLocation(); try { final URL configUrl = hzConfigResource.getURL(); final Config config = new XmlConfigBuilder(hzConfigResource.getInputStream()).build(); config.setConfigurationUrl(configUrl); config.setInstanceName(this.getClass().getSimpleName()) .setProperty("hazelcast.logging.type", "slf4j") .setProperty("hazelcast.max.no.heartbeat.seconds", "300"); return Hazelcast.newHazelcastInstance(config); } catch (final Exception e) { throw Throwables.propagate(e); } } }