package com.github.windbender; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; import javax.mail.MessagingException; import org.eclipse.jetty.server.session.SessionHandler; import com.amazonaws.util.StringInputStream; import com.bazaarvoice.dropwizard.assets.ConfiguredAssetsBundle; import com.github.windbender.auth.SessionAuthProvider; import com.github.windbender.auth.SessionCurProjProvider; import com.github.windbender.auth.SessionUserProvider; import com.github.windbender.core.FileImageStore; import com.github.windbender.core.HibernateDataStore; import com.github.windbender.core.ImageStore; import com.github.windbender.core.S3ImageStore; import com.github.windbender.dao.CameraDAO; import com.github.windbender.dao.EventDAO; import com.github.windbender.dao.GoodDAO; import com.github.windbender.dao.HibernateUserDAO; import com.github.windbender.dao.IdentificationDAO; import com.github.windbender.dao.ImageRecordDAO; import com.github.windbender.dao.InviteDAO; import com.github.windbender.dao.ProjectDAO; import com.github.windbender.dao.ReportDAO; import com.github.windbender.dao.ReviewDAO; import com.github.windbender.dao.SpeciesDAO; import com.github.windbender.dao.TokenDAO; import com.github.windbender.dao.UserProjectDAO; import com.github.windbender.domain.Camera; import com.github.windbender.domain.Good; import com.github.windbender.domain.Identification; import com.github.windbender.domain.ImageEvent; import com.github.windbender.domain.ImageRecord; import com.github.windbender.domain.Invite; import com.github.windbender.domain.Project; import com.github.windbender.domain.ResetPasswordToken; import com.github.windbender.domain.Review; import com.github.windbender.domain.Species; import com.github.windbender.domain.User; import com.github.windbender.domain.UserProject; import com.github.windbender.resources.CameraResource; import com.github.windbender.resources.ImageResource; import com.github.windbender.resources.ProjectResource; import com.github.windbender.resources.ReportResource; import com.github.windbender.resources.UserProjectResource; import com.github.windbender.resources.UserResource; import com.github.windbender.service.AsyncEmailSender; import com.github.windbender.service.CachingTimeZoneGetter; import com.github.windbender.service.CompositeTimeZoneGetter; import com.github.windbender.service.EmailService; import com.github.windbender.service.GeoNameTimeZoneGetter; import com.github.windbender.service.MakeDatesService; import com.github.windbender.service.MessageSender; import com.github.windbender.service.SMTPMessageSender; import com.github.windbender.service.StartupMessageCreator; import com.github.windbender.service.StupidTimeZoneGetter; import com.github.windbender.service.TimeZoneGetter; import com.sun.jersey.multipart.impl.MultiPartConfigProvider; import com.yammer.dropwizard.Service; import com.yammer.dropwizard.config.Bootstrap; import com.yammer.dropwizard.config.Environment; import com.yammer.dropwizard.db.DatabaseConfiguration; import com.yammer.dropwizard.hibernate.HibernateBundle; import com.yammer.dropwizard.migrations.MigrationsBundle; public class WLCDMServer extends Service<WLCDMServerConfiguration> { public static void main(String[] args) throws Exception { new WLCDMServer().run(args); } private WLCDMServer() { super(); } @Override public void initialize(Bootstrap<WLCDMServerConfiguration> bootstrap) { bootstrap.setName("wlcdm"); //bootstrap.addBundle(new AssetsBundle("/assets", "/")); bootstrap.addBundle(new ConfiguredAssetsBundle("/assets/", "/")); bootstrap.addBundle(hibernate); bootstrap.addBundle(new MigrationsBundle<WLCDMServerConfiguration>() { @Override public DatabaseConfiguration getDatabaseConfiguration(WLCDMServerConfiguration configuration) { return configuration.getDatabaseConfiguration(); } }); } private final HibernateBundle<WLCDMServerConfiguration> hibernate = new HibernateBundle<WLCDMServerConfiguration>( Identification.class, ImageRecord.class, Invite.class, ImageEvent.class, User.class, Species.class, Project.class, UserProject.class, Camera.class, ResetPasswordToken.class, Review.class, Good.class) { @Override public DatabaseConfiguration getDatabaseConfiguration(WLCDMServerConfiguration configuration) { return configuration.getDatabaseConfiguration(); } }; @Override public void run(WLCDMServerConfiguration configuration, Environment environment) { try { InputStream is = new StringInputStream("hello"); BufferedInputStream bis = new BufferedInputStream(is); BufferedImage bi = ImageIO.read(bis); } catch(Exception e) { System.out.println("that didn't work because:"+e); } String geoNameUsername = configuration.getGeoNameUsername(); TimeZoneGetter timeZoneGetter = new CompositeTimeZoneGetter(new CachingTimeZoneGetter(new GeoNameTimeZoneGetter(geoNameUsername)), new StupidTimeZoneGetter()); final IdentificationDAO idDAO = new IdentificationDAO(hibernate.getSessionFactory()); final ImageRecordDAO irDAO = new ImageRecordDAO(hibernate.getSessionFactory()); final SpeciesDAO spDAO = new SpeciesDAO(hibernate.getSessionFactory()); final HibernateUserDAO uDAO = new HibernateUserDAO(hibernate.getSessionFactory()); final EventDAO ieDAO = new EventDAO(hibernate.getSessionFactory()); final TokenDAO tokenDAO = new TokenDAO(hibernate.getSessionFactory()); final ProjectDAO projDAO = new ProjectDAO(hibernate.getSessionFactory()); final UserProjectDAO upDAO = new UserProjectDAO(hibernate.getSessionFactory()); final ReportDAO reportDAO = new ReportDAO(hibernate.getSessionFactory(), ieDAO, idDAO, projDAO); final CameraDAO cameraDAO = new CameraDAO(hibernate.getSessionFactory()); final ReviewDAO reviewDAO = new ReviewDAO(hibernate.getSessionFactory()); final GoodDAO goodDAO = new GoodDAO(hibernate.getSessionFactory()); final InviteDAO inviteDAO = new InviteDAO(hibernate.getSessionFactory()); HibernateDataStore ds = new HibernateDataStore(idDAO,irDAO,spDAO,uDAO, ieDAO, hibernate.getSessionFactory(), timeZoneGetter); environment.manage(ds); String bucketName = "wlcdm-test"; ImageStore store = null; if(configuration.isAmazon()) { store = new S3ImageStore(configuration.getAmazon().getAccesskey(), configuration.getAmazon().getSecretkey(), bucketName); } else { store = new FileImageStore("/Users/chris/Sites/s3fake/upload"); } MessageSender ms = null; // if(configuration.isAmazon()) { // ms = new AmazonMessageSender(configuration); // // } else { ms = new SMTPMessageSender(configuration); // } EmailService emailService; if(configuration.isAsync() ) { AsyncEmailSender ams = new AsyncEmailSender(configuration, ms); environment.manage(ams); emailService = new EmailService(configuration, ams); } else { emailService = new EmailService(configuration, ms); } // HashSessionManager hsm = new HashSessionManager(); IterableHashSessionManager hsm = new IterableHashSessionManager(); try { File dir = new File(configuration.getSessionPersistDirectory()); File f = dir.getCanonicalFile(); if(!f.exists()) { if(!f.mkdir()) { throw new IllegalArgumentException("can't create session directory"); } } if(!dir.isDirectory()) { throw new IOException("persistence directory is not a directory"); } hsm.setStoreDirectory(dir); hsm.setIdleSavePeriod(10*60); // 10 minutes hsm.setSavePeriod(60); } catch (IOException e) { } SessionReloaderOperator sro = new SessionReloaderOperator(hsm, uDAO, projDAO, upDAO); environment.addResource(new UserResource(uDAO, tokenDAO, projDAO, upDAO, inviteDAO, emailService)); environment.addResource(new ImageResource(ds, store, irDAO, spDAO, reportDAO, timeZoneGetter)); environment.addResource(new ProjectResource(projDAO, uDAO, upDAO,inviteDAO, emailService)); environment.addResource(new ReportResource(reportDAO, ieDAO, irDAO, reviewDAO, goodDAO)); environment.addResource(new CameraResource(cameraDAO, projDAO)); environment.addResource(new UserProjectResource(upDAO, projDAO, uDAO, sro)); environment.setSessionHandler(new SessionHandler(hsm)); environment.addProvider(SessionUserProvider.class); environment.addProvider(SessionAuthProvider.class); environment.addProvider(SessionCurProjProvider.class); environment.addProvider(MultiPartConfigProvider.class); environment.addProvider(com.sun.jersey.multipart.impl.MultiPartReaderServerSide.class); MakeDatesService mds = new MakeDatesService(hibernate.getSessionFactory()); mds.makeDates(); try { ms.sendMessage(new StartupMessageCreator()); System.out.println("startup message sent"); } catch (MessagingException e) { System.out.println("failed to send startup message "+e); // throw new RuntimeException(e); } } }