Matt, I'm also working on similar sort of requirement (application and 
admin to share ports and to secure API with mutual authentication). 
Appreciate if you could share your final implementation of "
SharedPortServerFactory", along with learnings and experience. Thank you.

-Abu


On Sunday, September 18, 2016 at 1:07:31 PM UTC-4, Matt Wharton wrote:
>
> Brilliant, that did the trick! Thanks so much!
>
> -Matt
>
> On Sunday, September 18, 2016 at 10:29:54 AM UTC-6, Evan Meagher wrote:
>>
>> 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 <[email protected]> 
>> 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 [email protected].
>>> 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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to