Check out the "Polymorphic configuration" section
<http://www.dropwizard.io/1.0.0/docs/manual/configuration.html#polymorphic-configuration>
of Dropwizard's user manual. Dropwizard loads Discoverable subclasses by
looking up services registered as resources under META-INF/services/. This
is a convoluted JVM jargon way of saying that you need to add a
src/main/resources/META-INF/services/io.dropwizard.server.ServerFactory
file containing a single line
"com.your.packagename.SharedPortServerFactory" to your application.

For comparison, here's
<https://github.com/dropwizard/dropwizard/blob/master/dropwizard-core/src/main/resources/META-INF/services/io.dropwizard.server.ServerFactory>
the services file within dropwizard-core which registers
{Default,Simple}ServerFactory.

On Sat, Sep 17, 2016 at 7:11 PM, Matt Wharton <matt.wharton.pe...@gmail.com>
wrote:

> Hi all,
>
> I'm interested in creating a ServerFactory implementation that's something
> of a hybrid between SimpleServerFactory and DefaultServerFactory.
> Specifically, I'd like to be able to run an SSL and a non-SSL port (which
> DefaultServerFactory allows for) but also have the application and admin
> connectors run on the same port (which SimpleServerFactory allows for).
>
> I have an attempted implementation below, but I'm not sure how to register
> the thing properly so that it can be properly processed by the config
> parser when the server 'type' is set to 'sharedport'. Is there anything
> special I'd need to do? Apologies if this has been covered before.
>
> Thanks!
>
> -Matt
>
> import javax.validation.Valid;
> import javax.validation.constraints.NotNull;
>
> import org.eclipse.jetty.server.Connector;
> import org.eclipse.jetty.server.Handler;
> import org.eclipse.jetty.server.Server;
> import org.eclipse.jetty.util.thread.ThreadPool;
> import org.hibernate.validator.constraints.NotEmpty;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
>
> import com.fasterxml.jackson.annotation.JsonProperty;
> import com.fasterxml.jackson.annotation.JsonTypeName;
> import com.google.common.collect.ImmutableMap;
>
> import io.dropwizard.jetty.ConnectorFactory;
> import io.dropwizard.jetty.ContextRoutingHandler;
> import io.dropwizard.jetty.HttpConnectorFactory;
> import io.dropwizard.server.AbstractServerFactory;
> import io.dropwizard.setup.Environment;
>
> /**
>  * This is an implementation of AbstractServerFactory which allows for
> distinct HTTP and
>  * HTTPS Connectors while also running application and admin on the same
> port within the given
>  * Connector. It's basically a hybrid of SimpleServerFactory and
> DefaultServerFactory.
>  */
> @JsonTypeName("sharedport")
> public class SharedPortServerFactory extends AbstractServerFactory
> {
>   private static final Logger LOG = LoggerFactory.getLogger(
> SharedPortServerFactory.class);
>
>   @Valid
>   @NotNull
>   private ConnectorFactory connector = HttpConnectorFactory.application();
>
>   @Valid
>   @NotNull
>   private ConnectorFactory sslConnector = HttpConnectorFactory.
> application();
>
>   @NotEmpty
>   private String applicationContextPath = "/";
>
>   @NotEmpty
>   private String adminContextPath = "/";
>
>   @JsonProperty
>   public ConnectorFactory getConnector()
>   {
>     return connector;
>   }
>
>   @JsonProperty
>   public void setConnector(ConnectorFactory factory)
>   {
>     this.connector = factory;
>   }
>
>   @JsonProperty
>   public ConnectorFactory getSslConnector()
>   {
>     return sslConnector;
>   }
>
>   @JsonProperty
>   public void setSslConnector(ConnectorFactory sslFactory)
>   {
>     this.sslConnector = sslFactory;
>   }
>
>   @JsonProperty
>   public String getApplicationContextPath()
>   {
>     return applicationContextPath;
>   }
>
>   @JsonProperty
>   public void setApplicationContextPath(String contextPath)
>   {
>     this.applicationContextPath = contextPath;
>   }
>
>   @JsonProperty
>   public String getAdminContextPath()
>   {
>     return adminContextPath;
>   }
>
>   @JsonProperty
>   public void setAdminContextPath(String contextPath)
>   {
>     this.adminContextPath = contextPath;
>   }
>
>   @Override
>   public Server build(Environment environment)
>   {
>     printBanner(environment.getName());
>     ThreadPool threadPool = createThreadPool(environment.metrics());
>     Server server = buildServer(environment.lifecycle(), threadPool);
>
>     LOG.info("Registering jersey handler with root path prefix: {}",
> applicationContextPath);
>     environment.getApplicationContext().setContextPath(
> applicationContextPath);
>     Handler applicationHandler = createAppServlet(server,
>                                                   environment.jersey(),
>
> environment.getObjectMapper(),
>
> environment.getValidator(),
>                                                   environment.
> getApplicationContext(),
>                                                   environment.
> getJerseyServletContainer(),
>                                                   environment.metrics());
>
>     LOG.info("Registering admin handler with root path prefix: {}",
> adminContextPath);
>     environment.getAdminContext().setContextPath(adminContextPath);
>     Handler adminHandler = createAdminServlet(server,
>
> environment.getAdminContext(),
>                                                     environment.metrics(),
>
> environment.healthChecks());
>
>     Connector conn = connector.build(server,
>                                      environment.metrics(),
>                                      environment.getName(),
>                                      null);
>     Connector sslConn = sslConnector.build(server,
>                                            environment.metrics(),
>                                            environment.getName(),
>                                            null);
>
>     server.addConnector(conn);
>     server.addConnector(sslConn);
>
>     ContextRoutingHandler routingHandler = new ContextRoutingHandler(
> ImmutableMap.of(applicationContextPath, applicationHandler,
>
>            adminContextPath, adminHandler));
>     server.setHandler(addStatsHandler(addRequestLog(server,
> routingHandler, environment.getName())));
>
>     return server;
>   }
>
> }
>
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "dropwizard-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to dropwizard-user+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>



-- 
Evan Meagher

-- 
You received this message because you are subscribed to the Google Groups 
"dropwizard-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to dropwizard-user+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to