diff --git a/README.md b/README.md
index a9834d0..2a99120 100644
--- a/README.md
+++ b/README.md
@@ -111,6 +111,10 @@ Controller methods arguments support the following [JAX-RS annotations](https://
* ```javax.ws.rs.BeanParam```
* Binds and attempts to convert the request body to an instance of the method parameter.
+* @DefaultParam
+ * ```javax.ws.rs.DefaultParam```
+ * Sets the default value of a method parameter.
+
## Return Types
#### Performance
diff --git a/pom.xml b/pom.xml
index 0b84392..0ed311b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -206,18 +206,15 @@
undertow-core
${version.undertow}
-
+
-
- javax.ws.rs
- javax.ws.rs-api
- 2.1.1
-
-
+
+ javax.ws.rs
+ javax.ws.rs-api
+ 2.1.1
+
+
com.squareup
javapoet
@@ -291,15 +288,11 @@
jackson-databind
${version.jackson}
+
- io.swagger
- swagger-annotations
- 1.5.12
-
-
- io.swagger
- swagger-core
- 1.5.12
+ ch.qos.logback
+ logback-classic
+ 1.2.3
org.slf4j
@@ -307,10 +300,27 @@
+
+
+
+
- ch.qos.logback
- logback-classic
- 1.2.3
+ io.swagger
+ swagger-annotations
+ 1.5.12
+
+
+ io.swagger
+ swagger-core
+ 1.5.12
org.slf4j
@@ -318,7 +328,6 @@
-
io.swagger
swagger-parser
diff --git a/src/main/java/io/sinistral/proteus/ProteusApplication.java b/src/main/java/io/sinistral/proteus/ProteusApplication.java
index e8d2f9f..5ff2c6d 100644
--- a/src/main/java/io/sinistral/proteus/ProteusApplication.java
+++ b/src/main/java/io/sinistral/proteus/ProteusApplication.java
@@ -46,16 +46,15 @@
import io.sinistral.proteus.server.endpoints.EndpointInfo;
import io.sinistral.proteus.server.handlers.HandlerGenerator;
import io.sinistral.proteus.server.handlers.ServerDefaultHttpHandler;
+import io.sinistral.proteus.services.BaseService;
import io.sinistral.proteus.utilities.SecurityOps;
import io.sinistral.proteus.utilities.TablePrinter;
-import io.undertow.Handlers;
import io.undertow.Undertow;
import io.undertow.Undertow.ListenerInfo;
import io.undertow.UndertowOptions;
import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;
import io.undertow.server.RoutingHandler;
-import io.undertow.server.protocol.http2.Http2UpgradeHandler;
import io.undertow.util.Headers;
import io.undertow.util.Methods;
@@ -77,7 +76,7 @@ public class ProteusApplication
@Inject
@Named("registeredServices")
- protected Set> registeredServices;
+ protected Set> registeredServices;
@Inject
protected RoutingHandler router;
@@ -142,7 +141,9 @@ public void start()
log.info("Starting services...");
- Set services = registeredServices.stream().map(sc -> injector.getInstance(sc)).collect(Collectors.toSet());
+ Set services = registeredServices.stream().map(sc -> injector.getInstance(sc)).collect(Collectors.toSet());
+
+ injector = injector.createChildInjector(services);
serviceManager = new ServiceManager(services);
@@ -316,7 +317,7 @@ public void buildServer()
}
- public ProteusApplication addService(Class extends Service> serviceClass)
+ public ProteusApplication addService(Class extends BaseService> serviceClass)
{
registeredServices.add(serviceClass);
return this;
diff --git a/src/main/java/io/sinistral/proteus/modules/ApplicationModule.java b/src/main/java/io/sinistral/proteus/modules/ApplicationModule.java
index 00e55e8..cb00df9 100644
--- a/src/main/java/io/sinistral/proteus/modules/ApplicationModule.java
+++ b/src/main/java/io/sinistral/proteus/modules/ApplicationModule.java
@@ -29,6 +29,7 @@
import io.sinistral.proteus.server.Extractors;
import io.sinistral.proteus.server.ServerResponse;
import io.sinistral.proteus.server.endpoints.EndpointInfo;
+import io.sinistral.proteus.services.BaseService;
import io.undertow.server.DefaultResponseListener;
import io.undertow.server.HandlerWrapper;
import io.undertow.server.HttpHandler;
@@ -44,7 +45,7 @@ public class ApplicationModule extends AbstractModule
protected Set registeredEndpoints = new TreeSet<>();
protected Set> registeredControllers = new HashSet<>();
- protected Set> registeredServices = new HashSet<>();
+ protected Set> registeredServices = new HashSet<>();
protected Map registeredHandlerWrappers = new HashMap<>();
protected Config config;
@@ -110,7 +111,7 @@ protected void configure()
{
}).annotatedWith(Names.named("registeredEndpoints")).toInstance(registeredEndpoints);
- this.bind(new TypeLiteral>>()
+ this.bind(new TypeLiteral>>()
{
}).annotatedWith(Names.named("registeredServices")).toInstance(registeredServices);
diff --git a/src/main/java/io/sinistral/proteus/server/ServerResponse.java b/src/main/java/io/sinistral/proteus/server/ServerResponse.java
index 5fc276b..70fadf7 100644
--- a/src/main/java/io/sinistral/proteus/server/ServerResponse.java
+++ b/src/main/java/io/sinistral/proteus/server/ServerResponse.java
@@ -30,6 +30,7 @@
import io.undertow.util.HeaderValues;
import io.undertow.util.Headers;
import io.undertow.util.HttpString;
+import io.undertow.util.Methods;
import io.undertow.util.StatusCodes;
/**
@@ -57,6 +58,7 @@ public class ServerResponse
protected T entity;
protected Throwable throwable;
// protected Class extends JsonContext> jsonContext;
+ protected HttpString method = null;
protected IoCallback ioCallback;
protected boolean hasCookies = false;
protected boolean hasHeaders = false;
@@ -179,29 +181,7 @@ public void setStatus(Response.Status status)
this.status = status.getStatusCode();
}
- /**
- * @param contentType
- * the contentType to set
- */
- protected void setContentType(String contentType)
- {
- this.contentType = contentType;
-
- if (this.contentType.equals(javax.ws.rs.core.MediaType.APPLICATION_JSON))
- {
- if (!this.preprocessed)
- {
- this.processJson = true;
- }
- }
- else if (this.contentType.equals(javax.ws.rs.core.MediaType.APPLICATION_XML))
- {
- if (!this.preprocessed)
- {
- this.processXml = true;
- }
- }
- }
+
public ServerResponse body(ByteBuffer body)
{
@@ -223,6 +203,18 @@ public ServerResponse entity(T entity)
return this;
}
+ public ServerResponse method(HttpString method)
+ {
+ this.method = method;
+ return this;
+ }
+
+ public ServerResponse method(String method)
+ {
+ this.method = Methods.fromString(method);
+ return this;
+ }
+
public ServerResponse lastModified(Date date)
{
this.headers.put(Headers.LAST_MODIFIED, date.getTime());
@@ -279,21 +271,47 @@ public ServerResponse cookie(String cookieName, Cookie cookie)
return this;
}
+
+ /**
+ * @param contentType
+ * the contentType to set
+ */
+ protected void setContentType(String contentType)
+ {
+ this.contentType = contentType;
+
+ if (this.contentType.equals(javax.ws.rs.core.MediaType.APPLICATION_JSON))
+ {
+ if (!this.preprocessed)
+ {
+ this.processJson = true;
+ }
+ }
+ else if (this.contentType.equals(javax.ws.rs.core.MediaType.APPLICATION_XML))
+ {
+ if (!this.preprocessed)
+ {
+ this.processXml = true;
+ }
+ }
+ }
+
public ServerResponse contentType(String contentType)
{
- this.setContentType(contentType);
+ this.setContentType(contentType);
return this;
}
+
public ServerResponse contentType(javax.ws.rs.core.MediaType mediaType)
{
- this.setContentType(mediaType.toString());
+ this.setContentType(mediaType.toString());
return this;
}
public ServerResponse contentType(MediaType mediaType)
{
- this.setContentType(mediaType.contentType());
+ this.setContentType(mediaType.contentType());
return this;
}
@@ -357,7 +375,7 @@ public ServerResponse redirect(String location)
public ServerResponse redirectPermanently(String location)
{
this.location = location;
- this.status = StatusCodes.MOVED_PERMANENTLY;;
+ this.status = StatusCodes.MOVED_PERMANENTLY;
return this;
}
@@ -543,16 +561,13 @@ public void send(final HttpServerExchange exchange) throws RuntimeException
public void send(final HttpHandler handler, final HttpServerExchange exchange) throws RuntimeException
{
-
-
-
+
final boolean hasBody = this.body != null;
final boolean hasEntity = this.entity != null;
final boolean hasError = this.throwable != null;
exchange.setStatusCode(this.status);
-
if (hasError)
{
@@ -562,15 +577,26 @@ public void send(final HttpHandler handler, final HttpServerExchange exchange) t
}
if(this.location != null)
- {
- exchange.getResponseHeaders().put(Headers.LOCATION, this.location);
+ {
+ exchange.getResponseHeaders().put(Headers.LOCATION, this.location);
}
- if(this.status == StatusCodes.TEMPORARY_REDIRECT || this.status == StatusCodes.PERMANENT_REDIRECT)
+ if(this.status == StatusCodes.FOUND || this.status == StatusCodes.MOVED_PERMANENTLY || this.status == StatusCodes.TEMPORARY_REDIRECT || this.status == StatusCodes.PERMANENT_REDIRECT )
{
- exchange.endExchange();
+ if( (this.status == StatusCodes.FOUND || this.status == StatusCodes.MOVED_PERMANENTLY) && (this.method != null) )
+ {
+ exchange.setRequestMethod(this.method);
+ }
+
+ exchange.endExchange();
return;
+ }
+
+ if (this.contentType != null)
+ {
+ exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, this.contentType);
}
+
if (this.hasHeaders)
{
@@ -591,11 +617,9 @@ public void send(final HttpHandler handler, final HttpServerExchange exchange) t
exchange.getResponseCookies().putAll(this.cookies);
}
+
- if (this.contentType != null)
- {
- exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, this.contentType);
- }
+
else if (!this.processJson && !this.processXml)
{
if (ServerPredicates.ACCEPT_JSON_PREDICATE.resolve(exchange))
diff --git a/src/main/resources/io/sinistral/proteus/swagger/index.html b/src/main/resources/io/sinistral/proteus/swagger/index.html
index 7e96476..1f13f97 100644
--- a/src/main/resources/io/sinistral/proteus/swagger/index.html
+++ b/src/main/resources/io/sinistral/proteus/swagger/index.html
@@ -25,6 +25,11 @@
margin:0;
background: #fafafa;
}
+
+ pre.microlight {
+ -webkit-font-smoothing: none;
+ }
+