/** * {@inheritDoc} * * @throws IOException when instance in configuration can not be opened and closed. */ @Override public final void run(final KijiRESTConfiguration configuration, final Environment environment) throws IOException { final KijiURI clusterURI = KijiURI.newBuilder(configuration.getClusterURI()).build(); // Load specified instances and health checks for each. final Set<KijiURI> instances = InstanceUtil.getInstances( clusterURI, new InstancesMapTo<KijiURI>() { public KijiURI apply(KijiURI instanceURI) throws IOException { InstanceUtil.openAndCloseInstance(instanceURI); LOG.info("Loading instance {} upon startup.", instanceURI.toOrderedString()); environment.addHealthCheck(new InstanceHealthCheck(instanceURI)); return instanceURI; } }); final ManagedKijiClient managedKijiClient = new ManagedKijiClient(instances); environment.manage(managedKijiClient); // Remove all built-in Dropwizard ExceptionHandler. // Always depend on custom ones. // Inspired by Jeremy Whitlock's suggestion on thoughtspark.org. Set<Object> jerseyResources = environment.getJerseyResourceConfig().getSingletons(); Iterator<Object> jerseyResourcesIterator = jerseyResources.iterator(); while (jerseyResourcesIterator.hasNext()) { Object jerseyResource = jerseyResourcesIterator.next(); if (jerseyResource instanceof ExceptionMapper && jerseyResource.getClass().getName().startsWith("com.yammer.dropwizard.jersey")) { jerseyResourcesIterator.remove(); } } // Update instances periodically. final RefreshInstances instanceRefresher = new RefreshInstances(clusterURI, managedKijiClient); ScheduledExecutorService scheduler = environment.managedScheduledExecutorService("instance_refresh_scheduler", 1); scheduler.scheduleAtFixedRate( instanceRefresher, INSTANCE_REFRESH_PERIOD_MINUTES, // Start a period from now. INSTANCE_REFRESH_PERIOD_MINUTES, MINUTES); // Load admin task to manually update instances. environment.addTask(new RefreshInstancesTask(instanceRefresher)); // Load resources. for (KijiRestPlugin plugin : Lookups.get(KijiRestPlugin.class)) { LOG.info("Loading plugin {}", plugin.getClass()); plugin.install(managedKijiClient, configuration, environment); } // Allow global CORS filter. CORS off by default. if (configuration.getCORS()) { environment.addFilter( CrossOriginFilter.class, configuration.getHttpConfiguration().getRootPath()); LOG.info("Global cross-origin resource sharing is allowed."); } }
/** {@inheritDoc} */ @Override public final void initialize(final Bootstrap<KijiRESTConfiguration> bootstrap) { bootstrap.setName("kiji-rest"); // Initialize plugins. for (KijiRestPlugin plugin : Lookups.get(KijiRestPlugin.class)) { LOG.info("Initializing plugin {}", plugin.getClass()); plugin.initialize(bootstrap); } }
/** * Provides a {@link ZooKeeperFactory}. There should only be a single {@code ZooKeeperFactory} * active per JVM, so {@link #get()} will always return the same object. */ public static final class Provider { private static final ZooKeeperFactory INSTANCE = Lookups.getPriority(ZooKeeperFactory.class).lookup(); /** @return the {@link ZooKeeperFactory} with the highest priority. */ public static ZooKeeperFactory get() { return INSTANCE; } /** Utility class may not be instantiated. */ private Provider() {} }