2014-08-08 16:49:02 +02:00
|
|
|
package com.commafeed;
|
|
|
|
|
|
|
|
|
|
import io.dropwizard.Application;
|
|
|
|
|
import io.dropwizard.assets.AssetsBundle;
|
|
|
|
|
import io.dropwizard.db.DataSourceFactory;
|
|
|
|
|
import io.dropwizard.hibernate.HibernateBundle;
|
|
|
|
|
import io.dropwizard.migrations.MigrationsBundle;
|
2014-10-28 16:31:49 +01:00
|
|
|
import io.dropwizard.server.DefaultServerFactory;
|
2014-08-22 20:23:31 +02:00
|
|
|
import io.dropwizard.servlets.CacheBustingFilter;
|
2014-08-08 16:49:02 +02:00
|
|
|
import io.dropwizard.setup.Bootstrap;
|
|
|
|
|
import io.dropwizard.setup.Environment;
|
|
|
|
|
|
2014-10-26 17:48:25 +01:00
|
|
|
import java.io.IOException;
|
2014-08-08 16:49:02 +02:00
|
|
|
import java.util.Date;
|
2014-08-22 20:17:13 +02:00
|
|
|
import java.util.EnumSet;
|
2014-10-22 15:36:21 +02:00
|
|
|
import java.util.concurrent.ScheduledExecutorService;
|
2014-08-22 20:17:13 +02:00
|
|
|
|
|
|
|
|
import javax.servlet.DispatcherType;
|
2014-10-26 17:48:25 +01:00
|
|
|
import javax.servlet.FilterChain;
|
|
|
|
|
import javax.servlet.ServletException;
|
|
|
|
|
import javax.servlet.ServletRequest;
|
|
|
|
|
import javax.servlet.ServletResponse;
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
2014-08-08 16:49:02 +02:00
|
|
|
|
2014-08-09 15:25:41 +02:00
|
|
|
import org.eclipse.jetty.server.session.SessionHandler;
|
2014-10-28 16:31:49 +01:00
|
|
|
import org.glassfish.jersey.media.multipart.MultiPartFeature;
|
2014-08-08 16:49:02 +02:00
|
|
|
|
|
|
|
|
import com.commafeed.backend.feed.FeedRefreshTaskGiver;
|
|
|
|
|
import com.commafeed.backend.feed.FeedRefreshUpdater;
|
|
|
|
|
import com.commafeed.backend.feed.FeedRefreshWorker;
|
|
|
|
|
import com.commafeed.backend.model.AbstractModel;
|
|
|
|
|
import com.commafeed.backend.model.Feed;
|
|
|
|
|
import com.commafeed.backend.model.FeedCategory;
|
|
|
|
|
import com.commafeed.backend.model.FeedEntry;
|
|
|
|
|
import com.commafeed.backend.model.FeedEntryContent;
|
|
|
|
|
import com.commafeed.backend.model.FeedEntryStatus;
|
|
|
|
|
import com.commafeed.backend.model.FeedEntryTag;
|
|
|
|
|
import com.commafeed.backend.model.FeedSubscription;
|
|
|
|
|
import com.commafeed.backend.model.User;
|
|
|
|
|
import com.commafeed.backend.model.UserRole;
|
|
|
|
|
import com.commafeed.backend.model.UserSettings;
|
|
|
|
|
import com.commafeed.backend.service.StartupService;
|
|
|
|
|
import com.commafeed.backend.service.UserService;
|
2014-08-09 22:18:14 +02:00
|
|
|
import com.commafeed.backend.task.OldStatusesCleanupTask;
|
|
|
|
|
import com.commafeed.backend.task.OrphansCleanupTask;
|
2014-10-28 16:31:49 +01:00
|
|
|
import com.commafeed.frontend.auth.SecurityCheckFactoryProvider;
|
2014-08-08 16:49:02 +02:00
|
|
|
import com.commafeed.frontend.resource.AdminREST;
|
|
|
|
|
import com.commafeed.frontend.resource.CategoryREST;
|
|
|
|
|
import com.commafeed.frontend.resource.EntryREST;
|
|
|
|
|
import com.commafeed.frontend.resource.FeedREST;
|
|
|
|
|
import com.commafeed.frontend.resource.PubSubHubbubCallbackREST;
|
|
|
|
|
import com.commafeed.frontend.resource.ServerREST;
|
|
|
|
|
import com.commafeed.frontend.resource.UserREST;
|
2014-08-11 15:11:01 +02:00
|
|
|
import com.commafeed.frontend.servlet.AnalyticsServlet;
|
2014-08-11 05:51:44 +02:00
|
|
|
import com.commafeed.frontend.servlet.CustomCssServlet;
|
2014-08-09 15:25:41 +02:00
|
|
|
import com.commafeed.frontend.servlet.LogoutServlet;
|
2014-08-09 13:25:53 +02:00
|
|
|
import com.commafeed.frontend.servlet.NextUnreadServlet;
|
2014-10-28 16:31:49 +01:00
|
|
|
import com.commafeed.frontend.session.SessionHelperFactoryProvider;
|
2014-08-17 14:16:30 +02:00
|
|
|
import com.google.inject.Guice;
|
|
|
|
|
import com.google.inject.Injector;
|
2014-08-11 11:05:50 +02:00
|
|
|
import com.wordnik.swagger.config.ConfigFactory;
|
|
|
|
|
import com.wordnik.swagger.config.ScannerFactory;
|
|
|
|
|
import com.wordnik.swagger.config.SwaggerConfig;
|
|
|
|
|
import com.wordnik.swagger.jaxrs.config.DefaultJaxrsScanner;
|
|
|
|
|
import com.wordnik.swagger.jaxrs.listing.ApiDeclarationProvider;
|
|
|
|
|
import com.wordnik.swagger.jaxrs.listing.ApiListingResourceJSON;
|
|
|
|
|
import com.wordnik.swagger.jaxrs.listing.ResourceListingProvider;
|
|
|
|
|
import com.wordnik.swagger.jaxrs.reader.DefaultJaxrsApiReader;
|
|
|
|
|
import com.wordnik.swagger.reader.ClassReaders;
|
2014-08-08 16:49:02 +02:00
|
|
|
|
|
|
|
|
public class CommaFeedApplication extends Application<CommaFeedConfiguration> {
|
|
|
|
|
|
|
|
|
|
public static final String USERNAME_ADMIN = "admin";
|
|
|
|
|
public static final String USERNAME_DEMO = "demo";
|
|
|
|
|
|
|
|
|
|
public static final Date STARTUP_TIME = new Date();
|
|
|
|
|
|
|
|
|
|
private HibernateBundle<CommaFeedConfiguration> hibernateBundle;
|
|
|
|
|
|
2014-08-19 12:51:15 +02:00
|
|
|
@Override
|
|
|
|
|
public String getName() {
|
|
|
|
|
return "CommaFeed";
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-08 16:49:02 +02:00
|
|
|
@Override
|
|
|
|
|
public void initialize(Bootstrap<CommaFeedConfiguration> bootstrap) {
|
2014-08-17 14:16:30 +02:00
|
|
|
bootstrap.addBundle(hibernateBundle = new HibernateBundle<CommaFeedConfiguration>(AbstractModel.class, Feed.class,
|
|
|
|
|
FeedCategory.class, FeedEntry.class, FeedEntryContent.class, FeedEntryStatus.class, FeedEntryTag.class,
|
|
|
|
|
FeedSubscription.class, User.class, UserRole.class, UserSettings.class) {
|
2014-08-08 16:49:02 +02:00
|
|
|
@Override
|
|
|
|
|
public DataSourceFactory getDataSourceFactory(CommaFeedConfiguration configuration) {
|
|
|
|
|
return configuration.getDatabase();
|
|
|
|
|
}
|
2014-08-17 14:16:30 +02:00
|
|
|
});
|
2014-08-08 16:49:02 +02:00
|
|
|
|
2014-08-17 14:16:30 +02:00
|
|
|
bootstrap.addBundle(new MigrationsBundle<CommaFeedConfiguration>() {
|
2014-08-08 16:49:02 +02:00
|
|
|
@Override
|
|
|
|
|
public DataSourceFactory getDataSourceFactory(CommaFeedConfiguration configuration) {
|
|
|
|
|
return configuration.getDatabase();
|
|
|
|
|
}
|
2014-08-17 14:16:30 +02:00
|
|
|
});
|
2014-08-08 16:49:02 +02:00
|
|
|
|
|
|
|
|
bootstrap.addBundle(new AssetsBundle("/assets/", "/", "index.html"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void run(CommaFeedConfiguration config, Environment environment) throws Exception {
|
2014-08-17 14:16:30 +02:00
|
|
|
// guice init
|
|
|
|
|
Injector injector = Guice.createInjector(new CommaFeedModule(hibernateBundle.getSessionFactory(), config, environment.metrics()));
|
2014-08-08 16:49:02 +02:00
|
|
|
|
2014-08-09 15:25:41 +02:00
|
|
|
// Auth/session management
|
2014-08-18 13:09:54 +02:00
|
|
|
environment.servlets().setSessionHandler(new SessionHandler(config.getSessionManagerFactory().build()));
|
2014-10-28 16:31:49 +01:00
|
|
|
environment.jersey().register(new SecurityCheckFactoryProvider.Binder(injector.getInstance(UserService.class)));
|
|
|
|
|
environment.jersey().register(new SessionHelperFactoryProvider.Binder());
|
2014-08-08 16:49:02 +02:00
|
|
|
|
2014-08-09 15:25:41 +02:00
|
|
|
// REST resources
|
2014-08-08 16:49:02 +02:00
|
|
|
environment.jersey().setUrlPattern("/rest/*");
|
2014-10-28 16:31:49 +01:00
|
|
|
((DefaultServerFactory) config.getServerFactory()).setJerseyRootPath("/rest/*");
|
2014-08-17 14:16:30 +02:00
|
|
|
environment.jersey().register(injector.getInstance(AdminREST.class));
|
|
|
|
|
environment.jersey().register(injector.getInstance(CategoryREST.class));
|
|
|
|
|
environment.jersey().register(injector.getInstance(EntryREST.class));
|
|
|
|
|
environment.jersey().register(injector.getInstance(FeedREST.class));
|
|
|
|
|
environment.jersey().register(injector.getInstance(PubSubHubbubCallbackREST.class));
|
|
|
|
|
environment.jersey().register(injector.getInstance(ServerREST.class));
|
|
|
|
|
environment.jersey().register(injector.getInstance(UserREST.class));
|
2014-08-08 16:49:02 +02:00
|
|
|
|
2014-10-28 16:31:49 +01:00
|
|
|
environment.jersey().register(MultiPartFeature.class);
|
|
|
|
|
|
2014-08-09 15:25:41 +02:00
|
|
|
// Servlets
|
2014-08-17 14:16:30 +02:00
|
|
|
environment.servlets().addServlet("next", injector.getInstance(NextUnreadServlet.class)).addMapping("/next");
|
|
|
|
|
environment.servlets().addServlet("logout", injector.getInstance(LogoutServlet.class)).addMapping("/logout");
|
|
|
|
|
environment.servlets().addServlet("customCss", injector.getInstance(CustomCssServlet.class)).addMapping("/custom_css.css");
|
|
|
|
|
environment.servlets().addServlet("analytics.js", injector.getInstance(AnalyticsServlet.class)).addMapping("/analytics.js");
|
2014-08-09 13:25:53 +02:00
|
|
|
|
2014-08-18 13:09:54 +02:00
|
|
|
// Scheduled tasks
|
2014-10-22 15:36:21 +02:00
|
|
|
ScheduledExecutorService executor = environment.lifecycle().scheduledExecutorService("task-scheduler").build();
|
|
|
|
|
injector.getInstance(OldStatusesCleanupTask.class).register(executor);
|
|
|
|
|
injector.getInstance(OrphansCleanupTask.class).register(executor);
|
2014-08-09 22:18:14 +02:00
|
|
|
|
2014-08-18 13:09:54 +02:00
|
|
|
// database init/changelogs
|
2014-08-17 14:16:30 +02:00
|
|
|
environment.lifecycle().manage(injector.getInstance(StartupService.class));
|
2014-08-18 13:09:54 +02:00
|
|
|
|
|
|
|
|
// background feed fetching
|
2014-08-17 14:16:30 +02:00
|
|
|
environment.lifecycle().manage(injector.getInstance(FeedRefreshTaskGiver.class));
|
|
|
|
|
environment.lifecycle().manage(injector.getInstance(FeedRefreshWorker.class));
|
|
|
|
|
environment.lifecycle().manage(injector.getInstance(FeedRefreshUpdater.class));
|
2014-08-09 13:25:53 +02:00
|
|
|
|
2014-08-11 11:05:50 +02:00
|
|
|
// Swagger
|
|
|
|
|
environment.jersey().register(new ApiListingResourceJSON());
|
|
|
|
|
environment.jersey().register(new ApiDeclarationProvider());
|
|
|
|
|
environment.jersey().register(new ResourceListingProvider());
|
|
|
|
|
ScannerFactory.setScanner(new DefaultJaxrsScanner());
|
|
|
|
|
ClassReaders.setReader(new DefaultJaxrsApiReader());
|
|
|
|
|
SwaggerConfig swaggerConfig = ConfigFactory.config();
|
|
|
|
|
swaggerConfig.setApiVersion("1");
|
|
|
|
|
swaggerConfig.setBasePath("/rest");
|
2014-08-22 20:17:13 +02:00
|
|
|
|
|
|
|
|
// cache configuration
|
2014-10-26 17:48:25 +01:00
|
|
|
// prevent caching on REST resources, except for favicons
|
|
|
|
|
environment.servlets().addFilter("cache-filter", new CacheBustingFilter() {
|
|
|
|
|
@Override
|
|
|
|
|
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
|
|
|
|
|
String path = ((HttpServletRequest) request).getRequestURI();
|
|
|
|
|
if (path.contains("/feed/favicon")) {
|
|
|
|
|
chain.doFilter(request, response);
|
|
|
|
|
} else {
|
|
|
|
|
super.doFilter(request, response, chain);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}).addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/rest/*");
|
2014-10-27 09:54:06 +01:00
|
|
|
|
2014-08-08 16:49:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
|
|
|
new CommaFeedApplication().run(args);
|
|
|
|
|
}
|
|
|
|
|
}
|