public void onRoutesAdd(Collection<Route> routes) {
    for (Route route : routes) {

      // if we are starting CamelContext or either of the two options has been
      // enabled, then enlist the route as a known route
      if (getCamelContext().getStatus().isStarting()
          || getManagementStrategy().getManagementAgent().getRegisterAlways()
          || getManagementStrategy().getManagementAgent().getRegisterNewRoutes()) {
        // register as known route id
        knowRouteIds.add(route.getId());
      }

      if (!shouldRegister(route, route)) {
        // avoid registering if not needed, skip to next route
        continue;
      }

      Object mr = getManagementObjectStrategy().getManagedObjectForRoute(camelContext, route);

      // skip already managed routes, for example if the route has been restarted
      if (getManagementStrategy().isManaged(mr, null)) {
        LOG.trace("The route is already managed: {}", route);
        continue;
      }

      // get the wrapped instrumentation processor from this route
      // and set me as the counter
      if (route instanceof EventDrivenConsumerRoute) {
        EventDrivenConsumerRoute edcr = (EventDrivenConsumerRoute) route;
        Processor processor = edcr.getProcessor();
        if (processor instanceof CamelInternalProcessor && mr instanceof ManagedRoute) {
          CamelInternalProcessor internal = (CamelInternalProcessor) processor;
          ManagedRoute routeMBean = (ManagedRoute) mr;

          CamelInternalProcessor.InstrumentationAdvice task =
              internal.getAdvice(CamelInternalProcessor.InstrumentationAdvice.class);
          if (task != null) {
            // we need to wrap the counter with the camel context so we get stats updated on the
            // context as well
            if (camelContextMBean != null) {
              CompositePerformanceCounter wrapper =
                  new CompositePerformanceCounter(routeMBean, camelContextMBean);
              task.setCounter(wrapper);
            } else {
              task.setCounter(routeMBean);
            }
          }
        }
      }

      try {
        manageObject(mr);
      } catch (JMException e) {
        LOG.warn("Could not register Route MBean", e);
      } catch (Exception e) {
        LOG.warn("Could not create Route MBean", e);
      }
    }
  }
  /**
   * Add the route in the database if it's not already, or update its state.
   *
   * @param routes being added to the app
   */
  @Override
  public void onRoutesAdd(Collection<Route> routes) {
    for (Route routeCamel : routes) {
      // adding a performance counter on the route
      if (routeCamel instanceof EventDrivenConsumerRoute) {
        EventDrivenConsumerRoute edcr = (EventDrivenConsumerRoute) routeCamel;
        Processor processor = edcr.getProcessor();
        if (processor instanceof InstrumentationProcessor) {
          InstrumentationProcessor ip = (InstrumentationProcessor) processor;
          ConsolePerformanceCounter counter =
              new ConsolePerformanceCounter(routeCamel.getId(), repository);
          ip.setCounter(counter);
          log.debug("Adding a counter" + counter.toString() + " to " + routeCamel.getId());
        }
      }

      // saving route in database
      log.debug("Route added " + routeCamel.getId());
      com.ninja_squad.console.Route route = repository.findRoute(routeCamel.getId());
      if (route == null) {
        route =
            new com.ninja_squad.console.Route(routeCamel.getId())
                .state(State.Started)
                .uri(routeCamel.getEndpoint().getEndpointUri());
        ObjectMapper mapper = new ObjectMapper();
        AnnotationIntrospector introspector =
            new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
        // make serializer use JAXB annotations (only)
        mapper.setAnnotationIntrospector(introspector);
        String definition = null;
        RouteDefinition routeDefinition = routeCamel.getRouteContext().getRoute();
        try {
          definition = mapper.writeValueAsString(routeDefinition);
        } catch (IOException e) {
          log.error("Error while marshalling route definition", e);
        }
        route.setDefinition(definition);
        for (ProcessorDefinition<?> stepDefinition : routeDefinition.getOutputs()) {
          if (stepDefinition.getId() == null) {
            stepDefinition.setId(stepDefinition.getClass().getSimpleName());
          }
          route.getSteps().put(stepDefinition.getId(), stepDefinition.getLabel());
        }
        repository.save(route);
      }

      // saving state in database
      RouteState routeState = repository.lastRouteState(routeCamel.getId());
      if (routeState == null || routeState.getState().equals(State.Stopped)) {
        routeState = new RouteState();
        routeState.setRouteId(routeCamel.getId());
        routeState.setState(State.Started);
        routeState.setTimestamp(DateTime.now().getMillis());
        repository.save(routeState);
      }
    }
  }