/**
   * Detaches the target from this router. All routes routing to this target Restlet are removed
   * from the list of routes and the default route is set to null.
   *
   * @param targetClass The target class to detach.
   */
  public void detach(Class<?> targetClass) {
    for (int i = getRoutes().size() - 1; i >= 0; i--) {
      Restlet target = getRoutes().get(i).getNext();

      if (target != null && Finder.class.isAssignableFrom(target.getClass())) {
        Finder finder = (Finder) target;

        if (finder.getTargetClass().equals(targetClass)) {
          getRoutes().remove(i);
        }
      }
    }

    if (getDefaultRoute() != null) {
      Restlet target = getDefaultRoute().getNext();

      if (target != null && Finder.class.isAssignableFrom(target.getClass())) {
        Finder finder = (Finder) target;

        if (finder.getTargetClass().equals(targetClass)) {
          setDefaultRoute(null);
        }
      }
    }
  }
  protected void setUp() throws Exception {
    super.setUp();
    Finder finder = new Finder();
    finder.setTargetClass(MyResource06.class);

    this.clientResource = new ClientResource("http://local");
    this.clientResource.setNext(finder);
  }
  /**
   * Creates a new finder instance based on the "targetClass" property. If none is define, the
   * {@link Application#createFinder(Class)} method is invoked if available, otherwise the {@link
   * org.restlet.resource.Finder#createFinder(Class, Class, Context, Logger)} method is called with
   * the {@link org.restlet.resource.Finder} class as parameter.
   *
   * @param resourceClass The target {@link org.restlet.resource.ServerResource} class to find.
   * @return The new finder instance.
   * @see org.restlet.resource.Finder#createFinder(Class, Class, Context, Logger)
   */
  public org.restlet.resource.Finder createFinder(
      Class<? extends org.restlet.resource.ServerResource> resourceClass) {
    org.restlet.resource.Finder result = null;

    if (getFinderClass() != null) {
      result =
          org.restlet.resource.Finder.createFinder(
              resourceClass, getFinderClass(), getContext(), getLogger());
    } else if ((getApplication() != null) && (getApplication() != this)) {
      result = getApplication().createFinder(resourceClass);
    } else {
      result =
          org.restlet.resource.Finder.createFinder(
              resourceClass, org.restlet.resource.Finder.class, getContext(), getLogger());
    }

    return result;
  }
  private void generateSwaggerForFinder(JSONObject pathObject, String routePath, Finder finder)
      throws JSONException {
    Class<? extends ServerResource> targetClass = finder.getTargetClass();
    for (Method method : targetClass.getDeclaredMethods()) {
      String httpVerb = null;
      Annotation annotationInstance = method.getAnnotation(HttpVerb.class);
      if (annotationInstance != null) {
        httpVerb = ((HttpVerb) annotationInstance).value().toLowerCase();
      }

      HashSet<String> methodPaths = new HashSet<String>();
      annotationInstance = method.getAnnotation(Paths.class);
      if (annotationInstance != null) {
        methodPaths.addAll(Arrays.asList(((Paths) annotationInstance).value()));
      }

      if (httpVerb != null && methodPaths.contains(routePath) && !routePath.endsWith("/")) {
        JSONObject operation = new JSONObject();
        pathObject.put(httpVerb, operation);

        annotationInstance = method.getAnnotation(Summary.class);
        if (annotationInstance != null) {
          operation.put(
              Summary.class.getSimpleName().toLowerCase(), ((Summary) annotationInstance).value());
        }

        annotationInstance = method.getAnnotation(Description.class);
        if (annotationInstance != null) {
          operation.put(
              Description.class.getSimpleName().toLowerCase(),
              ((Description) annotationInstance).value());
        }

        annotationInstance = method.getAnnotation(Tags.class);
        if (annotationInstance != null) {
          operation.put(
              Tags.class.getSimpleName().toLowerCase(), ((Tags) annotationInstance).value());
        }

        operation.put("operationId", method.getName());

        ArrayList<JSONObject> parameters = new ArrayList<JSONObject>();

        for (Annotation[] annotations : method.getParameterAnnotations()) {
          if (annotations.length != 0) {
            JSONObject parameter = new JSONObject();
            for (Annotation annotation : annotations) {
              if (annotation instanceof Parameter) {
                Parameter parameterAnnotation = (Parameter) annotation;
                parameter.put("name", parameterAnnotation.name());
                parameter.put("in", parameterAnnotation.in());
                if (parameterAnnotation.description() != null) {
                  parameter.put("description", parameterAnnotation.description());
                }
                parameter.put("type", "string");
                parameter.put("required", parameterAnnotation.required());
              }
            }

            if (parameter.keys().hasNext()) {
              parameters.add(parameter);
            }
          }
        }

        operation.put("parameters", parameters.toArray(new JSONObject[parameters.size()]));
      }
    }
  }