/** * Copyright (c) 2012, Andy Janata * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are permitted * provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of conditions * and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other materials provided * with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.socialgamer.cah; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Collections; import java.util.HashSet; import java.util.Properties; import java.util.Set; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; import net.socialgamer.cah.data.GameManager; import net.socialgamer.cah.data.GameManager.GameId; import net.socialgamer.cah.data.GameManager.MaxGames; import org.hibernate.Session; import com.google.inject.AbstractModule; import com.google.inject.BindingAnnotation; import com.google.inject.Provides; import com.google.inject.TypeLiteral; /** * CAH Guice module. * * @author Andy Janata (ajanata@socialgamer.net) */ public class CahModule extends AbstractModule { private final static Properties properties = new Properties(); @Override protected void configure() { bind(Integer.class) .annotatedWith(GameId.class) .toProvider(GameManager.class); /* * A mutable Set of IP addresses (in String format) which are banned. This Set is * thread-safe. */ bind(new TypeLiteral<Set<String>>() { }) .annotatedWith(BanList.class) .toInstance(Collections.synchronizedSet(new HashSet<String>())); bind(Properties.class) .toInstance(properties); final ScheduledThreadPoolExecutor threadPool = new ScheduledThreadPoolExecutor(2 * Runtime.getRuntime().availableProcessors(), new ThreadFactory() { final AtomicInteger threadCount = new AtomicInteger(); @Override public Thread newThread(final Runnable r) { final Thread t = new Thread(r); t.setDaemon(true); t.setName("timer-task-" + threadCount.incrementAndGet()); return t; } }); threadPool.setRemoveOnCancelPolicy(true); bind(ScheduledThreadPoolExecutor.class).toInstance(threadPool); } /** * @return The maximum number of games allowed on this server. */ @Provides @MaxGames Integer provideMaxGames() { synchronized (properties) { return Integer.valueOf(properties.getProperty("pyx.server.max_games", "20")); } } /** * @return The maximum number of users allowed to connect to this server. */ @Provides @MaxUsers Integer provideMaxUsers() { synchronized (properties) { return Integer.valueOf(properties.getProperty("pyx.server.max_users", "100")); } } @Provides @BroadcastConnectsAndDisconnects Boolean provideBroadcastConnectsAndDisconnects() { synchronized (properties) { return Boolean.valueOf(properties.getProperty( "pyx.server.broadcast_connects_and_disconnects", "true")); } } @Provides @CookieDomain String getCookieDomain() { synchronized (properties) { return properties.getProperty("pyx.client.cookie_domain", ".localhost"); } } @Provides @IncludeInactiveCardsets Boolean getIncludeInactiveCardsets() { synchronized (properties) { return Boolean.valueOf(properties .getProperty("pyx.server.include_inactive_cardsets", "false")); } } /** * @return A Hibernate session. Objects which receive a Hibernate session should close the * session when they are done! */ @Provides Session provideHibernateSession() { return HibernateUtil.instance.sessionFactory.openSession(); } @BindingAnnotation @Retention(RetentionPolicy.RUNTIME) public @interface BanList { } @BindingAnnotation @Retention(RetentionPolicy.RUNTIME) public @interface MaxUsers { } @BindingAnnotation @Retention(RetentionPolicy.RUNTIME) public @interface BroadcastConnectsAndDisconnects { } @BindingAnnotation @Retention(RetentionPolicy.RUNTIME) public @interface CookieDomain { } @BindingAnnotation @Retention(RetentionPolicy.RUNTIME) public @interface IncludeInactiveCardsets { } }