/** {@inheritDoc} */
  public Endpoint publish(
      final ServiceDomain domain,
      final String context,
      final List<Object> instances,
      final Map<String, String> contextParams)
      throws Exception {
    if (LOGGER.isTraceEnabled()) {
      LOGGER.trace(
          "Publishing StandaloneResource: context="
              + context
              + ", resources="
              + instances
              + ", contextParams="
              + contextParams);
    }

    List<Object> resourceInstances = new ArrayList<Object>();
    String path = _contextBuilder.getPath();
    if (path.startsWith("/")) {
      path = path.substring(1);
    }
    if (path.equals(context)) {
      _contextBuilder.cleanup();
      try {
        _httpServer.removeContext(_contextBuilder.getPath());
      } catch (IllegalArgumentException iae) {
        if (LOGGER.isDebugEnabled()) {
          LOGGER.debug("", iae);
        }
      }
      resourceInstances = _contextBuilder.getDeployment().getResources();
      _contextBuilder.getDeployment().getDefaultContextObjects().clear();
    }
    // Add as singleton instance
    for (Object instance : instances) {
      resourceInstances.add(instance);
    }
    _contextBuilder.getDeployment().setResources(resourceInstances);
    // Register @Provider classes
    final List<String> providers =
        RESTEasyUtil.getParamValues(contextParams, ResteasyContextParameters.RESTEASY_PROVIDERS);
    _contextBuilder
        .getDeployment()
        .setScannedProviderClasses(providers != null ? providers : Collections.<String>emptyList());
    _contextBuilder.setPath(context);

    if (LOGGER.isTraceEnabled()) {
      LOGGER.trace(
          "Published StandaloneResource - Refreshing Sun HTTP Server: context="
              + context
              + ", resources="
              + resourceInstances
              + ", providers="
              + providers);
    }
    _contextBuilder.bind(_httpServer);

    return new StandaloneResource(
        new StandaloneResource.Callback() {
          @Override
          public void onStart() {
            if (LOGGER.isTraceEnabled()) {
              LOGGER.trace(
                  "Starting StandaloneResource: context="
                      + context
                      + ", resources="
                      + instances
                      + ", providers="
                      + providers);
            }
          }

          @Override
          public void onStop() {
            if (LOGGER.isTraceEnabled()) {
              LOGGER.trace(
                  "Stopping StandaloneResource: context="
                      + context
                      + ", resouces="
                      + instances
                      + ", providers="
                      + providers);
            }

            List<Object> resources =
                new ArrayList<Object>(_contextBuilder.getDeployment().getResources());
            List<String> scannedProviderClasses =
                new ArrayList<String>(_contextBuilder.getDeployment().getScannedProviderClasses());

            String path = _contextBuilder.getPath();
            if (path.startsWith("/")) {
              path = path.substring(1);
            }
            if (path.equals(context)) {
              _contextBuilder.cleanup();
              try {
                _httpServer.removeContext(_contextBuilder.getPath());
              } catch (IllegalArgumentException iae) {
                if (LOGGER.isDebugEnabled()) {
                  LOGGER.debug("", iae);
                }
                _contextBuilder.getDeployment().getDefaultContextObjects().clear();
              }
            }

            for (int i = 0; instances != null && i < instances.size(); i++) {
              if (instances.get(i) != null) {
                if (LOGGER.isTraceEnabled()) {
                  LOGGER.trace("Removing RESTEasy Resource: " + instances.get(i));
                }
                resources.remove(instances.get(i));
              }
            }
            _contextBuilder.getDeployment().setResources(resources);
            for (int i = 0; providers != null && i < providers.size(); i++) {
              if (providers.get(i) != null) {
                scannedProviderClasses.remove(providers.get(i));
              }
            }
            _contextBuilder.getDeployment().setScannedProviderClasses(scannedProviderClasses);

            if (LOGGER.isTraceEnabled()) {
              LOGGER.trace(
                  "Stopped StandaloneResource - Refreshing Sun HTTP Server: context="
                      + context
                      + ", resources="
                      + resources
                      + ", providers="
                      + scannedProviderClasses);
            }
            _contextBuilder.setPath(context);
            _contextBuilder.bind(_httpServer);
          }
        });
  }