protected static SecurityResource parseResource()

in core/src/main/java/com/jetbrains/youtrackdb/internal/core/metadata/security/SecurityResource.java [24:150]


  protected static SecurityResource parseResource(String resource) {
    switch (resource) {
      case "*" -> {
        return SecurityResourceAll.INSTANCE;
      }
      case "database.schema" -> {
        return SecurityResourceSchema.INSTANCE;
      }
      case "database.class.*" -> {
        return SecurityResourceClass.ALL_CLASSES;
      }
      case "database.class.*.*" -> {
        return SecurityResourceProperty.ALL_PROPERTIES;
      }
      case "database.collection.*" -> {
        return SecurityResourceCollection.ALL_COLLECTIONS;
      }
      case "database.systemcollections" -> {
        return SecurityResourceCollection.SYSTEM_COLLECTIONS;
      }
      case "database.function.*" -> {
        return SecurityResourceFunction.ALL_FUNCTIONS;
      }
      case "database" -> {
        return SecurityResourceDatabaseOp.DB;
      }
      case "database.create" -> {
        return SecurityResourceDatabaseOp.CREATE;
      }
      case "database.copy" -> {
        return SecurityResourceDatabaseOp.COPY;
      }
      case "database.drop" -> {
        return SecurityResourceDatabaseOp.DROP;
      }
      case "database.exists" -> {
        return SecurityResourceDatabaseOp.EXISTS;
      }
      case "database.command" -> {
        return SecurityResourceDatabaseOp.COMMAND;
      }
      case "database.command.gremlin" -> {
        return SecurityResourceDatabaseOp.COMMAND_GREMLIN;
      }
      case "database.freeze" -> {
        return SecurityResourceDatabaseOp.FREEZE;
      }
      case "database.release" -> {
        return SecurityResourceDatabaseOp.RELEASE;
      }
      case "database.passthrough" -> {
        return SecurityResourceDatabaseOp.PASS_THROUGH;
      }
      case "database.bypassRestricted" -> {
        return SecurityResourceDatabaseOp.BYPASS_RESTRICTED;
      }
      case "database.hook.record" -> {
        return SecurityResourceDatabaseOp.HOOK_RECORD;
      }
      case "server" -> {
        return SecurityResourceServerOp.SERVER;
      }
      case "server.status" -> {
        return SecurityResourceServerOp.STATUS;
      }
      case "server.remove" -> {
        return SecurityResourceServerOp.REMOVE;
      }
      case "server.admin" -> {
        return SecurityResourceServerOp.ADMIN;
      }
    }
    try {
      var parsed = SQLEngine.parseSecurityResource(resource);

      if (resource.startsWith("database.class.")) {
        var classElement = parsed.getNext().getNext();
        String className;
        var allClasses = false;
        if (classElement.getIdentifier() != null) {
          className = classElement.getIdentifier().getStringValue();
        } else {
          className = null;
          allClasses = true;
        }
        var propertyModifier = classElement.getNext();
        if (propertyModifier != null) {
          if (propertyModifier.getNext() != null) {
            throw new SecurityException("Invalid resource: " + resource);
          }
          var propertyName = propertyModifier.getIdentifier().getStringValue();
          if (allClasses) {
            return new SecurityResourceProperty(resource, propertyName);
          } else {
            return new SecurityResourceProperty(resource, className, propertyName);
          }
        } else {
          return new SecurityResourceClass(resource, className);
        }
      } else if (resource.startsWith("database.collection.")) {
        var collectionElement = parsed.getNext().getNext();
        var collectionName = collectionElement.getIdentifier().getStringValue();
        if (collectionElement.getNext() != null) {
          throw new SecurityException("Invalid resource: " + resource);
        }
        return new SecurityResourceCollection(resource, collectionName);
      } else if (resource.startsWith("database.function.")) {
        var functionElement = parsed.getNext().getNext();
        var functionName = functionElement.getIdentifier().getStringValue();
        if (functionElement.getNext() != null) {
          throw new SecurityException("Invalid resource: " + resource);
        }
        return new SecurityResourceFunction(resource, functionName);
      } else if (resource.startsWith("database.systemcollections.")) {
        var collectionElement = parsed.getNext().getNext();
        var collectionName = collectionElement.getIdentifier().getStringValue();
        if (collectionElement.getNext() != null) {
          throw new SecurityException("Invalid resource: " + resource);
        }
        return new SecurityResourceCollection(resource, collectionName);
      }

      throw new SecurityException("Invalid resource: " + resource);
    } catch (Exception ex) {
      throw new SecurityException("Invalid resource: " + resource);
    }
  }