@Override
  public Representation represent(Variant variant) throws ResourceException {
    IntParameterInfo parameterInfo;
    OpenAcdAgent agent;
    OpenAcdAgentRestInfoFull agentRestInfo;

    // if have id then get a single item
    parameterInfo = RestUtilities.getIntFromAttribute(getRequest(), REQUEST_ATTRIBUTE_ID);
    if (parameterInfo.getExists()) {
      if (!parameterInfo.getValid()) {
        return RestUtilities.getResponseError(
            getResponse(), ERROR_ID_INVALID, parameterInfo.getValueString());
      }

      try {
        agent = m_openAcdContext.getAgentById(parameterInfo.getValue());
      } catch (Exception exception) {
        return RestUtilities.getResponseError(
            getResponse(), ERROR_OBJECT_NOT_FOUND, parameterInfo.getValue());
      }

      try {
        agentRestInfo = createAgentRestInfo(agent);
      } catch (Exception exception) {
        return RestUtilities.getResponseError(
            getResponse(),
            ERROR_READ_FAILED,
            parameterInfo.getValue(),
            exception.getLocalizedMessage());
      }

      return new OpenAcdAgentRepresentation(variant.getMediaType(), agentRestInfo);
    }

    // if not single, process request for list
    List<OpenAcdAgent> agents = m_openAcdContext.getAgents();
    List<OpenAcdAgentRestInfoFull> agentsRestInfo = new ArrayList<OpenAcdAgentRestInfoFull>();
    MetadataRestInfo metadataRestInfo;

    // sort if specified
    sortAgents(agents);

    // set requested agents groups and get resulting metadata
    metadataRestInfo = addAgents(agentsRestInfo, agents);

    // create final restinfo
    OpenAcdAgentsBundleRestInfo agentsBundleRestInfo =
        new OpenAcdAgentsBundleRestInfo(agentsRestInfo, metadataRestInfo);

    return new OpenAcdAgentsRepresentation(variant.getMediaType(), agentsBundleRestInfo);
  }
  @Override
  public Representation represent(Variant variant) throws ResourceException {
    IntParameterInfo parameterInfo;
    Branch branch;
    BranchRestInfoFull branchRestInfo;

    // if have id then get a single item
    parameterInfo = RestUtilities.getIntFromAttribute(getRequest(), REQUEST_ATTRIBUTE_ID);
    if (parameterInfo.getExists()) {
      if (!parameterInfo.getValid()) {
        return RestUtilities.getResponseError(
            getResponse(), ERROR_ID_INVALID, parameterInfo.getValueString());
      }

      try {
        branch = m_branchManager.retrieveBranch(parameterInfo.getValue());
        if (branch == null) {
          return RestUtilities.getResponseError(
              getResponse(), ERROR_OBJECT_NOT_FOUND, parameterInfo.getValue());
        }

        branchRestInfo = createBranchRestInfo(branch);
      } catch (Exception exception) {
        return RestUtilities.getResponseError(
            getResponse(),
            ERROR_READ_FAILED,
            parameterInfo.getValue(),
            exception.getLocalizedMessage());
      }

      return new BranchRepresentation(variant.getMediaType(), branchRestInfo);
    }

    // if not single, process request for list
    List<Branch> branches = m_branchManager.getBranches();
    List<BranchRestInfoFull> branchesRestInfo = new ArrayList<BranchRestInfoFull>();
    MetadataRestInfo metadataRestInfo;

    // sort if specified
    sortBranches(branches);

    // set requested agents groups and get resulting metadata
    metadataRestInfo = addBranches(branchesRestInfo, branches);

    // create final restinfo
    BranchesBundleRestInfo branchesBundleRestInfo =
        new BranchesBundleRestInfo(branchesRestInfo, metadataRestInfo);

    return new BranchesRepresentation(variant.getMediaType(), branchesBundleRestInfo);
  }
  @Override
  public void removeRepresentations() throws ResourceException {
    IntParameterInfo parameterInfo;
    Branch branch;

    // get id then delete a single item
    parameterInfo = RestUtilities.getIntFromAttribute(getRequest(), REQUEST_ATTRIBUTE_ID);
    if (parameterInfo.getExists()) {
      if (!parameterInfo.getValid()) {
        RestUtilities.setResponseError(
            getResponse(), ERROR_ID_INVALID, parameterInfo.getValueString());
        return;
      }

      try {
        // do not need object to delete, but confirm existence for error message
        branch = m_branchManager.retrieveBranch(parameterInfo.getValue());
        if (branch == null) {
          RestUtilities.setResponseError(
              getResponse(), ERROR_OBJECT_NOT_FOUND, parameterInfo.getValue());
          return;
        }

        List<Integer> branchIds = new ArrayList<Integer>();
        branchIds.add(parameterInfo.getValue());
        m_branchManager.deleteBranches(branchIds);
      } catch (Exception exception) {
        RestUtilities.setResponseError(
            getResponse(),
            ERROR_DELETE_FAILED,
            parameterInfo.getValue(),
            exception.getLocalizedMessage());
        return;
      }

      RestUtilities.setResponse(getResponse(), SUCCESS_DELETED, parameterInfo.getValue());
      return;
    }

    // no id string
    RestUtilities.setResponse(getResponse(), ERROR_MISSING_ID);
  }
  @Override
  public void removeRepresentations() throws ResourceException {
    IntParameterInfo parameterInfo;
    OpenAcdAgent agent;

    // get id then delete a single item
    parameterInfo = RestUtilities.getIntFromAttribute(getRequest(), REQUEST_ATTRIBUTE_ID);
    if (parameterInfo.getExists()) {
      if (!parameterInfo.getValid()) {
        RestUtilities.setResponseError(
            getResponse(), ERROR_ID_INVALID, parameterInfo.getValueString());
        return;
      }

      try {
        agent = m_openAcdContext.getAgentById(parameterInfo.getValue());
      } catch (Exception ex) {
        RestUtilities.setResponseError(
            getResponse(), ERROR_OBJECT_NOT_FOUND, parameterInfo.getValue());
        return;
      }

      try {
        m_openAcdContext.deleteAgent(agent);
      } catch (Exception exception) {
        RestUtilities.setResponseError(
            getResponse(),
            ERROR_DELETE_FAILED,
            parameterInfo.getValue(),
            exception.getLocalizedMessage());
        return;
      }

      RestUtilities.setResponse(getResponse(), SUCCESS_DELETED, agent.getId());
      return;
    }

    // no id string
    RestUtilities.setResponse(getResponse(), ERROR_MISSING_ID);
  }
  @Override
  public void storeRepresentation(Representation entity) throws ResourceException {
    IntParameterInfo parameterInfo;

    // get item from request body
    OpenAcdAgentRepresentation representation = new OpenAcdAgentRepresentation(entity);
    OpenAcdAgentRestInfoFull agentRestInfo = (OpenAcdAgentRestInfoFull) representation.getObject();
    OpenAcdAgent agent;

    // validate input for update or create
    ValidationInfo validationInfo = validate(agentRestInfo);

    if (!validationInfo.getValid()) {
      RestUtilities.setResponseError(
          getResponse(), validationInfo.getResponseCode(), validationInfo.getMessage());
      return;
    }

    // if have id then update single item
    parameterInfo = RestUtilities.getIntFromAttribute(getRequest(), REQUEST_ATTRIBUTE_ID);
    if (parameterInfo.getExists()) {
      if (!parameterInfo.getValid()) {
        RestUtilities.setResponseError(
            getResponse(), ERROR_ID_INVALID, parameterInfo.getValueString());
        return;
      }

      try {
        agent = m_openAcdContext.getAgentById(parameterInfo.getValue());
      } catch (Exception exception) {
        RestUtilities.setResponseError(
            getResponse(), ERROR_OBJECT_NOT_FOUND, parameterInfo.getValue());
        return;
      }

      // copy values over to existing item
      try {
        updateAgent(agent, agentRestInfo);
        m_openAcdContext.saveAgent(agent);
      } catch (Exception exception) {
        RestUtilities.setResponseError(
            getResponse(),
            ERROR_UPDATE_FAILED,
            parameterInfo.getValue(),
            exception.getLocalizedMessage());
        return;
      }

      RestUtilities.setResponse(getResponse(), SUCCESS_UPDATED, agent.getId());
      return;
    }

    // if not single, add new item
    try {
      agent = createOpenAcdAgent(agentRestInfo);
      m_openAcdContext.saveAgent(agent);
    } catch (Exception exception) {
      RestUtilities.setResponseError(
          getResponse(), ERROR_UPDATE_FAILED, exception.getLocalizedMessage());
      return;
    }

    RestUtilities.setResponse(getResponse(), SUCCESS_CREATED, agent.getId());
  }
  @Override
  public void storeRepresentation(Representation entity) throws ResourceException {
    IntParameterInfo parameterInfo;

    // get item from request body
    BranchRepresentation representation = new BranchRepresentation(entity);
    BranchRestInfoFull branchRestInfo = representation.getObject();
    Branch branch;

    // validate input for update or create
    ValidationInfo validationInfo = validate(branchRestInfo);

    if (!validationInfo.getValid()) {
      RestUtilities.setResponseError(
          getResponse(), validationInfo.getResponseCode(), validationInfo.getMessage());
      return;
    }

    // if have id then update single item
    parameterInfo = RestUtilities.getIntFromAttribute(getRequest(), REQUEST_ATTRIBUTE_ID);
    if (parameterInfo.getExists()) {
      if (!parameterInfo.getValid()) {
        RestUtilities.setResponseError(
            getResponse(), ERROR_ID_INVALID, parameterInfo.getValueString());
        return;
      }

      try {
        branch = m_branchManager.retrieveBranch(parameterInfo.getValue());
        if (branch == null) {
          RestUtilities.setResponseError(
              getResponse(), ERROR_OBJECT_NOT_FOUND, parameterInfo.getValue());
          return;
        }

        // copy values over to existing item
        updateBranch(branch, branchRestInfo);
        m_branchManager.saveBranch(branch);
      } catch (Exception exception) {
        RestUtilities.setResponseError(
            getResponse(),
            ERROR_UPDATE_FAILED,
            parameterInfo.getValue(),
            exception.getLocalizedMessage());
        return;
      }

      RestUtilities.setResponse(getResponse(), SUCCESS_UPDATED, branch.getId());
      return;
    }

    // if not single, add new item
    try {
      branch = createBranch(branchRestInfo);
      m_branchManager.saveBranch(branch);
    } catch (Exception exception) {
      RestUtilities.setResponseError(
          getResponse(), ERROR_CREATE_FAILED, exception.getLocalizedMessage());
      return;
    }

    RestUtilities.setResponse(getResponse(), SUCCESS_CREATED, branch.getId());
  }