#java #json #arraylist
#java #json #список массивов
Вопрос:
Используя Java 1.8 и Spring Boot 1.5.6.RELEASE.
Я могу получить список элементов из, проанализировав /etc/ passwd и / etc / group внутри ArrayList amp; ArrayList.
Необходимо создать следующую конечную точку Rest:
HTTP GET /users/<uid>/groups
Верните все группы для данного пользователя.
Пользователь:
public class User {
String name;
String password;
Integer uid;
Integer gid;
String comment;
String home;
String shell;
public User(String line) {
String[] items = line.split(":");
if (items.length != 7) {
throw new IllegalArgumentException("Need 7 items from " line " and there's only: " items.length);
}
this.name = items[0];
this.password = items[1];
this.uid = Integer.parseInt(items[2]);
this.gid = Integer.parseInt(items[3]);
this.comment = items[4];
this.home = items[5];
this.shell = items[6];
}
// Getters amp; Setters omitted for brevity.
}
Группа:
public class Group {
private Integer gid;
private String name;
private List<String> members;
public Group(String line) {
String[] items = line.split(":");
this.name = items[0];
this.gid = Integer.parseInt(items[2]);
if (items.length > 3){
this.members = Arrays.asList(items[3]);
}
}
// Getters amp; Setters omitted for brevity.
}
FileParserUtils:
public class FileParserUtils {
public static List<Group> parseFileForGroups(String line) {
List<Group> groups = null;
try (Stream<String> stream = Files.lines(Paths.get(line))) {
groups = stream.filter(s -> s.charAt(0) != '#').map(Group::new)
.collect(Collectors.toCollection(LinkedList::new));
}
catch (Exception e) {
e.printStackTrace();
}
return groups;
}
}
Обслуживание:
@Service
public class UserServiceImpl implements UserService {
@Override
public User findByUid(String line, Integer uid) {
List<User> allUsers = FileParserUtils.parseFileForUsers(line);
for (User user : allUsers) {
if (user.getUid() == uid) {
return user;
}
}
return null;
}
@Override
public List<Group> findByGroupsByUid(String line, Integer uid) {
User specificUser = findByUid(line, uid);
Integer userGid = specificUser.getGid();
List<Group> allGroups = FileParserUtils.parseFileForGroups(line);
List<Group> userGroups = new ArrayList<>();
for (Group group : allGroups) {
if (userGid == group.getGid()) {
userGroups.add(group);
}
}
return userGroups;
}
}
This issue is that not all User uids are the same as the Group’s gids (see the gids amp; uids for "name":"_cyrus"
):
Obtain a list of Users (along with their uids amp; gids):
HTTP GET /myservice/users:
Yields JSON Payload Response:
[
{
"name":"_cyrus",
"password":"*",
"uid":77,
"gid":6,
"comment":"Cyrus Administrator",
"home":"/var/imap",
"shell":"/usr/bin/false"
},
{
"name":"_mailman",
"password":"*",
"uid":78,
"gid":78,
"comment":"Mailman List Server",
"home":"/var/empty",
"shell":"/usr/bin/false"
},
{
"name":"_appserver",
"password":"*",
"uid":79,
"gid":79,
"comment":"Application Server",
"home":"/var/empty",
"shell":"/usr/bin/false"
},
{
"name": "_jabber",
"password": "*",
"uid": 84,
"gid": 84,
"comment": "Jabber XMPP Server",
"home": "/var/empty",
"shell": "/usr/bin/false"
}
]
Groups only have gids (and not uids):
[
{
"gid": 6,
"name": "mail",
"members": [
"_teamsserver"
]
}
{
"gid": 78,
"name": "_mailman",
"members": null
},
{
"gid": 79,
"name": "_appserverusr",
"members": null
},
{
"gid": 30,
"name": "_keytabusers",
"members": [
"_calendar,_jabber,_postfix"
]
}
]
Итак, когда, если я попытаюсь найти все группы, к которым принадлежит Jabber:
http://localhost:8080/MyService/users/84/groups
Получаем следующую полезную нагрузку ответа JSON:
[
{
"gid": 84,
"name": "_jabber",
"members": [
"84",
"Jabber XMPP Server",
"/var/empty",
"/usr/bin/false"
]
}
]
Почему 84 находится внутри массива members JSON?
Предполагается, что это вернет все группы для данного пользователя:
[
{
"gid": 29,
"name": "certusers",
"members": [
"root,_jabber,_postfix,_cyrus,_calendar,_dovecot"
]
},
{
"gid": 30,
"name": "_keytabusers",
"members": [
"_calendar,_jabber,_postfix"
]
}
]
Есть ли способ сопоставить (например, связать два списка массивов вместе или существует другая структура данных, которая помогла бы мне это сделать) User.uids с Group.gids?
Это все в памяти, поэтому, пожалуйста, не упоминайте использование ORM или JDBC.
Комментарии:
1. Откуда берутся эти две нужные группы? Как вы определяете, что jabber является частью этих двух групп (одна из которых даже не существует в списке групп, который вы опубликовали)?
2. Они поступают из списка массивов, который был заполнен мной при разборе файла /etc / group в Unix / Linux.
3. Каков ответ на мой второй вопрос? Вы получаете uid пользователя. Как вы находите группы, к которым принадлежит пользователь?
4. @JBNizet — У меня есть HTTP GET-вызов, который выдает мне всех пользователей, и внутри каждого отдельного пользователя есть gid и uid. Это gid, который я использую в своем коде (см. Выше). Я отредактировал сообщение, чтобы ответить на ваш вопрос…
5. ОК. Таким образом, это означает, что если вы передаете uid 84, то пользователь с именем «_jabber». Gid этого пользователя также равен 84. Таким образом, это означает, что у _jabber есть единственная группа, идентифицируемая gid 84 (которая отсутствует в опубликованном списке групп). Итак, полученный вами результат верен. Почему тогда вы ожидаете другого результата, содержащего группы 29 и 30?