Skip to content

Commit

Permalink
Core: Jersey recovers from bad resources (#650).
Browse files Browse the repository at this point in the history
When the developer makes errors in the REST resources (JAX-RS root resource and provider classes/singletons) Jersey complains properly. As soon as the developer corrects the error Jersey will properly deploy the corrected resources. Restarting the DM server is no longer required.

See #650.
  • Loading branch information
jri committed Jul 22, 2014
1 parent da607c4 commit 12cc6fb
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ class RestResource {

// ---------------------------------------------------------------------------------------------- Instance Variables

List<Object> resources;
List<Object> singletons;
List<Class<?>> providerClasses;

// ---------------------------------------------------------------------------------------------------- Constructors

RestResource(List<Object> resources, List<Class<?>> providerClasses) {
this.resources = resources;
RestResource(List<Object> singletons, List<Class<?>> providerClasses) {
this.singletons = singletons;
this.providerClasses = providerClasses;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -118,36 +118,47 @@ WebResources addWebResources(String directoryPath, String uriNamespace, Security
// === REST Resources ===

/**
* Adds root resource and provider classes/singletons to the Jersey application.
* <p>
* Note: synchronizing this method prevents creation of multiple Jersey servlet instances due to parallel plugin
* initialization.
*
* @param resources the set of root resource and provider singletons, may be empty.
* @param singletons the set of root resource and provider singletons, may be empty.
* @param providerClasses the set of root resource and provider classes, may be empty.
*/
synchronized RestResource addRestResource(List<Object> resources, List<Class<?>> providerClasses) {
addSingletons(resources);
addClasses(providerClasses);
logResourceInfo();
//
// Note: we must register the Jersey servlet lazily, that is not before any root resources are added.
// An "empty" application would fail (com.sun.jersey.api.container.ContainerException:
// The ResourceConfig instance does not contain any root resource classes).
if (!isJerseyServletRegistered) {
// Note: we must not register the servlet as long as no root resources are added yet.
// A plugin may contain just provider classes.
if (hasRootResources()) {
registerJerseyServlet();
synchronized RestResource addRestResource(List<Object> singletons, List<Class<?>> providerClasses) {
try {
addSingletons(singletons);
addClasses(providerClasses);
logResourceInfo();
//
// Note: we must register the Jersey servlet lazily, that is not before any root resources are added.
// An "empty" application would fail (com.sun.jersey.api.container.ContainerException:
// The ResourceConfig instance does not contain any root resource classes).
if (!isJerseyServletRegistered) {
// Note: we must not register the servlet as long as no root resources are added yet.
// A plugin may contain just provider classes.
if (hasRootResources()) {
registerJerseyServlet();
}
} else {
reloadJerseyServlet();
}
} else {
reloadJerseyServlet();
//
return new RestResource(singletons, providerClasses);
} catch (Exception e) {
removeRestResource(singletons, providerClasses);
throw new RuntimeException("Adding classes/singletons to Jersey application failed", e);
}
//
return new RestResource(resources, providerClasses);
}

synchronized void removeRestResource(RestResource restResource) {
removeSingletons(restResource.resources);
removeClasses(restResource.providerClasses);
removeRestResource(restResource.singletons, restResource.providerClasses);
}

private void removeRestResource(List<Object> singletons, List<Class<?>> providerClasses) {
removeSingletons(singletons);
removeClasses(providerClasses);
logResourceInfo();
//
// Note: once all root resources are removed we must unregister the Jersey servlet.
Expand Down

0 comments on commit 12cc6fb

Please sign in to comment.