/**
   * {@inheritDoc}
   *
   * @see org.osgi.service.cm.ManagedServiceFactory#updated(java.lang.String, java.util.Dictionary)
   */
  @Override
  public void updated(String pid, Dictionary properties) throws ConfigurationException {

    // Get the agent properties
    String nameConfig = (String) properties.get("id");
    if (isEmpty(nameConfig)) {
      throw new ConfigurationException("id", "must be specified");
    }
    nameConfig = nameConfig.trim();

    String urlConfig = (String) properties.get("url");
    if (isEmpty(urlConfig)) {
      throw new ConfigurationException("url", "must be specified");
    }
    urlConfig = urlConfig.trim();

    String orgConfig = (String) properties.get("organization");
    if (isEmpty(orgConfig)) {
      throw new ConfigurationException("organization", "must be specified");
    }
    orgConfig = orgConfig.trim();

    String schedulerRolesConfig = (String) properties.get("schedulerRoles");
    if (isEmpty(schedulerRolesConfig)) {
      throw new ConfigurationException("schedulerRoles", "must be specified");
    }
    schedulerRolesConfig = schedulerRolesConfig.trim();

    // If we don't already have a mapping for this PID, create one
    if (!pidMap.containsKey(pid)) {
      pidMap.put(pid, nameConfig);
    }

    AgentImpl agent = getAgent(nameConfig, orgConfig);
    if (agent == null) {
      agent = new AgentImpl(nameConfig, orgConfig, UNKNOWN, urlConfig, new Properties());
    } else {
      agent.url = urlConfig.trim();
      agent.organization = orgConfig.trim();
      agent.state = UNKNOWN;
      String[] schedulerRoles = schedulerRolesConfig.split(",");
      for (String role : schedulerRoles) {
        agent.schedulerRoles.add(role.trim());
      }
    }

    // Update the database
    logger.info("Roles '{}' may schedule '{}'", schedulerRolesConfig, agent.name);
    updateAgentInDatabase(agent);
  }