/* * The CroudTrip! application aims at revolutionizing the car-ride-sharing market with its easy, * user-friendly and highly automated way of organizing shared Trips. Copyright (C) 2015 Nazeeh Ammari, * Philipp Eichhorn, Ricarda Hohn, Vanessa Lange, Alexander Popp, Frederik Simon, Michael Weber * This program is free software: you can redistribute it and/or modify it under the terms of the GNU * Affero General Public License as published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * You should have received a copy of the GNU Affero General Public License along with this program. * If not, see http://www.gnu.org/licenses/. */ package org.croudtrip.app; import com.google.inject.Guice; import com.google.inject.Injector; import org.croudtrip.account.Avatar; import org.croudtrip.account.UserManager; import org.croudtrip.api.account.User; import org.croudtrip.api.account.UserDescription; import org.croudtrip.api.account.Vehicle; import org.croudtrip.api.gcm.GcmRegistration; import org.croudtrip.api.trips.JoinTripRequest; import org.croudtrip.api.trips.RunningTripQuery; import org.croudtrip.api.trips.SuperTrip; import org.croudtrip.api.trips.SuperTripReservation; import org.croudtrip.api.trips.TripOffer; import org.croudtrip.auth.BasicAuthenticator; import org.croudtrip.auth.BasicCredentials; import org.croudtrip.db.DbModule; import org.croudtrip.directions.DirectionsModule; import org.croudtrip.gcm.GcmModule; import org.croudtrip.logs.LogEntry; import org.croudtrip.places.PlacesModule; import org.croudtrip.rest.AvatarsResource; import org.croudtrip.rest.GcmRegistrationResource; import org.croudtrip.rest.JsonExceptionMapper; import org.croudtrip.rest.LogsResource; import org.croudtrip.rest.NotFoundExceptionMapper; import org.croudtrip.rest.RouteNotFoundExceptionMapper; import org.croudtrip.rest.ThrowableExceptionMapper; import org.croudtrip.rest.TripsResource; import org.croudtrip.rest.UsersHeadResource; import org.croudtrip.rest.UsersResource; import org.croudtrip.rest.VehicleResource; import org.croudtrip.trips.DisableTripOffersExecutor; import org.croudtrip.trips.ExpireJoinTripRequestsExecutor; import org.croudtrip.trips.ExpireTripOffersExecutor; import org.croudtrip.trips.RunningTripQueryGarbageCollectionExecutor; import org.croudtrip.trips.TripReservationGarbageCollectionExecutor; import org.croudtrip.trips.TripsModule; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.context.internal.ManagedSessionContext; import io.dropwizard.Application; import io.dropwizard.auth.AuthFactory; import io.dropwizard.auth.basic.BasicAuthFactory; import io.dropwizard.db.DataSourceFactory; import io.dropwizard.forms.MultiPartBundle; import io.dropwizard.hibernate.HibernateBundle; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; /** * Starting and central initialization point of server. */ public final class CroudTripApplication extends Application<CroudTripConfig> { public static void main(String[] args) throws Exception { new CroudTripApplication().run(args); } @Override public void initialize(Bootstrap<CroudTripConfig> bootstrap) { bootstrap.addBundle(hibernateBundle); bootstrap.addBundle(new MultiPartBundle()); } @Override public void run(CroudTripConfig configuration, Environment environment) throws Exception { Injector injector = Guice.createInjector( new DbModule(hibernateBundle.getSessionFactory()), new DirectionsModule(configuration), new GcmModule(configuration.getGoogleAPIKey()), new TripsModule(), new PlacesModule( configuration )); // start managed instances (manually since deployment via WAR file does not seem to work) injector.getInstance(TripReservationGarbageCollectionExecutor.class).start(); injector.getInstance(RunningTripQueryGarbageCollectionExecutor.class).start(); injector.getInstance(DisableTripOffersExecutor.class).start(); injector.getInstance(ExpireTripOffersExecutor.class).start(); injector.getInstance(ExpireJoinTripRequestsExecutor.class).start(); // setup REST api environment.jersey().register(injector.getInstance(UsersResource.class)); environment.jersey().register(injector.getInstance(UsersHeadResource.class)); environment.jersey().register(injector.getInstance(AvatarsResource.class)); environment.jersey().register(injector.getInstance(TripsResource.class)); environment.jersey().register(injector.getInstance(VehicleResource.class)); environment.jersey().register(injector.getInstance(GcmRegistrationResource.class)); environment.jersey().register(injector.getInstance(LogsResource.class)); environment.jersey().register(injector.getInstance(NotFoundExceptionMapper.class)); environment.jersey().register(injector.getInstance(JsonExceptionMapper.class)); environment.jersey().register(injector.getInstance(RouteNotFoundExceptionMapper.class)); environment.jersey().register(injector.getInstance(ThrowableExceptionMapper.class)); environment.jersey().register(AuthFactory.binder(new BasicAuthFactory<>( injector.getInstance(BasicAuthenticator.class), "all secret", User.class))); // register a set of "default" users SessionFactory sessionFactory = injector.getInstance(SessionFactory.class); UserManager userManager = injector.getInstance(UserManager.class); Session session = null; try { session = sessionFactory.openSession(); ManagedSessionContext.bind(session); for (UserDescription user : configuration.getUsers()) { if (!userManager.findUserByEmail(user.getEmail()).isPresent()) { userManager.addUser(user); } } } catch (Exception e) { throw e; } finally { if (session != null) { session.flush(); session.close(); } } } private final HibernateBundle<CroudTripConfig> hibernateBundle = new HibernateBundle<CroudTripConfig>( User.class, BasicCredentials.class, Avatar.class, TripOffer.class, SuperTripReservation.class, SuperTrip.class, JoinTripRequest.class, RunningTripQuery.class, Vehicle.class, LogEntry.class, GcmRegistration.class) { @Override public DataSourceFactory getDataSourceFactory(CroudTripConfig configuration) { return configuration.getDatabase(); } }; }