package org.axway.grapes.server;
import com.yammer.dropwizard.Service;
import com.yammer.dropwizard.assets.AssetsBundle;
import com.yammer.dropwizard.auth.basic.BasicAuthProvider;
import com.yammer.dropwizard.config.Bootstrap;
import com.yammer.dropwizard.config.Environment;
import com.yammer.dropwizard.views.ViewBundle;
import org.axway.grapes.server.config.GrapesServerConfig;
import org.axway.grapes.server.db.DBException;
import org.axway.grapes.server.db.RepositoryHandler;
import org.axway.grapes.server.db.datamodel.DbCredential;
import org.axway.grapes.server.webapp.auth.GrapesAuthenticator;
import org.axway.grapes.server.webapp.healthcheck.DataBaseCheck;
import org.axway.grapes.server.webapp.healthcheck.DataModelVersionCheck;
import org.axway.grapes.server.webapp.resources.*;
import org.axway.grapes.server.webapp.tasks.*;
import org.axway.grapes.server.webapp.tasks.migrate.MigrationTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.UnknownHostException;
/**
* Grapes service class.
* This is the main entry point of the project.
* This class starts and registers the different resources of Grapes.
*
* This server is entirely based on dropwizard library:
* http://dropwizard.codahale.com/manual
*
* INFO:
* All the resources of Grapes server are available in org.axway.grapes.server.resources.
*
* @author jdcoffre
*/
public class GrapesServer extends Service<GrapesServerConfig> {
private static final Logger LOG = LoggerFactory.getLogger(GrapesServer.class);
protected GrapesServer() {
super();
}
/**
* Runs Grapes
*/
public static void main(final String[] args) throws ExceptionInInitializerError {
try {
final GrapesServer grapesServer = new GrapesServer();
grapesServer.run(args);
} catch (Exception e) {
LOG.error("Grapes server failed to start:" + e.getMessage());
throw new ExceptionInInitializerError(e);
}
}
@Override
public void initialize(final Bootstrap<GrapesServerConfig> bootstrap) {
bootstrap.setName("Grapes");
// Create assets bundle to ass static resources
bootstrap.addBundle(new AssetsBundle("/public/", "/public"));
bootstrap.addBundle(new AssetsBundle("/assets/", "/assets"));
bootstrap.addBundle(new ViewBundle());
}
@Override
public void run(final GrapesServerConfig config, final Environment env) throws DBException, UnknownHostException {
// init the repoHandler
final RepositoryHandler repoHandler = getRepositoryHandler(config);
// Add credential management
final GrapesAuthenticator grapesAuthenticator = new GrapesAuthenticator(repoHandler);
final BasicAuthProvider authProvider = new BasicAuthProvider<DbCredential>(grapesAuthenticator, "Grapes Authenticator Provider");
env.addProvider(authProvider);
// Tasks
env.addTask(new AddUserTask(repoHandler));
env.addTask(new AddRoleTask(repoHandler));
env.addTask(new RemoveRoleTask(repoHandler));
env.addTask(new MaintenanceModeTask(config));
env.addTask(new KillTask());
env.addTask(new MigrationTask(config.getDataBaseConfig()));
// Health checks
env.addHealthCheck(new DataBaseCheck(config.getDataBaseConfig()));
env.addHealthCheck(new DataModelVersionCheck(config.getDataBaseConfig()));
// Resources
env.addResource(new OrganizationResource(repoHandler, config));
env.addResource(new ProductResource(repoHandler, config));
env.addResource(new ModuleResource(repoHandler, config));
env.addResource(new ArtifactResource(repoHandler, config));
env.addResource(new LicenseResource(repoHandler, config));
env.addResource(new Sequoia(repoHandler, config));
env.addResource(new WebAppResource(repoHandler, config));
env.addResource(new RootResource(repoHandler, config));
}
public RepositoryHandler getRepositoryHandler(final GrapesServerConfig config) throws DBException, UnknownHostException {
return DbResolver.getNewRepoHandler(config.getDataBaseConfig());
}
}