#java #gremlin #tinkerpop
Вопрос:
У нас есть один сервис обмена фотографиями, в котором можно разрешить или запретить просмотр другим пользователям или нет. Мы представили эту службу как API /представление?вызывающий абонент=идентификатор пользователя и фотоид=Фотоид. Мы используем сервис базы данных AWS Neptune Graph для поддержки этой авторизации и используем библиотеку java tinkerpop.
Для удобства обслуживания кода мы выбираем возможные пути из других методов класса и вызываем метод canUserView извне.
Public class Authorizer {
List<Role> roles;
public Authorizer(List<Role> roles) {
this.roles = roles;
}
public boolean canUserView(User user, String photoId) {
return graph.V(user.getId()).hasLabel("user").or(getPossibleTraversals(user)).hasId("photoId")
}
private GraphTraversal<Object, Vertex>[] getPossibleTraversals(User user) {
List<GraphTraversal<Vertex, Vertex>> traversals = roles.getTraversal(user).map(traversal -> traversal).collect(Collectors.toList())
return traversals.toArray(GraphTraversal[]::new);
}
}
и в классе ролей getTraversal для производительности кода на основе информации о пользователе я предоставляю необходимый обход или могу предоставить обход сбоя.
Теперь вопрос в том, как обеспечить обход отказа здесь. На данный момент мы предполагаем, что какой-то недоступный идентификатор вершины для обхода сбоя. Код выглядит так, как показано ниже.
public class Role {
public GraphTraversal<Object, Vertex> getTraversal(User user) {
if(user.satisfies(this)) {
return __.V("assumedUnavailableVertexId").hasLabel("absolutelynotpossible"); //This ID and label assumed
} else {
return actualTraversal(); //This will construct the possible traversals
}
}
}
Как вернуть обход сбоя для случая if в роли? Есть ли какой-нибудь способ устранить это предположение ?
Комментарии:
1. Я не уверен, что полностью понимаю ваш вопрос. Вы просите простой способ вернуть обход, который указывает на то, что что-то не удалось? Я часто видел что — то столь же простое, как
constant('Not allowed')
используемое в таких случаях.2. Да, мне нужен обход, потому что что-то не получилось.
3. Проблема с .constant(«Не разрешено») заключается в том, что возвращаемый тип .constant () — это GraphTraversal<Строка, строка> . В успешных случаях это будет GraphTraversal<Объект, вершина>. Если я задам тип возвращаемого значения без параметра type, т. е. public GraphTraversal getTraversal(), то наш sonarqube жалуется, что параметр универсального типа является обязательным.
4. Сможешь ли ты смириться с
Traversal <Object,Object>
этим делом? В Гремлине нет ничего необычного в том, что обход может иметь разные результаты в зависимости от того, какие ветви он принимает.5. Я думаю, это будет прекрасно. .константа(«Не разрешено») будет работать здесь. Иногда бывает трудно соблюдать правила Sonarqube. rules.sonarsource.com/java/RSPEC-1452 . Спасибо @KelvinLawrence
Ответ №1:
Я часто видел что-то столь же простое, как constant('Not allowed')
используемое, когда обход должен возвращать указание на то, что произошла ошибка/проблема.
В этом случае (если вам нужна чистая общая проверка компилятора и т. Д.) Вам Нужно будет начать с чего-то вроде Traversal <Object,Object>
того, что разные пути в вашем коде потенциально могут теперь возвращать разные типы обхода.