@Inject
  public VertexiumUserRepository(
      Configuration configuration,
      SimpleOrmSession simpleOrmSession,
      AuthorizationRepository authorizationRepository,
      Graph graph,
      OntologyRepository ontologyRepository,
      UserSessionCounterRepository userSessionCounterRepository,
      WorkQueueRepository workQueueRepository,
      UserNotificationRepository userNotificationRepository,
      LockRepository lockRepository) {
    super(
        configuration,
        simpleOrmSession,
        userSessionCounterRepository,
        workQueueRepository,
        userNotificationRepository,
        lockRepository);
    this.authorizationRepository = authorizationRepository;
    this.graph = graph;

    authorizationRepository.addAuthorizationToGraph(VISIBILITY_STRING);
    authorizationRepository.addAuthorizationToGraph(VisalloVisibility.SUPER_USER_VISIBILITY_STRING);

    Concept userConcept =
        ontologyRepository.getOrCreateConcept(null, USER_CONCEPT_IRI, "visalloUser", null);
    userConceptId = userConcept.getIRI();

    Set<String> authorizationsSet = new HashSet<>();
    authorizationsSet.add(VISIBILITY_STRING);
    authorizationsSet.add(VisalloVisibility.SUPER_USER_VISIBILITY_STRING);
    this.authorizations = graph.createAuthorizations(authorizationsSet);
  }
  @Handle
  public void handle(
      @Required(name = "concept") String conceptIRI,
      @Required(name = "displayName") String displayName,
      @Required(name = "color") String color,
      @Required(name = "displayType") String displayType,
      @Required(name = "titleFormula") String titleFormula,
      @Required(name = "subtitleFormula") String subtitleFormula,
      @Required(name = "timeFormula") String timeFormula,
      @Required(name = "addRelatedConceptWhiteList[]") String[] addRelatedConceptWhiteListArg,
      @Required(name = "intents[]") String[] intents,
      @Optional(name = "searchable", defaultValue = "true") boolean searchable,
      @Optional(name = "addable", defaultValue = "true") boolean addable,
      @Optional(name = "userVisible", defaultValue = "true") boolean userVisible,
      User user,
      Authorizations authorizations,
      VisalloResponse response)
      throws Exception {
    HashSet<String> addRelatedConceptWhiteList =
        new HashSet<>(Arrays.asList(addRelatedConceptWhiteListArg));

    Concept concept = ontologyRepository.getConceptByIRI(conceptIRI);
    if (concept == null) {
      response.respondWithNotFound("concept " + conceptIRI + " not found");
      return;
    }

    if (displayName.length() != 0) {
      concept.setProperty(
          OntologyProperties.DISPLAY_NAME.getPropertyName(), displayName, authorizations);
    }

    if (color.length() != 0) {
      concept.setProperty(OntologyProperties.COLOR.getPropertyName(), color, authorizations);
    }

    JSONArray whiteList = new JSONArray();
    for (String whitelistIri : addRelatedConceptWhiteList) {
      whiteList.put(whitelistIri);
    }
    concept.setProperty(
        OntologyProperties.ADD_RELATED_CONCEPT_WHITE_LIST.getPropertyName(),
        whiteList.toString(),
        authorizations);

    concept.setProperty(
        OntologyProperties.DISPLAY_TYPE.getPropertyName(), displayType, authorizations);
    concept.setProperty(
        OntologyProperties.SEARCHABLE.getPropertyName(), searchable, authorizations);
    concept.setProperty(OntologyProperties.ADDABLE.getPropertyName(), addable, authorizations);
    concept.setProperty(
        OntologyProperties.USER_VISIBLE.getPropertyName(), userVisible, authorizations);

    if (titleFormula.length() != 0) {
      concept.setProperty(
          OntologyProperties.TITLE_FORMULA.getPropertyName(), titleFormula, authorizations);
    } else {
      concept.removeProperty(OntologyProperties.TITLE_FORMULA.getPropertyName(), authorizations);
    }

    if (subtitleFormula.length() != 0) {
      concept.setProperty(
          OntologyProperties.SUBTITLE_FORMULA.getPropertyName(), subtitleFormula, authorizations);
    } else {
      concept.removeProperty(OntologyProperties.SUBTITLE_FORMULA.getPropertyName(), authorizations);
    }

    if (timeFormula.length() != 0) {
      concept.setProperty(
          OntologyProperties.TIME_FORMULA.getPropertyName(), timeFormula, authorizations);
    } else {
      concept.removeProperty(OntologyProperties.TIME_FORMULA.getPropertyName(), authorizations);
    }

    concept.updateIntents(StringArrayUtil.removeNullOrEmptyElements(intents), authorizations);

    ontologyRepository.clearCache();

    response.respondWithSuccessJson();
  }